From a0e835bfff21dbaeed60bedba232d88c56291537 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Wed, 31 Dec 2025 01:53:33 +0000 Subject: [PATCH 01/33] chore: get windows basics working without breaking existing --- .gitignore | 1 + build.cmd | 6 ++ lib/win/api.js | 13 +++ lib/win/win.cc | 247 +++++++++++++++++++++++++++++++++++++++++++++++++ lo.cc | 59 ++++++------ lo.h | 22 +---- 6 files changed, 304 insertions(+), 44 deletions(-) create mode 100644 build.cmd create mode 100644 lib/win/api.js create mode 100644 lib/win/win.cc diff --git a/.gitignore b/.gitignore index 369f570..af47f6a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ notes.md lib/inflate/em_inflate.c lib/inflate/em_inflate.h lib/**/*.cc +!lib/win/win.cc !lib/core/core.cc !lib/curl/curl.cc !lib/inflate/inflate.cc diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..1b66e62 --- /dev/null +++ b/build.cmd @@ -0,0 +1,6 @@ +REM "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" +bun gen.js +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/win/win.cc +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.22-pre\" -DRUNTIME=\"lo\" lo.cc +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.22-pre\" -DRUNTIME=\"lo\" main.cc +clang-cl.exe v8\v8_monolith.lib lo.obj main.obj win.obj winmm.lib /link /machine:x64 /SUBSYSTEM:console /out:lo.exe /WHOLEARCHIVE /WX diff --git a/lib/win/api.js b/lib/win/api.js new file mode 100644 index 0000000..a41b9c6 --- /dev/null +++ b/lib/win/api.js @@ -0,0 +1,13 @@ +const api = { + test: { + parameters: [], + result: 'i32', + name: 'test' + } +} + +const constants = {} +const includes = [] +const name = 'core' + +export { api, includes, name, constants } diff --git a/lib/win/win.cc b/lib/win/win.cc new file mode 100644 index 0000000..9a14471 --- /dev/null +++ b/lib/win/win.cc @@ -0,0 +1,247 @@ +#include +#include + +namespace lo { +namespace core { + +using v8::Local; +using v8::ObjectTemplate; +using v8::Isolate; +using v8::Value; +using v8::FunctionCallbackInfo; +using v8::CTypeInfo; +using v8::CFunctionInfo; +using v8::CFunction; +using v8::String; +using v8::Number; +using v8::BigInt; +using v8::Integer; + +unsigned int testFast(void* p); + +CTypeInfo cargstest[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), +}; +CTypeInfo rctest = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infotest = CFunctionInfo(rctest, 1, cargstest); +CFunction pFtest = CFunction((const void*)&testFast, &infotest); + +unsigned int testFast(void* p) { + return 1; +} + +void testSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + args.GetReturnValue().Set(1); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-copyfile +void copyFile(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value source(isolate, args[0]); + String::Utf8Value dest(isolate, args[1]); + bool ok = CopyFile(*source, *dest, true); + args.GetReturnValue().Set(ok); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-getlasterror +// https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes +// https://learn.microsoft.com/en-us/windows/win32/debug/retrieving-the-last-error-code +void getLastError(const FunctionCallbackInfo &args) { + args.GetReturnValue().Set(Number::New(args.GetIsolate(), GetLastError())); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle +void closeHandle (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + HANDLE file = reinterpret_cast(v0); + BOOL ok = CloseHandle(file); + if (ok) { + args.GetReturnValue().Set(true); + return; + } + args.GetReturnValue().Set(false); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfilesize +void getFileSize (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + HANDLE file = reinterpret_cast(v0); + DWORD fileSize = GetFileSize(file, NULL); + if (fileSize == INVALID_FILE_SIZE) { + args.GetReturnValue().Set(-1); + return; + } + args.GetReturnValue().Set(Number::New(isolate, fileSize)); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfiletype +void getFileType (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + HANDLE file = reinterpret_cast(v0); + DWORD fileType = GetFileType(file); + args.GetReturnValue().Set(Number::New(isolate, fileType)); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-readfile +void readFile (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + char* buffer = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t len = Local::Cast(args[2])->Value(); + // HANDLE's *should* be 32 bit safe - reference? + HANDLE file = reinterpret_cast(v0); + DWORD bytesRead; + BOOL ok = ReadFile(file, buffer, len, &bytesRead, NULL); + if (ok) { + args.GetReturnValue().Set(Number::New(isolate, bytesRead)); + return; + } + args.GetReturnValue().Set(-1); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-writefile +void writeFile (const FunctionCallbackInfo & args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + char* buffer = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t len = Local::Cast(args[2])->Value(); + // HANDLE's *should* be 32 bit safe - reference? + HANDLE file = reinterpret_cast(v0); + DWORD bytesWritten; + BOOL ok = WriteFile(file, buffer, len, &bytesWritten, NULL); + if (ok) { + args.GetReturnValue().Set(Number::New(isolate, bytesWritten)); + return; + } + args.GetReturnValue().Set(-1); +} + +// https://learn.microsoft.com/en-us/windows/win32/fileio/creating-and-opening-files +// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea +void createFile(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value path(isolate, args[0]); + uint32_t access = Local::Cast(args[1])->Value(); + uint32_t mode = Local::Cast(args[2])->Value(); + HANDLE file = CreateFile(*path, access, 0, NULL, mode, FILE_ATTRIBUTE_NORMAL, NULL); + if (file == INVALID_HANDLE_VALUE) { + args.GetReturnValue().Set(-1); + return; + } + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(file))); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getenvironmentvariable +void getEnv(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value name(isolate, args[0]); + char* buffer = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t len = Local::Cast(args[2])->Value(); + args.GetReturnValue().Set(Number::New(isolate, GetEnvironmentVariable(*name, buffer, len))); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setenvironmentvariable +void setEnv(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value name(isolate, args[0]); + String::Utf8Value value(isolate, args[1]); + BOOL ok = SetEnvironmentVariable(*name, *value); + if (ok) { + args.GetReturnValue().Set(true); + return; + } + args.GetReturnValue().Set(false); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-loadlibrarya +void loadLibrary(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value path(isolate, args[0]); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(LoadLibraryA(*path)))); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary +void freeLibrary(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint64_t v0 = (uint64_t)Local::Cast(args[0])->Value(); + HMODULE handle = reinterpret_cast(v0); + BOOL ok = FreeLibrary(handle); + if (ok) { + args.GetReturnValue().Set(true); + return; + } + args.GetReturnValue().Set(false); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getprocaddress +void getProcAddress(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint64_t v0 = (uint64_t)Local::Cast(args[0])->Value(); + String::Utf8Value name(isolate, args[1]); + HMODULE handle = reinterpret_cast(v0); + FARPROC fp = GetProcAddress(handle, *name); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(fp))); +} + +void Init(Isolate *isolate, Local target) { + Local module = ObjectTemplate::New(isolate); + + SET_METHOD(isolate, module, "testSlow", testSlow); + SET_FAST_METHOD(isolate, module, "test", &pFtest, testSlow); + + SET_METHOD(isolate, module, "getLastError", getLastError); + + SET_METHOD(isolate, module, "createFile", createFile); + SET_METHOD(isolate, module, "getFileSize", getFileSize); + SET_METHOD(isolate, module, "getFileType", getFileType); + SET_METHOD(isolate, module, "copyFile", copyFile); + SET_METHOD(isolate, module, "readFile", readFile); + SET_METHOD(isolate, module, "writeFile", writeFile); + SET_METHOD(isolate, module, "closeHandle", closeHandle); + + SET_METHOD(isolate, module, "loadLibrary", loadLibrary); + SET_METHOD(isolate, module, "getProcAddress", getProcAddress); + SET_METHOD(isolate, module, "freeLibrary", freeLibrary); + + SET_METHOD(isolate, module, "getenv", getEnv); + SET_METHOD(isolate, module, "setenv", setEnv); + + SET_VALUE(isolate, module, "GENERIC_READ", Integer::New(isolate, (int32_t)GENERIC_READ)); + SET_VALUE(isolate, module, "GENERIC_WRITE", Integer::New(isolate, (int32_t)GENERIC_WRITE)); + + SET_VALUE(isolate, module, "FILE_SHARE_READ", Integer::New(isolate, (int32_t)FILE_SHARE_READ)); + SET_VALUE(isolate, module, "FILE_SHARE_WRITE", Integer::New(isolate, (int32_t)FILE_SHARE_WRITE)); + + SET_VALUE(isolate, module, "CREATE_ALWAYS", Integer::New(isolate, (int32_t)CREATE_ALWAYS)); + SET_VALUE(isolate, module, "CREATE_NEW", Integer::New(isolate, (int32_t)CREATE_NEW)); + SET_VALUE(isolate, module, "OPEN_ALWAYS", Integer::New(isolate, (int32_t)OPEN_ALWAYS)); + SET_VALUE(isolate, module, "OPEN_EXISTING", Integer::New(isolate, (int32_t)OPEN_EXISTING)); + SET_VALUE(isolate, module, "TRUNCATE_EXISTING", Integer::New(isolate, (int32_t)TRUNCATE_EXISTING)); + + SET_VALUE(isolate, module, "FILE_ATTRIBUTE_NORMAL", Integer::New(isolate, (int32_t)FILE_ATTRIBUTE_NORMAL)); + SET_VALUE(isolate, module, "FILE_ATTRIBUTE_READONLY", Integer::New(isolate, (int32_t)FILE_ATTRIBUTE_READONLY)); + SET_VALUE(isolate, module, "FILE_ATTRIBUTE_TEMPORARY", Integer::New(isolate, (int32_t)FILE_ATTRIBUTE_TEMPORARY)); + + SET_VALUE(isolate, module, "FILE_TYPE_CHAR", Integer::New(isolate, (int32_t)FILE_TYPE_CHAR)); + SET_VALUE(isolate, module, "FILE_TYPE_DISK", Integer::New(isolate, (int32_t)FILE_TYPE_DISK)); + SET_VALUE(isolate, module, "FILE_TYPE_PIPE", Integer::New(isolate, (int32_t)FILE_TYPE_PIPE)); + SET_VALUE(isolate, module, "FILE_TYPE_REMOTE", Integer::New(isolate, (int32_t)FILE_TYPE_REMOTE)); + SET_VALUE(isolate, module, "FILE_TYPE_UNKNOWN", Integer::New(isolate, (int32_t)FILE_TYPE_UNKNOWN)); + + SET_VALUE(isolate, module, "INVALID_HANDLE_VALUE", Integer::New(isolate, -1)); + + SET_MODULE(isolate, target, "core", module); +} + +} // namespace core +} // namespace lo + +extern "C" { + void* _register_core() { + return (void*)lo::core::Init; + } +} diff --git a/lo.cc b/lo.cc index 81df341..6efc050 100644 --- a/lo.cc +++ b/lo.cc @@ -1,6 +1,5 @@ #include #include "lo.h" -#include using v8::String; using v8::FunctionCallbackInfo; @@ -59,17 +58,16 @@ using v8::Script; using v8::HeapStatistics; using v8::BigUint64Array; -// TODO: thread safety +#ifdef _WIN32 +static uint64_t hrtime_frequency_ = 0; +#else +int random_fd = -1; +#endif + std::map builtins; std::map modules; std::unique_ptr platform; -#ifndef _WIN64 -clock_t clock_id = CLOCK_MONOTONIC; -#endif - -struct timespec t; - CTypeInfo cargshrtime[2] = { CTypeInfo(CTypeInfo::Type::kV8Value), CTypeInfo(CTypeInfo::Type::kUint64) @@ -111,18 +109,6 @@ CFunctionInfo infoutf8encodeinto = CFunctionInfo(rcutf8encodeinto, 3, CFunction pFutf8encodeinto = CFunction((const void*)&lo::fastUtf8EncodeInto, &infoutf8encodeinto); -/* -CTypeInfo cargsutf8encodeintoPtr[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CFunctionInfo infoutf8encodeintoPtr = CFunctionInfo(rcutf8encodeinto, 3, - cargsutf8encodeintoPtr); -CFunction pFutf8encodeintoPtr = CFunction((const void*)&lo::fastUtf8EncodeIntoPtr, - &infoutf8encodeintoPtr); -*/ - CTypeInfo cargsutf8encodeintoatoffset[4] = { CTypeInfo(CTypeInfo::Type::kV8Value), CTypeInfo(CTypeInfo::Type::kSeqOneByteString), @@ -965,12 +951,28 @@ uint64_t lo::hrtime() { mach_port_deallocate(mach_task_self(), cclock); t.tv_sec = mts.tv_sec; t.tv_nsec = mts.tv_nsec; + return (t.tv_sec * (uint64_t) 1e9) + t.tv_nsec; #elif defined(_WIN32) - // TODO + // stolen from libuv: https://github.com/libuv/libuv/blob/v1.x/src/win/util.c + LARGE_INTEGER counter; + double scaled_freq; + double result; + if (hrtime_frequency_ == 0) { + LARGE_INTEGER perf_frequency; + if (QueryPerformanceFrequency(&perf_frequency)) { + hrtime_frequency_ = perf_frequency.QuadPart; + } + if (hrtime_frequency_ == 0) return 0; + } + if (!QueryPerformanceCounter(&counter)) return 0; + scaled_freq = (double) hrtime_frequency_ / 1000000000; + result = (double) counter.QuadPart / scaled_freq; + return (uint64_t) result; #else + struct timespec t; if (clock_gettime(clock_id, &t)) return 0; -#endif return (t.tv_sec * (uint64_t) 1e9) + t.tv_nsec; +#endif } void lo::HRTime(const FunctionCallbackInfo &args) { @@ -1418,9 +1420,6 @@ void lo::Exit(const FunctionCallbackInfo &args) { exit(status); } -// keep the /dev/urandom file open for lifetime of process -int random_fd = -1; - /** * fill the provided buffer with random bytes * @@ -1432,11 +1431,17 @@ int random_fd = -1; * @param length Write this number of random bytes, no more, no less. */ bool EntropySource(unsigned char* buffer, size_t length) { +#ifdef _WIN32 +// https://learn.microsoft.com/en-us/windows/win32/api/Bcrypt/nf-bcrypt-bcryptgenrandom + NTSTATUS status = BCryptGenRandom(NULL, buffer, length, BCRYPT_USE_SYSTEM_PREFERRED_RNG); + if (status != 0) return false; + return true; +#else if (random_fd == -1) random_fd = open("/dev/urandom", O_RDONLY); - //todo check return size_t bytes = read(random_fd, buffer, length); if (bytes != length) return false; return true; +#endif } void lo::Setup( @@ -1664,7 +1669,9 @@ void lo_shutdown (int cleanup) { V8::Dispose(); platform.reset(); } +#ifndef _WIN32 close(random_fd); +#endif builtins.clear(); modules.clear(); } diff --git a/lo.h b/lo.h index 8533d7a..17c993a 100644 --- a/lo.h +++ b/lo.h @@ -13,24 +13,10 @@ #endif #if defined _WIN32 || defined __CYGWIN__ - #ifdef BUILDING_DLL - #ifdef __GNUC__ - #define DLL_PUBLIC __attribute__ ((dllexport)) - #else - #define DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax. - #endif - #else - #ifdef __GNUC__ - #define DLL_PUBLIC __attribute__ ((dllimport)) - #else - #define DLL_PUBLIC __declspec(dllimport) // Note: actually gcc seems to also supports this syntax. - #endif - #endif - #define DLL_LOCAL -#else - #define DLL_PUBLIC __attribute__ ((visibility ("default"))) - #define DLL_LOCAL __attribute__ ((visibility ("hidden"))) +#include #endif +#define DLL_PUBLIC __attribute__ ((visibility ("default"))) +#define DLL_LOCAL __attribute__ ((visibility ("hidden"))) namespace lo { /* @@ -269,7 +255,7 @@ struct callback_state { }; DLL_PUBLIC void lo_callback (exec_info* info); -void lo_async_callback (exec_info* info, callback_state* state); +DLL_PUBLIC void lo_async_callback (exec_info* info, callback_state* state); DLL_PUBLIC void lo_shutdown (int cleanup); From 50c90dc9c2ac9572393a7d02471673773a4c042d Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Wed, 31 Dec 2025 02:01:34 +0000 Subject: [PATCH 02/33] fix: use CLOCK_MONOTONIC directly --- lo.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lo.cc b/lo.cc index 6efc050..02f8e58 100644 --- a/lo.cc +++ b/lo.cc @@ -970,7 +970,7 @@ uint64_t lo::hrtime() { return (uint64_t) result; #else struct timespec t; - if (clock_gettime(clock_id, &t)) return 0; + if (clock_gettime(CLOCK_MONOTONIC, &t)) return 0; return (t.tv_sec * (uint64_t) 1e9) + t.tv_nsec; #endif } From 93a567e2bf5d077caa8b3303c3cf8c0eb7cb725e Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Wed, 31 Dec 2025 18:44:19 +0000 Subject: [PATCH 03/33] fix: macos build --- lo.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/lo.cc b/lo.cc index 02f8e58..ff8a9eb 100644 --- a/lo.cc +++ b/lo.cc @@ -944,6 +944,7 @@ void lo::fastSetErrno (void* p, int32_t e) { uint64_t lo::hrtime() { #ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time + struct timespec t; clock_serv_t cclock; mach_timespec_t mts; host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); From 422ac93a2407f88c419ff11f54cb5091157c016b Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 1 Jan 2026 02:44:39 +0000 Subject: [PATCH 04/33] chore: windoze build mostly working --- Makefile | 2 +- build.cmd | 9 +- builtins.h | 5 +- lib/core2/api.js | 487 +++++++++++++++++++++++++++++++++++++++++++++++ lib/win/api.js | 2 +- lib/win/win.cc | 27 ++- main.js | 64 ++++--- main_win.h | 2 + 8 files changed, 561 insertions(+), 37 deletions(-) create mode 100644 lib/core2/api.js diff --git a/Makefile b/Makefile index 1dcb9c8..7439f24 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ CCARGS=-fPIC -std=c++20 -c -fno-omit-frame-pointer -fno-rtti -fno-exceptions -fv CARGS=-fPIC -c -fno-omit-frame-pointer -fvisibility=hidden WARN=-Werror -Wpedantic -Wall -Wextra -Wno-unused-parameter -Wno-error=unknown-warning-option OPT=-O3 -VERSION=0.0.23-pre +VERSION=0.0.24-pre V8_VERSION=14.3 RUNTIME=lo LO_HOME=$(shell pwd) diff --git a/build.cmd b/build.cmd index 1b66e62..c2c9ac5 100644 --- a/build.cmd +++ b/build.cmd @@ -1,6 +1,7 @@ REM "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" -bun gen.js +REM bun gen.js clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/win/win.cc -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.22-pre\" -DRUNTIME=\"lo\" lo.cc -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.22-pre\" -DRUNTIME=\"lo\" main.cc -clang-cl.exe v8\v8_monolith.lib lo.obj main.obj win.obj winmm.lib /link /machine:x64 /SUBSYSTEM:console /out:lo.exe /WHOLEARCHIVE /WX +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/core2/core.cc +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.24-pre\" -DRUNTIME=\"lo\" lo.cc +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.24-pre\" -DRUNTIME=\"lo\" main.cc +clang-cl.exe v8\v8_monolith.lib lo.obj main.obj win.obj core.obj winmm.lib /link /machine:x64 /SUBSYSTEM:console /out:lo.exe /WHOLEARCHIVE /WX diff --git a/builtins.h b/builtins.h index 236778c..e52949d 100644 --- a/builtins.h +++ b/builtins.h @@ -1,6 +1,5 @@ const char _binary_main_js_start[] = { -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x2c, 0x20, 0x70, 0x75, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0x2c, 0x20, 0x61, 0x72, 0x63, 0x68, 0x2c, 0x20, 0x6f, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x50, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0xd, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x20, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xd, 0xa, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x74, 0x72, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x75, 0x38, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xd, 0xa, 0x7d, 0xd, 0xa, 0x20, 0x20, 0xd, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x28, 0x75, 0x33, 0x32, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x31, 0x5d, 0x29, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x30, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5f, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x49, 0x73, 0x53, 0x61, 0x66, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x61, 0x66, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x27, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x27, 0x63, 0x61, 0x6c, 0x6c, 0x27, 0x2c, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x7b, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x29, 0x20, 0x7b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x24, 0x7b, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x60, 0x2c, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x75, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0xd, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0xd, 0xa, 0x7d, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0xd, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x31, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x32, 0x29, 0xd, 0xa, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x75, 0x73, 0x61, 0x67, 0x65, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x75, 0x73, 0x61, 0x67, 0x65, 0x29, 0xd, 0xa, 0xd, 0xa, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x28, 0x27, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x22, 0x66, 0x6f, 0x6f, 0x22, 0x29, 0x27, 0x2c, 0x20, 0x27, 0x66, 0x6f, 0x6f, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x38, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0xd, 0xa, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x32, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0xd, 0xa, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x28, 0x75, 0x38, 0x2c, 0x20, 0x6d, 0x65, 0x74, 0x61, 0x32, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6d, 0x65, 0x74, 0x61, 0x32, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x75, 0x38, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x38, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x6c, 0x6f, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0xd, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0x29, 0xd, 0xa, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x28, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x27, 0x29, 0x29, 0xd, 0xa, 0x72, 0x75, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x28, 0x29, 0xd, 0xa, 0x70, 0x75, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0x28, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x61, 0x72, 0x63, 0x68, 0x28, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6f, 0x73, 0x28, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x27, 0x63, 0x6f, 0x72, 0x65, 0x27, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x27, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x27, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x63, 0x73, 0x74, 0x72, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x63, 0x73, 0x74, 0x72, 0x29, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x63, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x27, 0x74, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x27, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x66, 0x64, 0x29, 0xd, 0xa, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x34, 0x30, 0x39, 0x36, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x72, 0x63, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x62, 0x75, 0x66, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x66, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xd, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29 +0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0xa, 0x2f, 0x2f, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xa, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x7d, 0x20, 0x64, 0x65, 0x73, 0x74, 0xa, 0x20, 0x20, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x20, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x20, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x64, 0x65, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xa, 0xa, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x7d, 0x20, 0x75, 0x38, 0xa, 0x20, 0x20, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7d, 0x20, 0x65, 0x72, 0x72, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x2f, 0x5c, 0x73, 0x2b, 0x61, 0x74, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x5c, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x5c, 0x2e, 0x6a, 0x73, 0x2e, 0x2b, 0x2f, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x30, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5f, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x49, 0x73, 0x53, 0x61, 0x66, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x61, 0x66, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0xa, 0x20, 0x20, 0x20, 0x20, 0x27, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x27, 0x63, 0x61, 0x6c, 0x6c, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x60, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x7b, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x24, 0x7b, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x7d, 0x60, 0x2c, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x75, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x74, 0x72, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x75, 0x38, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3f, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x73, 0x74, 0x72, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x30, 0x60, 0x29, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x66, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x20, 0x28, 0x75, 0x33, 0x32, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x20, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x20, 0x26, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x4d, 0x54, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3c, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x31, 0x36, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x5b, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x5d, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x2c, 0x20, 0x60, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x24, 0x7b, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x5b, 0x31, 0x32, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x5b, 0x35, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x5b, 0x36, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x20, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x38, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x6f, 0x66, 0x66, 0x29, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x2b, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x75, 0x38, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x2f, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x2b, 0x3d, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0xa, 0x2f, 0x2f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x6b, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x2d, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0x29, 0x20, 0x7c, 0x7c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x60, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x73, 0x79, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x43, 0x4a, 0x53, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x29, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x72, 0x63, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x72, 0x63, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x45, 0x53, 0x4d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x72, 0x63, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x72, 0x63, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x60, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x68, 0x79, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x3f, 0x3f, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6a, 0x73, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0xa, 0x2a, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0xa, 0x2a, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x61, 0x64, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6a, 0x75, 0x73, 0x74, 0xa, 0x2a, 0x20, 0x60, 0x60, 0x60, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x27, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x27, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x27, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x66, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0xa, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x65, 0x20, 0x67, 0x72, 0x61, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0xa, 0x2a, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x20, 0x7b, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x7d, 0x20, 0x61, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x64, 0x69, 0x65, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x73, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x65, 0x20, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x46, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0xa, 0x20, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x2c, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x27, 0x63, 0x6f, 0x72, 0x65, 0x27, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x2c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x2c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x57, 0x55, 0x53, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x55, 0x53, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x47, 0x52, 0x50, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x4f, 0x54, 0x48, 0x2c, 0xa, 0x20, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x2c, 0x20, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x4d, 0x54, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x73, 0x74, 0x61, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2c, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x29, 0xa, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x28, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x35, 0x36, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x28, 0x62, 0x75, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x62, 0x75, 0x66, 0x2c, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6f, 0x73, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x20, 0x3f, 0x20, 0x33, 0x32, 0x37, 0x36, 0x37, 0x20, 0x3a, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x20, 0x3d, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x28, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x55, 0x53, 0x52, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x57, 0x55, 0x53, 0x52, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x47, 0x52, 0x50, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x4f, 0x54, 0x48, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x20, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x4f, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x53, 0x5f, 0x49, 0x57, 0x52, 0x49, 0x54, 0x45, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x4f, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0xa, 0x7d, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0xa, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x30, 0x29, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x7d, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x6e, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x41, 0x44, 0x2c, 0x20, 0x41, 0x30, 0x2c, 0x20, 0x41, 0x52, 0x2c, 0x20, 0x41, 0x47, 0x2c, 0x20, 0x41, 0x59, 0x2c, 0x20, 0x41, 0x42, 0x2c, 0x20, 0x41, 0x4d, 0x2c, 0x20, 0x41, 0x43, 0x2c, 0x20, 0x41, 0x57, 0x20, 0x7d, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x7d, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x5f, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0xa, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x29, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x22, 0x6c, 0x6f, 0x22, 0x3f, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x29, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0xa, 0x7d, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x27, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x27, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x30, 0x27, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0xa, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x29, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x32, 0x29, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x36, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x2c, 0x20, 0x33, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x2c, 0x20, 0x33, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x28, 0x29, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x62, 0x6f, 0x74, 0x68, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x72, 0x6d, 0x36, 0x34, 0x27, 0x20, 0x3f, 0x20, 0x34, 0x20, 0x3a, 0x20, 0x36, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x64, 0x65, 0x70, 0x72, 0x61, 0x63, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x2e, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x3f, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x28, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x6c, 0x6f, 0x2e, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x6c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0xa, 0x2f, 0x2a, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x5f, 0x7a, 0x61, 0x70, 0x5f, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x5f, 0x7a, 0x61, 0x70, 0x5f, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0xa, 0x6c, 0x6f, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x5f, 0x61, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x75, 0x70, 0x2f, 0x64, 0x65, 0x63, 0x69, 0x64, 0x65, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, 0xa, 0x2f, 0x2a, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x60, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x73, 0x79, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2e, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x77, 0x65, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x2f, 0x5c, 0x28, 0x3f, 0x28, 0x5b, 0x5c, 0x77, 0x5c, 0x2f, 0x5c, 0x2e, 0x5c, 0x2d, 0x5f, 0x5d, 0x2b, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x2b, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x2b, 0x29, 0x5c, 0x29, 0x3f, 0x2f, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x31, 0x5d, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x5c, 0x6e, 0x24, 0x7b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x5c, 0x6e, 0x24, 0x7b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x20, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x67, 0x65, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x67, 0x65, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x6e, 0x69, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x72, 0x65, 0x70, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x65, 0x76, 0x61, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x65, 0x73, 0x74, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x72, 0x76, 0x65, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x7d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, 0x65, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xa, 0xa, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x7d, 0xa }; -unsigned int _binary_main_js_len = 3170; - +unsigned int _binary_main_js_len = 19877; diff --git a/lib/core2/api.js b/lib/core2/api.js new file mode 100644 index 0000000..dbcac4c --- /dev/null +++ b/lib/core2/api.js @@ -0,0 +1,487 @@ +const api = { + calloc: { + parameters: ['u32', 'u32'], + result: 'pointer' + }, + read: { + parameters: ['i32', 'pointer', 'i32'], + result: 'i32', + name: '_read' + }, + write: { + parameters: ['i32', 'pointer', 'i32'], + result: 'i32', + name: '_write' + }, + write_string: { + parameters: ['i32', 'string', 'i32'], + pointers: [, 'const char*'], + override: [, , { param: 1, fastfield: '->length', slowfield: '.length()' }], + result: 'i32', + name: '_write' + }, + putchar: { + parameters: ['i32'], + result: 'i32' + }, + getchar: { + parameters: [], + result: 'i32' + }, + close: { + parameters: ['i32'], + result: 'i32', + name: '_close' + }, + lseek: { + parameters: ['i32', 'u32', 'i32'], + result: 'u32', + name: '_lseek' + }, + // https://github.com/wine-mirror/wine/blob/master/include/msvcrt/sys/stat.h#L52 + fstat: { + parameters: ['i32', 'pointer'], + pointers: [, 'struct _stat *'], + result: 'i32', + name: '_fstat' + }, + rename: { + parameters: ['string', 'string'], + result: 'i32' + }, + open: { + parameters: ['string', 'i32', 'i32'], + pointers: ['const char*'], + result: 'i32', + name: '_open' + }, + unlink: { + parameters: ['string'], + result: 'i32', + name: '_unlink' + }, + memcpy: { + parameters: ['pointer', 'pointer', 'u32'], + result: 'pointer' + }, + memset: { + parameters: ['pointer', 'i32', 'u32'], + result: 'pointer' + }, + memmove: { + parameters: ['pointer', 'pointer', 'u32'], + result: 'pointer' + }, + malloc: { + parameters: ['u32'], + result: 'pointer' + }, + realloc: { + parameters: ['pointer', 'u32'], + result: 'pointer' + }, + aligned_alloc: { + parameters: ['u32', 'u32'], + result: 'pointer', + name: '_aligned_malloc' + }, + free: { + parameters: ['pointer'], + result: 'void' + }, + bind_fastcall: { + declare_only: true, + nofast: true + }, + bind_slowcall: { + declare_only: true, + nofast: true + }, + fastcall: { + parameters: ['pointer'], + pointers: ['struct fastcall*'], + result: 'void', + name: 'lo_fastcall' + }, + getenv: { + parameters: ['string'], + pointers: ['const char*'], + rpointer: 'char*', + result: 'pointer' + }, + dup: { + parameters: ['i32'], + result: 'i32', + name: '_dup' + }, + dup2: { + parameters: ['i32', 'i32'], + result: 'i32', + name: '_dup2' + }, + getcwd: { + parameters: ['pointer', 'i32'], + pointers: ['char*'], + result: 'pointer', + name: '_getcwd' + }, + getpid: { + parameters: [], + result: 'i32', + name: '_getpid' + }, + execve: { + parameters: ['string', 'buffer', 'buffer'], + pointers: ['const char*', 'char* const*', 'char* const*'], + result: 'i32', + name: '_execve' + }, + execvp: { + parameters: ['string', 'buffer'], + pointers: ['const char*', 'char* const*'], + result: 'i32', + name: '_execvp' + }, + exit: { + parameters: ['i32'], + result: 'void' + }, + isolate_create: { + parameters: [ + 'i32', 'u32array', 'string', 'u32', 'string', 'u32', 'buffer', + 'i32', 'i32', 'u64', 'string', 'string', 'i32', 'i32', 'pointer' + ], + pointers: [ + , 'char**', 'const char*', , 'const char*', , 'char*', , , + 'const char*', 'const char*' + ], + result: 'i32', + name: 'lo_create_isolate', + jsdoc: ``, + nofast: true + }, + isolate_context_create: { + parameters: [ + 'i32', 'pointer', 'string', 'u32', 'string', 'u32', 'pointer', + 'i32', 'i32', 'u64', 'string', 'string', 'i32', 'i32', 'pointer', 'buffer' + ], + pointers: [ + , 'char**', 'const char*', , 'const char*', , 'char*', , , + 'const char*', 'const char*', , , , , 'struct isolate_context*' + ], + result: 'void', + name: 'lo_create_isolate_context', + nofast: true + }, + isolate_context_destroy: { + parameters: ['buffer'], + pointers: ['struct isolate_context*'], + result: 'void', + name: 'lo_destroy_isolate_context' + }, + isolate_context_size: { + parameters: [], + result: 'i32', + name: 'lo_context_size' + }, + isolate_start: { + parameters: ['buffer'], + result: 'void', + name: 'lo_start_isolate', + nofast: true + }, + callback: { + parameters: ['pointer'], + pointers: ['exec_info*'], + result: 'void', + name: 'lo_callback', + nofast: true + }, + strnlen: { + parameters: ['pointer', 'u32'], + pointers: ['const char*'], + result: 'u32' + }, + isatty: { + parameters: ['i32'], + result: 'i32', + name: '_isatty' + }, +} + +const preamble = ` +struct fastcall { + void* wrapper; // 0-7 : v8 fastcall wrapper function pointer + uint8_t result; // 8 : the type of the result + uint8_t nparam; // 9 : the number of args (max 255) + uint8_t param[30]; // 10-39 : an array of types of the arguments + uint64_t args[32]; // 40-295: an array of pointer slots for arguments + // these will be filled in dynamically by + // lo::core::SlowCallback for the slow call + // and then the slowcall wrapper will shift them from + // this structure into regs + stack and make the call + // the first slot is reserved for the result + void* fn; // 296-303: the slowcall wrapper function pointer +}; + +typedef void (*lo_fast_call)(void*); + +inline uint8_t needsunwrap (lo::FastTypes t) { + if (t == lo::FastTypes::buffer) return 1; + if (t == lo::FastTypes::u32array) return 1; + if (t == lo::FastTypes::pointer) return 1; + if (t == lo::FastTypes::u64) return 1; + if (t == lo::FastTypes::i64) return 1; + return 0; +} + +v8::CTypeInfo* CTypeFromV8 (uint8_t v8Type) { + if (v8Type == lo::FastTypes::boolean) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kBool); + if (v8Type == lo::FastTypes::i8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::u8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::f32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat32); + if (v8Type == lo::FastTypes::f64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat64); + if (v8Type == lo::FastTypes::i64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::u64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::iSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::uSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::pointer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::function) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::string) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kSeqOneByteString); + if (v8Type == lo::FastTypes::buffer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::u32array) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + return new v8::CTypeInfo(v8::CTypeInfo::Type::kVoid); +} + +void lo_fastcall (struct fastcall* state) { + ((lo_fast_call)state->fn)(&state->args); +} + +void SlowCallback(const FunctionCallbackInfo &args) { + Isolate* isolate = args.GetIsolate(); + HandleScope scope(isolate); + struct fastcall* state = (struct fastcall*)args.Data() + .As()->GetAlignedPointerFromInternalField(1); + int r = 1; + int s = 0; + char* temp_strs[100]; + for (int i = 0; i < state->nparam; i++) { + switch (state->param[i]) { + case FastTypes::string: + { + String::Utf8Value arg0(isolate, args[i]); + temp_strs[s] = strdup(*arg0); + state->args[r++] = (uint64_t)temp_strs[s++]; + } + break; + case FastTypes::u32: + state->args[r++] = (uint32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u16: + state->args[r++] = (uint16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u8: + state->args[r++] = (uint8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::boolean: + state->args[r++] = (bool)Local::Cast(args[i])->Value(); + break; + case FastTypes::i32: + state->args[r++] = (int32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i16: + state->args[r++] = (int16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i8: + state->args[r++] = (int8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i64: + case FastTypes::iSize: + state->args[r++] = (int64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u64: + case FastTypes::pointer: + case FastTypes::uSize: + state->args[r++] = (uint64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::buffer: + { + Local u8 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u8->Buffer()->Data() + + u8->ByteOffset()); + } + break; + case FastTypes::u32array: + { + Local u32 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u32->Buffer()->Data() + + u32->ByteOffset()); + } + break; + case FastTypes::function: + break; + case FastTypes::f32: + { + float src = (float)args[i].As()->Value(); + float* dst = (float*)&state->args[r++]; + *dst = src; + } + break; + case FastTypes::f64: + { + double src = (double)args[i].As()->Value(); + double* dst = (double*)&state->args[r++]; + *dst = src; + } + break; + } + } + lo_fastcall(state); + for (int i = 0; i < s; i++) { + free(temp_strs[i]); + } + switch (state->result) { + case FastTypes::i32: + args.GetReturnValue().Set((int32_t)state->args[0]); + break; + case FastTypes::u32: + args.GetReturnValue().Set((uint32_t)state->args[0]); + break; + case FastTypes::boolean: + args.GetReturnValue().Set((bool)state->args[0]); + break; + case FastTypes::f32: + { + float* dst = (float*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::f64: + { + double* dst = (double*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::i64: + { + int64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + case FastTypes::buffer: + case FastTypes::u32array: + case FastTypes::u64: + case FastTypes::pointer: + { + uint64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + } +} + +void bind_fastcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + // TODO - does integer work? + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + uint8_t unwrap = needsunwrap((FastTypes)state->result); + int fastlen = state->nparam + 1 + unwrap; + CTypeInfo* cargs = (CTypeInfo*)calloc(fastlen, sizeof(CTypeInfo)); + cargs[0] = CTypeInfo(CTypeInfo::Type::kV8Value); + for (int i = 0; i < state->nparam; i++) { + uint8_t ptype = state->param[i]; + cargs[i + 1] = *CTypeFromV8(ptype); + } + CTypeInfo* rc; + if (unwrap) { + cargs[fastlen - 1] = *CTypeFromV8(FastTypes::u32array); + rc = CTypeFromV8(FastTypes::empty); + } else { + rc = CTypeFromV8((FastTypes)state->result); + } + CFunctionInfo* info = new CFunctionInfo(*rc, fastlen, cargs); + CFunction* fastCFunc = new CFunction(state->wrapper, info); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, fastCFunc + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} + +void bind_slowcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, 0 + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} +` +const includes = ['io.h', 'direct.h', 'process.h'] +const name = 'core' +const libs = [] +const obj = [] +const constants = { + S_IFCHR: 'i32', O_RDONLY: 'i32', O_WRONLY: 'i32', O_CREAT: 'i32', + O_TRUNC: 'i32', STDIN: 0, STDOUT: 1, STDERR: 2, SEEK_SET: 'i32', + SEEK_CUR: 'i32', SEEK_END: 'i32', S_IFMT: 'i32', S_IFDIR: 'i32', + S_IFREG: 'i32', O_RDWR: 'i32', EAGAIN: 'i32', + // WIN Specific + _S_IREAD: 'i32', + _S_IWRITE: 'i32', + _O_APPEND: 'i32', + _O_BINARY: 'i32', + _O_CREAT: 'i32', + _O_RDONLY: 'i32', + _O_RDWR: 'i32', + _O_TEXT: 'i32', + _O_TRUNC: 'i32', + _O_WRONLY: 'i32', + _O_U16TEXT: 'i32', + _O_U8TEXT: 'i32', +} + +const structs = ['fastcall'] + +export { + api, includes, name, libs, obj, constants, structs, preamble +} diff --git a/lib/win/api.js b/lib/win/api.js index a41b9c6..2af41f5 100644 --- a/lib/win/api.js +++ b/lib/win/api.js @@ -8,6 +8,6 @@ const api = { const constants = {} const includes = [] -const name = 'core' +const name = 'win' export { api, includes, name, constants } diff --git a/lib/win/win.cc b/lib/win/win.cc index 9a14471..5f3028f 100644 --- a/lib/win/win.cc +++ b/lib/win/win.cc @@ -1,8 +1,9 @@ #include #include +#include namespace lo { -namespace core { +namespace win { using v8::Local; using v8::ObjectTemplate; @@ -187,6 +188,16 @@ void getProcAddress(const FunctionCallbackInfo &args) { args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(fp))); } +// https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/isatty?view=msvc-170 +void isatty(const FunctionCallbackInfo &args) { + uint32_t fd = Local::Cast(args[0])->Value(); + if (_isatty(fd) == 0) { + args.GetReturnValue().Set(false); + return; + } + args.GetReturnValue().Set(true); +} + void Init(Isolate *isolate, Local target) { Local module = ObjectTemplate::New(isolate); @@ -210,6 +221,8 @@ void Init(Isolate *isolate, Local target) { SET_METHOD(isolate, module, "getenv", getEnv); SET_METHOD(isolate, module, "setenv", setEnv); + SET_METHOD(isolate, module, "isatty", isatty); + SET_VALUE(isolate, module, "GENERIC_READ", Integer::New(isolate, (int32_t)GENERIC_READ)); SET_VALUE(isolate, module, "GENERIC_WRITE", Integer::New(isolate, (int32_t)GENERIC_WRITE)); @@ -234,14 +247,18 @@ void Init(Isolate *isolate, Local target) { SET_VALUE(isolate, module, "INVALID_HANDLE_VALUE", Integer::New(isolate, -1)); - SET_MODULE(isolate, target, "core", module); + SET_VALUE(isolate, module, "STDOUT", Integer::New(isolate, _fileno(stdout))); + SET_VALUE(isolate, module, "STDERR", Integer::New(isolate, _fileno(stderr))); + SET_VALUE(isolate, module, "STDIN", Integer::New(isolate, _fileno(stdin))); + + SET_MODULE(isolate, target, "win", module); } -} // namespace core +} // namespace win } // namespace lo extern "C" { - void* _register_core() { - return (void*)lo::core::Init; + void* _register_win() { + return (void*)lo::win::Init; } } diff --git a/main.js b/main.js index 6c925a4..7df21a4 100644 --- a/main.js +++ b/main.js @@ -32,7 +32,7 @@ class TextDecoder { decode (u8) { // todo: result cache if (!u8.ptr) ptr(u8) - return utf8Decode(u8.ptr, u8.size) + return utf8Decode(u8.ptr, u8.length) } } @@ -85,13 +85,13 @@ function wrap (handle, fn, plen = 0) { function ptr (u8) { if (u8.ptr) return u8 u8.ptr = get_address(u8) - u8.size = u8.byteLength // TODO: this is not right? +// u8.size = u8.byteLength // TODO: this is not right? return u8 } function cstr (str) { const buf = ptr(encoder.encode(`${str}\0`)) - buf.size = buf.size - 1 +// buf.size = buf.size - 1 return buf } @@ -104,20 +104,25 @@ function check_mode (val, mode) { } function is_file (path) { - const fd = open(path, O_RDONLY) + const fd = open(path, defaultReadFlags) if (fd <= 2) return false if (fstat(fd, stat.ptr) !== 0) return false close(fd) + if (core.os === 'win') { + return check_mode(stat16[3], S_IFREG) + } return check_mode(stat32[MODE_WORD], S_IFREG) } -function read_file (path, flags = O_RDONLY, size = 0) { +function read_file (path, flags = defaultReadFlags, size = 0) { const fd = open(path, flags) assert(fd > 0, `failed to open ${path} with flags ${flags}`) if (size === 0) { assert(fstat(fd, stat.ptr) === 0) if (core.os === 'mac') { size = Number(st[12]) + } else if (core.os === 'win') { + size = stat32[5] } else { size = Number(st[6]) } @@ -144,7 +149,6 @@ function write_file (path, u8, flags = defaultWriteFlags, for (let i = 0, off = 0; i < chunks; ++i, off += 4096) { const towrite = Math.min(len - off, 4096) bytes = write(fd, u8.ptr + off, towrite); - //bytes = write(fd, u8.subarray(off, off + towrite), towrite) if (bytes <= 0) break total += bytes } @@ -170,16 +174,19 @@ function load (name) { return lib } // todo: we leak this handle - need to be able to unload - if (!core.dlopen) return - // RTLD_LOCAL is the default - const handle = core.dlopen(`lib/${name}/${name}.so`, RTLD_LAZY) || - core.dlopen(`${LO_HOME}/lib/${name}/${name}.so`, RTLD_LAZY) - if (!handle) return - const sym = core.dlsym(handle, `_register_${name}`) - if (!sym) return - lib = library(sym) - lib.handle = handle - if (!lib) return + if (core.os === 'win') { + // TODO + return + } else { + const handle = core.dlopen(`lib/${name}/${name}.so`, RTLD_LAZY) || + core.dlopen(`${LO_HOME}/lib/${name}/${name}.so`, RTLD_LAZY) + if (!handle) return + const sym = core.dlsym(handle, `_register_${name}`) + if (!sym) return + lib = library(sym) + lib.handle = handle + if (!lib) return + } lib.fileName = `lib/${name}/${name}.so` libCache.set(name, lib) return lib @@ -370,7 +377,9 @@ function get_address (buf) { return addr(handle) } -const MAX_ENV = 65536 // maximum environment variable size - todo +core.os = lo.os() +core.arch = lo.arch() +const MAX_ENV = core.os === 'win' ? 32767 : 65536 // maximum environment variable size - todo const MAX_DIR = 65536 // maximum path len - todo const isatty = core.isatty(STDOUT) const AD = isatty ? '\u001b[0m' : '' // ANSI Default @@ -382,8 +391,16 @@ const AB = isatty ? '\u001b[34m' : '' // ANSI Blue const AM = isatty ? '\u001b[35m' : '' // ANSI Magenta const AC = isatty ? '\u001b[36m' : '' // ANSI Cyan const AW = isatty ? '\u001b[37m' : '' // ANSI White -const defaultWriteFlags = O_WRONLY | O_CREAT | O_TRUNC -const defaultWriteMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH +const env_buf = ptr(new Uint8Array(MAX_ENV)) + +let defaultReadFlags = O_RDONLY +let defaultWriteFlags = O_WRONLY | O_CREAT | O_TRUNC +let defaultWriteMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH +if (core.os === 'win') { + defaultWriteFlags = O_WRONLY | O_CREAT | O_TRUNC | core._O_BINARY + defaultWriteMode = core._S_IWRITE + defaultReadFlags = O_RDONLY | core._O_BINARY +} core.defaultWriteFlags = defaultWriteFlags core.defaultWriteMode = defaultWriteMode const encoder = new TextEncoder() @@ -392,6 +409,7 @@ const handle = new Uint32Array(2) handle.ptr = get_address(handle) const stat = ptr(new Uint8Array(160)) const stat32 = new Uint32Array(stat.buffer) +const stat16 = new Uint16Array(stat.buffer) const st = new BigUint64Array(stat.buffer) const moduleCache = new Map() const requireCache = new Map() @@ -430,7 +448,10 @@ lo.addr = addr lo.core = core // todo: should we just overwrite the existing ones and not put these on "lo"? lo.getenv = wrap_getenv() -lo.setenv = lo.core.setenv +if (core.os !== 'win') { + // TODO + lo.setenv = lo.core.setenv +} lo.getcwd = wrap_getcwd() const LO_HOME = lo.getenv('LO_HOME') || lo.getcwd() const LO_CACHE = parseInt(lo.getenv('LO_CACHE') || '0', 10) @@ -450,8 +471,6 @@ core.write_file = write_file core.little_endian = little_endian() // todo: optimize this - return numbers and make a single call to get both -core.os = lo.os() -core.arch = lo.arch() const MODE_WORD = core.arch === 'arm64' ? 4 : 6 const _builtins = lo.builtins() lo.builtins = () => _builtins @@ -516,7 +535,6 @@ lo.unwrap_memory = lo.unwrapMemory lo.utf8_decode = lo.utf8Decode lo.utf8_encode = lo.utf8Encode lo.utf8_encode_into = lo.utf8EncodeInto -lo.utf8_encode_into_ptr = lo.utf8EncodeIntoPtr lo.utf8_encode_into_at_offset = lo.utf8EncodeIntoAtOffset lo.utf8_length = lo.utf8Length lo.wrap_memory = lo.wrapMemory diff --git a/main_win.h b/main_win.h index efe3d5a..ecb6a7c 100644 --- a/main_win.h +++ b/main_win.h @@ -8,11 +8,13 @@ static unsigned int main_js_len = _binary_main_js_len; extern "C" { + extern void* _register_win(); extern void* _register_core(); } void register_builtins() { lo::builtins_add("main.js", _binary_main_js_start, main_js_len); + lo::modules_add("win", &_register_win); lo::modules_add("core", &_register_core); } From 18335f83d4db3b13df6ea214cfbab817f633a87b Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 1 Jan 2026 13:44:30 +0000 Subject: [PATCH 05/33] chore: windows build - inflate, tweaks --- build.cmd | 15 +++++++++++---- builtins.h | 16 +++++++++++----- lib/core2/api.js | 5 +++++ lib/gen.js | 2 +- lib/proc.js | 2 +- main.js | 14 +++++++++----- main_win.h | 3 +++ 7 files changed, 41 insertions(+), 16 deletions(-) diff --git a/build.cmd b/build.cmd index c2c9ac5..dd4e88f 100644 --- a/build.cmd +++ b/build.cmd @@ -1,7 +1,14 @@ -REM "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" -REM bun gen.js +@echo off +if "%WindowsSdkDir%"== "" ( + call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" +) +if exist lo.exe ( + lo.exe gen --builtins --win main.js lib/inflate.js > builtins.h + lo.exe gen lib\core2\api.js > lib\core2\core.cc +) clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/win/win.cc -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/core2/core.cc +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./lib/inflate /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/inflate/inflate.cc clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.24-pre\" -DRUNTIME=\"lo\" lo.cc clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.24-pre\" -DRUNTIME=\"lo\" main.cc -clang-cl.exe v8\v8_monolith.lib lo.obj main.obj win.obj core.obj winmm.lib /link /machine:x64 /SUBSYSTEM:console /out:lo.exe /WHOLEARCHIVE /WX +clang-cl.exe v8\v8_monolith.lib lo.obj main.obj win.obj core.obj inflate.obj lib\inflate\em_inflate.o winmm.lib /link /machine:x64 /SUBSYSTEM:console /out:lo.exe /WHOLEARCHIVE /WX diff --git a/builtins.h b/builtins.h index e52949d..8077c5e 100644 --- a/builtins.h +++ b/builtins.h @@ -1,5 +1,11 @@ - -const char _binary_main_js_start[] = { -0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0xa, 0x2f, 0x2f, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xa, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x7d, 0x20, 0x64, 0x65, 0x73, 0x74, 0xa, 0x20, 0x20, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x20, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x20, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x64, 0x65, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xa, 0xa, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x7d, 0x20, 0x75, 0x38, 0xa, 0x20, 0x20, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7d, 0x20, 0x65, 0x72, 0x72, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x2f, 0x5c, 0x73, 0x2b, 0x61, 0x74, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x5c, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x5c, 0x2e, 0x6a, 0x73, 0x2e, 0x2b, 0x2f, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x30, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5f, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x49, 0x73, 0x53, 0x61, 0x66, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x61, 0x66, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0xa, 0x20, 0x20, 0x20, 0x20, 0x27, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x27, 0x63, 0x61, 0x6c, 0x6c, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x60, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x7b, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x24, 0x7b, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x7d, 0x60, 0x2c, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x75, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x74, 0x72, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x75, 0x38, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3f, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x73, 0x74, 0x72, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x30, 0x60, 0x29, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x66, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x20, 0x28, 0x75, 0x33, 0x32, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x20, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x20, 0x26, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x4d, 0x54, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3c, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x31, 0x36, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x5b, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x5d, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x2c, 0x20, 0x60, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x24, 0x7b, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x5b, 0x31, 0x32, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x5b, 0x35, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x5b, 0x36, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x20, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x38, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x6f, 0x66, 0x66, 0x29, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x2b, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x75, 0x38, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x2f, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x2b, 0x3d, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0xa, 0x2f, 0x2f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x6b, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x2d, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0x29, 0x20, 0x7c, 0x7c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x60, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x73, 0x79, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x43, 0x4a, 0x53, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x29, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x72, 0x63, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x72, 0x63, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x45, 0x53, 0x4d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x72, 0x63, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x72, 0x63, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x60, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x68, 0x79, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x3f, 0x3f, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6a, 0x73, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0xa, 0x2a, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0xa, 0x2a, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x61, 0x64, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6a, 0x75, 0x73, 0x74, 0xa, 0x2a, 0x20, 0x60, 0x60, 0x60, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x27, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x27, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x27, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x66, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0xa, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x65, 0x20, 0x67, 0x72, 0x61, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0xa, 0x2a, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x20, 0x7b, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x7d, 0x20, 0x61, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x64, 0x69, 0x65, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x73, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x65, 0x20, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x46, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0xa, 0x20, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x2c, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x27, 0x63, 0x6f, 0x72, 0x65, 0x27, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x2c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x2c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x57, 0x55, 0x53, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x55, 0x53, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x47, 0x52, 0x50, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x4f, 0x54, 0x48, 0x2c, 0xa, 0x20, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x2c, 0x20, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x4d, 0x54, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x73, 0x74, 0x61, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2c, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x29, 0xa, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x28, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x35, 0x36, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x28, 0x62, 0x75, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x62, 0x75, 0x66, 0x2c, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6f, 0x73, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x20, 0x3f, 0x20, 0x33, 0x32, 0x37, 0x36, 0x37, 0x20, 0x3a, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x20, 0x3d, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x28, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x55, 0x53, 0x52, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x57, 0x55, 0x53, 0x52, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x47, 0x52, 0x50, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x4f, 0x54, 0x48, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x20, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x4f, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x53, 0x5f, 0x49, 0x57, 0x52, 0x49, 0x54, 0x45, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x4f, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0xa, 0x7d, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0xa, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x30, 0x29, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x7d, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x6e, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x41, 0x44, 0x2c, 0x20, 0x41, 0x30, 0x2c, 0x20, 0x41, 0x52, 0x2c, 0x20, 0x41, 0x47, 0x2c, 0x20, 0x41, 0x59, 0x2c, 0x20, 0x41, 0x42, 0x2c, 0x20, 0x41, 0x4d, 0x2c, 0x20, 0x41, 0x43, 0x2c, 0x20, 0x41, 0x57, 0x20, 0x7d, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x7d, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x5f, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0xa, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x29, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x22, 0x6c, 0x6f, 0x22, 0x3f, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x29, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0xa, 0x7d, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x27, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x27, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x30, 0x27, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0xa, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x29, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x32, 0x29, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x36, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x2c, 0x20, 0x33, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x2c, 0x20, 0x33, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x28, 0x29, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x62, 0x6f, 0x74, 0x68, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x72, 0x6d, 0x36, 0x34, 0x27, 0x20, 0x3f, 0x20, 0x34, 0x20, 0x3a, 0x20, 0x36, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x64, 0x65, 0x70, 0x72, 0x61, 0x63, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x2e, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x3f, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x28, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x6c, 0x6f, 0x2e, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x6c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0xa, 0x2f, 0x2a, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x5f, 0x7a, 0x61, 0x70, 0x5f, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x5f, 0x7a, 0x61, 0x70, 0x5f, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0xa, 0x6c, 0x6f, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x5f, 0x61, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x75, 0x70, 0x2f, 0x64, 0x65, 0x63, 0x69, 0x64, 0x65, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, 0xa, 0x2f, 0x2a, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x60, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x73, 0x79, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2e, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x77, 0x65, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x2f, 0x5c, 0x28, 0x3f, 0x28, 0x5b, 0x5c, 0x77, 0x5c, 0x2f, 0x5c, 0x2e, 0x5c, 0x2d, 0x5f, 0x5d, 0x2b, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x2b, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x2b, 0x29, 0x5c, 0x29, 0x3f, 0x2f, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x31, 0x5d, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x5c, 0x6e, 0x24, 0x7b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x5c, 0x6e, 0x24, 0x7b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x20, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x67, 0x65, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x67, 0x65, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x6e, 0x69, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x72, 0x65, 0x70, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x65, 0x76, 0x61, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x65, 0x73, 0x74, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x72, 0x76, 0x65, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x7d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, 0x65, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xa, 0xa, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x7d, 0xa -}; -unsigned int _binary_main_js_len = 19877; + +const char _binary_main_js_start[] = { +0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0xa, 0x2f, 0x2f, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xa, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x7d, 0x20, 0x64, 0x65, 0x73, 0x74, 0xa, 0x20, 0x20, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x20, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x73, 0x73, 0x20, 0x61, 0x20, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x73, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x64, 0x65, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x27, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x27, 0xa, 0xa, 0x20, 0x20, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x20, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x7d, 0x20, 0x75, 0x38, 0xa, 0x20, 0x20, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x64, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x7d, 0x20, 0x65, 0x72, 0x72, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x6c, 0x69, 0x6e, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x28, 0x2f, 0x5c, 0x73, 0x2b, 0x61, 0x74, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x5c, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x5c, 0x2e, 0x6a, 0x73, 0x2e, 0x2b, 0x2f, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x7b, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x7d, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x28, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x22, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x78, 0x5f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x20, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x66, 0x6e, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x70, 0x6c, 0x65, 0x6e, 0x29, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x6c, 0x28, 0x30, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x5f, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x2e, 0x49, 0x73, 0x53, 0x61, 0x66, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x61, 0x66, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0xa, 0x20, 0x20, 0x20, 0x20, 0x27, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x27, 0x63, 0x61, 0x6c, 0x6c, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x60, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x24, 0x7b, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x7d, 0x24, 0x7b, 0x70, 0x6c, 0x65, 0x6e, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x7d, 0x60, 0x2c, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x75, 0x6e, 0x20, 0x3d, 0x20, 0x66, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x29, 0x20, 0x66, 0x75, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x75, 0x6e, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x74, 0x72, 0x20, 0x28, 0x75, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x75, 0x38, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x75, 0x38, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3f, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x73, 0x74, 0x72, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x30, 0x60, 0x29, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x66, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x20, 0x28, 0x75, 0x33, 0x32, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x75, 0x33, 0x32, 0x5b, 0x31, 0x5d, 0x29, 0x20, 0x20, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x61, 0x6c, 0x20, 0x26, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x4d, 0x54, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3c, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x31, 0x36, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x28, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x5b, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x5d, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x2c, 0x20, 0x60, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x24, 0x7b, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x73, 0x74, 0x61, 0x74, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x5b, 0x31, 0x32, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x5b, 0x35, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x5b, 0x36, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x20, 0x2d, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x61, 0x78, 0x20, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x38, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x6f, 0x66, 0x66, 0x29, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x2b, 0x3d, 0x20, 0x6c, 0x65, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x38, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x75, 0x38, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x75, 0x38, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x65, 0x6e, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x2d, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x66, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x65, 0x69, 0x6c, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x2f, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x2b, 0x3d, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x4d, 0x61, 0x74, 0x68, 0x2e, 0x6d, 0x69, 0x6e, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x75, 0x38, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0x2c, 0x20, 0x74, 0x6f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x29, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3c, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x20, 0x2b, 0x3d, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3e, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x28, 0x66, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x61, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0xa, 0x2f, 0x2f, 0x20, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x6b, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x2d, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0x29, 0x20, 0x7c, 0x7c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x60, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x73, 0x79, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x43, 0x4a, 0x53, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x29, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x72, 0x63, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x72, 0x63, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x45, 0x53, 0x4d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x72, 0x63, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x72, 0x63, 0x20, 0x7c, 0x7c, 0x20, 0x28, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x20, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x60, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x68, 0x79, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x3f, 0x3f, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x77, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x68, 0x65, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x28, 0x73, 0x72, 0x63, 0x2c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x78, 0x69, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x6a, 0x73, 0x20, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x2e, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x72, 0x65, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0xa, 0x2a, 0x20, 0x62, 0x65, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x69, 0x74, 0x27, 0x73, 0x20, 0x75, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x20, 0x74, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0xa, 0x2a, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x61, 0x64, 0x64, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x69, 0x74, 0x20, 0x77, 0x61, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x6a, 0x75, 0x73, 0x74, 0xa, 0x2a, 0x20, 0x60, 0x60, 0x60, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x7b, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x7d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x27, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x27, 0x2c, 0x20, 0x27, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x27, 0x2c, 0x20, 0x27, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x27, 0x2c, 0x20, 0x73, 0x72, 0x63, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x3a, 0x20, 0x7b, 0x7d, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x66, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x2c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x2e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x73, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x64, 0x69, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x72, 0xa, 0x2a, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x65, 0x73, 0x74, 0x20, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x6f, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x65, 0x20, 0x67, 0x72, 0x61, 0x63, 0x65, 0x66, 0x75, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, 0x67, 0x20, 0x61, 0x73, 0x20, 0x6d, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0xa, 0x2a, 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x73, 0x20, 0x68, 0x65, 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x62, 0x6c, 0x65, 0xa, 0x2a, 0x20, 0x40, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x20, 0x65, 0x72, 0x72, 0x20, 0x7b, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x7d, 0x20, 0x61, 0x20, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0xa, 0x2a, 0x2f, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x20, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x64, 0x69, 0x65, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x6a, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x69, 0x66, 0x20, 0x77, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x73, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x77, 0x64, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x70, 0x74, 0x72, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x69, 0x65, 0x20, 0x28, 0x65, 0x72, 0x72, 0x2c, 0x20, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x69, 0x64, 0x65, 0x5f, 0x66, 0x61, 0x74, 0x61, 0x6c, 0x29, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x46, 0x61, 0x74, 0x61, 0x6c, 0x20, 0x45, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0xa, 0x20, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x78, 0x69, 0x74, 0x2c, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x2c, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x2c, 0x20, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x27, 0x63, 0x6f, 0x72, 0x65, 0x27, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x2c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x2c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x57, 0x55, 0x53, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x55, 0x53, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x47, 0x52, 0x50, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x4f, 0x54, 0x48, 0x2c, 0xa, 0x20, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x52, 0x45, 0x47, 0x2c, 0x20, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x2c, 0x20, 0x53, 0x5f, 0x49, 0x46, 0x4d, 0x54, 0x2c, 0x20, 0x52, 0x54, 0x4c, 0x44, 0x5f, 0x4c, 0x41, 0x5a, 0x59, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x73, 0x74, 0x61, 0x74, 0x2c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x2c, 0x20, 0x63, 0x6c, 0x6f, 0x73, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x6e, 0x6c, 0x65, 0x6e, 0xa, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x32, 0x29, 0xa, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x2e, 0x73, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x28, 0x30, 0x2c, 0x20, 0x32, 0x35, 0x36, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x35, 0x36, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x28, 0x62, 0x75, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x62, 0x75, 0x66, 0x2c, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x72, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6f, 0x73, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x20, 0x3f, 0x20, 0x33, 0x32, 0x37, 0x36, 0x37, 0x20, 0x3a, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x41, 0x58, 0x5f, 0x44, 0x49, 0x52, 0x20, 0x3d, 0x20, 0x36, 0x35, 0x35, 0x33, 0x36, 0x20, 0x2f, 0x2f, 0x20, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x2d, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x28, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x61, 0x74, 0x74, 0x79, 0x20, 0x3f, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x55, 0x53, 0x52, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x57, 0x55, 0x53, 0x52, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x47, 0x52, 0x50, 0x20, 0x7c, 0x20, 0x53, 0x5f, 0x49, 0x52, 0x4f, 0x54, 0x48, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x57, 0x52, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x20, 0x7c, 0x20, 0x4f, 0x5f, 0x54, 0x52, 0x55, 0x4e, 0x43, 0x20, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x4f, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x53, 0x5f, 0x49, 0x57, 0x52, 0x49, 0x54, 0x45, 0xa, 0x20, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x61, 0x64, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x5f, 0x4f, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0xa, 0x7d, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x4d, 0x41, 0x58, 0x5f, 0x45, 0x4e, 0x56, 0x29, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x30, 0x29, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x74, 0x31, 0x36, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x61, 0x74, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x67, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x3a, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x74, 0x72, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x7d, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x6f, 0x6e, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0xa, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x41, 0x44, 0x2c, 0x20, 0x41, 0x30, 0x2c, 0x20, 0x41, 0x52, 0x2c, 0x20, 0x41, 0x47, 0x2c, 0x20, 0x41, 0x59, 0x2c, 0x20, 0x41, 0x42, 0x2c, 0x20, 0x41, 0x4d, 0x2c, 0x20, 0x41, 0x43, 0x2c, 0x20, 0x41, 0x57, 0x20, 0x7d, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x2b, 0x20, 0x28, 0x28, 0x32, 0x20, 0x2a, 0x2a, 0x20, 0x33, 0x32, 0x29, 0x20, 0x2a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x7d, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x5f, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x68, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0xa, 0x20, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x28, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x2c, 0x20, 0x66, 0x72, 0x65, 0x65, 0x29, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x61, 0x64, 0x64, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x64, 0x64, 0x72, 0xa, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x77, 0x65, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x70, 0x75, 0x74, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x20, 0x22, 0x6c, 0x6f, 0x22, 0x3f, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x29, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0xa, 0x7d, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x27, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x63, 0x77, 0x64, 0x28, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x27, 0x4c, 0x4f, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x45, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x30, 0x27, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x68, 0x6f, 0x6d, 0x65, 0x64, 0x69, 0x72, 0x20, 0x3d, 0x20, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0xa, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x29, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x32, 0x29, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x6d, 0x61, 0x70, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x6d, 0x61, 0x70, 0x2c, 0x20, 0x36, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x63, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x63, 0x70, 0x79, 0x2c, 0x20, 0x33, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6d, 0x65, 0x6d, 0x6d, 0x6f, 0x76, 0x65, 0x2c, 0x20, 0x33, 0x29, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x61, 0x70, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x2c, 0x20, 0x32, 0x29, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x69, 0x61, 0x6e, 0x28, 0x29, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x62, 0x6f, 0x74, 0x68, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x61, 0x72, 0x63, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x72, 0x6d, 0x36, 0x34, 0x27, 0x20, 0x3f, 0x20, 0x34, 0x20, 0x3a, 0x20, 0x36, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x5f, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x64, 0x65, 0x70, 0x72, 0x61, 0x63, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0x28, 0x29, 0x20, 0x69, 0x6e, 0x20, 0x66, 0x61, 0x76, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x6f, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x2e, 0x20, 0x77, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6e, 0x79, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x71, 0x75, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x6f, 0x20, 0x77, 0x65, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x70, 0x65, 0x72, 0x20, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x3f, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x28, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0xa, 0x6c, 0x6f, 0x2e, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x69, 0x61, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x61, 0x6d, 0x65, 0x6c, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x77, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0xa, 0x2f, 0x2a, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x29, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x5f, 0x7a, 0x61, 0x70, 0x5f, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x5d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x5f, 0x7a, 0x61, 0x70, 0x5f, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2c, 0x20, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, 0x2c, 0x20, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x68, 0x79, 0x73, 0x69, 0x63, 0x61, 0x6c, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x36, 0x29, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x68, 0x65, 0x61, 0x70, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x68, 0x65, 0x61, 0x70, 0x73, 0x74, 0x61, 0x74, 0x73, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x77, 0x72, 0x69, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0xa, 0x2f, 0x2f, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x67, 0x65, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x69, 0x63, 0x6b, 0xa, 0x6c, 0x6f, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x70, 0x75, 0x6d, 0x70, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x61, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x54, 0x61, 0x73, 0x6b, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x72, 0x75, 0x6e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x46, 0x6c, 0x61, 0x67, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x73, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x6f, 0x5f, 0x61, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x74, 0x6f, 0x41, 0x74, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0xa, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x75, 0x74, 0x66, 0x38, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x77, 0x72, 0x61, 0x70, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0xa, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x5f, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x61, 0x74, 0x69, 0x6e, 0x31, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x66, 0x69, 0x78, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x75, 0x70, 0x2f, 0x64, 0x65, 0x63, 0x69, 0x64, 0x65, 0x20, 0x65, 0x78, 0x61, 0x63, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x6f, 0x65, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x20, 0x77, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, 0xa, 0x2f, 0x2a, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x24, 0x7b, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x72, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x68, 0x6f, 0x6d, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x24, 0x7b, 0x4c, 0x4f, 0x5f, 0x48, 0x4f, 0x4d, 0x45, 0x7d, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0x2c, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x79, 0x6d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x64, 0x6c, 0x73, 0x79, 0x6d, 0x28, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x2c, 0x20, 0x60, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x73, 0x79, 0x6d, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x28, 0x73, 0x79, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x6c, 0x69, 0x62, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x6c, 0x69, 0x62, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x2e, 0x73, 0x6f, 0x60, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x2e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0xa, 0x20, 0x20, 0x6c, 0x69, 0x62, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0xa, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x27, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x6f, 0x2e, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x67, 0x65, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x2e, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x77, 0x65, 0x20, 0x6d, 0x69, 0x67, 0x68, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x69, 0x74, 0x20, 0x77, 0x6f, 0x6e, 0x27, 0x74, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x63, 0x68, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x69, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x74, 0x68, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x35, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2b, 0x20, 0x35, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x6c, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x7b, 0x28, 0x69, 0x20, 0x2b, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x2d, 0x20, 0x34, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x34, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x20, 0x24, 0x7b, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x34, 0x20, 0x3f, 0x20, 0x41, 0x4d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x6c, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x2f, 0x5c, 0x28, 0x3f, 0x28, 0x5b, 0x5c, 0x77, 0x5c, 0x2f, 0x5c, 0x2e, 0x5c, 0x2d, 0x5f, 0x5d, 0x2b, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x2b, 0x29, 0x3a, 0x28, 0x5c, 0x64, 0x2b, 0x29, 0x5c, 0x29, 0x3f, 0x2f, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x65, 0x72, 0x72, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x78, 0x5f, 0x65, 0x72, 0x72, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x28, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x31, 0x5d, 0x2e, 0x74, 0x72, 0x69, 0x6d, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x32, 0x5d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5b, 0x33, 0x5d, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x67, 0x65, 0x74, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x2c, 0x20, 0x63, 0x6f, 0x6c, 0x5f, 0x6e, 0x75, 0x6d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x5c, 0x6e, 0x24, 0x7b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x52, 0x7d, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x20, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x5c, 0x6e, 0x24, 0x7b, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2e, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x31, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x74, 0x63, 0x2e, 0x20, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x73, 0x2c, 0x20, 0x62, 0x75, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x62, 0x65, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x28, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0xa, 0x20, 0x20, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x67, 0x65, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x67, 0x65, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x67, 0x65, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x73, 0x72, 0x63, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x62, 0x65, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x65, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x6e, 0x69, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x69, 0x6e, 0x69, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x72, 0x65, 0x70, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x29, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x65, 0x76, 0x61, 0x6c, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x32, 0x5d, 0x29, 0x29, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x2c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x2c, 0x20, 0x74, 0x65, 0x73, 0x74, 0x2c, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x32, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x65, 0x73, 0x74, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x74, 0x65, 0x73, 0x74, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x62, 0x65, 0x6e, 0x63, 0x68, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x72, 0x76, 0x65, 0x29, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x28, 0x2e, 0x2e, 0x2e, 0x70, 0x61, 0x72, 0x67, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x29, 0x20, 0x7b, 0x7d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x27, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, 0x65, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x28, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x2e, 0x63, 0x61, 0x74, 0x63, 0x68, 0x28, 0x64, 0x69, 0x65, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x65, 0x6e, 0x64, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0xa, 0xa, 0x74, 0x72, 0x79, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x62, 0x6f, 0x6f, 0x74, 0x73, 0x74, 0x72, 0x61, 0x70, 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x28, 0x29, 0xa, 0x7d, 0x20, 0x63, 0x61, 0x74, 0x63, 0x68, 0x20, 0x28, 0x65, 0x72, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x28, 0x60, 0x24, 0x7b, 0x65, 0x72, 0x72, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x7d, 0xa +}; +unsigned int _binary_main_js_len = 20014; + +const char _binary_lib_inflate_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x27, 0x29, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x44, 0x45, 0x46, 0x4c, 0x41, 0x54, 0x45, 0x20, 0x3d, 0x20, 0x38, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x4f, 0x53, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x20, 0x3d, 0x20, 0x33, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x28, 0x62, 0x75, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x5b, 0x20, 0x69, 0x64, 0x31, 0x2c, 0x20, 0x69, 0x64, 0x32, 0x2c, 0x20, 0x63, 0x6d, 0x2c, 0x20, 0x66, 0x6c, 0x67, 0x2c, 0x20, 0x2c, 0x20, 0x2c, 0x20, 0x2c, 0x20, 0x2c, 0x20, 0x78, 0x66, 0x6c, 0x2c, 0x20, 0x6f, 0x73, 0x20, 0x5d, 0x20, 0x3d, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x73, 0x75, 0x62, 0x61, 0x72, 0x72, 0x61, 0x79, 0x28, 0x30, 0x2c, 0x20, 0x31, 0x30, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x69, 0x64, 0x31, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x78, 0x31, 0x66, 0x20, 0x26, 0x26, 0x20, 0x69, 0x64, 0x32, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x78, 0x38, 0x62, 0x2c, 0x20, 0x27, 0x67, 0x7a, 0x69, 0x70, 0x20, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x27, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x63, 0x6d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x44, 0x45, 0x46, 0x4c, 0x41, 0x54, 0x45, 0x2c, 0x20, 0x27, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x67, 0x7a, 0x69, 0x70, 0x20, 0x64, 0x65, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x27, 0x29, 0xa, 0x20, 0x20, 0x2f, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4f, 0x53, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x2c, 0x20, 0x27, 0x6e, 0x6f, 0x74, 0x20, 0x61, 0x20, 0x75, 0x6e, 0x69, 0x78, 0x20, 0x6f, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x28, 0x62, 0x75, 0x66, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x38, 0x2c, 0x20, 0x38, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x2e, 0x67, 0x65, 0x74, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x28, 0x34, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x54, 0x45, 0x58, 0x54, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x37, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x48, 0x43, 0x52, 0x43, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x36, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x45, 0x58, 0x54, 0x52, 0x41, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x35, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x4e, 0x41, 0x4d, 0x45, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x34, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x20, 0x3d, 0x20, 0x28, 0x66, 0x6c, 0x67, 0x20, 0x3e, 0x3e, 0x20, 0x33, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x64, 0x31, 0x2c, 0x20, 0x69, 0x64, 0x32, 0x2c, 0x20, 0x63, 0x6d, 0x2c, 0x20, 0x66, 0x6c, 0x67, 0x2c, 0x20, 0x78, 0x66, 0x6c, 0x2c, 0x20, 0x6f, 0x73, 0x2c, 0x20, 0x46, 0x54, 0x45, 0x58, 0x54, 0x2c, 0x20, 0x46, 0x48, 0x43, 0x52, 0x43, 0x2c, 0x20, 0x46, 0x45, 0x58, 0x54, 0x52, 0x41, 0x2c, 0x20, 0x46, 0x4e, 0x41, 0x4d, 0x45, 0x2c, 0x20, 0x46, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x28, 0x62, 0x75, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x28, 0x62, 0x75, 0x66, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x70, 0x74, 0x72, 0x28, 0x62, 0x75, 0x66, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x69, 0x7a, 0x65, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x62, 0x2e, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x64, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x60, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x65, 0x64, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x24, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x7d, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x24, 0x7b, 0x73, 0x69, 0x7a, 0x65, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x74, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x69, 0x6e, 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_inflate_js_len = 1087; + diff --git a/lib/core2/api.js b/lib/core2/api.js index dbcac4c..dcf6f1c 100644 --- a/lib/core2/api.js +++ b/lib/core2/api.js @@ -210,6 +210,11 @@ const api = { } const preamble = ` +#ifdef _WIN32 +#define strdup _strdup +#endif + + struct fastcall { void* wrapper; // 0-7 : v8 fastcall wrapper function pointer uint8_t result; // 8 : the type of the result diff --git a/lib/gen.js b/lib/gen.js index 19ec833..05d4b9c 100644 --- a/lib/gen.js +++ b/lib/gen.js @@ -667,7 +667,7 @@ async function gen (args) { } else { source = bindings(await import(args[0])) } - console.log(source) + return source } export { diff --git a/lib/proc.js b/lib/proc.js index 462436a..6b34ec0 100644 --- a/lib/proc.js +++ b/lib/proc.js @@ -4,7 +4,7 @@ const { setenv } = core const noop = () => {} -let mem = noop +let mem = () => 0 let exec = noop let exec_path_env = noop let exec_env = noop diff --git a/main.js b/main.js index 7df21a4..2dc3f22 100644 --- a/main.js +++ b/main.js @@ -377,6 +377,7 @@ function get_address (buf) { return addr(handle) } +const handle = new Uint32Array(2) core.os = lo.os() core.arch = lo.arch() const MAX_ENV = core.os === 'win' ? 32767 : 65536 // maximum environment variable size - todo @@ -391,8 +392,6 @@ const AB = isatty ? '\u001b[34m' : '' // ANSI Blue const AM = isatty ? '\u001b[35m' : '' // ANSI Magenta const AC = isatty ? '\u001b[36m' : '' // ANSI Cyan const AW = isatty ? '\u001b[37m' : '' // ANSI White -const env_buf = ptr(new Uint8Array(MAX_ENV)) - let defaultReadFlags = O_RDONLY let defaultWriteFlags = O_WRONLY | O_CREAT | O_TRUNC let defaultWriteMode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH @@ -405,8 +404,8 @@ core.defaultWriteFlags = defaultWriteFlags core.defaultWriteMode = defaultWriteMode const encoder = new TextEncoder() const decoder = new TextDecoder() -const handle = new Uint32Array(2) handle.ptr = get_address(handle) +//const env_buf = ptr(new Uint8Array(MAX_ENV)) const stat = ptr(new Uint8Array(160)) const stat32 = new Uint32Array(stat.buffer) const stat16 = new Uint16Array(stat.buffer) @@ -631,7 +630,8 @@ async function global_main () { const command = args[1] try { if (command === 'gen') { - await (await import('lib/gen.js')).gen(args.slice(2)) + const src = await (await import('lib/gen.js')).gen(args.slice(2)) + console.log(src) } else if (command === 'build') { //todo: should be awaited await (await import('lib/build.js')).build(args.slice(2)) @@ -673,6 +673,10 @@ if (workerSource) { } // end bootstrap_runtime -bootstrap_runtime() +try { + bootstrap_runtime() +} catch (err) { + lo.print(`${err.stack}\n`) +} export {} diff --git a/main_win.h b/main_win.h index ecb6a7c..b66523a 100644 --- a/main_win.h +++ b/main_win.h @@ -10,12 +10,15 @@ static unsigned int main_js_len = _binary_main_js_len; extern "C" { extern void* _register_win(); extern void* _register_core(); + extern void* _register_inflate(); } void register_builtins() { lo::builtins_add("main.js", _binary_main_js_start, main_js_len); + lo::builtins_add("lib/inflate.js", _binary_lib_inflate_js_start, _binary_lib_inflate_js_len); lo::modules_add("win", &_register_win); lo::modules_add("core", &_register_core); + lo::modules_add("inflate", &_register_inflate); } static const char* index_js = NULL; From f9f68574024a8d41d762c83d932e70bf74092f27 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 1 Jan 2026 14:44:36 +0000 Subject: [PATCH 06/33] chore: generate main_win.h --- build.cmd | 7 ++++-- main_win.h | 70 ++++++++++++++++++++++++------------------------------ 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/build.cmd b/build.cmd index dd4e88f..3c8400b 100644 --- a/build.cmd +++ b/build.cmd @@ -1,14 +1,17 @@ @echo off +set VERSION=0.0.24-pre +set RUNTIME=lo if "%WindowsSdkDir%"== "" ( call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" ) if exist lo.exe ( lo.exe gen --builtins --win main.js lib/inflate.js > builtins.h lo.exe gen lib\core2\api.js > lib\core2\core.cc + lo.exe gen --header --win core.a win.a inflate.a lib/inflate.js > main_win.h ) clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/win/win.cc clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./lib/inflate /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/inflate/inflate.cc -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.24-pre\" -DRUNTIME=\"lo\" lo.cc -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"0.0.24-pre\" -DRUNTIME=\"lo\" main.cc +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc +clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc clang-cl.exe v8\v8_monolith.lib lo.obj main.obj win.obj core.obj inflate.obj lib\inflate\em_inflate.o winmm.lib /link /machine:x64 /SUBSYSTEM:console /out:lo.exe /WHOLEARCHIVE /WX diff --git a/main_win.h b/main_win.h index b66523a..11fb624 100644 --- a/main_win.h +++ b/main_win.h @@ -1,39 +1,31 @@ -#pragma once -// [do not edit,] -// This file has been automatically generated, please do not change unless you disable auto-generation in the Makefile - -#include "lo.h" -#include "builtins.h" - -static unsigned int main_js_len = _binary_main_js_len; - -extern "C" { - extern void* _register_win(); - extern void* _register_core(); - extern void* _register_inflate(); -} - -void register_builtins() { - lo::builtins_add("main.js", _binary_main_js_start, main_js_len); - lo::builtins_add("lib/inflate.js", _binary_lib_inflate_js_start, _binary_lib_inflate_js_len); - lo::modules_add("win", &_register_win); - lo::modules_add("core", &_register_core); - lo::modules_add("inflate", &_register_inflate); -} - -static const char* index_js = NULL; -static unsigned int index_js_len = 0; - -static const char* main_js = _binary_main_js_start; - -static const char* v8flags = "--stack-trace-limit=10 --use-strict --turbo-fast-api-calls --no-freeze-flags-after-init --cppgc-young-generation"; -static unsigned int _v8flags_from_commandline = 1; -static unsigned int _v8_threads = 2; -static unsigned int _v8_cleanup = 0; -static unsigned int _on_exit = 0; -#ifdef __linux__ - -#endif -#ifdef __MACH__ - -#endif +#pragma once +// [do not edit,] +// This file has been automatically generated, please do not change unless you disable auto-generation in the Makefile + +#include "lo.h" + +#include "builtins.h" +static unsigned int main_js_len = _binary_main_js_len; + +extern "C" { + extern void* _register_core(); + extern void* _register_win(); + extern void* _register_inflate(); +} + +void register_builtins() { + lo::builtins_add("main.js", _binary_main_js_start, _binary_main_js_len); + lo::builtins_add("lib/inflate.js", _binary_lib_inflate_js_start, _binary_lib_inflate_js_len); + lo::modules_add("core", &_register_core); + lo::modules_add("win", &_register_win); + lo::modules_add("inflate", &_register_inflate); +} +static const char* index_js = NULL; +static unsigned int index_js_len = 0; +static const char* main_js = _binary_main_js_start; +static const char* v8flags = "--stack-trace-limit=10 --use-strict --turbo-fast-api-calls --no-freeze-flags-after-init --cppgc-young-generation"; +static unsigned int _v8flags_from_commandline = 1; +static unsigned int _v8_threads = 2; +static unsigned int _v8_cleanup = 0; +static unsigned int _on_exit = 0; + From eccf0d326bc6a5b6dea982933439df90e5a98af3 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 1 Jan 2026 14:49:54 +0000 Subject: [PATCH 07/33] chore: build inflate for windows --- build.cmd | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.cmd b/build.cmd index 3c8400b..f267ecb 100644 --- a/build.cmd +++ b/build.cmd @@ -11,6 +11,11 @@ if exist lo.exe ( ) clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/win/win.cc clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc +cd lib\inflate +curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.h +curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.c +clang -I. -c -o em_inflate.o -O3 em_inflate.c +cd ..\.. clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./lib/inflate /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/inflate/inflate.cc clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc From 3a27e13d6e3487483c344e704983eb56ed7b9fc9 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 1 Jan 2026 14:55:52 +0000 Subject: [PATCH 08/33] chore: more builtins for windows --- build.cmd | 5 +++-- builtins.h | 25 +++++++++++++++++++++++++ main_win.h | 5 +++++ test.cmd | 4 ++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 test.cmd diff --git a/build.cmd b/build.cmd index f267ecb..7894ce3 100644 --- a/build.cmd +++ b/build.cmd @@ -1,13 +1,14 @@ @echo off set VERSION=0.0.24-pre set RUNTIME=lo +set BUILTINS=lib/inflate.js lib/gen.js lib/path.js lib/proc.js lib/stringify.js lib/binary.js if "%WindowsSdkDir%"== "" ( call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" ) if exist lo.exe ( - lo.exe gen --builtins --win main.js lib/inflate.js > builtins.h + lo.exe gen --builtins --win main.js %BUILTINS% > builtins.h lo.exe gen lib\core2\api.js > lib\core2\core.cc - lo.exe gen --header --win core.a win.a inflate.a lib/inflate.js > main_win.h + lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h ) clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/win/win.cc clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc diff --git a/builtins.h b/builtins.h index 8077c5e..6c0894f 100644 --- a/builtins.h +++ b/builtins.h @@ -9,3 +9,28 @@ const char _binary_lib_inflate_js_start[] = { }; unsigned int _binary_lib_inflate_js_len = 1087; +const char _binary_lib_gen_js_start[] = { +0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x27, 0x6c, 0x69, 0x62, 0x2f, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6a, 0x73, 0x27, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x20, 0x28, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x21, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x70, 0x61, 0x72, 0x73, 0x65, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x28, 0x6e, 0x29, 0x29, 0x20, 0x26, 0x26, 0x20, 0x69, 0x73, 0x46, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x28, 0x6e, 0x29, 0x3b, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x28, 0x74, 0x2c, 0x20, 0x72, 0x76, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x38, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x31, 0x36, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x38, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x31, 0x36, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x31, 0x36, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x73, 0x7a, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x69, 0x6e, 0x74, 0x70, 0x74, 0x72, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x73, 0x7a, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x70, 0x74, 0x72, 0x5f, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x4f, 0x6e, 0x65, 0x42, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x41, 0x70, 0x69, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x41, 0x70, 0x69, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x76, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x38, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x56, 0x6f, 0x69, 0x64, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x32, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x36, 0x34, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x53, 0x65, 0x71, 0x4f, 0x6e, 0x65, 0x42, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x49, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x3a, 0x6b, 0x4e, 0x6f, 0x6e, 0x65, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x49, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x3a, 0x6b, 0x4e, 0x6f, 0x6e, 0x65, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x6b, 0x56, 0x6f, 0x69, 0x64, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x20, 0x28, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x38, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x66, 0x33, 0x32, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x28, 0x64, 0x65, 0x66, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x28, 0x60, 0x2f, 0x2f, 0x20, 0x24, 0x7b, 0x64, 0x65, 0x66, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x7d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x7d, 0x20, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x60, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x26, 0x26, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x7d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x26, 0x26, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2a, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x7d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x21, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x26, 0x26, 0x20, 0x64, 0x65, 0x66, 0x2e, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x5d, 0x29, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x27, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x41, 0x70, 0x69, 0x54, 0x79, 0x70, 0x65, 0x64, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x20, 0x46, 0x61, 0x73, 0x74, 0x4f, 0x6e, 0x65, 0x42, 0x79, 0x74, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2a, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x70, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x29, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x79, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x70, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x7d, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x66, 0x61, 0x73, 0x74, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x22, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x7d, 0x22, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x75, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x70, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x54, 0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x20, 0x2d, 0x20, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x28, 0x29, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x7a, 0x65, 0x72, 0x6f, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x2a, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x55, 0x74, 0x66, 0x38, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x2f, 0x2a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x29, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3e, 0x28, 0x29, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x29, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x75, 0x38, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x79, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x54, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x29, 0x3b, 0x60, 0xa, 0x2f, 0x2a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x20, 0x75, 0x33, 0x32, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x20, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x38, 0x5f, 0x74, 0x2a, 0x29, 0x75, 0x33, 0x32, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x75, 0x33, 0x32, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2d, 0x3e, 0x42, 0x79, 0x74, 0x65, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x28, 0x29, 0x3b, 0x60, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x24, 0x7b, 0x70, 0x54, 0x79, 0x70, 0x65, 0x7d, 0x3e, 0x28, 0x70, 0x74, 0x72, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0xa, 0x2a, 0x2f, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x76, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x7d, 0x24, 0x7b, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x5b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5d, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x7d, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x29, 0x7d, 0x20, 0x76, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x20, 0x3d, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x3a, 0x3a, 0x43, 0x61, 0x73, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x5d, 0x29, 0x2d, 0x3e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x70, 0x29, 0x7d, 0x29, 0x2c, 0x60, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x28, 0x7b, 0x20, 0x61, 0x70, 0x69, 0x2c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x20, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x61, 0x70, 0x69, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x63, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x2e, 0x68, 0x61, 0x73, 0x4f, 0x77, 0x6e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x28, 0x6e, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x5b, 0x6e, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x33, 0x32, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x27, 0x69, 0x33, 0x32, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x27, 0x69, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x28, 0x74, 0x79, 0x70, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x28, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x24, 0x7b, 0x74, 0x79, 0x70, 0x65, 0x7d, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x54, 0x4f, 0x44, 0x4f, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x28, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x24, 0x7b, 0x6e, 0x7d, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x2c, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x6f, 0x66, 0x28, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x73, 0x6c, 0x6f, 0x77, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x53, 0x6c, 0x6f, 0x77, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x46, 0x41, 0x53, 0x54, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x26, 0x70, 0x46, 0x24, 0x7b, 0x6e, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x53, 0x6c, 0x6f, 0x77, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x20, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x2c, 0x20, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x26, 0x26, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x26, 0x26, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x76, 0x20, 0x3d, 0x3e, 0x20, 0x76, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x38, 0x3a, 0x3a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x76, 0x38, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x61, 0x72, 0x67, 0x73, 0x24, 0x7b, 0x6e, 0x7d, 0x5b, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x32, 0x7d, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x56, 0x38, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2c, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x29, 0x5c, 0x6e, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x49, 0x73, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2c, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x3a, 0x6b, 0x4e, 0x6f, 0x6e, 0x65, 0x29, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x7d, 0x3b, 0x5c, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x72, 0x63, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x56, 0x6f, 0x69, 0x64, 0x29, 0x3b, 0xa, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x72, 0x63, 0x24, 0x7b, 0x6e, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x32, 0x7d, 0x2c, 0x20, 0x63, 0x61, 0x72, 0x67, 0x73, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x3b, 0xa, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x46, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x29, 0x26, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x26, 0x69, 0x6e, 0x66, 0x6f, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x38, 0x3a, 0x3a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x76, 0x38, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x63, 0x61, 0x72, 0x67, 0x73, 0x24, 0x7b, 0x6e, 0x7d, 0x5b, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x7d, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x6b, 0x56, 0x38, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x29, 0x2c, 0xa, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x6e, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0xa, 0x7d, 0x3b, 0xa, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x72, 0x63, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x3a, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x29, 0x3b, 0xa, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x72, 0x63, 0x24, 0x7b, 0x6e, 0x7d, 0x2c, 0x20, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x7d, 0x2c, 0x20, 0x63, 0x61, 0x72, 0x67, 0x73, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x3b, 0xa, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x70, 0x46, 0x24, 0x7b, 0x6e, 0x7d, 0x20, 0x3d, 0x20, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x29, 0x26, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x26, 0x69, 0x6e, 0x66, 0x6f, 0x24, 0x7b, 0x6e, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x61, 0x70, 0x69, 0x5b, 0x6e, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x2c, 0x20, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x2c, 0x20, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x63, 0x61, 0x73, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x7d, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x20, 0x28, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x24, 0x7b, 0x63, 0x61, 0x73, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x20, 0x3f, 0x20, 0x63, 0x61, 0x73, 0x74, 0x73, 0x5b, 0x69, 0x5d, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x65, 0x63, 0x6c, 0x61, 0x72, 0x65, 0x5f, 0x6f, 0x6e, 0x6c, 0x79, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0xa, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x53, 0x6c, 0x6f, 0x77, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x3c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x20, 0x26, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x20, 0x26, 0x26, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x75, 0x33, 0x32, 0x61, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x20, 0x26, 0x26, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x36, 0x34, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7c, 0x7c, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x2a, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x28, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x3e, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x3e, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x28, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x53, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x20, 0x2b, 0x20, 0x27, 0x2a, 0x27, 0x20, 0x3a, 0x20, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x2a, 0x60, 0x20, 0x3a, 0x20, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x28, 0x72, 0x63, 0x29, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3e, 0x20, 0x61, 0x62, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x76, 0x20, 0x3d, 0x3e, 0x20, 0x76, 0x29, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x5d, 0x2e, 0x41, 0x73, 0x3c, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x28, 0x29, 0x2d, 0x3e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x28, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x28, 0x28, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x2a, 0x29, 0x61, 0x62, 0x2d, 0x3e, 0x44, 0x61, 0x74, 0x61, 0x28, 0x29, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x63, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x69, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x28, 0x72, 0x63, 0x29, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x75, 0x36, 0x34, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x65, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x74, 0x3c, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x3e, 0x28, 0x72, 0x63, 0x29, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x72, 0x63, 0x29, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x28, 0x29, 0x2e, 0x53, 0x65, 0x74, 0x28, 0x72, 0x63, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x7d, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x6f, 0x66, 0x61, 0x73, 0x74, 0x20, 0x7c, 0x7c, 0x20, 0x73, 0x6c, 0x6f, 0x77, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x24, 0x7b, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x20, 0x3a, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x2f, 0x2f, 0x24, 0x7b, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x20, 0x3a, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x6e, 0x7d, 0x46, 0x61, 0x73, 0x74, 0x28, 0x76, 0x38, 0x3a, 0x3a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x76, 0x38, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3e, 0x20, 0x70, 0x24, 0x7b, 0x28, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x7c, 0x7c, 0x20, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x3f, 0x20, 0x27, 0x2c, 0x20, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x28, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x29, 0x7d, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x43, 0x61, 0x73, 0x74, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x2c, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x76, 0x6f, 0x69, 0x64, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x27, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6e, 0x65, 0x65, 0x64, 0x73, 0x55, 0x6e, 0x77, 0x72, 0x61, 0x70, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 0x29, 0x7d, 0x20, 0x72, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x27, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x28, 0x28, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x2a, 0x29, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x20, 0x3d, 0x20, 0x72, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x5f, 0x74, 0x29, 0x72, 0x3b, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x28, 0x28, 0x24, 0x7b, 0x72, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7c, 0x7c, 0x20, 0x67, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x29, 0x7d, 0x2a, 0x29, 0x70, 0x5f, 0x72, 0x65, 0x74, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x29, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x72, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x5c, 0x6e, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x28, 0x70, 0x2c, 0x20, 0x69, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x24, 0x7b, 0x67, 0x65, 0x74, 0x43, 0x61, 0x73, 0x74, 0x28, 0x69, 0x29, 0x7d, 0x76, 0x24, 0x7b, 0x69, 0x7d, 0x24, 0x7b, 0x70, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x27, 0x20, 0x3f, 0x20, 0x27, 0x2d, 0x3e, 0x64, 0x61, 0x74, 0x61, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0x29, 0x3b, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x72, 0x63, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x5c, 0x6e, 0x7d, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0xa, 0x2f, 0x2f, 0x20, 0x5b, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x64, 0x69, 0x74, 0x2c, 0x3c, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x2f, 0x3e, 0x5d, 0xa, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x20, 0xa, 0x24, 0x7b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x63, 0x70, 0x6c, 0x75, 0x73, 0x70, 0x6c, 0x75, 0x73, 0xa, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x22, 0x43, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7b, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x24, 0x7b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x7d, 0x3e, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x63, 0x70, 0x6c, 0x75, 0x73, 0x70, 0x6c, 0x75, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0xa, 0x7d, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x7d, 0xa, 0xa, 0x24, 0x7b, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x5b, 0x27, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x24, 0x7b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x7d, 0x3e, 0x60, 0x29, 0x2c, 0x20, 0x27, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x27, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x24, 0x7b, 0x28, 0x6d, 0x61, 0x63, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x5b, 0x27, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0x27, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x6d, 0x61, 0x63, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x24, 0x7b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x7d, 0x3e, 0x60, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x5c, 0x6e, 0x27, 0x29, 0x2c, 0x20, 0x27, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x27, 0x5d, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0xa, 0xa, 0xa, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x3c, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x2e, 0x68, 0x3e, 0xa, 0xa, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x20, 0x7b, 0xa, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x7b, 0xa, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x43, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x43, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x3b, 0xa, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x38, 0x3a, 0x3a, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x3b, 0xa, 0xa, 0x24, 0x7b, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x3f, 0x2e, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6d, 0x61, 0x63, 0x3f, 0x2e, 0x70, 0x72, 0x65, 0x61, 0x6d, 0x62, 0x6c, 0x65, 0x20, 0x7c, 0x7c, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x24, 0x7b, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x28, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x63, 0x6c, 0x28, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x24, 0x7b, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x49, 0x6e, 0x69, 0x74, 0x28, 0x49, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2a, 0x20, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3e, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x3c, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3e, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3a, 0x3a, 0x4e, 0x65, 0x77, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x29, 0x3b, 0xa, 0x24, 0x7b, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x6d, 0x61, 0x63, 0x66, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x28, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x61, 0x70, 0x69, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x24, 0x7b, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x28, 0x6d, 0x61, 0x63, 0x20, 0x26, 0x26, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x20, 0x3f, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x6b, 0x65, 0x79, 0x73, 0x28, 0x6d, 0x61, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x7b, 0x7d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x28, 0x6e, 0x2c, 0x20, 0x6d, 0x61, 0x63, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x20, 0x3a, 0x20, 0x27, 0x27, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x4d, 0x41, 0x43, 0x48, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x5b, 0x2e, 0x2e, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x28, 0x6d, 0x61, 0x63, 0x3f, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0x29, 0x5d, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x5f, 0x5f, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x5f, 0x5f, 0xa, 0x24, 0x7b, 0x5b, 0x2e, 0x2e, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x28, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x3f, 0x2e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0x29, 0x5d, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0xa, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0xa, 0x20, 0x20, 0x53, 0x45, 0x54, 0x5f, 0x4d, 0x4f, 0x44, 0x55, 0x4c, 0x45, 0x28, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x20, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2c, 0x20, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x3b, 0xa, 0x7d, 0xa, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0xa, 0x7d, 0x20, 0x2f, 0x2f, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x22, 0x43, 0x22, 0x20, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x44, 0x4c, 0x4c, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x29, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x49, 0x6e, 0x69, 0x74, 0x3b, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0x60, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x78, 0x20, 0x3d, 0x20, 0x2f, 0x5b, 0x2e, 0x2f, 0x2d, 0x5d, 0x2f, 0x67, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0xa, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x44, 0x65, 0x6e, 0x6f, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x44, 0x65, 0x6e, 0x6f, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x28, 0x66, 0x6e, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x54, 0x68, 0x69, 0x73, 0x2e, 0x42, 0x75, 0x6e, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x28, 0x27, 0x66, 0x73, 0x27, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x66, 0x6e, 0x20, 0x3d, 0x3e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x66, 0x73, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x28, 0x66, 0x6e, 0x29, 0x29, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x2d, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x2c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x20, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x2f, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0xa, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x69, 0x6e, 0x63, 0x62, 0x69, 0x6e, 0x20, 0x22, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0xa, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x3a, 0xa, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0xa, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3a, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x69, 0x6e, 0x63, 0x62, 0x69, 0x6e, 0x20, 0x22, 0x24, 0x7b, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0xa, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x3a, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x72, 0x63, 0x20, 0x3d, 0x20, 0x60, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5b, 0x5d, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x24, 0x7b, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x62, 0x79, 0x74, 0x65, 0x73, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x27, 0x30, 0x78, 0x27, 0x20, 0x2b, 0x20, 0x62, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, 0x36, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x2c, 0x20, 0x27, 0x29, 0x7d, 0xa, 0x7d, 0x3b, 0x20, 0xa, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x72, 0x63, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2e, 0x27, 0x29, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x64, 0x65, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x64, 0x65, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x64, 0x65, 0x70, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x70, 0x69, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x28, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x3f, 0x2e, 0x6c, 0x69, 0x62, 0x73, 0x3f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x2e, 0x6c, 0x69, 0x62, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x73, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x66, 0x6c, 0x61, 0x74, 0x28, 0x29, 0x29, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x2d, 0x6c, 0x24, 0x7b, 0x6c, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0x50, 0x61, 0x74, 0x68, 0x73, 0x20, 0x28, 0x64, 0x65, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x64, 0x65, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x64, 0x65, 0x70, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x70, 0x69, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x50, 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x2e, 0x61, 0x6c, 0x6c, 0x28, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x3e, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x3d, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x53, 0x65, 0x74, 0x28, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x3f, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x3f, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7c, 0x7c, 0x20, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x2e, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x70, 0x29, 0x29, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x70, 0x29, 0x29, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x62, 0x5b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x5d, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x74, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0x29, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x2c, 0x20, 0x70, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x62, 0x2e, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 0x7c, 0x7c, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x29, 0x2e, 0x66, 0x6c, 0x61, 0x74, 0x28, 0x29, 0x29, 0x29, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6c, 0x69, 0x62, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x2e, 0x6d, 0x61, 0x70, 0x28, 0x6c, 0x20, 0x3d, 0x3e, 0x20, 0x60, 0x2d, 0x4c, 0x24, 0x7b, 0x6c, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x64, 0x65, 0x70, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0x2c, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x2c, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x2c, 0x20, 0x6f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x64, 0x65, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x64, 0x65, 0x70, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x70, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x64, 0x65, 0x70, 0x20, 0x3d, 0x3e, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x64, 0x65, 0x70, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x61, 0x27, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x23, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x20, 0x6f, 0x6e, 0x63, 0x65, 0xa, 0x2f, 0x2f, 0x20, 0x5b, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x64, 0x69, 0x74, 0x2c, 0x3c, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x20, 0x2f, 0x3e, 0x5d, 0xa, 0x2f, 0x2f, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x70, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x64, 0x6f, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x75, 0x6e, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4d, 0x61, 0x6b, 0x65, 0x66, 0x69, 0x6c, 0x65, 0xa, 0xa, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x2e, 0x68, 0x22, 0xa, 0x60, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x23, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x22, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x2e, 0x68, 0x22, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x3b, 0xa, 0x60, 0x20, 0x20, 0x20, 0x20, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5b, 0x5d, 0x3b, 0xa, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x5b, 0x5d, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5b, 0x5d, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x63, 0x68, 0x61, 0x72, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x5b, 0x5d, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x5c, 0x6e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x22, 0x43, 0x22, 0x20, 0x7b, 0x5c, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x20, 0x76, 0x6f, 0x69, 0x64, 0x2a, 0x20, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0x7d, 0x28, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0x3b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x7d, 0x5c, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x7d, 0x22, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0xa, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x28, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x7d, 0x22, 0x2c, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x6f, 0x66, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x7d, 0x22, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2c, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x7d, 0x3a, 0x3a, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x5f, 0x61, 0x64, 0x64, 0x28, 0x22, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x22, 0x2c, 0x20, 0x26, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x29, 0x3b, 0x5c, 0x6e, 0x60, 0x3b, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x7d, 0x5c, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x26, 0x26, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x2e, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x73, 0x28, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x20, 0x6c, 0x69, 0x62, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x28, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x3e, 0x20, 0x6c, 0x69, 0x62, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x29, 0x5b, 0x30, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x60, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6c, 0x69, 0x62, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x72, 0x78, 0x2c, 0x20, 0x27, 0x5f, 0x27, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6a, 0x73, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6a, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x65, 0x6e, 0x64, 0x20, 0x2d, 0x20, 0x24, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6a, 0x73, 0x20, 0x3d, 0x20, 0x4e, 0x55, 0x4c, 0x4c, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6a, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6a, 0x73, 0x5f, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x6c, 0x65, 0x6e, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6a, 0x73, 0x20, 0x3d, 0x20, 0x5f, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x5f, 0x24, 0x7b, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x2a, 0x20, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x22, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x7d, 0x22, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x20, 0x3f, 0x20, 0x31, 0x20, 0x3a, 0x20, 0x30, 0x7d, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x76, 0x38, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x38, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x7d, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x76, 0x38, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x76, 0x38, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x7d, 0x3b, 0xa, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x20, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x74, 0x20, 0x5f, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x20, 0x3d, 0x20, 0x24, 0x7b, 0x6f, 0x70, 0x74, 0x73, 0x2e, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x7d, 0x3b, 0xa, 0x60, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x20, 0x74, 0x6f, 0x64, 0x6f, 0x3a, 0x20, 0x65, 0x6e, 0x76, 0x20, 0x76, 0x61, 0x72, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x73, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x4f, 0x70, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x76, 0x38, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x3a, 0x20, 0x30, 0x2c, 0xa, 0x20, 0x20, 0x76, 0x38, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x3a, 0x20, 0x32, 0x2c, 0xa, 0x20, 0x20, 0x76, 0x38, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x3a, 0x20, 0x27, 0x2d, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2d, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x3d, 0x31, 0x30, 0x20, 0x2d, 0x2d, 0x75, 0x73, 0x65, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x20, 0x2d, 0x2d, 0x74, 0x75, 0x72, 0x62, 0x6f, 0x2d, 0x66, 0x61, 0x73, 0x74, 0x2d, 0x61, 0x70, 0x69, 0x2d, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x20, 0x2d, 0x2d, 0x6e, 0x6f, 0x2d, 0x66, 0x72, 0x65, 0x65, 0x7a, 0x65, 0x2d, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2d, 0x69, 0x6e, 0x69, 0x74, 0x20, 0x2d, 0x2d, 0x63, 0x70, 0x70, 0x67, 0x63, 0x2d, 0x79, 0x6f, 0x75, 0x6e, 0x67, 0x2d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x69, 0x74, 0x3a, 0x20, 0x30, 0x2c, 0xa, 0x20, 0x20, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x3a, 0x20, 0x27, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x20, 0x3d, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6f, 0x73, 0x3a, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x2c, 0x20, 0xa, 0x20, 0x20, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x3a, 0x20, 0x27, 0x6c, 0x6f, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x43, 0x43, 0x3a, 0x20, 0x27, 0x67, 0x63, 0x63, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x43, 0x58, 0x58, 0x3a, 0x20, 0x27, 0x67, 0x2b, 0x2b, 0x27, 0x2c, 0xa, 0x20, 0x20, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x20, 0x27, 0x78, 0x36, 0x34, 0x27, 0xa, 0x7d, 0xa, 0xa, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x67, 0x65, 0x6e, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x62, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x73, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x28, 0x27, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x6a, 0x73, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x2b, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x6c, 0x69, 0x6e, 0x6b, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2d, 0x2d, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x72, 0x67, 0x73, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6e, 0x65, 0x78, 0x74, 0x29, 0x29, 0x29, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x20, 0x27, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x28, 0x61, 0x77, 0x61, 0x69, 0x74, 0x20, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x30, 0x5d, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0xa, 0x20, 0x20, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x65, 0x72, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2c, 0x20, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x6c, 0x69, 0x62, 0x50, 0x61, 0x74, 0x68, 0x73, 0x2c, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2c, 0x20, 0x67, 0x65, 0x6e, 0xa, 0x7d, 0xa +}; +unsigned int _binary_lib_gen_js_len = 24548; + +const char _binary_lib_path_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x20, 0x3d, 0x20, 0x34, 0x37, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x20, 0x3d, 0x20, 0x39, 0x32, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x44, 0x4f, 0x54, 0x20, 0x3d, 0x20, 0x34, 0x36, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x27, 0x2e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x3c, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x70, 0x6f, 0x73, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x2c, 0x20, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x69, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x29, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x69, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x7c, 0x7c, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x4e, 0x4f, 0x4f, 0x50, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3c, 0x20, 0x32, 0x20, 0x7c, 0x7c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x7c, 0x7c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x44, 0x4f, 0x54, 0x20, 0x7c, 0x7c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x32, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x44, 0x4f, 0x54, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x32, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x30, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x20, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x69, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x27, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x69, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x20, 0x3f, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x7d, 0x2e, 0x2e, 0x60, 0x20, 0x3a, 0x20, 0x27, 0x2e, 0x2e, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x32, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x24, 0x7b, 0x73, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x7d, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x69, 0x29, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x2c, 0x20, 0x69, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x2d, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x6c, 0x61, 0x73, 0x68, 0x20, 0x3d, 0x20, 0x69, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x44, 0x4f, 0x54, 0x20, 0x26, 0x26, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x2d, 0x31, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2b, 0x2b, 0x64, 0x6f, 0x74, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x74, 0x73, 0x20, 0x3d, 0x20, 0x2d, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x2e, 0x27, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x73, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x30, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x65, 0x70, 0x20, 0x3d, 0x20, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x63, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x41, 0x74, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x43, 0x48, 0x41, 0x52, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x5f, 0x53, 0x4c, 0x41, 0x53, 0x48, 0xa, 0x20, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2c, 0x20, 0x21, 0x69, 0x73, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x2c, 0x20, 0x27, 0x2f, 0x27, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x73, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x2f, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x65, 0x70, 0x20, 0x3f, 0x20, 0x27, 0x2e, 0x2f, 0x27, 0x20, 0x3a, 0x20, 0x27, 0x2e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x65, 0x70, 0x29, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x2f, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x73, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x20, 0x3f, 0x20, 0x60, 0x2f, 0x24, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x60, 0x20, 0x3a, 0x20, 0x70, 0x61, 0x74, 0x68, 0xa, 0x7d, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x2e, 0x27, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x20, 0x26, 0x26, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x2f, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x2b, 0x2b, 0x69, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x61, 0x72, 0x67, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x2b, 0x3d, 0x20, 0x60, 0x2f, 0x24, 0x7b, 0x61, 0x72, 0x67, 0x7d, 0x60, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x65, 0x64, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x2e, 0x27, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x28, 0x6a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6a, 0x6f, 0x69, 0x6e, 0x2c, 0x20, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6e, 0x6f, 0x72, 0x6d, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x65, 0x78, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_path_js_len = 3139; + +const char _binary_lib_proc_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2b, 0x2b, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x33, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x60, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x75, 0x66, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x68, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x68, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x30, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x62, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x36, 0x34, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x36, 0x34, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x62, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x35, 0x34, 0x30, 0x45, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x6f, 0x63, 0x74, 0x6c, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x28, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x37, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x35, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x6d, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_proc_js_len = 4472; + +const char _binary_lib_stringify_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x2a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x65, 0x74, 0x74, 0x79, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4a, 0x53, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0xa, 0x20, 0x2a, 0x2f, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x20, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x76, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x69, 0x67, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x20, 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x76, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x76, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x2c, 0x20, 0x73, 0x70, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x20, 0x27, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6f, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x70, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, 0x65, 0x78, 0x74, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x38, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x42, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x36, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x34, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x5c, 0x73, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x28, 0x5b, 0x7b, 0x7d, 0x5d, 0x29, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x4d, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x5b, 0x28, 0x2e, 0x2b, 0x29, 0x5c, 0x5d, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5b, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_stringify_js_len = 2000; + +const char _binary_lib_binary_js_start[] = { +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x41, 0x44, 0x2c, 0x20, 0x41, 0x47, 0x2c, 0x20, 0x41, 0x43, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x20, 0x28, 0x75, 0x38, 0x2c, 0x20, 0x6c, 0x65, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x38, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x2c, 0x20, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x31, 0x36, 0x2c, 0x20, 0x70, 0x6f, 0x73, 0x20, 0x3d, 0x20, 0x30, 0x2c, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x20, 0x3d, 0x20, 0x5b, 0x5d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x61, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x20, 0x3f, 0x20, 0x31, 0x30, 0x20, 0x3a, 0x20, 0x31, 0x36, 0xa, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6c, 0x65, 0x6e, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x27, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x20, 0x24, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x66, 0x66, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x6f, 0x66, 0x66, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x25, 0x20, 0x38, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x24, 0x7b, 0x28, 0x62, 0x6f, 0x66, 0x66, 0x29, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x62, 0x61, 0x73, 0x65, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x35, 0x2c, 0x20, 0x27, 0x20, 0x27, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x20, 0x24, 0x7b, 0x75, 0x38, 0x5b, 0x62, 0x6f, 0x66, 0x66, 0x5d, 0x2e, 0x74, 0x6f, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x31, 0x36, 0x29, 0x2e, 0x70, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x28, 0x32, 0x2c, 0x20, 0x27, 0x30, 0x27, 0x29, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x75, 0x38, 0x5b, 0x62, 0x6f, 0x66, 0x66, 0x5d, 0x20, 0x3e, 0x3d, 0x20, 0x33, 0x32, 0x20, 0x26, 0x26, 0x20, 0x75, 0x38, 0x5b, 0x62, 0x6f, 0x66, 0x66, 0x5d, 0x20, 0x3c, 0x3d, 0x20, 0x31, 0x32, 0x36, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x24, 0x7b, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x66, 0x72, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x28, 0x75, 0x38, 0x5b, 0x62, 0x6f, 0x66, 0x66, 0x5d, 0x29, 0x7d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x27, 0x2e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x28, 0x6c, 0x65, 0x6e, 0x20, 0x25, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x20, 0x24, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x3c, 0x20, 0x38, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x24, 0x7b, 0x27, 0x20, 0x20, 0x20, 0x27, 0x2e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x29, 0x7d, 0x20, 0x24, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x70, 0x75, 0x73, 0x68, 0x28, 0x60, 0x24, 0x7b, 0x27, 0x20, 0x20, 0x20, 0x27, 0x2e, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x28, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x29, 0x7d, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x63, 0x68, 0x61, 0x72, 0x73, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0x7d, 0x5c, 0x6e, 0x60, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x27, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x64, 0x75, 0x6d, 0x70, 0x20, 0x7d, 0xa +}; +unsigned int _binary_lib_binary_js_len = 1074; + diff --git a/main_win.h b/main_win.h index 11fb624..78b1dcf 100644 --- a/main_win.h +++ b/main_win.h @@ -16,6 +16,11 @@ extern "C" { void register_builtins() { lo::builtins_add("main.js", _binary_main_js_start, _binary_main_js_len); lo::builtins_add("lib/inflate.js", _binary_lib_inflate_js_start, _binary_lib_inflate_js_len); + lo::builtins_add("lib/gen.js", _binary_lib_gen_js_start, _binary_lib_gen_js_len); + lo::builtins_add("lib/path.js", _binary_lib_path_js_start, _binary_lib_path_js_len); + lo::builtins_add("lib/proc.js", _binary_lib_proc_js_start, _binary_lib_proc_js_len); + lo::builtins_add("lib/stringify.js", _binary_lib_stringify_js_start, _binary_lib_stringify_js_len); + lo::builtins_add("lib/binary.js", _binary_lib_binary_js_start, _binary_lib_binary_js_len); lo::modules_add("core", &_register_core); lo::modules_add("win", &_register_win); lo::modules_add("inflate", &_register_inflate); diff --git a/test.cmd b/test.cmd new file mode 100644 index 0000000..17f653a --- /dev/null +++ b/test.cmd @@ -0,0 +1,4 @@ +set VERSION=0.0.24-pre +set RUNTIME=lo +echo \"%VERSION%\" +echo \"%RUNTIME%\" From 33751da465f71f0bf91ae41313396b34722d26d0 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 1 Jan 2026 16:19:19 +0000 Subject: [PATCH 09/33] chore: memory usage for windows --- builtins.h | 4 ++-- lib/proc.js | 10 +++++++++- lib/win/win.cc | 29 +++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/builtins.h b/builtins.h index 6c0894f..146acd5 100644 --- a/builtins.h +++ b/builtins.h @@ -20,9 +20,9 @@ const char _binary_lib_path_js_start[] = { unsigned int _binary_lib_path_js_len = 3139; const char _binary_lib_proc_js_start[] = { -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2b, 0x2b, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x33, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x60, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x75, 0x66, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x68, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x68, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x30, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x62, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x36, 0x34, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x36, 0x34, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x62, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x35, 0x34, 0x30, 0x45, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x6f, 0x63, 0x74, 0x6c, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x28, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x37, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x35, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x6d, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7d, 0xa +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2b, 0x2b, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x33, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x60, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x75, 0x66, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x68, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x68, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x30, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x62, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x36, 0x34, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x36, 0x34, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x62, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x35, 0x34, 0x30, 0x45, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x6f, 0x63, 0x74, 0x6c, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x28, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x37, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x35, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x6d, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7d, 0xa }; -unsigned int _binary_lib_proc_js_len = 4472; +unsigned int _binary_lib_proc_js_len = 4669; const char _binary_lib_stringify_js_start[] = { 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x2a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x65, 0x74, 0x74, 0x79, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4a, 0x53, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0xa, 0x20, 0x2a, 0x2f, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x20, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x76, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x69, 0x67, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x20, 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x76, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x76, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x2c, 0x20, 0x73, 0x70, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x20, 0x27, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6f, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x70, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, 0x65, 0x78, 0x74, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x38, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x42, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x36, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x34, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x5c, 0x73, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x28, 0x5b, 0x7b, 0x7d, 0x5d, 0x29, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x4d, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x5b, 0x28, 0x2e, 0x2b, 0x29, 0x5c, 0x5d, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5b, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x7d, 0xa diff --git a/lib/proc.js b/lib/proc.js index 6b34ec0..ec05785 100644 --- a/lib/proc.js +++ b/lib/proc.js @@ -1,4 +1,4 @@ -const { ptr, core, assert } = lo +const { ptr, core, assert, load } = lo const { setenv } = core @@ -52,6 +52,14 @@ if (core.os === 'linux') { assert(task_info(task_self(), TASK_BASIC_INFO, info.ptr, msg_type.ptr) === KERN_SUCCESS) return info[3] } +} else if (core.os === 'win') { + const { win } = load('win') + const { getProcessMemoryInfo } = win + const process_info = ptr(new BigUint64Array(9)) + mem = () => { + assert(getProcessMemoryInfo(process_info.ptr, process_info.byteLength)) + return Number(process_info[2]) + } } if (core.os === 'linux' || core.os === 'mac') { diff --git a/lib/win/win.cc b/lib/win/win.cc index 5f3028f..781c0f6 100644 --- a/lib/win/win.cc +++ b/lib/win/win.cc @@ -1,6 +1,7 @@ #include #include #include +#include namespace lo { namespace win { @@ -198,6 +199,30 @@ void isatty(const FunctionCallbackInfo &args) { args.GetReturnValue().Set(true); } +// https://learn.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-getprocessmemoryinfo +void getProcessMemoryInfo(const FunctionCallbackInfo &args) { + //uint32_t v0 = Local::Cast(args[0])->Value(); + //HANDLE pid = reinterpret_cast(v0); + PROCESS_MEMORY_COUNTERS* counter = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + DWORD size = Local::Cast(args[1])->Value(); + BOOL ok = GetProcessMemoryInfo(GetCurrentProcess(), counter, size); + if (ok) { + args.GetReturnValue().Set(true); + return; + } + args.GetReturnValue().Set(false); +} + +// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentprocess +void getCurrentProcess(const FunctionCallbackInfo &args) { + HANDLE pid = GetCurrentProcess(); + if (pid == INVALID_HANDLE_VALUE) { + args.GetReturnValue().Set(-1); + return; + } + args.GetReturnValue().Set(Number::New(args.GetIsolate(), reinterpret_cast(pid))); +} + void Init(Isolate *isolate, Local target) { Local module = ObjectTemplate::New(isolate); @@ -223,6 +248,10 @@ void Init(Isolate *isolate, Local target) { SET_METHOD(isolate, module, "isatty", isatty); + SET_METHOD(isolate, module, "getProcessMemoryInfo", getProcessMemoryInfo); + SET_METHOD(isolate, module, "getCurrentProcess", getCurrentProcess); + + SET_VALUE(isolate, module, "GENERIC_READ", Integer::New(isolate, (int32_t)GENERIC_READ)); SET_VALUE(isolate, module, "GENERIC_WRITE", Integer::New(isolate, (int32_t)GENERIC_WRITE)); From e3cfa9407a87d2e1d3fe0a4e279429561d25bf1c Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 1 Jan 2026 17:17:08 +0000 Subject: [PATCH 10/33] chore: update builtins.h --- builtins.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builtins.h b/builtins.h index 146acd5..31cd9e2 100644 --- a/builtins.h +++ b/builtins.h @@ -20,9 +20,9 @@ const char _binary_lib_path_js_start[] = { unsigned int _binary_lib_path_js_len = 3139; const char _binary_lib_proc_js_start[] = { -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2b, 0x2b, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x33, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x60, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x75, 0x66, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x68, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x68, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x30, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x62, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x36, 0x34, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x36, 0x34, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x62, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x35, 0x34, 0x30, 0x45, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x6f, 0x63, 0x74, 0x6c, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x28, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x37, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x35, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x6d, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7d, 0xa +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2b, 0x2b, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x33, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x60, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x75, 0x66, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x68, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x68, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x39, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x32, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x30, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x62, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x36, 0x34, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x36, 0x34, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x62, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x35, 0x34, 0x30, 0x45, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x6f, 0x63, 0x74, 0x6c, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x28, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x37, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x35, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x6d, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7d, 0xa }; -unsigned int _binary_lib_proc_js_len = 4669; +unsigned int _binary_lib_proc_js_len = 4760; const char _binary_lib_stringify_js_start[] = { 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x2a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x65, 0x74, 0x74, 0x79, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4a, 0x53, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0xa, 0x20, 0x2a, 0x2f, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x20, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x76, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x69, 0x67, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x20, 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x76, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x76, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x2c, 0x20, 0x73, 0x70, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x20, 0x27, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6f, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x70, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, 0x65, 0x78, 0x74, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x38, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x42, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x36, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x34, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x5c, 0x73, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x28, 0x5b, 0x7b, 0x7d, 0x5d, 0x29, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x4d, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x5b, 0x28, 0x2e, 0x2b, 0x29, 0x5c, 0x5d, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5b, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x7d, 0xa From 1cfa4881e3bd7e3b6ae62f5f8bcca8c6d06de134 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Thu, 1 Jan 2026 23:32:38 +0000 Subject: [PATCH 11/33] chore: nicer build script for windows --- .gitignore | 3 ++- build.cmd | 34 +++++++++++++++++++++++----------- lib/win/win.cc | 3 --- 3 files changed, 25 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index af47f6a..12973d8 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,5 @@ node_modules lib/lines/linenoise.h lib/lines/linenoise.c zero -dist \ No newline at end of file +dist +*.pdb \ No newline at end of file diff --git a/build.cmd b/build.cmd index 7894ce3..ff977ca 100644 --- a/build.cmd +++ b/build.cmd @@ -1,6 +1,12 @@ @echo off set VERSION=0.0.24-pre set RUNTIME=lo +set V8_OPTS=-DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS +set OPTS=-std=c++20 -fomit-frame-pointer -fno-rtti -fno-exceptions -O3 -march=native -mtune=native +set WARN=-Werror -Wpedantic -Wall -Wextra -Wno-unused-parameter -Wno-error=unknown-warning-option +set OBJS=lo.o main.o win.o core.o inflate.o lib\inflate\em_inflate.o +set LOPTS=-lwinmm -ldbghelp -lbcrypt +set INCLUDE=-I. -I./v8 -I./v8/include set BUILTINS=lib/inflate.js lib/gen.js lib/path.js lib/proc.js lib/stringify.js lib/binary.js if "%WindowsSdkDir%"== "" ( call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" @@ -10,14 +16,20 @@ if exist lo.exe ( lo.exe gen lib\core2\api.js > lib\core2\core.cc lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h ) -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/win/win.cc -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc -cd lib\inflate -curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.h -curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.c -clang -I. -c -o em_inflate.o -O3 em_inflate.c -cd ..\.. -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./lib/inflate /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS lib/inflate/inflate.cc -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc -clang-cl.exe /GS- -m64 /EHsc /std:c++20 /I. /I./v8 /I./v8/include /c -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc -clang-cl.exe v8\v8_monolith.lib lo.obj main.obj win.obj core.obj inflate.obj lib\inflate\em_inflate.o winmm.lib /link /machine:x64 /SUBSYSTEM:console /out:lo.exe /WHOLEARCHIVE /WX +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% lib/win/win.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc +if not exist em_inflate.o ( + cd lib\inflate + if not exist em_inflate.h ( + curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.h + ) + if not exist em_inflate.c ( + curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.c + ) + clang -I. -c -o em_inflate.o -O3 em_inflate.c + cd ..\.. +) +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -Ilib/inflate lib/inflate/inflate.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc +clang++ v8\v8_monolith.lib %OBJS% %LOPTS% -o %RUNTIME%.exe diff --git a/lib/win/win.cc b/lib/win/win.cc index 781c0f6..f60a177 100644 --- a/lib/win/win.cc +++ b/lib/win/win.cc @@ -33,7 +33,6 @@ unsigned int testFast(void* p) { } void testSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); args.GetReturnValue().Set(1); } @@ -55,7 +54,6 @@ void getLastError(const FunctionCallbackInfo &args) { // https://learn.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-closehandle void closeHandle (const FunctionCallbackInfo & args) { - Isolate *isolate = args.GetIsolate(); uint32_t v0 = Local::Cast(args[0])->Value(); HANDLE file = reinterpret_cast(v0); BOOL ok = CloseHandle(file); @@ -168,7 +166,6 @@ void loadLibrary(const FunctionCallbackInfo &args) { // https://learn.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-freelibrary void freeLibrary(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); uint64_t v0 = (uint64_t)Local::Cast(args[0])->Value(); HMODULE handle = reinterpret_cast(v0); BOOL ok = FreeLibrary(handle); From 4c0a3f44dd5ae1e626313202b3430685bf619762 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 2 Jan 2026 00:10:44 +0000 Subject: [PATCH 12/33] chore: basic createProcess for windows --- build.cmd | 9 ++++++--- builtins.h | 4 ++-- lib/proc.js | 9 ++++++++- lib/win/win.cc | 34 +++++++++++++++++++++++++++++++++- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/build.cmd b/build.cmd index ff977ca..7a511ea 100644 --- a/build.cmd +++ b/build.cmd @@ -16,8 +16,6 @@ if exist lo.exe ( lo.exe gen lib\core2\api.js > lib\core2\core.cc lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h ) -clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% lib/win/win.cc -clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc if not exist em_inflate.o ( cd lib\inflate if not exist em_inflate.h ( @@ -30,6 +28,11 @@ if not exist em_inflate.o ( cd ..\.. ) clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -Ilib/inflate lib/inflate/inflate.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% lib/win/win.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc -clang++ v8\v8_monolith.lib %OBJS% %LOPTS% -o %RUNTIME%.exe +clang++ v8\v8_monolith.lib %OBJS% %LOPTS% -o %RUNTIME%.tmp.exe +move /Y %RUNTIME%.tmp.exe %RUNTIME%.exe +del *.lib +del *.exp \ No newline at end of file diff --git a/builtins.h b/builtins.h index 31cd9e2..d6dc5af 100644 --- a/builtins.h +++ b/builtins.h @@ -20,9 +20,9 @@ const char _binary_lib_path_js_start[] = { unsigned int _binary_lib_path_js_len = 3139; const char _binary_lib_proc_js_start[] = { -0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2b, 0x2b, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x33, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x60, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x75, 0x66, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x68, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x68, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x39, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x32, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x30, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x62, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x36, 0x34, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x36, 0x34, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x62, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x35, 0x34, 0x30, 0x45, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x6f, 0x63, 0x74, 0x6c, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x28, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x37, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x35, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x6d, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7d, 0xa +0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0x7d, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x30, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x6e, 0x6f, 0x6f, 0x70, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x72, 0x65, 0x61, 0x64, 0x2c, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x72, 0x65, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x20, 0x28, 0x73, 0x74, 0x72, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x27, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x20, 0x3c, 0x20, 0x32, 0x34, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x73, 0x74, 0x72, 0x2e, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x66, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x2c, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x69, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2b, 0x2b, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x32, 0x33, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x28, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x28, 0x6c, 0x61, 0x73, 0x74, 0x2c, 0x20, 0x69, 0x29, 0x29, 0x20, 0x2a, 0x20, 0x34, 0x30, 0x39, 0x36, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x69, 0x20, 0x2b, 0x20, 0x31, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x75, 0x66, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x31, 0x30, 0x32, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x54, 0x65, 0x78, 0x74, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x28, 0x29, 0xa, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x30, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x66, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x66, 0x64, 0x20, 0x3d, 0x20, 0x6f, 0x70, 0x65, 0x6e, 0x28, 0x60, 0x2f, 0x70, 0x72, 0x6f, 0x63, 0x2f, 0x73, 0x65, 0x6c, 0x66, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x60, 0x2c, 0x20, 0x4f, 0x5f, 0x52, 0x44, 0x4f, 0x4e, 0x4c, 0x59, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x72, 0x65, 0x61, 0x64, 0x28, 0x66, 0x64, 0x2c, 0x20, 0x62, 0x75, 0x66, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x31, 0x30, 0x32, 0x34, 0x2c, 0x20, 0x30, 0x29, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x66, 0x69, 0x6e, 0x64, 0x6d, 0x65, 0x6d, 0x28, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x2e, 0x64, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x28, 0x62, 0x75, 0x66, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x30, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x61, 0x63, 0x68, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x6d, 0x61, 0x63, 0x68, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x2c, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0xa, 0x20, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x63, 0x68, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x68, 0x5f, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x20, 0x2f, 0x20, 0x34, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x5f, 0x43, 0x4f, 0x55, 0x4e, 0x54, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x28, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x73, 0x65, 0x6c, 0x66, 0x28, 0x29, 0x2c, 0x20, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x4b, 0x45, 0x52, 0x4e, 0x5f, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x33, 0x5d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x39, 0x29, 0x29, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x67, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5b, 0x32, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0xa, 0xa, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x77, 0x69, 0x6e, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x6c, 0x6f, 0x61, 0x64, 0x28, 0x27, 0x77, 0x69, 0x6e, 0x27, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x77, 0x69, 0x6e, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x2e, 0x6a, 0x6f, 0x69, 0x6e, 0x28, 0x27, 0x20, 0x27, 0x29, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6c, 0x69, 0x6e, 0x75, 0x78, 0x27, 0x20, 0x7c, 0x7c, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x6f, 0x73, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6d, 0x61, 0x63, 0x27, 0x29, 0x20, 0x7b, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x2c, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x2c, 0x20, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x63, 0x73, 0x74, 0x72, 0x2c, 0x20, 0x70, 0x74, 0x72, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0xa, 0xa, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x20, 0x28, 0x61, 0x72, 0x67, 0x73, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x61, 0x72, 0x67, 0x62, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x30, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x62, 0x36, 0x34, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x42, 0x69, 0x67, 0x55, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x2b, 0x20, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x20, 0x3d, 0x20, 0x61, 0x72, 0x67, 0x62, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x73, 0x74, 0x72, 0x28, 0x61, 0x72, 0x67, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f, 0x20, 0x40, 0x74, 0x73, 0x2d, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x36, 0x34, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x42, 0x69, 0x67, 0x49, 0x6e, 0x74, 0x28, 0x73, 0x74, 0x72, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x72, 0x67, 0x73, 0x3a, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x62, 0x36, 0x34, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x2c, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x20, 0x61, 0x72, 0x67, 0x62, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x2f, 0x2f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x20, 0x3d, 0x20, 0x30, 0x78, 0x35, 0x34, 0x30, 0x45, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x63, 0x6f, 0x72, 0x65, 0x2e, 0x69, 0x6f, 0x63, 0x74, 0x6c, 0x32, 0x28, 0x30, 0x2c, 0x20, 0x54, 0x49, 0x4f, 0x43, 0x53, 0x43, 0x54, 0x54, 0x59, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x65, 0x6e, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x65, 0x6e, 0x76, 0x28, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x30, 0x5d, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5b, 0x69, 0x5d, 0x5b, 0x31, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x70, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x20, 0x3d, 0x20, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x32, 0x29, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x70, 0x74, 0x72, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x7b, 0x20, 0x61, 0x72, 0x67, 0x73, 0x20, 0x7d, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x5b, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x2e, 0x2e, 0x2e, 0x76, 0x61, 0x72, 0x67, 0x73, 0x5d, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0x28, 0x65, 0x6e, 0x76, 0x29, 0x2e, 0x61, 0x72, 0x67, 0x73, 0xa, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x20, 0x66, 0x6f, 0x72, 0x6b, 0x28, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x65, 0x6e, 0x76, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x29, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x65, 0x72, 0x72, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x63, 0x6f, 0x75, 0x6c, 0x64, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x78, 0x65, 0x63, 0x76, 0x65, 0x20, 0x24, 0x7b, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x65, 0x72, 0x72, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x2e, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x60, 0x60, 0x29, 0x29, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x2f, 0x2f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x78, 0x69, 0x74, 0x28, 0x31, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x69, 0x66, 0x20, 0x28, 0x70, 0x69, 0x64, 0x20, 0x3e, 0x20, 0x30, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x77, 0x61, 0x69, 0x74, 0x70, 0x69, 0x64, 0x28, 0x70, 0x69, 0x64, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x74, 0x72, 0x2c, 0x20, 0x30, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x28, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x70, 0x69, 0x64, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x30, 0x5d, 0x20, 0x3d, 0x20, 0x6c, 0x6f, 0x2e, 0x65, 0x72, 0x72, 0x6e, 0x6f, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5b, 0x31, 0x5d, 0x20, 0x3d, 0x20, 0x70, 0x69, 0x64, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x20, 0x3d, 0x20, 0x73, 0x79, 0x73, 0x63, 0x6f, 0x6e, 0x66, 0x28, 0x5f, 0x53, 0x43, 0x5f, 0x43, 0x4c, 0x4b, 0x5f, 0x54, 0x43, 0x4b, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x36, 0x29, 0x20, 0xa, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x35, 0x5d, 0x20, 0x3d, 0x20, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x20, 0x3d, 0x20, 0x70, 0x74, 0x72, 0x28, 0x6e, 0x65, 0x77, 0x20, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x28, 0x37, 0x29, 0x29, 0xa, 0xa, 0x20, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x3d, 0x20, 0x28, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x34, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x28, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x2e, 0x70, 0x74, 0x72, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d, 0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x35, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0x20, 0x2d, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5b, 0x69, 0x5d, 0x20, 0x3d, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x33, 0x32, 0x5b, 0x69, 0x5d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0xa, 0x20, 0x20, 0x7d, 0xa, 0xa, 0x20, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x20, 0x3d, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x41, 0x72, 0x67, 0x73, 0xa, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x6d, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x65, 0x6e, 0x76, 0x2c, 0x20, 0x6d, 0x61, 0x6b, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x2c, 0x20, 0x63, 0x70, 0x75, 0x74, 0x69, 0x6d, 0x65, 0x20, 0x7d, 0xa }; -unsigned int _binary_lib_proc_js_len = 4760; +unsigned int _binary_lib_proc_js_len = 4964; const char _binary_lib_stringify_js_start[] = { 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x44, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x30, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x30, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x61, 0x63, 0x6b, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x52, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x31, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x52, 0x65, 0x64, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x47, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x32, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x47, 0x72, 0x65, 0x65, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x59, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x33, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x59, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x42, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x34, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x42, 0x6c, 0x75, 0x65, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x4d, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x35, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x4d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x61, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x43, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x36, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x43, 0x79, 0x61, 0x6e, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x41, 0x57, 0x20, 0x3d, 0x20, 0x27, 0x5c, 0x75, 0x30, 0x30, 0x31, 0x62, 0x5b, 0x33, 0x37, 0x6d, 0x27, 0x20, 0x2f, 0x2f, 0x20, 0x41, 0x4e, 0x53, 0x49, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0xa, 0xa, 0x2f, 0x2a, 0x2a, 0xa, 0x20, 0x2a, 0x20, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x65, 0x74, 0x74, 0x79, 0x20, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x4a, 0x53, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0xa, 0x20, 0x2a, 0x2f, 0xa, 0xa, 0x6c, 0x65, 0x74, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0xa, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x20, 0x28, 0x6b, 0x2c, 0x20, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x68, 0x61, 0x73, 0x28, 0x76, 0x29, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x2e, 0x73, 0x65, 0x74, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x69, 0x67, 0x69, 0x6e, 0x74, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x28, 0x76, 0x29, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x76, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x27, 0x20, 0x26, 0x26, 0x20, 0x74, 0x79, 0x70, 0x65, 0x6f, 0x66, 0x20, 0x76, 0x20, 0x21, 0x3d, 0x3d, 0x20, 0x27, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x27, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x27, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x7b, 0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x76, 0x2e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2c, 0x20, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x3a, 0x20, 0x76, 0x2e, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x41, 0x72, 0x72, 0x61, 0x79, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x38, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x55, 0x69, 0x6e, 0x74, 0x33, 0x32, 0x41, 0x72, 0x72, 0x61, 0x79, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x27, 0x44, 0x61, 0x74, 0x61, 0x56, 0x69, 0x65, 0x77, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x76, 0x2e, 0x62, 0x79, 0x74, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x20, 0x26, 0x26, 0x20, 0x76, 0x2e, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x3d, 0x3d, 0x3d, 0x20, 0x27, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x27, 0x29, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x60, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x20, 0x24, 0x7b, 0x76, 0x2e, 0x6e, 0x61, 0x6d, 0x65, 0x7d, 0x20, 0x28, 0x2e, 0x2e, 0x2e, 0x24, 0x7b, 0x76, 0x2e, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x7d, 0x29, 0x60, 0x20, 0xa, 0x20, 0x20, 0x7d, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x76, 0xa, 0x7d, 0xa, 0xa, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x3d, 0x20, 0x28, 0x6f, 0x2c, 0x20, 0x73, 0x70, 0x20, 0x3d, 0x20, 0x27, 0x20, 0x20, 0x27, 0x29, 0x20, 0x3d, 0x3e, 0x20, 0x7b, 0xa, 0x20, 0x20, 0x6d, 0x65, 0x6d, 0x6f, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4d, 0x61, 0x70, 0x28, 0x29, 0xa, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x65, 0x78, 0x74, 0x20, 0x3d, 0x20, 0x4a, 0x53, 0x4f, 0x4e, 0x2e, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x28, 0x6f, 0x2c, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x72, 0x2c, 0x20, 0x73, 0x70, 0x29, 0xa, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x21, 0x74, 0x65, 0x78, 0x74, 0x29, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0xa, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x38, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x42, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x36, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x7b, 0x34, 0x7d, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x73, 0x5c, 0x73, 0x22, 0x28, 0x2e, 0x2b, 0x29, 0x22, 0x3a, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x20, 0x20, 0x24, 0x7b, 0x41, 0x59, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x3a, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x28, 0x5b, 0x7b, 0x7d, 0x5d, 0x29, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x4d, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x5c, 0x5b, 0x28, 0x2e, 0x2b, 0x29, 0x5c, 0x5d, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5b, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x24, 0x31, 0x24, 0x7b, 0x41, 0x47, 0x7d, 0x5d, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x28, 0x2f, 0x22, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x22, 0x2f, 0x67, 0x2c, 0x20, 0x60, 0x24, 0x7b, 0x41, 0x43, 0x7d, 0x3c, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x3e, 0x24, 0x7b, 0x41, 0x44, 0x7d, 0x60, 0x29, 0xa, 0x7d, 0xa, 0xa, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x20, 0x7b, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x69, 0x66, 0x79, 0x20, 0x7d, 0xa diff --git a/lib/proc.js b/lib/proc.js index ec05785..190f540 100644 --- a/lib/proc.js +++ b/lib/proc.js @@ -62,7 +62,14 @@ if (core.os === 'linux') { } } -if (core.os === 'linux' || core.os === 'mac') { +if (core.os === 'win') { + const { win } = lo.load('win') + const { createProcess } = win + + exec = (name, vargs, status = new Int32Array(2)) => { + createProcess([name, ...vargs].join(' ')) + } +} else if (core.os === 'linux' || core.os === 'mac') { const { fork, execvp, execve, waitpid, times, _SC_CLK_TCK, sysconf } = lo.core const { cstr, ptr } = lo diff --git a/lib/win/win.cc b/lib/win/win.cc index f60a177..9bc16d9 100644 --- a/lib/win/win.cc +++ b/lib/win/win.cc @@ -2,6 +2,7 @@ #include #include #include +#include namespace lo { namespace win { @@ -220,6 +221,37 @@ void getCurrentProcess(const FunctionCallbackInfo &args) { args.GetReturnValue().Set(Number::New(args.GetIsolate(), reinterpret_cast(pid))); } +// https://learn.microsoft.com/en-us/windows/win32/procthread/creating-processes +// https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa +void createProcess(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory( &si, sizeof(si) ); + si.cb = sizeof(si); + ZeroMemory( &pi, sizeof(pi) ); + String::Utf8Value cmdline(isolate, args[0]); + LPSTR szCmdline = _tcsdup(TEXT(*cmdline)); + if( !CreateProcess( NULL, // No module name (use command line) + szCmdline, // Command line + NULL, // Process handle not inheritable + NULL, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + NULL, // Use parent's environment block + NULL, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi ) // Pointer to PROCESS_INFORMATION structure + ) + { + printf( "CreateProcess failed (%lu).\n", GetLastError() ); + return; + } + WaitForSingleObject( pi.hProcess, INFINITE ); + CloseHandle( pi.hProcess ); + CloseHandle( pi.hThread ); +} + void Init(Isolate *isolate, Local target) { Local module = ObjectTemplate::New(isolate); @@ -247,7 +279,7 @@ void Init(Isolate *isolate, Local target) { SET_METHOD(isolate, module, "getProcessMemoryInfo", getProcessMemoryInfo); SET_METHOD(isolate, module, "getCurrentProcess", getCurrentProcess); - + SET_METHOD(isolate, module, "createProcess", createProcess); SET_VALUE(isolate, module, "GENERIC_READ", Integer::New(isolate, (int32_t)GENERIC_READ)); SET_VALUE(isolate, module, "GENERIC_WRITE", Integer::New(isolate, (int32_t)GENERIC_WRITE)); From 95ac83460a28e91db4e6cd3bbf0ae28b2860fef7 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 2 Jan 2026 01:11:48 +0000 Subject: [PATCH 13/33] chore: check in core2 source --- .gitignore | 1 + build.cmd | 3 + lib/core2/core.cc | 1192 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1196 insertions(+) create mode 100644 lib/core2/core.cc diff --git a/.gitignore b/.gitignore index 12973d8..355b7bc 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ lib/inflate/em_inflate.h lib/**/*.cc !lib/win/win.cc !lib/core/core.cc +!lib/core2/core.cc !lib/curl/curl.cc !lib/inflate/inflate.cc !lib/mach/mach.cc diff --git a/build.cmd b/build.cmd index 7a511ea..00c9fe5 100644 --- a/build.cmd +++ b/build.cmd @@ -32,6 +32,9 @@ clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% lib/win/win.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc +REM clang++ %OPTS% %INCLUDE% -Iscratch\curl\curl-8.17.0_6-win64-mingw\include -c %V8_OPTS% -DNOMINMAX lib/curl/curl.cc +REM set CURLP=scratch\curl\curl-8.17.0_6-win64-mingw\ +REM clang++ v8\v8_monolith.lib lo.o main.o win.o core.o inflate.o lib\inflate\em_inflate.o curl.o %CURLP%lib\libcurl.a %CURLP%lib\libcurl.dll.a -lwinmm -ldbghelp -lbcrypt -o lo.tmp.exe clang++ v8\v8_monolith.lib %OBJS% %LOPTS% -o %RUNTIME%.tmp.exe move /Y %RUNTIME%.tmp.exe %RUNTIME%.exe del *.lib diff --git a/lib/core2/core.cc b/lib/core2/core.cc new file mode 100644 index 0000000..afba7b6 --- /dev/null +++ b/lib/core2/core.cc @@ -0,0 +1,1192 @@ + +// [do not edit,] +// This file has been automatically generated, please do not change unless you disable auto-generation in the Makefile +#include + +#include + +#include + + + + + + +#include + +namespace lo { +namespace core { + +using v8::FunctionCallbackInfo; +using v8::Local; +using v8::ObjectTemplate; +using v8::Isolate; +using v8::Value; +using v8::Integer; +using v8::Number; +using v8::FunctionTemplate; +using v8::FunctionCallback; +using v8::CFunction; +using v8::CTypeInfo; +using v8::Uint8Array; +using v8::CFunctionInfo; +using v8::String; +using v8::Uint32Array; +using v8::ArrayBuffer; +using v8::Context; +using v8::Function; +using v8::Object; +using v8::HandleScope; +using v8::BigInt; + + +#ifdef _WIN32 +#define strdup _strdup +#endif + + +struct fastcall { + void* wrapper; // 0-7 : v8 fastcall wrapper function pointer + uint8_t result; // 8 : the type of the result + uint8_t nparam; // 9 : the number of args (max 255) + uint8_t param[30]; // 10-39 : an array of types of the arguments + uint64_t args[32]; // 40-295: an array of pointer slots for arguments + // these will be filled in dynamically by + // lo::core::SlowCallback for the slow call + // and then the slowcall wrapper will shift them from + // this structure into regs + stack and make the call + // the first slot is reserved for the result + void* fn; // 296-303: the slowcall wrapper function pointer +}; + +typedef void (*lo_fast_call)(void*); + +inline uint8_t needsunwrap (lo::FastTypes t) { + if (t == lo::FastTypes::buffer) return 1; + if (t == lo::FastTypes::u32array) return 1; + if (t == lo::FastTypes::pointer) return 1; + if (t == lo::FastTypes::u64) return 1; + if (t == lo::FastTypes::i64) return 1; + return 0; +} + +v8::CTypeInfo* CTypeFromV8 (uint8_t v8Type) { + if (v8Type == lo::FastTypes::boolean) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kBool); + if (v8Type == lo::FastTypes::i8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::u8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::f32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat32); + if (v8Type == lo::FastTypes::f64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat64); + if (v8Type == lo::FastTypes::i64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::u64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::iSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::uSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::pointer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::function) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::string) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kSeqOneByteString); + if (v8Type == lo::FastTypes::buffer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::u32array) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + return new v8::CTypeInfo(v8::CTypeInfo::Type::kVoid); +} + +void lo_fastcall (struct fastcall* state) { + ((lo_fast_call)state->fn)(&state->args); +} + +void SlowCallback(const FunctionCallbackInfo &args) { + Isolate* isolate = args.GetIsolate(); + HandleScope scope(isolate); + struct fastcall* state = (struct fastcall*)args.Data() + .As()->GetAlignedPointerFromInternalField(1); + int r = 1; + int s = 0; + char* temp_strs[100]; + for (int i = 0; i < state->nparam; i++) { + switch (state->param[i]) { + case FastTypes::string: + { + String::Utf8Value arg0(isolate, args[i]); + temp_strs[s] = strdup(*arg0); + state->args[r++] = (uint64_t)temp_strs[s++]; + } + break; + case FastTypes::u32: + state->args[r++] = (uint32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u16: + state->args[r++] = (uint16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u8: + state->args[r++] = (uint8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::boolean: + state->args[r++] = (bool)Local::Cast(args[i])->Value(); + break; + case FastTypes::i32: + state->args[r++] = (int32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i16: + state->args[r++] = (int16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i8: + state->args[r++] = (int8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i64: + case FastTypes::iSize: + state->args[r++] = (int64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u64: + case FastTypes::pointer: + case FastTypes::uSize: + state->args[r++] = (uint64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::buffer: + { + Local u8 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u8->Buffer()->Data() + + u8->ByteOffset()); + } + break; + case FastTypes::u32array: + { + Local u32 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u32->Buffer()->Data() + + u32->ByteOffset()); + } + break; + case FastTypes::function: + break; + case FastTypes::f32: + { + float src = (float)args[i].As()->Value(); + float* dst = (float*)&state->args[r++]; + *dst = src; + } + break; + case FastTypes::f64: + { + double src = (double)args[i].As()->Value(); + double* dst = (double*)&state->args[r++]; + *dst = src; + } + break; + } + } + lo_fastcall(state); + for (int i = 0; i < s; i++) { + free(temp_strs[i]); + } + switch (state->result) { + case FastTypes::i32: + args.GetReturnValue().Set((int32_t)state->args[0]); + break; + case FastTypes::u32: + args.GetReturnValue().Set((uint32_t)state->args[0]); + break; + case FastTypes::boolean: + args.GetReturnValue().Set((bool)state->args[0]); + break; + case FastTypes::f32: + { + float* dst = (float*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::f64: + { + double* dst = (double*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::i64: + { + int64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + case FastTypes::buffer: + case FastTypes::u32array: + case FastTypes::u64: + case FastTypes::pointer: + { + uint64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + } +} + +void bind_fastcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + // TODO - does integer work? + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + uint8_t unwrap = needsunwrap((FastTypes)state->result); + int fastlen = state->nparam + 1 + unwrap; + CTypeInfo* cargs = (CTypeInfo*)calloc(fastlen, sizeof(CTypeInfo)); + cargs[0] = CTypeInfo(CTypeInfo::Type::kV8Value); + for (int i = 0; i < state->nparam; i++) { + uint8_t ptype = state->param[i]; + cargs[i + 1] = *CTypeFromV8(ptype); + } + CTypeInfo* rc; + if (unwrap) { + cargs[fastlen - 1] = *CTypeFromV8(FastTypes::u32array); + rc = CTypeFromV8(FastTypes::empty); + } else { + rc = CTypeFromV8((FastTypes)state->result); + } + CFunctionInfo* info = new CFunctionInfo(*rc, fastlen, cargs); + CFunction* fastCFunc = new CFunction(state->wrapper, info); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, fastCFunc + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} + +void bind_slowcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, 0 + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +void callocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargscalloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rccalloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infocalloc = CFunctionInfo(rccalloc, 4, cargscalloc); +CFunction pFcalloc = CFunction((const void*)&callocFast, &infocalloc); + +int32_t readFast(void* p, int32_t p0, uint64_t* p1, int32_t p2); +CTypeInfo cargsread[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcread = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo inforead = CFunctionInfo(rcread, 4, cargsread); +CFunction pFread = CFunction((const void*)&readFast, &inforead); + +int32_t writeFast(void* p, int32_t p0, uint64_t* p1, int32_t p2); +CTypeInfo cargswrite[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcwrite = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infowrite = CFunctionInfo(rcwrite, 4, cargswrite); +CFunction pFwrite = CFunction((const void*)&writeFast, &infowrite); + +int32_t write_stringFast(void* p, int32_t p0, struct FastOneByteString* const p1); +CTypeInfo cargswrite_string[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcwrite_string = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infowrite_string = CFunctionInfo(rcwrite_string, 3, cargswrite_string); +CFunction pFwrite_string = CFunction((const void*)&write_stringFast, &infowrite_string); + +int32_t putcharFast(void* p, int32_t p0); +CTypeInfo cargsputchar[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcputchar = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoputchar = CFunctionInfo(rcputchar, 2, cargsputchar); +CFunction pFputchar = CFunction((const void*)&putcharFast, &infoputchar); + +int32_t getcharFast(void* p); +CTypeInfo cargsgetchar[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcgetchar = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetchar = CFunctionInfo(rcgetchar, 1, cargsgetchar); +CFunction pFgetchar = CFunction((const void*)&getcharFast, &infogetchar); + +int32_t closeFast(void* p, int32_t p0); +CTypeInfo cargsclose[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcclose = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoclose = CFunctionInfo(rcclose, 2, cargsclose); +CFunction pFclose = CFunction((const void*)&closeFast, &infoclose); + +uint32_t lseekFast(void* p, int32_t p0, uint32_t p1, int32_t p2); +CTypeInfo cargslseek[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rclseek = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infolseek = CFunctionInfo(rclseek, 4, cargslseek); +CFunction pFlseek = CFunction((const void*)&lseekFast, &infolseek); + +int32_t fstatFast(void* p, int32_t p0, uint64_t* p1); +CTypeInfo cargsfstat[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfstat = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infofstat = CFunctionInfo(rcfstat, 3, cargsfstat); +CFunction pFfstat = CFunction((const void*)&fstatFast, &infofstat); + +int32_t renameFast(void* p, struct FastOneByteString* const p0, struct FastOneByteString* const p1); +CTypeInfo cargsrename[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcrename = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo inforename = CFunctionInfo(rcrename, 3, cargsrename); +CFunction pFrename = CFunction((const void*)&renameFast, &inforename); + +int32_t openFast(void* p, struct FastOneByteString* const p0, int32_t p1, int32_t p2); +CTypeInfo cargsopen[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcopen = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoopen = CFunctionInfo(rcopen, 4, cargsopen); +CFunction pFopen = CFunction((const void*)&openFast, &infoopen); + +int32_t unlinkFast(void* p, struct FastOneByteString* const p0); +CTypeInfo cargsunlink[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcunlink = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infounlink = CFunctionInfo(rcunlink, 2, cargsunlink); +CFunction pFunlink = CFunction((const void*)&unlinkFast, &infounlink); + +void memcpyFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemcpy[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemcpy = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemcpy = CFunctionInfo(rcmemcpy, 5, cargsmemcpy); +CFunction pFmemcpy = CFunction((const void*)&memcpyFast, &infomemcpy); + +void memsetFast(void* p, uint64_t* p0, int32_t p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemset[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemset = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemset = CFunctionInfo(rcmemset, 5, cargsmemset); +CFunction pFmemset = CFunction((const void*)&memsetFast, &infomemset); + +void memmoveFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemmove[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemmove = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemmove = CFunctionInfo(rcmemmove, 5, cargsmemmove); +CFunction pFmemmove = CFunction((const void*)&memmoveFast, &infomemmove); + +void mallocFast(void* p, uint32_t p0, uint64_t* p_ret); +CTypeInfo cargsmalloc[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmalloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomalloc = CFunctionInfo(rcmalloc, 3, cargsmalloc); +CFunction pFmalloc = CFunction((const void*)&mallocFast, &infomalloc); + +void reallocFast(void* p, uint64_t* p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargsrealloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcrealloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo inforealloc = CFunctionInfo(rcrealloc, 4, cargsrealloc); +CFunction pFrealloc = CFunction((const void*)&reallocFast, &inforealloc); + +void aligned_allocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargsaligned_alloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcaligned_alloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoaligned_alloc = CFunctionInfo(rcaligned_alloc, 4, cargsaligned_alloc); +CFunction pFaligned_alloc = CFunction((const void*)&aligned_allocFast, &infoaligned_alloc); + +void freeFast(void* p, uint64_t* p0); +CTypeInfo cargsfree[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfree = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infofree = CFunctionInfo(rcfree, 2, cargsfree); +CFunction pFfree = CFunction((const void*)&freeFast, &infofree); + +void fastcallFast(void* p, uint64_t* p0); +CTypeInfo cargsfastcall[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfastcall = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infofastcall = CFunctionInfo(rcfastcall, 2, cargsfastcall); +CFunction pFfastcall = CFunction((const void*)&fastcallFast, &infofastcall); + +void getenvFast(void* p, struct FastOneByteString* const p0, uint64_t* p_ret); +CTypeInfo cargsgetenv[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcgetenv = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infogetenv = CFunctionInfo(rcgetenv, 3, cargsgetenv); +CFunction pFgetenv = CFunction((const void*)&getenvFast, &infogetenv); + +int32_t dupFast(void* p, int32_t p0); +CTypeInfo cargsdup[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcdup = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infodup = CFunctionInfo(rcdup, 2, cargsdup); +CFunction pFdup = CFunction((const void*)&dupFast, &infodup); + +int32_t dup2Fast(void* p, int32_t p0, int32_t p1); +CTypeInfo cargsdup2[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcdup2 = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infodup2 = CFunctionInfo(rcdup2, 3, cargsdup2); +CFunction pFdup2 = CFunction((const void*)&dup2Fast, &infodup2); + +void getcwdFast(void* p, uint64_t* p0, int32_t p1, uint64_t* p_ret); +CTypeInfo cargsgetcwd[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcgetcwd = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infogetcwd = CFunctionInfo(rcgetcwd, 4, cargsgetcwd); +CFunction pFgetcwd = CFunction((const void*)&getcwdFast, &infogetcwd); + +int32_t getpidFast(void* p); +CTypeInfo cargsgetpid[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcgetpid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetpid = CFunctionInfo(rcgetpid, 1, cargsgetpid); +CFunction pFgetpid = CFunction((const void*)&getpidFast, &infogetpid); + +int32_t execveFast(void* p, struct FastOneByteString* const p0, uint64_t* p1, uint64_t* p2); +CTypeInfo cargsexecve[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcexecve = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoexecve = CFunctionInfo(rcexecve, 4, cargsexecve); +CFunction pFexecve = CFunction((const void*)&execveFast, &infoexecve); + +int32_t execvpFast(void* p, struct FastOneByteString* const p0, uint64_t* p1); +CTypeInfo cargsexecvp[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcexecvp = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoexecvp = CFunctionInfo(rcexecvp, 3, cargsexecvp); +CFunction pFexecvp = CFunction((const void*)&execvpFast, &infoexecvp); + +void exitFast(void* p, int32_t p0); +CTypeInfo cargsexit[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcexit = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoexit = CFunctionInfo(rcexit, 2, cargsexit); +CFunction pFexit = CFunction((const void*)&exitFast, &infoexit); + +void isolate_context_destroyFast(void* p, uint64_t* p0); +CTypeInfo cargsisolate_context_destroy[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcisolate_context_destroy = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoisolate_context_destroy = CFunctionInfo(rcisolate_context_destroy, 2, cargsisolate_context_destroy); +CFunction pFisolate_context_destroy = CFunction((const void*)&isolate_context_destroyFast, &infoisolate_context_destroy); + +int32_t isolate_context_sizeFast(void* p); +CTypeInfo cargsisolate_context_size[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcisolate_context_size = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoisolate_context_size = CFunctionInfo(rcisolate_context_size, 1, cargsisolate_context_size); +CFunction pFisolate_context_size = CFunction((const void*)&isolate_context_sizeFast, &infoisolate_context_size); + +uint32_t strnlenFast(void* p, uint64_t* p0, uint32_t p1); +CTypeInfo cargsstrnlen[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), +}; +CTypeInfo rcstrnlen = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infostrnlen = CFunctionInfo(rcstrnlen, 3, cargsstrnlen); +CFunction pFstrnlen = CFunction((const void*)&strnlenFast, &infostrnlen); + +int32_t isattyFast(void* p, int32_t p0); +CTypeInfo cargsisatty[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcisatty = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoisatty = CFunctionInfo(rcisatty, 2, cargsisatty); +CFunction pFisatty = CFunction((const void*)&isattyFast, &infoisatty); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +void callocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = calloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void callocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret) { + uint32_t v0 = p0; + uint32_t v1 = p1; + void* r = calloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void readSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _read(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t readFast(void* p, int32_t p0, uint64_t* p1, int32_t p2) { + int32_t v0 = p0; + void* v1 = reinterpret_cast(p1); + int32_t v2 = p2; + return _read(v0, v1, v2); +} +void writeSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _write(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t writeFast(void* p, int32_t p0, uint64_t* p1, int32_t p2) { + int32_t v0 = p0; + void* v1 = reinterpret_cast(p1); + int32_t v2 = p2; + return _write(v0, v1, v2); +} +void write_stringSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + String::Utf8Value v1(isolate, args[1]); + int32_t v2 = v1.length(); + int32_t rc = _write(v0, *v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t write_stringFast(void* p, int32_t p0, struct FastOneByteString* const p1) { + int32_t v0 = p0; + struct FastOneByteString* const v1 = p1; + int32_t v2 = p1->length; + return _write(v0, v1->data, v2); +} +void putcharSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = putchar(v0); + args.GetReturnValue().Set(rc); +} + +int32_t putcharFast(void* p, int32_t p0) { + int32_t v0 = p0; + return putchar(v0); +} +void getcharSlow(const FunctionCallbackInfo &args) { + + int32_t rc = getchar(); + args.GetReturnValue().Set(rc); +} + +int32_t getcharFast(void* p) { + + return getchar(); +} +void closeSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _close(v0); + args.GetReturnValue().Set(rc); +} + +int32_t closeFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _close(v0); +} +void lseekSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + int32_t v2 = Local::Cast(args[2])->Value(); + uint32_t rc = _lseek(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +uint32_t lseekFast(void* p, int32_t p0, uint32_t p1, int32_t p2) { + int32_t v0 = p0; + uint32_t v1 = p1; + int32_t v2 = p2; + return _lseek(v0, v1, v2); +} +void fstatSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + struct _stat * v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t rc = _fstat(v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t fstatFast(void* p, int32_t p0, uint64_t* p1) { + int32_t v0 = p0; + struct _stat * v1 = reinterpret_cast(p1); + return _fstat(v0, v1); +} +void renameSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + String::Utf8Value v1(isolate, args[1]); + int32_t rc = rename(*v0, *v1); + args.GetReturnValue().Set(rc); +} + +int32_t renameFast(void* p, struct FastOneByteString* const p0, struct FastOneByteString* const p1) { + struct FastOneByteString* const v0 = p0; + struct FastOneByteString* const v1 = p1; + return rename(v0->data, v1->data); +} +void openSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + int32_t v1 = Local::Cast(args[1])->Value(); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _open(*v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t openFast(void* p, struct FastOneByteString* const p0, int32_t p1, int32_t p2) { + struct FastOneByteString* const v0 = p0; + int32_t v1 = p1; + int32_t v2 = p2; + return _open(v0->data, v1, v2); +} +void unlinkSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + int32_t rc = _unlink(*v0); + args.GetReturnValue().Set(rc); +} + +int32_t unlinkFast(void* p, struct FastOneByteString* const p0) { + struct FastOneByteString* const v0 = p0; + return _unlink(v0->data); +} +void memcpySlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memcpy(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memcpyFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + void* v1 = reinterpret_cast(p1); + uint32_t v2 = p2; + void* r = memcpy(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void memsetSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + int32_t v1 = Local::Cast(args[1])->Value(); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memset(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memsetFast(void* p, uint64_t* p0, int32_t p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + int32_t v1 = p1; + uint32_t v2 = p2; + void* r = memset(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void memmoveSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memmove(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memmoveFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + void* v1 = reinterpret_cast(p1); + uint32_t v2 = p2; + void* r = memmove(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void mallocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + void* rc = malloc(v0); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void mallocFast(void* p, uint32_t p0, uint64_t* p_ret) { + uint32_t v0 = p0; + void* r = malloc(v0); + + p_ret[0] = (uint64_t)r; +} +void reallocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = realloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void reallocFast(void* p, uint64_t* p0, uint32_t p1, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + uint32_t v1 = p1; + void* r = realloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void aligned_allocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = _aligned_malloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void aligned_allocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret) { + uint32_t v0 = p0; + uint32_t v1 = p1; + void* r = _aligned_malloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void freeSlow(const FunctionCallbackInfo &args) { + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + free(v0); +} + +void freeFast(void* p, uint64_t* p0) { + void* v0 = reinterpret_cast(p0); + free(v0); +} +void fastcallSlow(const FunctionCallbackInfo &args) { + struct fastcall* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_fastcall(v0); +} + +void fastcallFast(void* p, uint64_t* p0) { + struct fastcall* v0 = reinterpret_cast(p0); + lo_fastcall(v0); +} +void getenvSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* rc = getenv(*v0); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void getenvFast(void* p, struct FastOneByteString* const p0, uint64_t* p_ret) { + struct FastOneByteString* const v0 = p0; + char* r = getenv(v0->data); + + p_ret[0] = (uint64_t)r; +} +void dupSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _dup(v0); + args.GetReturnValue().Set(rc); +} + +int32_t dupFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _dup(v0); +} +void dup2Slow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t v1 = Local::Cast(args[1])->Value(); + int32_t rc = _dup2(v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t dup2Fast(void* p, int32_t p0, int32_t p1) { + int32_t v0 = p0; + int32_t v1 = p1; + return _dup2(v0, v1); +} +void getcwdSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + char* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + int32_t v1 = Local::Cast(args[1])->Value(); + void* rc = _getcwd(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void getcwdFast(void* p, uint64_t* p0, int32_t p1, uint64_t* p_ret) { + char* v0 = reinterpret_cast(p0); + int32_t v1 = p1; + void* r = _getcwd(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void getpidSlow(const FunctionCallbackInfo &args) { + + int32_t rc = _getpid(); + args.GetReturnValue().Set(rc); +} + +int32_t getpidFast(void* p) { + + return _getpid(); +} +void execveSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* const* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + char* const* v2 = reinterpret_cast((uint64_t)Local::Cast(args[2])->Value()); + int32_t rc = _execve(*v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t execveFast(void* p, struct FastOneByteString* const p0, uint64_t* p1, uint64_t* p2) { + struct FastOneByteString* const v0 = p0; + char* const* v1 = reinterpret_cast(p1); + char* const* v2 = reinterpret_cast(p2); + return _execve(v0->data, v1, v2); +} +void execvpSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* const* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t rc = _execvp(*v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t execvpFast(void* p, struct FastOneByteString* const p0, uint64_t* p1) { + struct FastOneByteString* const v0 = p0; + char* const* v1 = reinterpret_cast(p1); + return _execvp(v0->data, v1); +} +void exitSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + exit(v0); +} + +void exitFast(void* p, int32_t p0) { + int32_t v0 = p0; + exit(v0); +} +void isolate_createSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + char** v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + String::Utf8Value v2(isolate, args[2]); + uint32_t v3 = Local::Cast(args[3])->Value(); + String::Utf8Value v4(isolate, args[4]); + uint32_t v5 = Local::Cast(args[5])->Value(); + char* v6 = reinterpret_cast((uint64_t)Local::Cast(args[6])->Value()); + int32_t v7 = Local::Cast(args[7])->Value(); + int32_t v8 = Local::Cast(args[8])->Value(); + uint64_t v9 = Local::Cast(args[9])->Value(); + String::Utf8Value v10(isolate, args[10]); + String::Utf8Value v11(isolate, args[11]); + int32_t v12 = Local::Cast(args[12])->Value(); + int32_t v13 = Local::Cast(args[13])->Value(); + void* v14 = reinterpret_cast((uint64_t)Local::Cast(args[14])->Value()); + int32_t rc = lo_create_isolate(v0, v1, *v2, v3, *v4, v5, v6, v7, v8, v9, *v10, *v11, v12, v13, v14); + args.GetReturnValue().Set(rc); +} + +void isolate_context_createSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + char** v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + String::Utf8Value v2(isolate, args[2]); + uint32_t v3 = Local::Cast(args[3])->Value(); + String::Utf8Value v4(isolate, args[4]); + uint32_t v5 = Local::Cast(args[5])->Value(); + char* v6 = reinterpret_cast((uint64_t)Local::Cast(args[6])->Value()); + int32_t v7 = Local::Cast(args[7])->Value(); + int32_t v8 = Local::Cast(args[8])->Value(); + uint64_t v9 = Local::Cast(args[9])->Value(); + String::Utf8Value v10(isolate, args[10]); + String::Utf8Value v11(isolate, args[11]); + int32_t v12 = Local::Cast(args[12])->Value(); + int32_t v13 = Local::Cast(args[13])->Value(); + void* v14 = reinterpret_cast((uint64_t)Local::Cast(args[14])->Value()); + struct isolate_context* v15 = reinterpret_cast((uint64_t)Local::Cast(args[15])->Value()); + lo_create_isolate_context(v0, v1, *v2, v3, *v4, v5, v6, v7, v8, v9, *v10, *v11, v12, v13, v14, v15); +} + +void isolate_context_destroySlow(const FunctionCallbackInfo &args) { + struct isolate_context* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_destroy_isolate_context(v0); +} + +void isolate_context_destroyFast(void* p, uint64_t* p0) { + struct isolate_context* v0 = reinterpret_cast(p0); + lo_destroy_isolate_context(v0); +} +void isolate_context_sizeSlow(const FunctionCallbackInfo &args) { + + int32_t rc = lo_context_size(); + args.GetReturnValue().Set(rc); +} + +int32_t isolate_context_sizeFast(void* p) { + + return lo_context_size(); +} +void isolate_startSlow(const FunctionCallbackInfo &args) { + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_start_isolate(v0); +} + +void callbackSlow(const FunctionCallbackInfo &args) { + exec_info* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_callback(v0); +} + +void strnlenSlow(const FunctionCallbackInfo &args) { + const char* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + uint32_t v1 = Local::Cast(args[1])->Value(); + uint32_t rc = strnlen(v0, v1); + args.GetReturnValue().Set(rc); +} + +uint32_t strnlenFast(void* p, uint64_t* p0, uint32_t p1) { + const char* v0 = reinterpret_cast(p0); + uint32_t v1 = p1; + return strnlen(v0, v1); +} +void isattySlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _isatty(v0); + args.GetReturnValue().Set(rc); +} + +int32_t isattyFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _isatty(v0); +} +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif +void Init(Isolate* isolate, Local target) { + Local module = ObjectTemplate::New(isolate); + SET_FAST_METHOD(isolate, module, "calloc", &pFcalloc, callocSlow); + SET_FAST_METHOD(isolate, module, "read", &pFread, readSlow); + SET_FAST_METHOD(isolate, module, "write", &pFwrite, writeSlow); + SET_FAST_METHOD(isolate, module, "write_string", &pFwrite_string, write_stringSlow); + SET_FAST_METHOD(isolate, module, "putchar", &pFputchar, putcharSlow); + SET_FAST_METHOD(isolate, module, "getchar", &pFgetchar, getcharSlow); + SET_FAST_METHOD(isolate, module, "close", &pFclose, closeSlow); + SET_FAST_METHOD(isolate, module, "lseek", &pFlseek, lseekSlow); + SET_FAST_METHOD(isolate, module, "fstat", &pFfstat, fstatSlow); + SET_FAST_METHOD(isolate, module, "rename", &pFrename, renameSlow); + SET_FAST_METHOD(isolate, module, "open", &pFopen, openSlow); + SET_FAST_METHOD(isolate, module, "unlink", &pFunlink, unlinkSlow); + SET_FAST_METHOD(isolate, module, "memcpy", &pFmemcpy, memcpySlow); + SET_FAST_METHOD(isolate, module, "memset", &pFmemset, memsetSlow); + SET_FAST_METHOD(isolate, module, "memmove", &pFmemmove, memmoveSlow); + SET_FAST_METHOD(isolate, module, "malloc", &pFmalloc, mallocSlow); + SET_FAST_METHOD(isolate, module, "realloc", &pFrealloc, reallocSlow); + SET_FAST_METHOD(isolate, module, "aligned_alloc", &pFaligned_alloc, aligned_allocSlow); + SET_FAST_METHOD(isolate, module, "free", &pFfree, freeSlow); + SET_METHOD(isolate, module, "bind_fastcall", bind_fastcallSlow); + SET_METHOD(isolate, module, "bind_slowcall", bind_slowcallSlow); + SET_FAST_METHOD(isolate, module, "fastcall", &pFfastcall, fastcallSlow); + SET_FAST_METHOD(isolate, module, "getenv", &pFgetenv, getenvSlow); + SET_FAST_METHOD(isolate, module, "dup", &pFdup, dupSlow); + SET_FAST_METHOD(isolate, module, "dup2", &pFdup2, dup2Slow); + SET_FAST_METHOD(isolate, module, "getcwd", &pFgetcwd, getcwdSlow); + SET_FAST_METHOD(isolate, module, "getpid", &pFgetpid, getpidSlow); + SET_FAST_METHOD(isolate, module, "execve", &pFexecve, execveSlow); + SET_FAST_METHOD(isolate, module, "execvp", &pFexecvp, execvpSlow); + SET_FAST_METHOD(isolate, module, "exit", &pFexit, exitSlow); + SET_METHOD(isolate, module, "isolate_create", isolate_createSlow); + SET_METHOD(isolate, module, "isolate_context_create", isolate_context_createSlow); + SET_FAST_METHOD(isolate, module, "isolate_context_destroy", &pFisolate_context_destroy, isolate_context_destroySlow); + SET_FAST_METHOD(isolate, module, "isolate_context_size", &pFisolate_context_size, isolate_context_sizeSlow); + SET_METHOD(isolate, module, "isolate_start", isolate_startSlow); + SET_METHOD(isolate, module, "callback", callbackSlow); + SET_FAST_METHOD(isolate, module, "strnlen", &pFstrnlen, strnlenSlow); + SET_FAST_METHOD(isolate, module, "isatty", &pFisatty, isattySlow); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + SET_VALUE(isolate, module, "S_IFCHR", Integer::New(isolate, (int32_t)S_IFCHR)); + SET_VALUE(isolate, module, "O_RDONLY", Integer::New(isolate, (int32_t)O_RDONLY)); + SET_VALUE(isolate, module, "O_WRONLY", Integer::New(isolate, (int32_t)O_WRONLY)); + SET_VALUE(isolate, module, "O_CREAT", Integer::New(isolate, (int32_t)O_CREAT)); + SET_VALUE(isolate, module, "O_TRUNC", Integer::New(isolate, (int32_t)O_TRUNC)); + SET_VALUE(isolate, module, "STDIN", Number::New(isolate, (int64_t)0)); + SET_VALUE(isolate, module, "STDOUT", Number::New(isolate, (int64_t)1)); + SET_VALUE(isolate, module, "STDERR", Number::New(isolate, (int64_t)2)); + SET_VALUE(isolate, module, "SEEK_SET", Integer::New(isolate, (int32_t)SEEK_SET)); + SET_VALUE(isolate, module, "SEEK_CUR", Integer::New(isolate, (int32_t)SEEK_CUR)); + SET_VALUE(isolate, module, "SEEK_END", Integer::New(isolate, (int32_t)SEEK_END)); + SET_VALUE(isolate, module, "S_IFMT", Integer::New(isolate, (int32_t)S_IFMT)); + SET_VALUE(isolate, module, "S_IFDIR", Integer::New(isolate, (int32_t)S_IFDIR)); + SET_VALUE(isolate, module, "S_IFREG", Integer::New(isolate, (int32_t)S_IFREG)); + SET_VALUE(isolate, module, "O_RDWR", Integer::New(isolate, (int32_t)O_RDWR)); + SET_VALUE(isolate, module, "EAGAIN", Integer::New(isolate, (int32_t)EAGAIN)); + SET_VALUE(isolate, module, "_S_IREAD", Integer::New(isolate, (int32_t)_S_IREAD)); + SET_VALUE(isolate, module, "_S_IWRITE", Integer::New(isolate, (int32_t)_S_IWRITE)); + SET_VALUE(isolate, module, "_O_APPEND", Integer::New(isolate, (int32_t)_O_APPEND)); + SET_VALUE(isolate, module, "_O_BINARY", Integer::New(isolate, (int32_t)_O_BINARY)); + SET_VALUE(isolate, module, "_O_CREAT", Integer::New(isolate, (int32_t)_O_CREAT)); + SET_VALUE(isolate, module, "_O_RDONLY", Integer::New(isolate, (int32_t)_O_RDONLY)); + SET_VALUE(isolate, module, "_O_RDWR", Integer::New(isolate, (int32_t)_O_RDWR)); + SET_VALUE(isolate, module, "_O_TEXT", Integer::New(isolate, (int32_t)_O_TEXT)); + SET_VALUE(isolate, module, "_O_TRUNC", Integer::New(isolate, (int32_t)_O_TRUNC)); + SET_VALUE(isolate, module, "_O_WRONLY", Integer::New(isolate, (int32_t)_O_WRONLY)); + SET_VALUE(isolate, module, "_O_U16TEXT", Integer::New(isolate, (int32_t)_O_U16TEXT)); + SET_VALUE(isolate, module, "_O_U8TEXT", Integer::New(isolate, (int32_t)_O_U8TEXT)); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +#ifdef __MACH__ + SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + +#endif +#ifdef __linux__ + SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + +#endif + SET_MODULE(isolate, target, "core", module); +} +} // namespace core +} // namespace lo + +extern "C" { + DLL_PUBLIC void* _register_core() { + return (void*)lo::core::Init; + } +} From 3065e9c640cbbb8654590e8c868916153978c070 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 2 Jan 2026 01:30:13 +0000 Subject: [PATCH 14/33] chore: giving up on curl for now --- build.cmd | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cmd b/build.cmd index 00c9fe5..424fd15 100644 --- a/build.cmd +++ b/build.cmd @@ -12,9 +12,9 @@ if "%WindowsSdkDir%"== "" ( call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" ) if exist lo.exe ( - lo.exe gen --builtins --win main.js %BUILTINS% > builtins.h - lo.exe gen lib\core2\api.js > lib\core2\core.cc - lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h +REM lo.exe gen --builtins --win main.js %BUILTINS% > builtins.h +REM lo.exe gen lib\core2\api.js > lib\core2\core.cc +REM lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h ) if not exist em_inflate.o ( cd lib\inflate @@ -32,10 +32,10 @@ clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% lib/win/win.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc -REM clang++ %OPTS% %INCLUDE% -Iscratch\curl\curl-8.17.0_6-win64-mingw\include -c %V8_OPTS% -DNOMINMAX lib/curl/curl.cc REM set CURLP=scratch\curl\curl-8.17.0_6-win64-mingw\ -REM clang++ v8\v8_monolith.lib lo.o main.o win.o core.o inflate.o lib\inflate\em_inflate.o curl.o %CURLP%lib\libcurl.a %CURLP%lib\libcurl.dll.a -lwinmm -ldbghelp -lbcrypt -o lo.tmp.exe +REM clang++ %OPTS% %INCLUDE% -I%CURLP%include -c %V8_OPTS% -DNOMINMAX lib/curl/curl.cc +REM clang++ v8\v8_monolith.lib %OBJS% curl.o -L %CURLP%lib -l libcurl -l libcurl.dll -l libbrotlicommon -l libbrotlidec -l libcrypto -l libnghttp2 -l libnghttp3 -l libngtcp2 -l libngtcp2_crypto_libressl -l libpsl -l libssh2 -l libz -l libzstd %LOPTS% -o lo.tmp.exe clang++ v8\v8_monolith.lib %OBJS% %LOPTS% -o %RUNTIME%.tmp.exe move /Y %RUNTIME%.tmp.exe %RUNTIME%.exe del *.lib -del *.exp \ No newline at end of file +del *.exp From 3e1553b8439a0eb647532af09c8f6d34efdbb086 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 2 Jan 2026 01:32:39 +0000 Subject: [PATCH 15/33] chore: try a windows ci build --- .github/workflows/push.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 99fcca8..1aeaa9f 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -139,7 +139,7 @@ jobs: name: lo-linux-${{ matrix.platform }} build-windows: - if: ${{ false }} # disable +# if: ${{ false }} # disable name: windows runs-on: windows-2022 strategy: @@ -152,10 +152,7 @@ jobs: uses: microsoft/setup-msbuild@v1.0.2 - name: compile run: | - make BINDINGS= ARCH=${{ matrix.platform }} lo.exe - - name: check - run: | - make check + build.cmd - name: upload artifact uses: actions/upload-artifact@v4 with: From 06416c100c7a12e9d26c217833964c498818b37f Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 2 Jan 2026 01:44:20 +0000 Subject: [PATCH 16/33] chore: download deps on windows build --- .github/workflows/push.yml | 3 +- build.cmd | 18 +- lib/core2/core.cc | 2385 ++++++++++++++++++------------------ 3 files changed, 1210 insertions(+), 1196 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 1aeaa9f..e4c6fba 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -151,8 +151,9 @@ jobs: - name: Install MSVC/MCBuild (Windows) uses: microsoft/setup-msbuild@v1.0.2 - name: compile + shell: cmd run: | - build.cmd + call ${{ github.workspace}}\build.cmd - name: upload artifact uses: actions/upload-artifact@v4 with: diff --git a/build.cmd b/build.cmd index 424fd15..b62d5fb 100644 --- a/build.cmd +++ b/build.cmd @@ -1,5 +1,6 @@ @echo off set VERSION=0.0.24-pre +set V8=14.3 set RUNTIME=lo set V8_OPTS=-DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ALLOCATION_FOLDING -DV8_SHORT_BUILTIN_CALLS set OPTS=-std=c++20 -fomit-frame-pointer -fno-rtti -fno-exceptions -O3 -march=native -mtune=native @@ -11,10 +12,21 @@ set BUILTINS=lib/inflate.js lib/gen.js lib/path.js lib/proc.js lib/stringify.js if "%WindowsSdkDir%"== "" ( call "C:\Program Files (x86)\Microsoft Visual Studio\18\BuildTools\VC\Auxiliary\Build\vcvars64.bat" ) +if not exist v8 ( + mkdir v8 + cd v8 + curl -L -O https://github.com/just-js/v8/releases/download/%V8%/include.tar.gz + tar -xvf include.tar.gz + curl -L -O https://github.com/just-js/v8/releases/download/%V8%/libv8_monolith-win-x64.zip + tar -xvf libv8_monolith-win-x64.zip + del /Q *.zip + del /Q *.gz + cd .. +) if exist lo.exe ( -REM lo.exe gen --builtins --win main.js %BUILTINS% > builtins.h -REM lo.exe gen lib\core2\api.js > lib\core2\core.cc -REM lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h + lo.exe gen --builtins --win main.js %BUILTINS% > builtins.h + lo.exe gen lib\core2\api.js > lib\core2\core.cc + lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h ) if not exist em_inflate.o ( cd lib\inflate diff --git a/lib/core2/core.cc b/lib/core2/core.cc index afba7b6..b1fb147 100644 --- a/lib/core2/core.cc +++ b/lib/core2/core.cc @@ -1,1192 +1,1193 @@ - -// [do not edit,] -// This file has been automatically generated, please do not change unless you disable auto-generation in the Makefile -#include - -#include - -#include - - - - - - -#include - -namespace lo { -namespace core { - -using v8::FunctionCallbackInfo; -using v8::Local; -using v8::ObjectTemplate; -using v8::Isolate; -using v8::Value; -using v8::Integer; -using v8::Number; -using v8::FunctionTemplate; -using v8::FunctionCallback; -using v8::CFunction; -using v8::CTypeInfo; -using v8::Uint8Array; -using v8::CFunctionInfo; -using v8::String; -using v8::Uint32Array; -using v8::ArrayBuffer; -using v8::Context; -using v8::Function; -using v8::Object; -using v8::HandleScope; -using v8::BigInt; - - -#ifdef _WIN32 -#define strdup _strdup -#endif - - -struct fastcall { - void* wrapper; // 0-7 : v8 fastcall wrapper function pointer - uint8_t result; // 8 : the type of the result - uint8_t nparam; // 9 : the number of args (max 255) - uint8_t param[30]; // 10-39 : an array of types of the arguments - uint64_t args[32]; // 40-295: an array of pointer slots for arguments - // these will be filled in dynamically by - // lo::core::SlowCallback for the slow call - // and then the slowcall wrapper will shift them from - // this structure into regs + stack and make the call - // the first slot is reserved for the result - void* fn; // 296-303: the slowcall wrapper function pointer -}; - -typedef void (*lo_fast_call)(void*); - -inline uint8_t needsunwrap (lo::FastTypes t) { - if (t == lo::FastTypes::buffer) return 1; - if (t == lo::FastTypes::u32array) return 1; - if (t == lo::FastTypes::pointer) return 1; - if (t == lo::FastTypes::u64) return 1; - if (t == lo::FastTypes::i64) return 1; - return 0; -} - -v8::CTypeInfo* CTypeFromV8 (uint8_t v8Type) { - if (v8Type == lo::FastTypes::boolean) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kBool); - if (v8Type == lo::FastTypes::i8) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); - if (v8Type == lo::FastTypes::i16) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); - if (v8Type == lo::FastTypes::i32) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); - if (v8Type == lo::FastTypes::u8) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); - if (v8Type == lo::FastTypes::u16) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); - if (v8Type == lo::FastTypes::u32) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); - if (v8Type == lo::FastTypes::f32) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat32); - if (v8Type == lo::FastTypes::f64) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat64); - if (v8Type == lo::FastTypes::i64) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); - if (v8Type == lo::FastTypes::u64) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); - if (v8Type == lo::FastTypes::iSize) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); - if (v8Type == lo::FastTypes::uSize) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); - if (v8Type == lo::FastTypes::pointer) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); - if (v8Type == lo::FastTypes::function) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); - if (v8Type == lo::FastTypes::string) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kSeqOneByteString); - if (v8Type == lo::FastTypes::buffer) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); - if (v8Type == lo::FastTypes::u32array) - return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); - return new v8::CTypeInfo(v8::CTypeInfo::Type::kVoid); -} - -void lo_fastcall (struct fastcall* state) { - ((lo_fast_call)state->fn)(&state->args); -} - -void SlowCallback(const FunctionCallbackInfo &args) { - Isolate* isolate = args.GetIsolate(); - HandleScope scope(isolate); - struct fastcall* state = (struct fastcall*)args.Data() - .As()->GetAlignedPointerFromInternalField(1); - int r = 1; - int s = 0; - char* temp_strs[100]; - for (int i = 0; i < state->nparam; i++) { - switch (state->param[i]) { - case FastTypes::string: - { - String::Utf8Value arg0(isolate, args[i]); - temp_strs[s] = strdup(*arg0); - state->args[r++] = (uint64_t)temp_strs[s++]; - } - break; - case FastTypes::u32: - state->args[r++] = (uint32_t)Local::Cast(args[i])->Value(); - break; - case FastTypes::u16: - state->args[r++] = (uint16_t)Local::Cast(args[i])->Value(); - break; - case FastTypes::u8: - state->args[r++] = (uint8_t)Local::Cast(args[i])->Value(); - break; - case FastTypes::boolean: - state->args[r++] = (bool)Local::Cast(args[i])->Value(); - break; - case FastTypes::i32: - state->args[r++] = (int32_t)Local::Cast(args[i])->Value(); - break; - case FastTypes::i16: - state->args[r++] = (int16_t)Local::Cast(args[i])->Value(); - break; - case FastTypes::i8: - state->args[r++] = (int8_t)Local::Cast(args[i])->Value(); - break; - case FastTypes::i64: - case FastTypes::iSize: - state->args[r++] = (int64_t)Local::Cast(args[i])->Value(); - break; - case FastTypes::u64: - case FastTypes::pointer: - case FastTypes::uSize: - state->args[r++] = (uint64_t)Local::Cast(args[i])->Value(); - break; - case FastTypes::buffer: - { - Local u8 = args[i].As(); - state->args[r++] = (uint64_t)((uint8_t*)u8->Buffer()->Data() + - u8->ByteOffset()); - } - break; - case FastTypes::u32array: - { - Local u32 = args[i].As(); - state->args[r++] = (uint64_t)((uint8_t*)u32->Buffer()->Data() + - u32->ByteOffset()); - } - break; - case FastTypes::function: - break; - case FastTypes::f32: - { - float src = (float)args[i].As()->Value(); - float* dst = (float*)&state->args[r++]; - *dst = src; - } - break; - case FastTypes::f64: - { - double src = (double)args[i].As()->Value(); - double* dst = (double*)&state->args[r++]; - *dst = src; - } - break; - } - } - lo_fastcall(state); - for (int i = 0; i < s; i++) { - free(temp_strs[i]); - } - switch (state->result) { - case FastTypes::i32: - args.GetReturnValue().Set((int32_t)state->args[0]); - break; - case FastTypes::u32: - args.GetReturnValue().Set((uint32_t)state->args[0]); - break; - case FastTypes::boolean: - args.GetReturnValue().Set((bool)state->args[0]); - break; - case FastTypes::f32: - { - float* dst = (float*)&state->args[0]; - args.GetReturnValue().Set(Number::New(isolate, *dst)); - } - break; - case FastTypes::f64: - { - double* dst = (double*)&state->args[0]; - args.GetReturnValue().Set(Number::New(isolate, *dst)); - } - break; - case FastTypes::i64: - { - int64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); - *res = state->args[0]; - } - break; - case FastTypes::buffer: - case FastTypes::u32array: - case FastTypes::u64: - case FastTypes::pointer: - { - uint64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); - *res = state->args[0]; - } - break; - } -} - -void bind_fastcallSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - Local context = isolate->GetCurrentContext(); - // TODO - does integer work? - struct fastcall* state = reinterpret_cast( - Local::Cast(args[0])->Value()); - Local tpl = ObjectTemplate::New(isolate); - tpl->SetInternalFieldCount(2); - Local data = tpl->NewInstance(context).ToLocalChecked(); - data->SetAlignedPointerInInternalField(1, state); - uint8_t unwrap = needsunwrap((FastTypes)state->result); - int fastlen = state->nparam + 1 + unwrap; - CTypeInfo* cargs = (CTypeInfo*)calloc(fastlen, sizeof(CTypeInfo)); - cargs[0] = CTypeInfo(CTypeInfo::Type::kV8Value); - for (int i = 0; i < state->nparam; i++) { - uint8_t ptype = state->param[i]; - cargs[i + 1] = *CTypeFromV8(ptype); - } - CTypeInfo* rc; - if (unwrap) { - cargs[fastlen - 1] = *CTypeFromV8(FastTypes::u32array); - rc = CTypeFromV8(FastTypes::empty); - } else { - rc = CTypeFromV8((FastTypes)state->result); - } - CFunctionInfo* info = new CFunctionInfo(*rc, fastlen, cargs); - CFunction* fastCFunc = new CFunction(state->wrapper, info); - Local funcTemplate = FunctionTemplate::New(isolate, - SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, - v8::SideEffectType::kHasNoSideEffect, fastCFunc - ); - Local fun = - funcTemplate->GetFunction(context).ToLocalChecked(); - args.GetReturnValue().Set(fun); -} - -void bind_slowcallSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - Local context = isolate->GetCurrentContext(); - struct fastcall* state = reinterpret_cast( - Local::Cast(args[0])->Value()); - Local tpl = ObjectTemplate::New(isolate); - tpl->SetInternalFieldCount(2); - Local data = tpl->NewInstance(context).ToLocalChecked(); - data->SetAlignedPointerInInternalField(1, state); - Local funcTemplate = FunctionTemplate::New(isolate, - SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, - v8::SideEffectType::kHasNoSideEffect, 0 - ); - Local fun = - funcTemplate->GetFunction(context).ToLocalChecked(); - args.GetReturnValue().Set(fun); -} - -#ifdef __linux__ - -#endif -#ifdef __MACH__ - -#endif - -void callocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret); -CTypeInfo cargscalloc[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rccalloc = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infocalloc = CFunctionInfo(rccalloc, 4, cargscalloc); -CFunction pFcalloc = CFunction((const void*)&callocFast, &infocalloc); - -int32_t readFast(void* p, int32_t p0, uint64_t* p1, int32_t p2); -CTypeInfo cargsread[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcread = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo inforead = CFunctionInfo(rcread, 4, cargsread); -CFunction pFread = CFunction((const void*)&readFast, &inforead); - -int32_t writeFast(void* p, int32_t p0, uint64_t* p1, int32_t p2); -CTypeInfo cargswrite[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcwrite = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infowrite = CFunctionInfo(rcwrite, 4, cargswrite); -CFunction pFwrite = CFunction((const void*)&writeFast, &infowrite); - -int32_t write_stringFast(void* p, int32_t p0, struct FastOneByteString* const p1); -CTypeInfo cargswrite_string[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), -}; -CTypeInfo rcwrite_string = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infowrite_string = CFunctionInfo(rcwrite_string, 3, cargswrite_string); -CFunction pFwrite_string = CFunction((const void*)&write_stringFast, &infowrite_string); - -int32_t putcharFast(void* p, int32_t p0); -CTypeInfo cargsputchar[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcputchar = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infoputchar = CFunctionInfo(rcputchar, 2, cargsputchar); -CFunction pFputchar = CFunction((const void*)&putcharFast, &infoputchar); - -int32_t getcharFast(void* p); -CTypeInfo cargsgetchar[1] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - -}; -CTypeInfo rcgetchar = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infogetchar = CFunctionInfo(rcgetchar, 1, cargsgetchar); -CFunction pFgetchar = CFunction((const void*)&getcharFast, &infogetchar); - -int32_t closeFast(void* p, int32_t p0); -CTypeInfo cargsclose[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcclose = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infoclose = CFunctionInfo(rcclose, 2, cargsclose); -CFunction pFclose = CFunction((const void*)&closeFast, &infoclose); - -uint32_t lseekFast(void* p, int32_t p0, uint32_t p1, int32_t p2); -CTypeInfo cargslseek[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rclseek = CTypeInfo(CTypeInfo::Type::kUint32); -CFunctionInfo infolseek = CFunctionInfo(rclseek, 4, cargslseek); -CFunction pFlseek = CFunction((const void*)&lseekFast, &infolseek); - -int32_t fstatFast(void* p, int32_t p0, uint64_t* p1); -CTypeInfo cargsfstat[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kUint64), -}; -CTypeInfo rcfstat = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infofstat = CFunctionInfo(rcfstat, 3, cargsfstat); -CFunction pFfstat = CFunction((const void*)&fstatFast, &infofstat); - -int32_t renameFast(void* p, struct FastOneByteString* const p0, struct FastOneByteString* const p1); -CTypeInfo cargsrename[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), -}; -CTypeInfo rcrename = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo inforename = CFunctionInfo(rcrename, 3, cargsrename); -CFunction pFrename = CFunction((const void*)&renameFast, &inforename); - -int32_t openFast(void* p, struct FastOneByteString* const p0, int32_t p1, int32_t p2); -CTypeInfo cargsopen[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcopen = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infoopen = CFunctionInfo(rcopen, 4, cargsopen); -CFunction pFopen = CFunction((const void*)&openFast, &infoopen); - -int32_t unlinkFast(void* p, struct FastOneByteString* const p0); -CTypeInfo cargsunlink[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), -}; -CTypeInfo rcunlink = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infounlink = CFunctionInfo(rcunlink, 2, cargsunlink); -CFunction pFunlink = CFunction((const void*)&unlinkFast, &infounlink); - -void memcpyFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret); -CTypeInfo cargsmemcpy[5] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rcmemcpy = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infomemcpy = CFunctionInfo(rcmemcpy, 5, cargsmemcpy); -CFunction pFmemcpy = CFunction((const void*)&memcpyFast, &infomemcpy); - -void memsetFast(void* p, uint64_t* p0, int32_t p1, uint32_t p2, uint64_t* p_ret); -CTypeInfo cargsmemset[5] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rcmemset = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infomemset = CFunctionInfo(rcmemset, 5, cargsmemset); -CFunction pFmemset = CFunction((const void*)&memsetFast, &infomemset); - -void memmoveFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret); -CTypeInfo cargsmemmove[5] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rcmemmove = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infomemmove = CFunctionInfo(rcmemmove, 5, cargsmemmove); -CFunction pFmemmove = CFunction((const void*)&memmoveFast, &infomemmove); - -void mallocFast(void* p, uint32_t p0, uint64_t* p_ret); -CTypeInfo cargsmalloc[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rcmalloc = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infomalloc = CFunctionInfo(rcmalloc, 3, cargsmalloc); -CFunction pFmalloc = CFunction((const void*)&mallocFast, &infomalloc); - -void reallocFast(void* p, uint64_t* p0, uint32_t p1, uint64_t* p_ret); -CTypeInfo cargsrealloc[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rcrealloc = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo inforealloc = CFunctionInfo(rcrealloc, 4, cargsrealloc); -CFunction pFrealloc = CFunction((const void*)&reallocFast, &inforealloc); - -void aligned_allocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret); -CTypeInfo cargsaligned_alloc[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint32), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rcaligned_alloc = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infoaligned_alloc = CFunctionInfo(rcaligned_alloc, 4, cargsaligned_alloc); -CFunction pFaligned_alloc = CFunction((const void*)&aligned_allocFast, &infoaligned_alloc); - -void freeFast(void* p, uint64_t* p0); -CTypeInfo cargsfree[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), -}; -CTypeInfo rcfree = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infofree = CFunctionInfo(rcfree, 2, cargsfree); -CFunction pFfree = CFunction((const void*)&freeFast, &infofree); - -void fastcallFast(void* p, uint64_t* p0); -CTypeInfo cargsfastcall[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), -}; -CTypeInfo rcfastcall = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infofastcall = CFunctionInfo(rcfastcall, 2, cargsfastcall); -CFunction pFfastcall = CFunction((const void*)&fastcallFast, &infofastcall); - -void getenvFast(void* p, struct FastOneByteString* const p0, uint64_t* p_ret); -CTypeInfo cargsgetenv[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rcgetenv = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infogetenv = CFunctionInfo(rcgetenv, 3, cargsgetenv); -CFunction pFgetenv = CFunction((const void*)&getenvFast, &infogetenv); - -int32_t dupFast(void* p, int32_t p0); -CTypeInfo cargsdup[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcdup = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infodup = CFunctionInfo(rcdup, 2, cargsdup); -CFunction pFdup = CFunction((const void*)&dupFast, &infodup); - -int32_t dup2Fast(void* p, int32_t p0, int32_t p1); -CTypeInfo cargsdup2[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcdup2 = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infodup2 = CFunctionInfo(rcdup2, 3, cargsdup2); -CFunction pFdup2 = CFunction((const void*)&dup2Fast, &infodup2); - -void getcwdFast(void* p, uint64_t* p0, int32_t p1, uint64_t* p_ret); -CTypeInfo cargsgetcwd[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kInt32), - CTypeInfo(CTypeInfo::Type::kUint64) -}; -CTypeInfo rcgetcwd = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infogetcwd = CFunctionInfo(rcgetcwd, 4, cargsgetcwd); -CFunction pFgetcwd = CFunction((const void*)&getcwdFast, &infogetcwd); - -int32_t getpidFast(void* p); -CTypeInfo cargsgetpid[1] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - -}; -CTypeInfo rcgetpid = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infogetpid = CFunctionInfo(rcgetpid, 1, cargsgetpid); -CFunction pFgetpid = CFunction((const void*)&getpidFast, &infogetpid); - -int32_t execveFast(void* p, struct FastOneByteString* const p0, uint64_t* p1, uint64_t* p2); -CTypeInfo cargsexecve[4] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kUint64), -}; -CTypeInfo rcexecve = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infoexecve = CFunctionInfo(rcexecve, 4, cargsexecve); -CFunction pFexecve = CFunction((const void*)&execveFast, &infoexecve); - -int32_t execvpFast(void* p, struct FastOneByteString* const p0, uint64_t* p1); -CTypeInfo cargsexecvp[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kSeqOneByteString), - CTypeInfo(CTypeInfo::Type::kUint64), -}; -CTypeInfo rcexecvp = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infoexecvp = CFunctionInfo(rcexecvp, 3, cargsexecvp); -CFunction pFexecvp = CFunction((const void*)&execvpFast, &infoexecvp); - -void exitFast(void* p, int32_t p0); -CTypeInfo cargsexit[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcexit = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infoexit = CFunctionInfo(rcexit, 2, cargsexit); -CFunction pFexit = CFunction((const void*)&exitFast, &infoexit); - -void isolate_context_destroyFast(void* p, uint64_t* p0); -CTypeInfo cargsisolate_context_destroy[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), -}; -CTypeInfo rcisolate_context_destroy = CTypeInfo(CTypeInfo::Type::kVoid); -CFunctionInfo infoisolate_context_destroy = CFunctionInfo(rcisolate_context_destroy, 2, cargsisolate_context_destroy); -CFunction pFisolate_context_destroy = CFunction((const void*)&isolate_context_destroyFast, &infoisolate_context_destroy); - -int32_t isolate_context_sizeFast(void* p); -CTypeInfo cargsisolate_context_size[1] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - -}; -CTypeInfo rcisolate_context_size = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infoisolate_context_size = CFunctionInfo(rcisolate_context_size, 1, cargsisolate_context_size); -CFunction pFisolate_context_size = CFunction((const void*)&isolate_context_sizeFast, &infoisolate_context_size); - -uint32_t strnlenFast(void* p, uint64_t* p0, uint32_t p1); -CTypeInfo cargsstrnlen[3] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kUint64), - CTypeInfo(CTypeInfo::Type::kUint32), -}; -CTypeInfo rcstrnlen = CTypeInfo(CTypeInfo::Type::kUint32); -CFunctionInfo infostrnlen = CFunctionInfo(rcstrnlen, 3, cargsstrnlen); -CFunction pFstrnlen = CFunction((const void*)&strnlenFast, &infostrnlen); - -int32_t isattyFast(void* p, int32_t p0); -CTypeInfo cargsisatty[2] = { - CTypeInfo(CTypeInfo::Type::kV8Value), - CTypeInfo(CTypeInfo::Type::kInt32), -}; -CTypeInfo rcisatty = CTypeInfo(CTypeInfo::Type::kInt32); -CFunctionInfo infoisatty = CFunctionInfo(rcisatty, 2, cargsisatty); -CFunction pFisatty = CFunction((const void*)&isattyFast, &infoisatty); - -#ifdef __linux__ - -#endif -#ifdef __MACH__ - -#endif - -void callocSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - uint32_t v0 = Local::Cast(args[0])->Value(); - uint32_t v1 = Local::Cast(args[1])->Value(); - void* rc = calloc(v0, v1); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void callocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret) { - uint32_t v0 = p0; - uint32_t v1 = p1; - void* r = calloc(v0, v1); - - p_ret[0] = (uint64_t)r; -} -void readSlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - int32_t v2 = Local::Cast(args[2])->Value(); - int32_t rc = _read(v0, v1, v2); - args.GetReturnValue().Set(rc); -} - -int32_t readFast(void* p, int32_t p0, uint64_t* p1, int32_t p2) { - int32_t v0 = p0; - void* v1 = reinterpret_cast(p1); - int32_t v2 = p2; - return _read(v0, v1, v2); -} -void writeSlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - int32_t v2 = Local::Cast(args[2])->Value(); - int32_t rc = _write(v0, v1, v2); - args.GetReturnValue().Set(rc); -} - -int32_t writeFast(void* p, int32_t p0, uint64_t* p1, int32_t p2) { - int32_t v0 = p0; - void* v1 = reinterpret_cast(p1); - int32_t v2 = p2; - return _write(v0, v1, v2); -} -void write_stringSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - int32_t v0 = Local::Cast(args[0])->Value(); - String::Utf8Value v1(isolate, args[1]); - int32_t v2 = v1.length(); - int32_t rc = _write(v0, *v1, v2); - args.GetReturnValue().Set(rc); -} - -int32_t write_stringFast(void* p, int32_t p0, struct FastOneByteString* const p1) { - int32_t v0 = p0; - struct FastOneByteString* const v1 = p1; - int32_t v2 = p1->length; - return _write(v0, v1->data, v2); -} -void putcharSlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - int32_t rc = putchar(v0); - args.GetReturnValue().Set(rc); -} - -int32_t putcharFast(void* p, int32_t p0) { - int32_t v0 = p0; - return putchar(v0); -} -void getcharSlow(const FunctionCallbackInfo &args) { - - int32_t rc = getchar(); - args.GetReturnValue().Set(rc); -} - -int32_t getcharFast(void* p) { - - return getchar(); -} -void closeSlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - int32_t rc = _close(v0); - args.GetReturnValue().Set(rc); -} - -int32_t closeFast(void* p, int32_t p0) { - int32_t v0 = p0; - return _close(v0); -} -void lseekSlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - uint32_t v1 = Local::Cast(args[1])->Value(); - int32_t v2 = Local::Cast(args[2])->Value(); - uint32_t rc = _lseek(v0, v1, v2); - args.GetReturnValue().Set(rc); -} - -uint32_t lseekFast(void* p, int32_t p0, uint32_t p1, int32_t p2) { - int32_t v0 = p0; - uint32_t v1 = p1; - int32_t v2 = p2; - return _lseek(v0, v1, v2); -} -void fstatSlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - struct _stat * v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - int32_t rc = _fstat(v0, v1); - args.GetReturnValue().Set(rc); -} - -int32_t fstatFast(void* p, int32_t p0, uint64_t* p1) { - int32_t v0 = p0; - struct _stat * v1 = reinterpret_cast(p1); - return _fstat(v0, v1); -} -void renameSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - String::Utf8Value v0(isolate, args[0]); - String::Utf8Value v1(isolate, args[1]); - int32_t rc = rename(*v0, *v1); - args.GetReturnValue().Set(rc); -} - -int32_t renameFast(void* p, struct FastOneByteString* const p0, struct FastOneByteString* const p1) { - struct FastOneByteString* const v0 = p0; - struct FastOneByteString* const v1 = p1; - return rename(v0->data, v1->data); -} -void openSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - String::Utf8Value v0(isolate, args[0]); - int32_t v1 = Local::Cast(args[1])->Value(); - int32_t v2 = Local::Cast(args[2])->Value(); - int32_t rc = _open(*v0, v1, v2); - args.GetReturnValue().Set(rc); -} - -int32_t openFast(void* p, struct FastOneByteString* const p0, int32_t p1, int32_t p2) { - struct FastOneByteString* const v0 = p0; - int32_t v1 = p1; - int32_t v2 = p2; - return _open(v0->data, v1, v2); -} -void unlinkSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - String::Utf8Value v0(isolate, args[0]); - int32_t rc = _unlink(*v0); - args.GetReturnValue().Set(rc); -} - -int32_t unlinkFast(void* p, struct FastOneByteString* const p0) { - struct FastOneByteString* const v0 = p0; - return _unlink(v0->data); -} -void memcpySlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - uint32_t v2 = Local::Cast(args[2])->Value(); - void* rc = memcpy(v0, v1, v2); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void memcpyFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret) { - void* v0 = reinterpret_cast(p0); - void* v1 = reinterpret_cast(p1); - uint32_t v2 = p2; - void* r = memcpy(v0, v1, v2); - - p_ret[0] = (uint64_t)r; -} -void memsetSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - int32_t v1 = Local::Cast(args[1])->Value(); - uint32_t v2 = Local::Cast(args[2])->Value(); - void* rc = memset(v0, v1, v2); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void memsetFast(void* p, uint64_t* p0, int32_t p1, uint32_t p2, uint64_t* p_ret) { - void* v0 = reinterpret_cast(p0); - int32_t v1 = p1; - uint32_t v2 = p2; - void* r = memset(v0, v1, v2); - - p_ret[0] = (uint64_t)r; -} -void memmoveSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - uint32_t v2 = Local::Cast(args[2])->Value(); - void* rc = memmove(v0, v1, v2); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void memmoveFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret) { - void* v0 = reinterpret_cast(p0); - void* v1 = reinterpret_cast(p1); - uint32_t v2 = p2; - void* r = memmove(v0, v1, v2); - - p_ret[0] = (uint64_t)r; -} -void mallocSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - uint32_t v0 = Local::Cast(args[0])->Value(); - void* rc = malloc(v0); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void mallocFast(void* p, uint32_t p0, uint64_t* p_ret) { - uint32_t v0 = p0; - void* r = malloc(v0); - - p_ret[0] = (uint64_t)r; -} -void reallocSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - uint32_t v1 = Local::Cast(args[1])->Value(); - void* rc = realloc(v0, v1); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void reallocFast(void* p, uint64_t* p0, uint32_t p1, uint64_t* p_ret) { - void* v0 = reinterpret_cast(p0); - uint32_t v1 = p1; - void* r = realloc(v0, v1); - - p_ret[0] = (uint64_t)r; -} -void aligned_allocSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - uint32_t v0 = Local::Cast(args[0])->Value(); - uint32_t v1 = Local::Cast(args[1])->Value(); - void* rc = _aligned_malloc(v0, v1); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void aligned_allocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret) { - uint32_t v0 = p0; - uint32_t v1 = p1; - void* r = _aligned_malloc(v0, v1); - - p_ret[0] = (uint64_t)r; -} -void freeSlow(const FunctionCallbackInfo &args) { - void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - free(v0); -} - -void freeFast(void* p, uint64_t* p0) { - void* v0 = reinterpret_cast(p0); - free(v0); -} -void fastcallSlow(const FunctionCallbackInfo &args) { - struct fastcall* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - lo_fastcall(v0); -} - -void fastcallFast(void* p, uint64_t* p0) { - struct fastcall* v0 = reinterpret_cast(p0); - lo_fastcall(v0); -} -void getenvSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - String::Utf8Value v0(isolate, args[0]); - char* rc = getenv(*v0); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void getenvFast(void* p, struct FastOneByteString* const p0, uint64_t* p_ret) { - struct FastOneByteString* const v0 = p0; - char* r = getenv(v0->data); - - p_ret[0] = (uint64_t)r; -} -void dupSlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - int32_t rc = _dup(v0); - args.GetReturnValue().Set(rc); -} - -int32_t dupFast(void* p, int32_t p0) { - int32_t v0 = p0; - return _dup(v0); -} -void dup2Slow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - int32_t v1 = Local::Cast(args[1])->Value(); - int32_t rc = _dup2(v0, v1); - args.GetReturnValue().Set(rc); -} - -int32_t dup2Fast(void* p, int32_t p0, int32_t p1) { - int32_t v0 = p0; - int32_t v1 = p1; - return _dup2(v0, v1); -} -void getcwdSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - char* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - int32_t v1 = Local::Cast(args[1])->Value(); - void* rc = _getcwd(v0, v1); - args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); -} - -void getcwdFast(void* p, uint64_t* p0, int32_t p1, uint64_t* p_ret) { - char* v0 = reinterpret_cast(p0); - int32_t v1 = p1; - void* r = _getcwd(v0, v1); - - p_ret[0] = (uint64_t)r; -} -void getpidSlow(const FunctionCallbackInfo &args) { - - int32_t rc = _getpid(); - args.GetReturnValue().Set(rc); -} - -int32_t getpidFast(void* p) { - - return _getpid(); -} -void execveSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - String::Utf8Value v0(isolate, args[0]); - char* const* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - char* const* v2 = reinterpret_cast((uint64_t)Local::Cast(args[2])->Value()); - int32_t rc = _execve(*v0, v1, v2); - args.GetReturnValue().Set(rc); -} - -int32_t execveFast(void* p, struct FastOneByteString* const p0, uint64_t* p1, uint64_t* p2) { - struct FastOneByteString* const v0 = p0; - char* const* v1 = reinterpret_cast(p1); - char* const* v2 = reinterpret_cast(p2); - return _execve(v0->data, v1, v2); -} -void execvpSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - String::Utf8Value v0(isolate, args[0]); - char* const* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - int32_t rc = _execvp(*v0, v1); - args.GetReturnValue().Set(rc); -} - -int32_t execvpFast(void* p, struct FastOneByteString* const p0, uint64_t* p1) { - struct FastOneByteString* const v0 = p0; - char* const* v1 = reinterpret_cast(p1); - return _execvp(v0->data, v1); -} -void exitSlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - exit(v0); -} - -void exitFast(void* p, int32_t p0) { - int32_t v0 = p0; - exit(v0); -} -void isolate_createSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - int32_t v0 = Local::Cast(args[0])->Value(); - char** v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - String::Utf8Value v2(isolate, args[2]); - uint32_t v3 = Local::Cast(args[3])->Value(); - String::Utf8Value v4(isolate, args[4]); - uint32_t v5 = Local::Cast(args[5])->Value(); - char* v6 = reinterpret_cast((uint64_t)Local::Cast(args[6])->Value()); - int32_t v7 = Local::Cast(args[7])->Value(); - int32_t v8 = Local::Cast(args[8])->Value(); - uint64_t v9 = Local::Cast(args[9])->Value(); - String::Utf8Value v10(isolate, args[10]); - String::Utf8Value v11(isolate, args[11]); - int32_t v12 = Local::Cast(args[12])->Value(); - int32_t v13 = Local::Cast(args[13])->Value(); - void* v14 = reinterpret_cast((uint64_t)Local::Cast(args[14])->Value()); - int32_t rc = lo_create_isolate(v0, v1, *v2, v3, *v4, v5, v6, v7, v8, v9, *v10, *v11, v12, v13, v14); - args.GetReturnValue().Set(rc); -} - -void isolate_context_createSlow(const FunctionCallbackInfo &args) { - Isolate *isolate = args.GetIsolate(); - int32_t v0 = Local::Cast(args[0])->Value(); - char** v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); - String::Utf8Value v2(isolate, args[2]); - uint32_t v3 = Local::Cast(args[3])->Value(); - String::Utf8Value v4(isolate, args[4]); - uint32_t v5 = Local::Cast(args[5])->Value(); - char* v6 = reinterpret_cast((uint64_t)Local::Cast(args[6])->Value()); - int32_t v7 = Local::Cast(args[7])->Value(); - int32_t v8 = Local::Cast(args[8])->Value(); - uint64_t v9 = Local::Cast(args[9])->Value(); - String::Utf8Value v10(isolate, args[10]); - String::Utf8Value v11(isolate, args[11]); - int32_t v12 = Local::Cast(args[12])->Value(); - int32_t v13 = Local::Cast(args[13])->Value(); - void* v14 = reinterpret_cast((uint64_t)Local::Cast(args[14])->Value()); - struct isolate_context* v15 = reinterpret_cast((uint64_t)Local::Cast(args[15])->Value()); - lo_create_isolate_context(v0, v1, *v2, v3, *v4, v5, v6, v7, v8, v9, *v10, *v11, v12, v13, v14, v15); -} - -void isolate_context_destroySlow(const FunctionCallbackInfo &args) { - struct isolate_context* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - lo_destroy_isolate_context(v0); -} - -void isolate_context_destroyFast(void* p, uint64_t* p0) { - struct isolate_context* v0 = reinterpret_cast(p0); - lo_destroy_isolate_context(v0); -} -void isolate_context_sizeSlow(const FunctionCallbackInfo &args) { - - int32_t rc = lo_context_size(); - args.GetReturnValue().Set(rc); -} - -int32_t isolate_context_sizeFast(void* p) { - - return lo_context_size(); -} -void isolate_startSlow(const FunctionCallbackInfo &args) { - void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - lo_start_isolate(v0); -} - -void callbackSlow(const FunctionCallbackInfo &args) { - exec_info* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - lo_callback(v0); -} - -void strnlenSlow(const FunctionCallbackInfo &args) { - const char* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); - uint32_t v1 = Local::Cast(args[1])->Value(); - uint32_t rc = strnlen(v0, v1); - args.GetReturnValue().Set(rc); -} - -uint32_t strnlenFast(void* p, uint64_t* p0, uint32_t p1) { - const char* v0 = reinterpret_cast(p0); - uint32_t v1 = p1; - return strnlen(v0, v1); -} -void isattySlow(const FunctionCallbackInfo &args) { - int32_t v0 = Local::Cast(args[0])->Value(); - int32_t rc = _isatty(v0); - args.GetReturnValue().Set(rc); -} - -int32_t isattyFast(void* p, int32_t p0) { - int32_t v0 = p0; - return _isatty(v0); -} -#ifdef __linux__ - -#endif -#ifdef __MACH__ - -#endif -void Init(Isolate* isolate, Local target) { - Local module = ObjectTemplate::New(isolate); - SET_FAST_METHOD(isolate, module, "calloc", &pFcalloc, callocSlow); - SET_FAST_METHOD(isolate, module, "read", &pFread, readSlow); - SET_FAST_METHOD(isolate, module, "write", &pFwrite, writeSlow); - SET_FAST_METHOD(isolate, module, "write_string", &pFwrite_string, write_stringSlow); - SET_FAST_METHOD(isolate, module, "putchar", &pFputchar, putcharSlow); - SET_FAST_METHOD(isolate, module, "getchar", &pFgetchar, getcharSlow); - SET_FAST_METHOD(isolate, module, "close", &pFclose, closeSlow); - SET_FAST_METHOD(isolate, module, "lseek", &pFlseek, lseekSlow); - SET_FAST_METHOD(isolate, module, "fstat", &pFfstat, fstatSlow); - SET_FAST_METHOD(isolate, module, "rename", &pFrename, renameSlow); - SET_FAST_METHOD(isolate, module, "open", &pFopen, openSlow); - SET_FAST_METHOD(isolate, module, "unlink", &pFunlink, unlinkSlow); - SET_FAST_METHOD(isolate, module, "memcpy", &pFmemcpy, memcpySlow); - SET_FAST_METHOD(isolate, module, "memset", &pFmemset, memsetSlow); - SET_FAST_METHOD(isolate, module, "memmove", &pFmemmove, memmoveSlow); - SET_FAST_METHOD(isolate, module, "malloc", &pFmalloc, mallocSlow); - SET_FAST_METHOD(isolate, module, "realloc", &pFrealloc, reallocSlow); - SET_FAST_METHOD(isolate, module, "aligned_alloc", &pFaligned_alloc, aligned_allocSlow); - SET_FAST_METHOD(isolate, module, "free", &pFfree, freeSlow); - SET_METHOD(isolate, module, "bind_fastcall", bind_fastcallSlow); - SET_METHOD(isolate, module, "bind_slowcall", bind_slowcallSlow); - SET_FAST_METHOD(isolate, module, "fastcall", &pFfastcall, fastcallSlow); - SET_FAST_METHOD(isolate, module, "getenv", &pFgetenv, getenvSlow); - SET_FAST_METHOD(isolate, module, "dup", &pFdup, dupSlow); - SET_FAST_METHOD(isolate, module, "dup2", &pFdup2, dup2Slow); - SET_FAST_METHOD(isolate, module, "getcwd", &pFgetcwd, getcwdSlow); - SET_FAST_METHOD(isolate, module, "getpid", &pFgetpid, getpidSlow); - SET_FAST_METHOD(isolate, module, "execve", &pFexecve, execveSlow); - SET_FAST_METHOD(isolate, module, "execvp", &pFexecvp, execvpSlow); - SET_FAST_METHOD(isolate, module, "exit", &pFexit, exitSlow); - SET_METHOD(isolate, module, "isolate_create", isolate_createSlow); - SET_METHOD(isolate, module, "isolate_context_create", isolate_context_createSlow); - SET_FAST_METHOD(isolate, module, "isolate_context_destroy", &pFisolate_context_destroy, isolate_context_destroySlow); - SET_FAST_METHOD(isolate, module, "isolate_context_size", &pFisolate_context_size, isolate_context_sizeSlow); - SET_METHOD(isolate, module, "isolate_start", isolate_startSlow); - SET_METHOD(isolate, module, "callback", callbackSlow); - SET_FAST_METHOD(isolate, module, "strnlen", &pFstrnlen, strnlenSlow); - SET_FAST_METHOD(isolate, module, "isatty", &pFisatty, isattySlow); - -#ifdef __linux__ - -#endif -#ifdef __MACH__ - -#endif - SET_VALUE(isolate, module, "S_IFCHR", Integer::New(isolate, (int32_t)S_IFCHR)); - SET_VALUE(isolate, module, "O_RDONLY", Integer::New(isolate, (int32_t)O_RDONLY)); - SET_VALUE(isolate, module, "O_WRONLY", Integer::New(isolate, (int32_t)O_WRONLY)); - SET_VALUE(isolate, module, "O_CREAT", Integer::New(isolate, (int32_t)O_CREAT)); - SET_VALUE(isolate, module, "O_TRUNC", Integer::New(isolate, (int32_t)O_TRUNC)); - SET_VALUE(isolate, module, "STDIN", Number::New(isolate, (int64_t)0)); - SET_VALUE(isolate, module, "STDOUT", Number::New(isolate, (int64_t)1)); - SET_VALUE(isolate, module, "STDERR", Number::New(isolate, (int64_t)2)); - SET_VALUE(isolate, module, "SEEK_SET", Integer::New(isolate, (int32_t)SEEK_SET)); - SET_VALUE(isolate, module, "SEEK_CUR", Integer::New(isolate, (int32_t)SEEK_CUR)); - SET_VALUE(isolate, module, "SEEK_END", Integer::New(isolate, (int32_t)SEEK_END)); - SET_VALUE(isolate, module, "S_IFMT", Integer::New(isolate, (int32_t)S_IFMT)); - SET_VALUE(isolate, module, "S_IFDIR", Integer::New(isolate, (int32_t)S_IFDIR)); - SET_VALUE(isolate, module, "S_IFREG", Integer::New(isolate, (int32_t)S_IFREG)); - SET_VALUE(isolate, module, "O_RDWR", Integer::New(isolate, (int32_t)O_RDWR)); - SET_VALUE(isolate, module, "EAGAIN", Integer::New(isolate, (int32_t)EAGAIN)); - SET_VALUE(isolate, module, "_S_IREAD", Integer::New(isolate, (int32_t)_S_IREAD)); - SET_VALUE(isolate, module, "_S_IWRITE", Integer::New(isolate, (int32_t)_S_IWRITE)); - SET_VALUE(isolate, module, "_O_APPEND", Integer::New(isolate, (int32_t)_O_APPEND)); - SET_VALUE(isolate, module, "_O_BINARY", Integer::New(isolate, (int32_t)_O_BINARY)); - SET_VALUE(isolate, module, "_O_CREAT", Integer::New(isolate, (int32_t)_O_CREAT)); - SET_VALUE(isolate, module, "_O_RDONLY", Integer::New(isolate, (int32_t)_O_RDONLY)); - SET_VALUE(isolate, module, "_O_RDWR", Integer::New(isolate, (int32_t)_O_RDWR)); - SET_VALUE(isolate, module, "_O_TEXT", Integer::New(isolate, (int32_t)_O_TEXT)); - SET_VALUE(isolate, module, "_O_TRUNC", Integer::New(isolate, (int32_t)_O_TRUNC)); - SET_VALUE(isolate, module, "_O_WRONLY", Integer::New(isolate, (int32_t)_O_WRONLY)); - SET_VALUE(isolate, module, "_O_U16TEXT", Integer::New(isolate, (int32_t)_O_U16TEXT)); - SET_VALUE(isolate, module, "_O_U8TEXT", Integer::New(isolate, (int32_t)_O_U8TEXT)); - -#ifdef __linux__ - -#endif -#ifdef __MACH__ - -#endif - -#ifdef __MACH__ - SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); - -#endif -#ifdef __linux__ - SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); - -#endif - SET_MODULE(isolate, target, "core", module); -} -} // namespace core -} // namespace lo - -extern "C" { - DLL_PUBLIC void* _register_core() { - return (void*)lo::core::Init; - } -} + +// [do not edit,] +// This file has been automatically generated, please do not change unless you disable auto-generation in the Makefile +#include + +#include + +#include + + + + + + +#include + +namespace lo { +namespace core { + +using v8::FunctionCallbackInfo; +using v8::Local; +using v8::ObjectTemplate; +using v8::Isolate; +using v8::Value; +using v8::Integer; +using v8::Number; +using v8::FunctionTemplate; +using v8::FunctionCallback; +using v8::CFunction; +using v8::CTypeInfo; +using v8::Uint8Array; +using v8::CFunctionInfo; +using v8::String; +using v8::Uint32Array; +using v8::ArrayBuffer; +using v8::Context; +using v8::Function; +using v8::Object; +using v8::HandleScope; +using v8::BigInt; + + +#ifdef _WIN32 +#define strdup _strdup +#endif + + +struct fastcall { + void* wrapper; // 0-7 : v8 fastcall wrapper function pointer + uint8_t result; // 8 : the type of the result + uint8_t nparam; // 9 : the number of args (max 255) + uint8_t param[30]; // 10-39 : an array of types of the arguments + uint64_t args[32]; // 40-295: an array of pointer slots for arguments + // these will be filled in dynamically by + // lo::core::SlowCallback for the slow call + // and then the slowcall wrapper will shift them from + // this structure into regs + stack and make the call + // the first slot is reserved for the result + void* fn; // 296-303: the slowcall wrapper function pointer +}; + +typedef void (*lo_fast_call)(void*); + +inline uint8_t needsunwrap (lo::FastTypes t) { + if (t == lo::FastTypes::buffer) return 1; + if (t == lo::FastTypes::u32array) return 1; + if (t == lo::FastTypes::pointer) return 1; + if (t == lo::FastTypes::u64) return 1; + if (t == lo::FastTypes::i64) return 1; + return 0; +} + +v8::CTypeInfo* CTypeFromV8 (uint8_t v8Type) { + if (v8Type == lo::FastTypes::boolean) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kBool); + if (v8Type == lo::FastTypes::i8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::i32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt32); + if (v8Type == lo::FastTypes::u8) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u16) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::u32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint32); + if (v8Type == lo::FastTypes::f32) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat32); + if (v8Type == lo::FastTypes::f64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kFloat64); + if (v8Type == lo::FastTypes::i64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::u64) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::iSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kInt64); + if (v8Type == lo::FastTypes::uSize) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::pointer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::function) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::string) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kSeqOneByteString); + if (v8Type == lo::FastTypes::buffer) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + if (v8Type == lo::FastTypes::u32array) + return new v8::CTypeInfo(v8::CTypeInfo::Type::kUint64); + return new v8::CTypeInfo(v8::CTypeInfo::Type::kVoid); +} + +void lo_fastcall (struct fastcall* state) { + ((lo_fast_call)state->fn)(&state->args); +} + +void SlowCallback(const FunctionCallbackInfo &args) { + Isolate* isolate = args.GetIsolate(); + HandleScope scope(isolate); + struct fastcall* state = (struct fastcall*)args.Data() + .As()->GetAlignedPointerFromInternalField(1); + int r = 1; + int s = 0; + char* temp_strs[100]; + for (int i = 0; i < state->nparam; i++) { + switch (state->param[i]) { + case FastTypes::string: + { + String::Utf8Value arg0(isolate, args[i]); + temp_strs[s] = strdup(*arg0); + state->args[r++] = (uint64_t)temp_strs[s++]; + } + break; + case FastTypes::u32: + state->args[r++] = (uint32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u16: + state->args[r++] = (uint16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u8: + state->args[r++] = (uint8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::boolean: + state->args[r++] = (bool)Local::Cast(args[i])->Value(); + break; + case FastTypes::i32: + state->args[r++] = (int32_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i16: + state->args[r++] = (int16_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i8: + state->args[r++] = (int8_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::i64: + case FastTypes::iSize: + state->args[r++] = (int64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::u64: + case FastTypes::pointer: + case FastTypes::uSize: + state->args[r++] = (uint64_t)Local::Cast(args[i])->Value(); + break; + case FastTypes::buffer: + { + Local u8 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u8->Buffer()->Data() + + u8->ByteOffset()); + } + break; + case FastTypes::u32array: + { + Local u32 = args[i].As(); + state->args[r++] = (uint64_t)((uint8_t*)u32->Buffer()->Data() + + u32->ByteOffset()); + } + break; + case FastTypes::function: + break; + case FastTypes::f32: + { + float src = (float)args[i].As()->Value(); + float* dst = (float*)&state->args[r++]; + *dst = src; + } + break; + case FastTypes::f64: + { + double src = (double)args[i].As()->Value(); + double* dst = (double*)&state->args[r++]; + *dst = src; + } + break; + } + } + lo_fastcall(state); + for (int i = 0; i < s; i++) { + free(temp_strs[i]); + } + switch (state->result) { + case FastTypes::i32: + args.GetReturnValue().Set((int32_t)state->args[0]); + break; + case FastTypes::u32: + args.GetReturnValue().Set((uint32_t)state->args[0]); + break; + case FastTypes::boolean: + args.GetReturnValue().Set((bool)state->args[0]); + break; + case FastTypes::f32: + { + float* dst = (float*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::f64: + { + double* dst = (double*)&state->args[0]; + args.GetReturnValue().Set(Number::New(isolate, *dst)); + } + break; + case FastTypes::i64: + { + int64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + case FastTypes::buffer: + case FastTypes::u32array: + case FastTypes::u64: + case FastTypes::pointer: + { + uint64_t* res = reinterpret_cast((uint64_t)Local::Cast(args[args.Length() - 1])->Value()); + *res = state->args[0]; + } + break; + } +} + +void bind_fastcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + // TODO - does integer work? + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + uint8_t unwrap = needsunwrap((FastTypes)state->result); + int fastlen = state->nparam + 1 + unwrap; + CTypeInfo* cargs = (CTypeInfo*)calloc(fastlen, sizeof(CTypeInfo)); + cargs[0] = CTypeInfo(CTypeInfo::Type::kV8Value); + for (int i = 0; i < state->nparam; i++) { + uint8_t ptype = state->param[i]; + cargs[i + 1] = *CTypeFromV8(ptype); + } + CTypeInfo* rc; + if (unwrap) { + cargs[fastlen - 1] = *CTypeFromV8(FastTypes::u32array); + rc = CTypeFromV8(FastTypes::empty); + } else { + rc = CTypeFromV8((FastTypes)state->result); + } + CFunctionInfo* info = new CFunctionInfo(*rc, fastlen, cargs); + CFunction* fastCFunc = new CFunction(state->wrapper, info); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, fastCFunc + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} + +void bind_slowcallSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + Local context = isolate->GetCurrentContext(); + struct fastcall* state = reinterpret_cast( + Local::Cast(args[0])->Value()); + Local tpl = ObjectTemplate::New(isolate); + tpl->SetInternalFieldCount(2); + Local data = tpl->NewInstance(context).ToLocalChecked(); + data->SetAlignedPointerInInternalField(1, state); + Local funcTemplate = FunctionTemplate::New(isolate, + SlowCallback, data, Local(), 0, v8::ConstructorBehavior::kThrow, + v8::SideEffectType::kHasNoSideEffect, 0 + ); + Local fun = + funcTemplate->GetFunction(context).ToLocalChecked(); + args.GetReturnValue().Set(fun); +} + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +void callocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargscalloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rccalloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infocalloc = CFunctionInfo(rccalloc, 4, cargscalloc); +CFunction pFcalloc = CFunction((const void*)&callocFast, &infocalloc); + +int32_t readFast(void* p, int32_t p0, uint64_t* p1, int32_t p2); +CTypeInfo cargsread[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcread = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo inforead = CFunctionInfo(rcread, 4, cargsread); +CFunction pFread = CFunction((const void*)&readFast, &inforead); + +int32_t writeFast(void* p, int32_t p0, uint64_t* p1, int32_t p2); +CTypeInfo cargswrite[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcwrite = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infowrite = CFunctionInfo(rcwrite, 4, cargswrite); +CFunction pFwrite = CFunction((const void*)&writeFast, &infowrite); + +int32_t write_stringFast(void* p, int32_t p0, struct FastOneByteString* const p1); +CTypeInfo cargswrite_string[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcwrite_string = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infowrite_string = CFunctionInfo(rcwrite_string, 3, cargswrite_string); +CFunction pFwrite_string = CFunction((const void*)&write_stringFast, &infowrite_string); + +int32_t putcharFast(void* p, int32_t p0); +CTypeInfo cargsputchar[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcputchar = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoputchar = CFunctionInfo(rcputchar, 2, cargsputchar); +CFunction pFputchar = CFunction((const void*)&putcharFast, &infoputchar); + +int32_t getcharFast(void* p); +CTypeInfo cargsgetchar[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcgetchar = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetchar = CFunctionInfo(rcgetchar, 1, cargsgetchar); +CFunction pFgetchar = CFunction((const void*)&getcharFast, &infogetchar); + +int32_t closeFast(void* p, int32_t p0); +CTypeInfo cargsclose[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcclose = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoclose = CFunctionInfo(rcclose, 2, cargsclose); +CFunction pFclose = CFunction((const void*)&closeFast, &infoclose); + +uint32_t lseekFast(void* p, int32_t p0, uint32_t p1, int32_t p2); +CTypeInfo cargslseek[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rclseek = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infolseek = CFunctionInfo(rclseek, 4, cargslseek); +CFunction pFlseek = CFunction((const void*)&lseekFast, &infolseek); + +int32_t fstatFast(void* p, int32_t p0, uint64_t* p1); +CTypeInfo cargsfstat[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfstat = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infofstat = CFunctionInfo(rcfstat, 3, cargsfstat); +CFunction pFfstat = CFunction((const void*)&fstatFast, &infofstat); + +int32_t renameFast(void* p, struct FastOneByteString* const p0, struct FastOneByteString* const p1); +CTypeInfo cargsrename[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcrename = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo inforename = CFunctionInfo(rcrename, 3, cargsrename); +CFunction pFrename = CFunction((const void*)&renameFast, &inforename); + +int32_t openFast(void* p, struct FastOneByteString* const p0, int32_t p1, int32_t p2); +CTypeInfo cargsopen[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcopen = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoopen = CFunctionInfo(rcopen, 4, cargsopen); +CFunction pFopen = CFunction((const void*)&openFast, &infoopen); + +int32_t unlinkFast(void* p, struct FastOneByteString* const p0); +CTypeInfo cargsunlink[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), +}; +CTypeInfo rcunlink = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infounlink = CFunctionInfo(rcunlink, 2, cargsunlink); +CFunction pFunlink = CFunction((const void*)&unlinkFast, &infounlink); + +void memcpyFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemcpy[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemcpy = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemcpy = CFunctionInfo(rcmemcpy, 5, cargsmemcpy); +CFunction pFmemcpy = CFunction((const void*)&memcpyFast, &infomemcpy); + +void memsetFast(void* p, uint64_t* p0, int32_t p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemset[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemset = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemset = CFunctionInfo(rcmemset, 5, cargsmemset); +CFunction pFmemset = CFunction((const void*)&memsetFast, &infomemset); + +void memmoveFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret); +CTypeInfo cargsmemmove[5] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmemmove = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomemmove = CFunctionInfo(rcmemmove, 5, cargsmemmove); +CFunction pFmemmove = CFunction((const void*)&memmoveFast, &infomemmove); + +void mallocFast(void* p, uint32_t p0, uint64_t* p_ret); +CTypeInfo cargsmalloc[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcmalloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infomalloc = CFunctionInfo(rcmalloc, 3, cargsmalloc); +CFunction pFmalloc = CFunction((const void*)&mallocFast, &infomalloc); + +void reallocFast(void* p, uint64_t* p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargsrealloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcrealloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo inforealloc = CFunctionInfo(rcrealloc, 4, cargsrealloc); +CFunction pFrealloc = CFunction((const void*)&reallocFast, &inforealloc); + +void aligned_allocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret); +CTypeInfo cargsaligned_alloc[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcaligned_alloc = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoaligned_alloc = CFunctionInfo(rcaligned_alloc, 4, cargsaligned_alloc); +CFunction pFaligned_alloc = CFunction((const void*)&aligned_allocFast, &infoaligned_alloc); + +void freeFast(void* p, uint64_t* p0); +CTypeInfo cargsfree[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfree = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infofree = CFunctionInfo(rcfree, 2, cargsfree); +CFunction pFfree = CFunction((const void*)&freeFast, &infofree); + +void fastcallFast(void* p, uint64_t* p0); +CTypeInfo cargsfastcall[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcfastcall = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infofastcall = CFunctionInfo(rcfastcall, 2, cargsfastcall); +CFunction pFfastcall = CFunction((const void*)&fastcallFast, &infofastcall); + +void getenvFast(void* p, struct FastOneByteString* const p0, uint64_t* p_ret); +CTypeInfo cargsgetenv[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcgetenv = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infogetenv = CFunctionInfo(rcgetenv, 3, cargsgetenv); +CFunction pFgetenv = CFunction((const void*)&getenvFast, &infogetenv); + +int32_t dupFast(void* p, int32_t p0); +CTypeInfo cargsdup[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcdup = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infodup = CFunctionInfo(rcdup, 2, cargsdup); +CFunction pFdup = CFunction((const void*)&dupFast, &infodup); + +int32_t dup2Fast(void* p, int32_t p0, int32_t p1); +CTypeInfo cargsdup2[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcdup2 = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infodup2 = CFunctionInfo(rcdup2, 3, cargsdup2); +CFunction pFdup2 = CFunction((const void*)&dup2Fast, &infodup2); + +void getcwdFast(void* p, uint64_t* p0, int32_t p1, uint64_t* p_ret); +CTypeInfo cargsgetcwd[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kUint64) +}; +CTypeInfo rcgetcwd = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infogetcwd = CFunctionInfo(rcgetcwd, 4, cargsgetcwd); +CFunction pFgetcwd = CFunction((const void*)&getcwdFast, &infogetcwd); + +int32_t getpidFast(void* p); +CTypeInfo cargsgetpid[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcgetpid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetpid = CFunctionInfo(rcgetpid, 1, cargsgetpid); +CFunction pFgetpid = CFunction((const void*)&getpidFast, &infogetpid); + +int32_t execveFast(void* p, struct FastOneByteString* const p0, uint64_t* p1, uint64_t* p2); +CTypeInfo cargsexecve[4] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcexecve = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoexecve = CFunctionInfo(rcexecve, 4, cargsexecve); +CFunction pFexecve = CFunction((const void*)&execveFast, &infoexecve); + +int32_t execvpFast(void* p, struct FastOneByteString* const p0, uint64_t* p1); +CTypeInfo cargsexecvp[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kSeqOneByteString), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcexecvp = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoexecvp = CFunctionInfo(rcexecvp, 3, cargsexecvp); +CFunction pFexecvp = CFunction((const void*)&execvpFast, &infoexecvp); + +void exitFast(void* p, int32_t p0); +CTypeInfo cargsexit[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcexit = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoexit = CFunctionInfo(rcexit, 2, cargsexit); +CFunction pFexit = CFunction((const void*)&exitFast, &infoexit); + +void isolate_context_destroyFast(void* p, uint64_t* p0); +CTypeInfo cargsisolate_context_destroy[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), +}; +CTypeInfo rcisolate_context_destroy = CTypeInfo(CTypeInfo::Type::kVoid); +CFunctionInfo infoisolate_context_destroy = CFunctionInfo(rcisolate_context_destroy, 2, cargsisolate_context_destroy); +CFunction pFisolate_context_destroy = CFunction((const void*)&isolate_context_destroyFast, &infoisolate_context_destroy); + +int32_t isolate_context_sizeFast(void* p); +CTypeInfo cargsisolate_context_size[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcisolate_context_size = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoisolate_context_size = CFunctionInfo(rcisolate_context_size, 1, cargsisolate_context_size); +CFunction pFisolate_context_size = CFunction((const void*)&isolate_context_sizeFast, &infoisolate_context_size); + +uint32_t strnlenFast(void* p, uint64_t* p0, uint32_t p1); +CTypeInfo cargsstrnlen[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint64), + CTypeInfo(CTypeInfo::Type::kUint32), +}; +CTypeInfo rcstrnlen = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infostrnlen = CFunctionInfo(rcstrnlen, 3, cargsstrnlen); +CFunction pFstrnlen = CFunction((const void*)&strnlenFast, &infostrnlen); + +int32_t isattyFast(void* p, int32_t p0); +CTypeInfo cargsisatty[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcisatty = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infoisatty = CFunctionInfo(rcisatty, 2, cargsisatty); +CFunction pFisatty = CFunction((const void*)&isattyFast, &infoisatty); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +void callocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = calloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void callocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret) { + uint32_t v0 = p0; + uint32_t v1 = p1; + void* r = calloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void readSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _read(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t readFast(void* p, int32_t p0, uint64_t* p1, int32_t p2) { + int32_t v0 = p0; + void* v1 = reinterpret_cast(p1); + int32_t v2 = p2; + return _read(v0, v1, v2); +} +void writeSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _write(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t writeFast(void* p, int32_t p0, uint64_t* p1, int32_t p2) { + int32_t v0 = p0; + void* v1 = reinterpret_cast(p1); + int32_t v2 = p2; + return _write(v0, v1, v2); +} +void write_stringSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + String::Utf8Value v1(isolate, args[1]); + int32_t v2 = v1.length(); + int32_t rc = _write(v0, *v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t write_stringFast(void* p, int32_t p0, struct FastOneByteString* const p1) { + int32_t v0 = p0; + struct FastOneByteString* const v1 = p1; + int32_t v2 = p1->length; + return _write(v0, v1->data, v2); +} +void putcharSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = putchar(v0); + args.GetReturnValue().Set(rc); +} + +int32_t putcharFast(void* p, int32_t p0) { + int32_t v0 = p0; + return putchar(v0); +} +void getcharSlow(const FunctionCallbackInfo &args) { + + int32_t rc = getchar(); + args.GetReturnValue().Set(rc); +} + +int32_t getcharFast(void* p) { + + return getchar(); +} +void closeSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _close(v0); + args.GetReturnValue().Set(rc); +} + +int32_t closeFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _close(v0); +} +void lseekSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + int32_t v2 = Local::Cast(args[2])->Value(); + uint32_t rc = _lseek(v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +uint32_t lseekFast(void* p, int32_t p0, uint32_t p1, int32_t p2) { + int32_t v0 = p0; + uint32_t v1 = p1; + int32_t v2 = p2; + return _lseek(v0, v1, v2); +} +void fstatSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + struct _stat * v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t rc = _fstat(v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t fstatFast(void* p, int32_t p0, uint64_t* p1) { + int32_t v0 = p0; + struct _stat * v1 = reinterpret_cast(p1); + return _fstat(v0, v1); +} +void renameSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + String::Utf8Value v1(isolate, args[1]); + int32_t rc = rename(*v0, *v1); + args.GetReturnValue().Set(rc); +} + +int32_t renameFast(void* p, struct FastOneByteString* const p0, struct FastOneByteString* const p1) { + struct FastOneByteString* const v0 = p0; + struct FastOneByteString* const v1 = p1; + return rename(v0->data, v1->data); +} +void openSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + int32_t v1 = Local::Cast(args[1])->Value(); + int32_t v2 = Local::Cast(args[2])->Value(); + int32_t rc = _open(*v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t openFast(void* p, struct FastOneByteString* const p0, int32_t p1, int32_t p2) { + struct FastOneByteString* const v0 = p0; + int32_t v1 = p1; + int32_t v2 = p2; + return _open(v0->data, v1, v2); +} +void unlinkSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + int32_t rc = _unlink(*v0); + args.GetReturnValue().Set(rc); +} + +int32_t unlinkFast(void* p, struct FastOneByteString* const p0) { + struct FastOneByteString* const v0 = p0; + return _unlink(v0->data); +} +void memcpySlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memcpy(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memcpyFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + void* v1 = reinterpret_cast(p1); + uint32_t v2 = p2; + void* r = memcpy(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void memsetSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + int32_t v1 = Local::Cast(args[1])->Value(); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memset(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memsetFast(void* p, uint64_t* p0, int32_t p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + int32_t v1 = p1; + uint32_t v2 = p2; + void* r = memset(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void memmoveSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + void* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + uint32_t v2 = Local::Cast(args[2])->Value(); + void* rc = memmove(v0, v1, v2); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void memmoveFast(void* p, uint64_t* p0, uint64_t* p1, uint32_t p2, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + void* v1 = reinterpret_cast(p1); + uint32_t v2 = p2; + void* r = memmove(v0, v1, v2); + + p_ret[0] = (uint64_t)r; +} +void mallocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + void* rc = malloc(v0); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void mallocFast(void* p, uint32_t p0, uint64_t* p_ret) { + uint32_t v0 = p0; + void* r = malloc(v0); + + p_ret[0] = (uint64_t)r; +} +void reallocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = realloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void reallocFast(void* p, uint64_t* p0, uint32_t p1, uint64_t* p_ret) { + void* v0 = reinterpret_cast(p0); + uint32_t v1 = p1; + void* r = realloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void aligned_allocSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + uint32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + void* rc = _aligned_malloc(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void aligned_allocFast(void* p, uint32_t p0, uint32_t p1, uint64_t* p_ret) { + uint32_t v0 = p0; + uint32_t v1 = p1; + void* r = _aligned_malloc(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void freeSlow(const FunctionCallbackInfo &args) { + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + free(v0); +} + +void freeFast(void* p, uint64_t* p0) { + void* v0 = reinterpret_cast(p0); + free(v0); +} +void fastcallSlow(const FunctionCallbackInfo &args) { + struct fastcall* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_fastcall(v0); +} + +void fastcallFast(void* p, uint64_t* p0) { + struct fastcall* v0 = reinterpret_cast(p0); + lo_fastcall(v0); +} +void getenvSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* rc = getenv(*v0); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void getenvFast(void* p, struct FastOneByteString* const p0, uint64_t* p_ret) { + struct FastOneByteString* const v0 = p0; + char* r = getenv(v0->data); + + p_ret[0] = (uint64_t)r; +} +void dupSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _dup(v0); + args.GetReturnValue().Set(rc); +} + +int32_t dupFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _dup(v0); +} +void dup2Slow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t v1 = Local::Cast(args[1])->Value(); + int32_t rc = _dup2(v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t dup2Fast(void* p, int32_t p0, int32_t p1) { + int32_t v0 = p0; + int32_t v1 = p1; + return _dup2(v0, v1); +} +void getcwdSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + char* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + int32_t v1 = Local::Cast(args[1])->Value(); + void* rc = _getcwd(v0, v1); + args.GetReturnValue().Set(Number::New(isolate, reinterpret_cast(rc))); +} + +void getcwdFast(void* p, uint64_t* p0, int32_t p1, uint64_t* p_ret) { + char* v0 = reinterpret_cast(p0); + int32_t v1 = p1; + void* r = _getcwd(v0, v1); + + p_ret[0] = (uint64_t)r; +} +void getpidSlow(const FunctionCallbackInfo &args) { + + int32_t rc = _getpid(); + args.GetReturnValue().Set(rc); +} + +int32_t getpidFast(void* p) { + + return _getpid(); +} +void execveSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* const* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + char* const* v2 = reinterpret_cast((uint64_t)Local::Cast(args[2])->Value()); + int32_t rc = _execve(*v0, v1, v2); + args.GetReturnValue().Set(rc); +} + +int32_t execveFast(void* p, struct FastOneByteString* const p0, uint64_t* p1, uint64_t* p2) { + struct FastOneByteString* const v0 = p0; + char* const* v1 = reinterpret_cast(p1); + char* const* v2 = reinterpret_cast(p2); + return _execve(v0->data, v1, v2); +} +void execvpSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + String::Utf8Value v0(isolate, args[0]); + char* const* v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + int32_t rc = _execvp(*v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t execvpFast(void* p, struct FastOneByteString* const p0, uint64_t* p1) { + struct FastOneByteString* const v0 = p0; + char* const* v1 = reinterpret_cast(p1); + return _execvp(v0->data, v1); +} +void exitSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + exit(v0); +} + +void exitFast(void* p, int32_t p0) { + int32_t v0 = p0; + exit(v0); +} +void isolate_createSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + char** v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + String::Utf8Value v2(isolate, args[2]); + uint32_t v3 = Local::Cast(args[3])->Value(); + String::Utf8Value v4(isolate, args[4]); + uint32_t v5 = Local::Cast(args[5])->Value(); + char* v6 = reinterpret_cast((uint64_t)Local::Cast(args[6])->Value()); + int32_t v7 = Local::Cast(args[7])->Value(); + int32_t v8 = Local::Cast(args[8])->Value(); + uint64_t v9 = Local::Cast(args[9])->Value(); + String::Utf8Value v10(isolate, args[10]); + String::Utf8Value v11(isolate, args[11]); + int32_t v12 = Local::Cast(args[12])->Value(); + int32_t v13 = Local::Cast(args[13])->Value(); + void* v14 = reinterpret_cast((uint64_t)Local::Cast(args[14])->Value()); + int32_t rc = lo_create_isolate(v0, v1, *v2, v3, *v4, v5, v6, v7, v8, v9, *v10, *v11, v12, v13, v14); + args.GetReturnValue().Set(rc); +} + +void isolate_context_createSlow(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + int32_t v0 = Local::Cast(args[0])->Value(); + char** v1 = reinterpret_cast((uint64_t)Local::Cast(args[1])->Value()); + String::Utf8Value v2(isolate, args[2]); + uint32_t v3 = Local::Cast(args[3])->Value(); + String::Utf8Value v4(isolate, args[4]); + uint32_t v5 = Local::Cast(args[5])->Value(); + char* v6 = reinterpret_cast((uint64_t)Local::Cast(args[6])->Value()); + int32_t v7 = Local::Cast(args[7])->Value(); + int32_t v8 = Local::Cast(args[8])->Value(); + uint64_t v9 = Local::Cast(args[9])->Value(); + String::Utf8Value v10(isolate, args[10]); + String::Utf8Value v11(isolate, args[11]); + int32_t v12 = Local::Cast(args[12])->Value(); + int32_t v13 = Local::Cast(args[13])->Value(); + void* v14 = reinterpret_cast((uint64_t)Local::Cast(args[14])->Value()); + struct isolate_context* v15 = reinterpret_cast((uint64_t)Local::Cast(args[15])->Value()); + lo_create_isolate_context(v0, v1, *v2, v3, *v4, v5, v6, v7, v8, v9, *v10, *v11, v12, v13, v14, v15); +} + +void isolate_context_destroySlow(const FunctionCallbackInfo &args) { + struct isolate_context* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_destroy_isolate_context(v0); +} + +void isolate_context_destroyFast(void* p, uint64_t* p0) { + struct isolate_context* v0 = reinterpret_cast(p0); + lo_destroy_isolate_context(v0); +} +void isolate_context_sizeSlow(const FunctionCallbackInfo &args) { + + int32_t rc = lo_context_size(); + args.GetReturnValue().Set(rc); +} + +int32_t isolate_context_sizeFast(void* p) { + + return lo_context_size(); +} +void isolate_startSlow(const FunctionCallbackInfo &args) { + void* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_start_isolate(v0); +} + +void callbackSlow(const FunctionCallbackInfo &args) { + exec_info* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + lo_callback(v0); +} + +void strnlenSlow(const FunctionCallbackInfo &args) { + const char* v0 = reinterpret_cast((uint64_t)Local::Cast(args[0])->Value()); + uint32_t v1 = Local::Cast(args[1])->Value(); + uint32_t rc = strnlen(v0, v1); + args.GetReturnValue().Set(rc); +} + +uint32_t strnlenFast(void* p, uint64_t* p0, uint32_t p1) { + const char* v0 = reinterpret_cast(p0); + uint32_t v1 = p1; + return strnlen(v0, v1); +} +void isattySlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = _isatty(v0); + args.GetReturnValue().Set(rc); +} + +int32_t isattyFast(void* p, int32_t p0) { + int32_t v0 = p0; + return _isatty(v0); +} +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif +void Init(Isolate* isolate, Local target) { + Local module = ObjectTemplate::New(isolate); + SET_FAST_METHOD(isolate, module, "calloc", &pFcalloc, callocSlow); + SET_FAST_METHOD(isolate, module, "read", &pFread, readSlow); + SET_FAST_METHOD(isolate, module, "write", &pFwrite, writeSlow); + SET_FAST_METHOD(isolate, module, "write_string", &pFwrite_string, write_stringSlow); + SET_FAST_METHOD(isolate, module, "putchar", &pFputchar, putcharSlow); + SET_FAST_METHOD(isolate, module, "getchar", &pFgetchar, getcharSlow); + SET_FAST_METHOD(isolate, module, "close", &pFclose, closeSlow); + SET_FAST_METHOD(isolate, module, "lseek", &pFlseek, lseekSlow); + SET_FAST_METHOD(isolate, module, "fstat", &pFfstat, fstatSlow); + SET_FAST_METHOD(isolate, module, "rename", &pFrename, renameSlow); + SET_FAST_METHOD(isolate, module, "open", &pFopen, openSlow); + SET_FAST_METHOD(isolate, module, "unlink", &pFunlink, unlinkSlow); + SET_FAST_METHOD(isolate, module, "memcpy", &pFmemcpy, memcpySlow); + SET_FAST_METHOD(isolate, module, "memset", &pFmemset, memsetSlow); + SET_FAST_METHOD(isolate, module, "memmove", &pFmemmove, memmoveSlow); + SET_FAST_METHOD(isolate, module, "malloc", &pFmalloc, mallocSlow); + SET_FAST_METHOD(isolate, module, "realloc", &pFrealloc, reallocSlow); + SET_FAST_METHOD(isolate, module, "aligned_alloc", &pFaligned_alloc, aligned_allocSlow); + SET_FAST_METHOD(isolate, module, "free", &pFfree, freeSlow); + SET_METHOD(isolate, module, "bind_fastcall", bind_fastcallSlow); + SET_METHOD(isolate, module, "bind_slowcall", bind_slowcallSlow); + SET_FAST_METHOD(isolate, module, "fastcall", &pFfastcall, fastcallSlow); + SET_FAST_METHOD(isolate, module, "getenv", &pFgetenv, getenvSlow); + SET_FAST_METHOD(isolate, module, "dup", &pFdup, dupSlow); + SET_FAST_METHOD(isolate, module, "dup2", &pFdup2, dup2Slow); + SET_FAST_METHOD(isolate, module, "getcwd", &pFgetcwd, getcwdSlow); + SET_FAST_METHOD(isolate, module, "getpid", &pFgetpid, getpidSlow); + SET_FAST_METHOD(isolate, module, "execve", &pFexecve, execveSlow); + SET_FAST_METHOD(isolate, module, "execvp", &pFexecvp, execvpSlow); + SET_FAST_METHOD(isolate, module, "exit", &pFexit, exitSlow); + SET_METHOD(isolate, module, "isolate_create", isolate_createSlow); + SET_METHOD(isolate, module, "isolate_context_create", isolate_context_createSlow); + SET_FAST_METHOD(isolate, module, "isolate_context_destroy", &pFisolate_context_destroy, isolate_context_destroySlow); + SET_FAST_METHOD(isolate, module, "isolate_context_size", &pFisolate_context_size, isolate_context_sizeSlow); + SET_METHOD(isolate, module, "isolate_start", isolate_startSlow); + SET_METHOD(isolate, module, "callback", callbackSlow); + SET_FAST_METHOD(isolate, module, "strnlen", &pFstrnlen, strnlenSlow); + SET_FAST_METHOD(isolate, module, "isatty", &pFisatty, isattySlow); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + SET_VALUE(isolate, module, "S_IFCHR", Integer::New(isolate, (int32_t)S_IFCHR)); + SET_VALUE(isolate, module, "O_RDONLY", Integer::New(isolate, (int32_t)O_RDONLY)); + SET_VALUE(isolate, module, "O_WRONLY", Integer::New(isolate, (int32_t)O_WRONLY)); + SET_VALUE(isolate, module, "O_CREAT", Integer::New(isolate, (int32_t)O_CREAT)); + SET_VALUE(isolate, module, "O_TRUNC", Integer::New(isolate, (int32_t)O_TRUNC)); + SET_VALUE(isolate, module, "STDIN", Number::New(isolate, (int64_t)0)); + SET_VALUE(isolate, module, "STDOUT", Number::New(isolate, (int64_t)1)); + SET_VALUE(isolate, module, "STDERR", Number::New(isolate, (int64_t)2)); + SET_VALUE(isolate, module, "SEEK_SET", Integer::New(isolate, (int32_t)SEEK_SET)); + SET_VALUE(isolate, module, "SEEK_CUR", Integer::New(isolate, (int32_t)SEEK_CUR)); + SET_VALUE(isolate, module, "SEEK_END", Integer::New(isolate, (int32_t)SEEK_END)); + SET_VALUE(isolate, module, "S_IFMT", Integer::New(isolate, (int32_t)S_IFMT)); + SET_VALUE(isolate, module, "S_IFDIR", Integer::New(isolate, (int32_t)S_IFDIR)); + SET_VALUE(isolate, module, "S_IFREG", Integer::New(isolate, (int32_t)S_IFREG)); + SET_VALUE(isolate, module, "O_RDWR", Integer::New(isolate, (int32_t)O_RDWR)); + SET_VALUE(isolate, module, "EAGAIN", Integer::New(isolate, (int32_t)EAGAIN)); + SET_VALUE(isolate, module, "_S_IREAD", Integer::New(isolate, (int32_t)_S_IREAD)); + SET_VALUE(isolate, module, "_S_IWRITE", Integer::New(isolate, (int32_t)_S_IWRITE)); + SET_VALUE(isolate, module, "_O_APPEND", Integer::New(isolate, (int32_t)_O_APPEND)); + SET_VALUE(isolate, module, "_O_BINARY", Integer::New(isolate, (int32_t)_O_BINARY)); + SET_VALUE(isolate, module, "_O_CREAT", Integer::New(isolate, (int32_t)_O_CREAT)); + SET_VALUE(isolate, module, "_O_RDONLY", Integer::New(isolate, (int32_t)_O_RDONLY)); + SET_VALUE(isolate, module, "_O_RDWR", Integer::New(isolate, (int32_t)_O_RDWR)); + SET_VALUE(isolate, module, "_O_TEXT", Integer::New(isolate, (int32_t)_O_TEXT)); + SET_VALUE(isolate, module, "_O_TRUNC", Integer::New(isolate, (int32_t)_O_TRUNC)); + SET_VALUE(isolate, module, "_O_WRONLY", Integer::New(isolate, (int32_t)_O_WRONLY)); + SET_VALUE(isolate, module, "_O_U16TEXT", Integer::New(isolate, (int32_t)_O_U16TEXT)); + SET_VALUE(isolate, module, "_O_U8TEXT", Integer::New(isolate, (int32_t)_O_U8TEXT)); + +#ifdef __linux__ + +#endif +#ifdef __MACH__ + +#endif + +#ifdef __MACH__ + SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + +#endif +#ifdef __linux__ + SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + +#endif + SET_MODULE(isolate, target, "core", module); +} +} // namespace core +} // namespace lo + +extern "C" { + DLL_PUBLIC void* _register_core() { + return (void*)lo::core::Init; + } +} + From 9e05d8b997e591e8324dbdb53570fa9715873d2d Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 2 Jan 2026 01:48:25 +0000 Subject: [PATCH 17/33] chore: try to fix ci --- .github/workflows/push.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index e4c6fba..c8723d3 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -141,11 +141,11 @@ jobs: build-windows: # if: ${{ false }} # disable name: windows - runs-on: windows-2022 + runs-on: windows-latest strategy: fail-fast: false matrix: - platform: [x64,arm64] + platform: [x64] steps: - uses: actions/checkout@v3 - name: Install MSVC/MCBuild (Windows) From 1e83294cfd8e5c7520a3cfd9c390c00d9e649bbc Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sun, 18 Jan 2026 20:11:16 +0000 Subject: [PATCH 18/33] feat: repl for windows --- build.cmd | 4 +- lib/repl.js | 279 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 188 insertions(+), 95 deletions(-) diff --git a/build.cmd b/build.cmd index b62d5fb..fa4ad9b 100644 --- a/build.cmd +++ b/build.cmd @@ -28,7 +28,7 @@ if exist lo.exe ( lo.exe gen lib\core2\api.js > lib\core2\core.cc lo.exe gen --header --win core.a win.a inflate.a %BUILTINS% > main_win.h ) -if not exist em_inflate.o ( +if not exist lib\inflate\em_inflate.o ( cd lib\inflate if not exist em_inflate.h ( curl -s -O https://raw.githubusercontent.com/emmanuel-marty/em_inflate/master/lib/em_inflate.h @@ -39,8 +39,8 @@ if not exist em_inflate.o ( clang -I. -c -o em_inflate.o -O3 em_inflate.c cd ..\.. ) -clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -Ilib/inflate lib/inflate/inflate.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% lib/win/win.cc +clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -Ilib/inflate lib/inflate/inflate.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -D_CRT_SECURE_NO_WARNINGS lib/core2/core.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" lo.cc clang++ %OPTS% %WARN% %INCLUDE% -c %V8_OPTS% -DVERSION=\"%VERSION%\" -DRUNTIME=\"%RUNTIME%\" main.cc diff --git a/lib/repl.js b/lib/repl.js index 1bb16aa..1b79648 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -5,41 +5,14 @@ import { control } from 'lib/ansi.js' import { dump } from 'lib/binary.js' const boot_time = Math.floor((lo.hrtime() - lo.start) / 10000) / 100 +const { + core, assert, version, handle_error, ptr, colors +} = lo +const { + write, arch, os, getchar +} = core -const { bestlines } = lo.load('bestlines') -const { colors, utf8_decode, wrap, core, handle_error, ptr } = lo -const { strnlen, isatty } = core - -const { AG, AD, AR, AY, AM } = colors - -const encoder = new TextEncoder() -const u32 = new Uint32Array(2) - -const { bestline, bestline_raw } = bestlines -//const bestline = wrap(u32, bestlines.bestline, 1) -//const bestline_raw = wrap(u32, bestlines.bestline_raw, 3) -const { cls, add, save, load } = bestlines -const { STDIN, STDOUT, STDERR } = core - -const history_path = join(core.homedir, '.lo_history') - -load(history_path) -const prompt = ptr(encoder.encode(`${AG}>${AD} \0`)) -const async_fn = Object.getPrototypeOf(async function() {}) - -function on_unhandled_rejection (err) { - //console.error(`${AR}Unhandled Rejection${AD}`) - //console.error(err.stack) -} - -globalThis.onUnhandledRejection = on_unhandled_rejection - -function info () { - console.log(` ${AG}lo${AD} ${lo.version.lo} ${control.column(26)}${AG}v8${AD} ${lo.version.v8} - ${AM}arch${AD} ${lo.core.arch} ${control.column(26)}${AM}os${AD} ${lo.core.os} - ${AY}boot${AD} ${boot_time} ms ${control.column(26)}${AY}rss${AD} ${proc.mem()} -`) -} +let repl function logo () { console.log(`⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛ @@ -62,75 +35,195 @@ function logo () { ⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛ `) } -const MAX_LINE = 65536 - -function bestline_notatty (p) { - return bestline(p) -} -function bestline_isatty (p) { - return bestline_raw(p, STDIN, STDOUT) -} +if (os === 'win') { + const { column, cls } = control + const { exec, mem } = proc + const async_fn = Object.getPrototypeOf(async function() {}) + const { AG, AD, AY, AM } = colors + const encoder = new TextEncoder() + const decoder = new TextDecoder() + const prompt = ptr(encoder.encode(`${AG}>${AD} \0`)) + + function info () { + console.log(` ${AG}lo${AD} ${version.lo} ${column(26)}${AG}v8${AD} ${version.v8} + ${AM}arch${AD} ${arch} ${control.column(26)}${AM}os${AD} ${os} + ${AY}boot${AD} ${boot_time} ms ${column(26)}${AY}rss${AD} ${mem()} + `) + } -let nextline = (isatty(STDIN) && isatty(STDOUT)) ? bestline_isatty : bestline_notatty - -async function repl (ctx) { -// cls(1) - logo() - info() - let line - globalThis.repl = ctx - while (line = nextline(prompt.ptr)) { - try { - const len = strnlen(line, MAX_LINE) - if (len === 0) continue - const command = utf8_decode(line, len) - if (!command) continue - if (command === '.exit') break - if (command === '.save') { - save(history_path) - continue - } - if (command === '.cls') { - cls(1) - continue - } - if (command === '.info') { - info() - add(line) - continue + async function handle_command (command) { + if (!command) return + if (command[0] === '!') { + const [cmd, ...args] = command.slice(1).split(' ') + exec(cmd, args) + return + } + if (command === '.cls') { + cls(1) + return + } + if (command === '.info') { + info() + return + } + const result = await async_fn.constructor(`return (${command})`) + .call(this, command) + if (result !== null && result !== undefined) { + if (result === null) { + console.log('') + } else if (result === undefined) { + console.log('') + } else if (!result.constructor) { + console.log(stringify(result)) + } else if (result.constructor.name === 'Number') { + console.log(result) + } else if (result.constructor.name === 'String') { + console.log(`${result}`) + } else if (ArrayBuffer.isView(result)) { + const { buffer, byteOffset, length } = result + console.log(dump(new Uint8Array(buffer, byteOffset, length))) + } else { + console.log(stringify(result)) } - if (command[0] === '!') { - const [cmd, ...args] = command.slice(1).split(' ') - proc.exec(cmd, args) - add(line) + } + } + + repl = async function () { + const max_len = 65536 + logo() + info() + const buffer = new Uint8Array(max_len) + let n = 0 + write(1, prompt.ptr, prompt.length) + while (true) { + if (n === max_len) { + console.log('line is too long') + n = 0 continue } - const result = await async_fn.constructor(`return (${command})`).call(this, command) - if (result !== null && result !== undefined) { - if (result === null) { - console.log('') - } else if (result === undefined) { - console.log('') - } else if (!result.constructor) { - console.log(stringify(result)) - } else if (result.constructor.name === 'Number') { - console.log(result) - } else if (result.constructor.name === 'String') { - console.log(`${result}`) - } else if (ArrayBuffer.isView(result)) { - console.log(dump(new Uint8Array(result.buffer, result.byteOffset, result.byteLength))) - } else { - console.log(stringify(result)) + const c = buffer[n++] = getchar() + if (c === 0) break + if (c === 10) { + const command = decoder.decode(buffer.subarray(0, n)).trim() + if (command === '.exit') break + try { + await handle_command(command) + } catch (err) { + handle_error(err) } + n = 0 + write(1, prompt.ptr, prompt.length) } - } catch (err) { - handle_error(err) } - add(line) } - save(history_path) +} else { + const { utf8_decode, wrap } = lo + const { strnlen, isatty } = core + const { bestlines } = lo.load('bestlines') + + const { AG, AD, AR, AY, AM } = colors + + const encoder = new TextEncoder() + const u32 = new Uint32Array(2) + + const { bestline, bestline_raw } = bestlines + //const bestline = wrap(u32, bestlines.bestline, 1) + //const bestline_raw = wrap(u32, bestlines.bestline_raw, 3) + const { cls, add, save, load } = bestlines + const { STDIN, STDOUT, STDERR } = core + + const history_path = join(core.homedir, '.lo_history') + + load(history_path) + const prompt = ptr(encoder.encode(`${AG}>${AD} \0`)) + const async_fn = Object.getPrototypeOf(async function() {}) + + function on_unhandled_rejection (err) { + //console.error(`${AR}Unhandled Rejection${AD}`) + //console.error(err.stack) + } + + globalThis.onUnhandledRejection = on_unhandled_rejection + + function info () { + console.log(` ${AG}lo${AD} ${lo.version.lo} ${control.column(26)}${AG}v8${AD} ${lo.version.v8} + ${AM}arch${AD} ${lo.core.arch} ${control.column(26)}${AM}os${AD} ${lo.core.os} + ${AY}boot${AD} ${boot_time} ms ${control.column(26)}${AY}rss${AD} ${proc.mem()} + `) + } + + const MAX_LINE = 65536 + + function bestline_notatty (p) { + return bestline(p) + } + + function bestline_isatty (p) { + return bestline_raw(p, STDIN, STDOUT) + } + + let nextline = (isatty(STDIN) && isatty(STDOUT)) ? bestline_isatty : bestline_notatty + + repl = async function (ctx) { + // cls(1) + logo() + info() + let line + globalThis.repl = ctx + while (line = nextline(prompt.ptr)) { + try { + const len = strnlen(line, MAX_LINE) + if (len === 0) continue + const command = utf8_decode(line, len) + if (!command) continue + if (command === '.exit') break + if (command === '.save') { + save(history_path) + continue + } + if (command === '.cls') { + cls(1) + continue + } + if (command === '.info') { + info() + add(line) + continue + } + if (command[0] === '!') { + const [cmd, ...args] = command.slice(1).split(' ') + proc.exec(cmd, args) + add(line) + continue + } + const result = await async_fn.constructor(`return (${command})`).call(this, command) + if (result !== null && result !== undefined) { + if (result === null) { + console.log('') + } else if (result === undefined) { + console.log('') + } else if (!result.constructor) { + console.log(stringify(result)) + } else if (result.constructor.name === 'Number') { + console.log(result) + } else if (result.constructor.name === 'String') { + console.log(`${result}`) + } else if (ArrayBuffer.isView(result)) { + console.log(dump(new Uint8Array(result.buffer, result.byteOffset, result.byteLength))) + } else { + console.log(stringify(result)) + } + } + } catch (err) { + handle_error(err) + } + add(line) + } + + save(history_path) + } } export { repl } From 1a8ce9f67e5d2cc55bd0f00ca5613b5708b4cb41 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Fri, 30 Jan 2026 23:04:19 +0000 Subject: [PATCH 19/33] feat: md4c bindings --- lib/md4c/api.js | 144 ++++++++++++++++++++++++++++++++++++++++++++++ lib/md4c/build.js | 37 ++++++++++++ 2 files changed, 181 insertions(+) create mode 100644 lib/md4c/api.js create mode 100644 lib/md4c/build.js diff --git a/lib/md4c/api.js b/lib/md4c/api.js new file mode 100644 index 0000000..2db0a6a --- /dev/null +++ b/lib/md4c/api.js @@ -0,0 +1,144 @@ +const api = { + parse: { + parameters: ['string', 'u32', 'pointer', 'pointer'], + pointers: ['const MD_CHAR*',, 'const MD_PARSER*'], + result: 'i32', + name: 'md_parse' + }, + html: { + parameters: ['string', 'u32', 'pointer', 'pointer', 'u32', 'u32'], + pointers: ['const MD_CHAR*', , 'process_output'], + result: 'i32', + name: 'md_html' + }, + to_html: { + parameters: ['string', 'u32', 'pointer'], + pointers: ['const MD_CHAR*', , 'HtmlBuffer*'], + result: 'i32', + } +} + +// https://bun.com/blog/bun-v1.3.8 + +const constants = { + MD_FLAG_COLLAPSEWHITESPACE: 'i32', + MD_DIALECT_GITHUB: 'i32', + MD_DIALECT_COMMONMARK: 'i32', + + MD_BLOCK_DOC: 'i32', + MD_BLOCK_QUOTE: 'i32', + MD_BLOCK_UL: 'i32', + MD_BLOCK_OL: 'i32', + MD_BLOCK_LI: 'i32', + MD_BLOCK_HR: 'i32', + MD_BLOCK_H: 'i32', + MD_BLOCK_CODE: 'i32', + MD_BLOCK_HTML: 'i32', + MD_BLOCK_P: 'i32', + MD_BLOCK_TABLE: 'i32', + MD_BLOCK_THEAD: 'i32', + MD_BLOCK_TBODY: 'i32', + MD_BLOCK_TR: 'i32', + MD_BLOCK_TH: 'i32', + MD_BLOCK_TD: 'i32', + + MD_SPAN_EM: 'i32', + MD_SPAN_STRONG: 'i32', + MD_SPAN_A: 'i32', + MD_SPAN_IMG: 'i32', + MD_SPAN_CODE: 'i32', + MD_SPAN_DEL: 'i32', + MD_SPAN_LATEXMATH: 'i32', + MD_SPAN_LATEXMATH_DISPLAY: 'i32', + MD_SPAN_WIKILINK: 'i32', + MD_SPAN_U: 'i32', + + MD_TEXT_NORMAL: 'i32', + MD_TEXT_NULLCHAR: 'i32', + MD_TEXT_BR: 'i32', + MD_TEXT_SOFTBR: 'i32', + MD_TEXT_ENTITY: 'i32', + MD_TEXT_CODE: 'i32', + MD_TEXT_HTML: 'i32', + MD_TEXT_LATEXMATH: 'i32', + + MD_ALIGN_DEFAULT: 'i32', + MD_ALIGN_LEFT: 'i32', + MD_ALIGN_CENTER: 'i32', + MD_ALIGN_RIGHT: 'i32', + + MD_FLAG_COLLAPSEWHITESPACE: 'i32', + MD_FLAG_PERMISSIVEATXHEADERS: 'i32', + MD_FLAG_PERMISSIVEURLAUTOLINKS: 'i32', + MD_FLAG_PERMISSIVEEMAILAUTOLINKS: 'i32', + MD_FLAG_NOINDENTEDCODEBLOCKS: 'i32', + MD_FLAG_NOHTMLBLOCKS: 'i32', + MD_FLAG_NOHTMLSPANS: 'i32', + MD_FLAG_TABLES: 'i32', + MD_FLAG_STRIKETHROUGH: 'i32', + MD_FLAG_PERMISSIVEWWWAUTOLINKS: 'i32', + MD_FLAG_TASKLISTS: 'i32', + MD_FLAG_LATEXMATHSPANS: 'i32', + MD_FLAG_WIKILINKS: 'i32', + MD_FLAG_UNDERLINE: 'i32', + MD_FLAG_HARD_SOFT_BREAKS: 'i32', + MD_FLAG_PERMISSIVEAUTOLINKS: 'i32', + MD_FLAG_NOHTML: 'i32', + + MD_HTML_FLAG_DEBUG: 'i32', + MD_HTML_FLAG_VERBATIM_ENTITIES: 'i32', + MD_HTML_FLAG_SKIP_UTF8_BOM: 'i32', + MD_HTML_FLAG_XHTML: 'i32', + + +} +const includes = ['md4c.h', 'md4c-html.h'] +const name = 'md4c' +const libs = [] +const obj = ['deps/md4c/build/src/libmd4c.a', 'deps/md4c/build/src/libmd4c-html.a'] +const include_paths = ['deps/md4c/src'] +const structs = [ + 'MD_ATTRIBUTE', + 'MD_BLOCK_UL_DETAIL', + 'MD_BLOCK_OL_DETAIL', + 'MD_BLOCK_LI_DETAIL', + 'MD_BLOCK_H_DETAIL', + 'MD_BLOCK_CODE_DETAIL', + 'MD_BLOCK_TABLE_DETAIL', + 'MD_BLOCK_TD_DETAIL', + 'MD_SPAN_A_DETAIL', + 'MD_SPAN_IMG_DETAIL', + 'MD_SPAN_WIKILINK', + 'MD_PARSER', +] +const preamble = ` +typedef void (*process_output)(const MD_CHAR*, MD_SIZE, void*); + +typedef struct { + char* data; + size_t size; + size_t capacity; +} HtmlBuffer; + +void append_to_buffer (const MD_CHAR* text, MD_SIZE size, void* userdata) { + HtmlBuffer* buf = (HtmlBuffer*)userdata; + if (buf->size + size + 1 > buf->capacity) { + size_t new_capacity = buf->capacity ? buf->capacity * 2 : 1024; + while (new_capacity < buf->size + size + 1) new_capacity *= 2; + char* new_data = (char*)realloc(buf->data, new_capacity); + if (!new_data) return; + buf->data = new_data; + buf->capacity = new_capacity; + } + memcpy(buf->data + buf->size, text, size); + buf->size += size; +} + +int to_html (const MD_CHAR* text, MD_SIZE size, HtmlBuffer* html) { + html->size = 0; + return md_html(text, size, append_to_buffer, html, 0, 0); +} + +` + +export { api, includes, name, obj, libs, constants, include_paths, structs, preamble } diff --git a/lib/md4c/build.js b/lib/md4c/build.js new file mode 100644 index 0000000..939f743 --- /dev/null +++ b/lib/md4c/build.js @@ -0,0 +1,37 @@ +import { fetch } from 'lib/curl.js' +import { inflate } from 'lib/inflate.js' +import { untar } from 'lib/untar.js' +import { isDir, isFile } from 'lib/fs.js' +import { exec } from 'lib/proc.js' +import { obj } from 'lib/md4c/api.js' + +async function build () { + const { assert, core } = lo + const { + chdir, mkdir, S_IRWXU, S_IRWXG, S_IROTH, S_IXOTH, readFile + } = core + if (!isDir('deps/md4c')) { + mkdir('deps', S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) + assert(chdir('deps') === 0) + if (!isFile('md4c.tar.gz')) { + console.log('fetching release') + fetch('https://github.com/mity/md4c/archive/refs/tags/release-0.5.2.tar.gz', + 'md4c.tar.gz') + } + const bytes = readFile('md4c.tar.gz') + const dir_name = untar(inflate(bytes)) + const cwd = lo.getcwd() + assert(lo.core.rename(`${cwd}/${dir_name}`, `${cwd}/md4c`) === 0) + assert(chdir('../') === 0) + } + if (obj.some(o => !isFile(o))) { + assert(chdir('deps/md4c') === 0) + assert(exec('cmake', ['-DBUILD_SHARED_LIBS=ON', '-B', 'build'])[0] === 0) + assert(exec('make', ['-C', 'build', '-j', '6'])[0] === 0) + assert(exec('cmake', ['-DBUILD_SHARED_LIBS=OFF', '-B', 'build'])[0] === 0) + assert(exec('make', ['-C', 'build', '-j', '6'])[0] === 0) + assert(chdir('../../') === 0) + } +} + +export { build } From a72945b8294bd4c50f541fb53b886644c718fe1d Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 03:44:30 +0000 Subject: [PATCH 20/33] feat: cpio support --- lib/cpio.js | 420 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 420 insertions(+) create mode 100644 lib/cpio.js diff --git a/lib/cpio.js b/lib/cpio.js new file mode 100644 index 0000000..86d2de4 --- /dev/null +++ b/lib/cpio.js @@ -0,0 +1,420 @@ +// COMPAT +let constants = {} +let stat +if (globalThis.lo) { + globalThis.readFileSync = lo.core.read_file + const { file_stat } = await import('lib/fs.js') + stat = file_stat + globalThis.args = lo.args.slice(2) + constants.S_IFBLK = lo.core.S_IFBLK + constants.S_IFCHR = lo.core.S_IFCHR + constants.S_IFIFO = lo.core.S_IFIFO + constants.S_IFMT = lo.core.S_IFMT + constants.S_IFDIR = lo.core.S_IFDIR + constants.S_IFREG = lo.core.S_IFREG + constants.S_IRUSR = lo.core.S_IRUSR + constants.S_IWUSR = lo.core.S_IWUSR + constants.S_IXUSR = lo.core.S_IXUSR + constants.S_IRGRP = lo.core.S_IRGRP + constants.S_IWGRP = lo.core.S_IWGRP + constants.S_IXGRP = lo.core.S_IXGRP + constants.S_IROTH = lo.core.S_IROTH + constants.S_IWOTH = lo.core.S_IWOTH + constants.S_IXOTH = lo.core.S_IXOTH + constants.S_IRWXU = lo.core.S_IRWXU + constants.S_IRWXG = lo.core.S_IRWXG + constants.S_IRWXO = lo.core.S_IRWXO + constants.O_WRONLY = lo.core.O_WRONLY + constants.O_RDONLY = lo.core.O_RDONLY + constants.O_RDWR = lo.core.O_RDWR + constants.O_CREAT = lo.core.O_CREAT + constants.O_TRUNC = lo.core.O_TRUNC +} else { + const fs = await import('node:fs') + stat = fs.statSync + globalThis.readFileSync = fs.readFileSync + globalThis.args = process.argv.slice(2) + constants.S_IFBLK = fs.constants.S_IFBLK + constants.S_IFCHR = fs.constants.S_IFCHR + constants.S_IFIFO = fs.constants.S_IFIFO + constants.S_IFMT = fs.constants.S_IFMT + constants.S_IFDIR = fs.constants.S_IFDIR + constants.S_IFREG = fs.constants.S_IFREG + constants.S_IRUSR = fs.constants.S_IRUSR + constants.S_IWUSR = fs.constants.S_IWUSR + constants.S_IXUSR = fs.constants.S_IXUSR + constants.S_IRGRP = fs.constants.S_IRGRP + constants.S_IWGRP = fs.constants.S_IWGRP + constants.S_IXGRP = fs.constants.S_IXGRP + constants.S_IROTH = fs.constants.S_IROTH + constants.S_IWOTH = fs.constants.S_IWOTH + constants.S_IXOTH = fs.constants.S_IXOTH + constants.S_IRWXU = fs.constants.S_IRWXU + constants.S_IRWXG = fs.constants.S_IRWXG + constants.S_IRWXO = fs.constants.S_IRWXO + constants.O_WRONLY = fs.constants.O_WRONLY + constants.O_RDONLY = fs.constants.O_RDONLY + constants.O_RDWR = fs.constants.O_RDWR + constants.O_CREAT = fs.constants.O_CREAT + constants.O_TRUNC = fs.constants.O_TRUNC +} + +const { + S_IFBLK, + S_IFCHR, + S_IFIFO, + S_IFMT , + S_IFDIR, + S_IFREG, + S_IRUSR, + S_IWUSR, + S_IXUSR, + S_IRGRP, + S_IWGRP, + S_IXGRP, + S_IROTH, + S_IWOTH, + S_IXOTH, + S_IRWXU, + S_IRWXG, + S_IRWXO, + O_WRONLY, + O_RDONLY, + O_RDWR, + O_CREAT, + O_TRUNC +} = constants + +const encoder = new TextEncoder() +const decoder = new TextDecoder() +globalThis.decode_utf8 = (bytes, off, sz) => { + return decoder.decode(bytes.subarray(off, off + sz)) +} + +const AD = "\u001b[0m" // ANSI Default +const AG = "\u001b[32m" // ANSI Green +const AY = "\u001b[33m" // ANSI Yellow +const AC = "\u001b[36m" // ANSI Cyan +// END OF COMPAT + +// SRV4 ASCII CPIO Format + +// https://github.com/libyal/dtformats/blob/main/documentation/Copy%20in%20and%20out%20(CPIO)%20archive%20format.asciidoc#5-mode-permissions-and-type +/* +0170000 This masks the file type bits. +0140000 File type value for sockets. +0120000 File type value for symbolic links. For symbolic links, + the link body is stored as file data. +0100000 File type value for regular files. +0060000 File type value for block special devices. +0040000 File type value for directories. +0020000 File type value for character special devices. +0010000 File type value for named pipes or FIFOs. +0004000 SUID bit. +0002000 SGID bit. +0001000 Sticky bit. On some systems, this modifies the behavior + of executables and/or directories. +0000777 The lower 9 bits specify read/write/execute permissions + for world, group, and user following standard POSIX con- + ventions. +*/ + +function get_file_type (val) { + const type = val & IF_TYPE + if (type === IF_SOCK) return 'sck' + if (type === IF_LINK) return 'sym' + if (type === IF_REG) return 'reg' + if (type === IF_BLK) return 'blk' + if (type === IF_DIR) return 'dir' + if (type === IF_CHR) return 'chr' + if (type === IF_PIPE) return 'pip' + return '' +} + +function get_bits (val) { + const suid = val & IF_SUID + const sgid = val & IF_SGID + const sticky = val & IF_STICKY + return { suid, sgid, sticky } +} + +function perms (p) { + const { r, w, x } = mode + return `${(p & r) === r ? 'r' : '-'}${(p & w) === w ? 'w' : '-'}${(p & x) === x ? 'x' : '-'}` +} + +function get_perms (val) { + const perm = val & IF_PERM + const u = perm >> 6 + const g = (perm >> 3) & 0x07 + const w = perm & 0x07 + return [u, g, w].map(perms) +} + +function parse_cpio (bytes) { + function octal (sz) { + const val = Number(`0o${decode_utf8(bytes, off, sz)}`) + off += sz + return val + } + + function hex (sz) { + const val = Number(`0x${decode_utf8(bytes, off, sz)}`) + off += sz + return val + } + + function string (sz) { + const str = decode_utf8(bytes, off, sz) + off += sz + 1 + return str + } + + function align () { + const over = off % 4 + if (over === 0) return + off += 4 - over + } + + function buffer (sz) { + const buf = bytes.subarray(off, off + sz) + off += sz + return buf + } + + let off = 0 + const files = [] + + while (off < bytes.length) { + // can be "070701" (no checksums) or "070702" (with checksums) + const id = octal(6) + if (id !== 29121 && id !== 29122) throw new Error('Unrecognized file id') + const inode = hex(8) + const mode = hex(8) + const type = get_file_type(mode) + const perms = get_perms(mode) + const { suid, sgid, sticky } = get_bits(mode) + const uid = hex(8) + const gid = hex(8) + const links = hex(8) + const mod = new Date(hex(8) * 1000) + const size = hex(8) + const major = hex(8) + const minor = hex(8) + const dev_major = hex(8) + const dev_minor = hex(8) + const path_size = hex(8) + const checksum = hex(8) // will only be set if id is "070702" + const path = string(path_size - 1) + if (path === 'TRAILER!!!') break + const file = { + id, inode, mode, uid, gid, links, mod, size, major, minor, dev_major, + dev_minor, path_size, checksum, path, type, perms, + suid, sgid, sticky + } + align() + if (type === 'link') { + file.link_path = string(size) + } else { + file.data = buffer(size) + } + align() + files.push(file) + } + return files +} + +function build_cpio (entries) { + function octal (n, sz) { + const str = n.toString(8).padStart(sz, '0') + off += sz + return str + } + + function hex (n, sz) { + const str = n.toString(16).padStart(sz, '0') + off += sz + return str + } + + function string (s) { + const str = `${s}\0` + off += str.length // TODO - UTF8 + return str + } + + function align () { + const over = off % 4 + if (over === 0) return + off += 4 - over + } + + function buffer (b) { + off += b.length + return b + } + + function get_type (entry) { + const { type } = entry + if (type === 'reg') return S_IFREG + if (type === 'dir') return S_IFDIR + if (type === 'blk') return S_IFBLK + if (type === 'chr') return S_IFCHR + return S_IFREG + } + + function get_perms (entry) { + const { type, exe } = entry + if (type === 'reg') { + if (exe) return S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH + return S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH + } + if (type === 'dir') return S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH + if (type === 'blk') return S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH + if (type === 'chr') return S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH + return 0 + } + + function get_size (entry) { + const { type } = entry + if (type === 'reg') { + const st = stat(entry.source) + return st.size + } + return 0 + } + + function get_dev (entry) { + if (entry.type !== 'chr' && entry.type !== 'blk') return { major: 0, minor: 0 } + const [ major, minor ] = entry.dev.split('.').map(v => parseInt(v, 10)) + return { major, minor } + } + function create_entry (entry) { + off = 0 + const id = octal(29121, 6) + const inode = hex(next_inode++, 8) + const mode = hex(get_perms(entry) | get_type(entry), 8) + const uid = hex(0, 8) + const gid = hex(0, 8) + const links = hex(0, 8) + const mod = hex(Math.floor(Date.now() / 1000), 8) + const size = hex(get_size(entry), 8) + const dev = get_dev(entry) + const major = hex(8, 8) + const minor = hex(1, 8) + const dev_major = hex(dev.major, 8) + const dev_minor = hex(dev.minor, 8) + const path_size = hex(entry.path.length + 1, 8) + const checksum = hex(0, 8) + const path = string(entry.path) + let payload + align() + if (entry.type === 'link') { + payload = encoder.encode(string(entry.link_path)) + } else if (entry.type === 'reg') { + payload = buffer(readFileSync(entry.source)) + } + align() + const dest = new Uint8Array(off) + const text = `${id}${inode}${mode}${uid}${gid}${links}${mod}${size}${major}${minor}${dev_major}${dev_minor}${path_size}${checksum}${path}` + const written = encoder.encodeInto(text, dest) + off = written + align() + if (payload) dest.set(payload, off) + return dest + } + + const sections = [] + let off = 0 + let next_inode = 1 + for (const entry of entries) { + sections.push(create_entry(entry)) + } + sections.push(create_entry({ path: 'TRAILER!!!' })) + return sections +} + +function col (type, perms) { + if (type === 'reg') { + if (perms) { + const executable = perms.map(p => p.split('')[2]).includes('x') + if (executable) return AG + } + return AD + } + if (type === 'dir') return AC + if (type === 'link') return AG + if (type === 'sock') return AG + if (type === 'chr') return AY + return AY +} + +function header () { + const fields = [] + fields.push('path'.padEnd(40, ' ')) + fields.push('type'.padEnd(6, ' ')) + fields.push('inode'.padEnd(10, ' ')) + fields.push('size'.padStart(20, ' ')) + fields.push('modified'.padStart(30, ' ')) + fields.push('perm'.padStart(10, ' ')) + fields.push('ver'.padStart(6, ' ')) + fields.push('dev'.padStart(6, ' ')) + fields.push('uid'.padStart(8, ' ')) + fields.push('gid'.padStart(8, ' ')) + fields.push('links'.padStart(6, ' ')) + fields.push('suid'.padStart(4, ' ')) + fields.push('sgid'.padStart(4, ' ')) + fields.push('stky'.padStart(4, ' ')) + return `${AG}${fields.join(' ')}${AD}\n${'-'.repeat(168)}` +} + +function dump_file (file) { + const { + path, inode, type, size, mod, perms, major, minor, dev_major, dev_minor, uid, gid, links, + suid, sgid, sticky + } = file + const fields = [] + fields.push(`${col(type, perms)}${path.padEnd(40, ' ')}${AD}`) + fields.push(`${type.padEnd(6, ' ')}`) + fields.push(`${inode.toString().padEnd(10, ' ')}`) + fields.push(`${size.toString().padStart(20, ' ')}`) + fields.push(`${AY}${mod.toISOString().padStart(30, ' ')}${AD}`) + fields.push(`${perms.join('').padStart(10, ' ')}`) + + fields.push(`${(major + "." + minor).padStart(6, ' ')}`) + fields.push(`${(dev_major + "." + dev_minor).padStart(6, ' ')}`) + fields.push(`${uid.toString().padStart(8, ' ')}`) + fields.push(`${gid.toString().padStart(8, ' ')}`) + fields.push(`${links.toString().padStart(6, ' ')}`) + fields.push(`${suid.toString().padStart(4, ' ')}`) + fields.push(`${sgid.toString().padStart(4, ' ')}`) + fields.push(`${sticky.toString().padStart(4, ' ')}`) + return fields.join(' ') +} + +const mode = { x: 1, w: 2, r: 4 } +const IF_TYPE = 0o170000 +const IF_SOCK = 0o140000 +const IF_LINK = 0o120000 +const IF_REG = 0o100000 +const IF_BLK = 0o060000 +const IF_DIR = 0o040000 +const IF_CHR = 0o020000 +const IF_PIPE = 0o010000 +const IF_SUID = 0o004000 +const IF_SGID = 0o002000 +const IF_STICKY = 0o001000 +const IF_PERM = 0o000777 + +function dump_cpio (path) { + const files = parse_cpio(readFileSync(path)) + let total = 0 + console.log(header()) + for (const file of files) { + console.log(dump_file(file)) + total += file.size + } + console.log(`\ntotal: ${total}`) +} + +export { parse_cpio, build_cpio, dump_cpio } From 7f1642b85b3dea153c94ce0cee48e3a9f4f8331e Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 03:45:13 +0000 Subject: [PATCH 21/33] feat: ffi callbacks --- lib/ffi.js | 122 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 111 insertions(+), 11 deletions(-) diff --git a/lib/ffi.js b/lib/ffi.js index 54c0e8b..a62b786 100644 --- a/lib/ffi.js +++ b/lib/ffi.js @@ -178,7 +178,58 @@ function platform_x64 () { return compiler.compile(asm.bytes()) } - return { compile_slowcall, compile_fastcall } + function generate_real_callback (ctx, { result, parameters, callback }) { + const u32 = new Uint32Array(ctx.buffer) + const i32 = new Int32Array(ctx.buffer) + const u64 = new BigUint64Array(ctx.buffer) + const source = [] + if (result === 'u32') { + source.push(`u32[4] = callback(`) + } else if (result === 'i32') { + source.push(`u32[4] = callback(`) + } else { + source.push(`callback(`) + } + let off = 24 + for (const param of parameters) { + if (off > 24) source.push(', ') + if (param === 'u32') { + source.push(`u32[${off / 4}]`) + } else if (param === 'pointer') { + source.push(`Number(u64[${off / 8}])`) + } + off += 8 + } + source.push(')\n') + return (new Function('i32', 'u32', 'u64', 'callback', `return function () {\n${source.join('')}\n}`))(i32, u32, u64, callback) + } + + function generate_callback (def) { + const { parameters, result } = def + const nArgs = parameters.length + if (nArgs > 6) throw new Error('more than 6 arguments not yet implemented') + const ctx = ptr(new Uint8Array(((nArgs + 3) * 8))) + const callback_address = assert(dlsym(0, 'lo_callback')) + lo.register_callback(ctx.ptr, generate_real_callback(ctx, def)) + asm.reset() + .movabs(ctx.ptr, rax) + if (nArgs > 0) asm.movdest(rdi, rax, 24) + if (nArgs > 1) asm.movdest(rsi, rax, 32) + if (nArgs > 2) asm.movdest(rdx, rax, 40) + if (nArgs > 3) asm.movdest(rcx, rax, 48) + if (nArgs > 4) asm.movdest(r8, rax, 56) + if (nArgs > 5) asm.movdest(r9, rax, 64) + asm.movreg(rax, rdi) + .push(r15) + .movreg(rax, r15) + .call(callback_address) + if (result && result !== 'void') asm.movsrc(r15, rax, 16) + asm.pop(r15) + .ret() + return { context: ctx, fn: compiler.compile(asm.bytes()) } + } + + return { compile_slowcall, compile_fastcall, generate_callback } } function platform_arm64 () { @@ -233,7 +284,11 @@ function platform_arm64 () { return compiler.compile(asm.bytes()) } - return { compile_slowcall, compile_fastcall } + function generate_callback () { + throw new Error('Not Implemented') + } + + return { compile_slowcall, compile_fastcall, generate_callback } } function platform_specific () { @@ -245,13 +300,13 @@ function platform_specific () { return {} } -const { compile_slowcall, compile_fastcall } = platform_specific() +const { compile_slowcall, compile_fastcall, generate_callback } = platform_specific() -function bindall (api, addr = 0) { - const binding = {} +function bindall (api, addr = 0, constants = {} ) { + const binding = { ...constants } for (const key of Object.keys(api)) { - const { name, result, parameters } = api[key] - binding[key] = bind(assert(dlsym(addr, name || key)), result, parameters) + const { name, result, parameters, nofast } = api[key] + binding[key] = bind(assert(dlsym(addr, name || key)), result, parameters, nofast) } return binding } @@ -286,7 +341,7 @@ function bind (address, res = 'void', params = [], slow = false, fast_address = const generated_fun = slow ? bind_slowcall(state.ptr) : bind_fastcall(state.ptr) // keep the state alive - generated_fun._state = state + generated_fun.state = state generated_fun.slow_src = slow_src generated_fun.fast_src = fast_src // return generated_fun @@ -320,7 +375,7 @@ function bind_custom (res = 'void', params = [], slow_address = 0, fast_address const generated_fun = fast_address ? bind_fastcall(state.ptr) : bind_slowcall(state.ptr) // keep the state alive - generated_fun._state = state + generated_fun.state = state // return generated_fun return needs_unwrap(result) ? wrap(result_handle, generated_fun, params.length) : generated_fun @@ -330,7 +385,7 @@ const { ptr, core, wrap, assert } = lo const { bind_fastcall, bind_slowcall, dlsym, struct_fastcall_size } = core -const { rdi, rsi, rdx, rcx, r8, r9, rsp, rax, rbx } = Registers +const { rdi, rsi, rdx, rcx, r8, r9, rsp, rax, rbx, r15 } = Registers // maximum number of args we can handle - this is arbitrary const max_args = 30 // the offset in struct fastcall where we place the function pointer for the @@ -349,4 +404,49 @@ const Types = { u32array: 17, bool: 18, string: 19 } -export { bind, bindall, bind_custom } +class Struct { + #u8 + #u32 + #u64 + #off = 0 + #size = 0 + + constructor (size = 64) { + const buf = new ArrayBuffer(size) + this.#size = size + this.#u8 = ptr(new Uint8Array(buf)) + this.#u64 = new BigUint64Array(buf) + this.#u32 = new Uint32Array(buf) + this.#off = 0 + } + + u32 (val) { + this.#u32[this.#off / 4] = val + this.#off += 4 + return this + } + + u64 (val) { + this.#u64[this.#off / 8] = BigInt(val) + this.#off += 8 + return this + } + + up (i) { + if (this.#off + i > this.#size) throw new Error('OOB') + this.#off += i + return this + } + + down (i) { + if (this.#off - i < 0) throw new Error('OOB') + this.#off -= i + return this + } + + get bytes () { + return this.#u8 + } +} + +export { bind, bindall, bind_custom, generate_callback, Struct } From db7eb1b94ef5a8cfc21890095358b3312128d0cb Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 03:46:15 +0000 Subject: [PATCH 22/33] feat: fs fixes & stat working on linux --- lib/fs.js | 63 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/lib/fs.js b/lib/fs.js index b0d898b..d759269 100644 --- a/lib/fs.js +++ b/lib/fs.js @@ -4,7 +4,7 @@ const { F_OK, O_RDONLY, S_IFMT, S_IFDIR, S_IFREG, S_IRWXU, S_IRWXG, NAME_MAX, O_WRONLY, O_CREAT, O_TRUNC, S_IRUSR, S_IWUSR, S_IRGRP, S_IROTH, - DT_DIR, DT_CHR, DT_REG, DT_FIFO, DT_LNK, opendir, readdir + DT_DIR, DT_CHR, DT_REG, DT_FIFO, DT_LNK, DT_BLK, opendir, readdir } = core const u8 = ptr(new Uint8Array(21)) @@ -31,9 +31,7 @@ function checkMode (val, mode) { return (val & S_IFMT) === mode } -function file_size (path) { - const fd = open(path, O_RDONLY) - assert(fd > 0, `failed to open ${path}`) +function file_size_fd (fd) { assert(fstat(fd, stat.ptr) === 0) let size = 0 if (core.os === 'mac') { @@ -41,10 +39,61 @@ function file_size (path) { } else { size = Number(st[6]) } + return size +} + +function file_mode_fd (fd) { + assert(fstat(fd, stat.ptr) === 0) + return stat32[MODE_WORD] +} + +function file_size (path) { + const fd = open(path, O_RDONLY) + assert(fd > 0, `failed to open ${path}`) + const size = file_size_fd(fd) close(fd) return size } +/* +offset size field +------------------------------------ +0 8 st_dev +8 8 st_ino +16 8 st_nlink +24 4 st_mode +28 4 st_uid +32 4 st_gid +36 4 padding +40 8 st_rdev +48 8 st_size +56 8 st_blksize +64 8 st_blocks +72 16 st_atim +88 16 st_mtim +104 16 st_ctim +------------------------------------ +total: 144 bytes +alignment: 8 bytes +*/ +function file_stat (path) { + assert(core.stat(path, stat.ptr) === 0) + const dev = Number(st[0]) // 0 + const ino = Number(st[1]) // 8 + const nlink = stat32[4] // 16 + const mode = stat32[6] // 16 + const uid = stat32[7] // 32 + const gid = stat32[8] // 36 + const rdev = Number(st[5]) // 40 + const size = Number(st[6]) // 48 + const blksize = Number(st[7]) // 56 + const blocks = Number(st[8]) // 64 + const atim = [st[9], st[10]] // 72 + const mtim = [st[11], st[12]] // 88 + const ctim = [st[13], st[14]] // 104 + return { dev, ino, mode, nlink, uid, gid, rdev, size, blksize, blocks, atim, mtim, ctim } +} + function readdir_sync (path, entries = [], options = default_options) { const dir = opendir(path) let next = readdir(dir) @@ -54,12 +103,14 @@ function readdir_sync (path, entries = [], options = default_options) { if (!(entry.name === '..' || entry.name === '.')) { const entry_path = `${path}/${entry.name}` if (entry.d_type === DT_DIR) { - entries.push({ path, name: entry_path, isDirectory: true }) + entries.push({ path, name: entry.name, isDirectory: true }) if (options.recursive) readdir_sync(entry_path, entries, options) } else if (entry.d_type === DT_REG) { entries.push({ path, name: entry.name, isFile: true }) } else if (entry.d_type === DT_CHR) { entries.push({ path, name: entry.name, isChar: true }) + } else if (entry.d_type === DT_BLK) { + entries.push({ path, name: entry.name, isBlock: true }) } else if (entry.d_type === DT_LNK) { const path_name = ptr(new Uint8Array(1024)) const len = core.readlink(entry_path, path_name.ptr, 1024) @@ -191,5 +242,5 @@ export { mkDirAll, rmDirAll, isFile, isDir, readEntry, write_flags, read_flags, write_mode, dir_flags, is_dir, is_file, mkdir_all, rmdir_all, mkdir_all_safe, file_size, - readdir_sync, read_entry + readdir_sync, read_entry, file_size_fd, file_mode_fd, file_stat } From 1f8c0feb7c2523407c9b91004a61588940aec65b Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 03:46:42 +0000 Subject: [PATCH 23/33] fix: codegen fixes --- lib/gen.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/gen.js b/lib/gen.js index 05d4b9c..d2a8dd0 100644 --- a/lib/gen.js +++ b/lib/gen.js @@ -226,7 +226,7 @@ function bindings ({ api, includes = [], name, preamble, constants, structs = [] } function initStruct(n) { - return ` SET_VALUE(isolate, module, "struct_${n}_size", Integer::New(isolate, sizeof(${n})));\n` + return ` SET_VALUE(isolate, module, "struct_${n.replace(/\s/g, '_')}_size", Integer::New(isolate, sizeof(${n})));\n` } function initFunction (n, api) { @@ -648,7 +648,7 @@ async function gen (args) { } // source += await linkerScript('main.js') for (const fileName of args.slice(next)) { - source += await linkerScript(fileName) + source += await linkerScript(fileName, lo.getcwd()) } } else if (args[0] === '--header') { let next = 1 From a958f573664889396aabe75a2171870a5ba37746 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 03:47:12 +0000 Subject: [PATCH 24/33] fix: hash fixes --- lib/hash.js | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/lib/hash.js b/lib/hash.js index 5f4b8e4..4b6b912 100644 --- a/lib/hash.js +++ b/lib/hash.js @@ -5,17 +5,14 @@ if (lo.getenv('LOSSL') === 'boringssl') { libssl = lo.load('libssl').libssl } -const { assert, ptr, wrap } = lo +const { encode } = lo.load('encode') + +const { assert, ptr, utf8_decode } = lo const sizes = { md5: 16, sha1: 20, sha256: 32, sha384: 48, sha512: 64 } -const handle = new Uint32Array(2) - -libssl.EVP_get_digestbyname = wrap(handle, libssl.EVP_get_digestbyname, 1) -libssl.EVP_MD_CTX_new = wrap(handle, libssl.EVP_MD_CTX_new, 0) - const { EVP_get_digestbyname, EVP_MD_CTX_new, EVP_DigestInit_ex, EVP_DigestUpdateBuffer, EVP_DigestFinal, EVP_MD_CTX_reset, EVP_Digest, @@ -28,10 +25,10 @@ class Digest { constructor (method = 'md5') { const size = sizes[method] this.method = method - this.hasher = EVP_get_digestbyname(method) - this.hsize = new Uint32Array(2) + this.hasher = assert(EVP_get_digestbyname(method)) + this.hsize = ptr(new Uint32Array(2)) this.digest = ptr(new Uint8Array(size)) - this.ctx = EVP_MD_CTX_new() + this.ctx = assert(EVP_MD_CTX_new()) } init () { @@ -39,12 +36,12 @@ class Digest { } update (buf) { - assert(EVP_DigestUpdateBuffer(this.ctx, buf, buf.length) === 1) + assert(EVP_DigestUpdateBuffer(this.ctx, ptr(buf).ptr, buf.length) === 1) } finish () { const { hsize, digest, ctx } = this - assert(EVP_DigestFinal(ctx, digest, hsize) === 1) + assert(EVP_DigestFinal(ctx, digest.ptr, hsize.ptr) === 1) EVP_MD_CTX_reset(ctx) return digest } @@ -52,8 +49,8 @@ class Digest { hash (buf) { const { hasher, hsize, digest, ctx } = this assert(EVP_DigestInit_ex(ctx, hasher, 0) === 1) - assert(EVP_DigestUpdateBuffer(ctx, buf, buf.length) === 1) - assert(EVP_DigestFinal(ctx, digest, hsize) === 1) + assert(EVP_DigestUpdateBuffer(ctx, ptr(buf).ptr, buf.length) === 1) + assert(EVP_DigestFinal(ctx, digest.ptr, hsize.ptr) === 1) EVP_MD_CTX_reset(ctx) return digest } @@ -62,7 +59,7 @@ class Digest { const { hasher, hsize, digest, ctx } = this assert(EVP_DigestInit_ex(ctx, hasher, 0) === 1) assert(EVP_DigestUpdateString(ctx, str) === 1) - assert(EVP_DigestFinal(ctx, digest, hsize) === 1) + assert(EVP_DigestFinal(ctx, digest.ptr, hsize.ptr) === 1) EVP_MD_CTX_reset(ctx) return digest } @@ -71,16 +68,22 @@ class Digest { const { hasher, hsize, digest, ctx } = this assert(EVP_DigestInit_ex(ctx, hasher, 0) === 1) assert(EVP_DigestUpdate(ctx, c_str.ptr, c_str.size) === 1) - assert(EVP_DigestFinal(ctx, digest, hsize) === 1) + assert(EVP_DigestFinal(ctx, digest.ptr, hsize.ptr) === 1) EVP_MD_CTX_reset(ctx) return digest } hashonce (buf) { const { hasher, hsize, digest } = this - assert(EVP_Digest(buf, buf.length, digest, hsize, hasher, 0) === 1) + assert(EVP_Digest(ptr(buf).ptr, buf.length, digest.ptr, hsize.ptr, hasher, 0) === 1) return digest } } -export { Digest } +function hex_encode (digest) { + const hex_encoded = ptr(new Uint8Array(digest.length * 2)) + const size = encode.hex_encode(digest.ptr, digest.length, hex_encoded.ptr, hex_encoded.length) + return utf8_decode(hex_encoded.ptr, size) +} + +export { Digest, hex_encode } From 08da370c5dae473648d67ba68fe3a53550003753 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 03:49:04 +0000 Subject: [PATCH 25/33] chore: remove repl logo --- lib/repl.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/repl.js b/lib/repl.js index 1b79648..c8e8952 100644 --- a/lib/repl.js +++ b/lib/repl.js @@ -9,9 +9,10 @@ const { core, assert, version, handle_error, ptr, colors } = lo const { - write, arch, os, getchar + write, arch, os, getchar, read_file } = core +const decoder = new TextDecoder() let repl function logo () { @@ -91,7 +92,7 @@ if (os === 'win') { repl = async function () { const max_len = 65536 - logo() +// logo() info() const buffer = new Uint8Array(max_len) let n = 0 @@ -148,7 +149,7 @@ if (os === 'win') { globalThis.onUnhandledRejection = on_unhandled_rejection function info () { - console.log(` ${AG}lo${AD} ${lo.version.lo} ${control.column(26)}${AG}v8${AD} ${lo.version.v8} + console.log(` ${AG}lo${AD} ${lo.version.lo} ${control.column(26)}${AG}v8${AD} ${lo.version.v8} ${AM}arch${AD} ${lo.core.arch} ${control.column(26)}${AM}os${AD} ${lo.core.os} ${AY}boot${AD} ${boot_time} ms ${control.column(26)}${AY}rss${AD} ${proc.mem()} `) @@ -168,7 +169,7 @@ if (os === 'win') { repl = async function (ctx) { // cls(1) - logo() + // logo() info() let line globalThis.repl = ctx @@ -187,6 +188,10 @@ if (os === 'win') { cls(1) continue } + if (command === '.history') { + console.log(decoder.decode(read_file(history_path))) + continue + } if (command === '.info') { info() add(line) From 6c3cec304430cf5784ad914d7454149a4ac4b045 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 03:49:24 +0000 Subject: [PATCH 26/33] fix: sqlite fixes --- lib/sqlite.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/sqlite.js b/lib/sqlite.js index b63e041..a68fc2d 100644 --- a/lib/sqlite.js +++ b/lib/sqlite.js @@ -90,8 +90,8 @@ class Blob { } open (table, col, row, flags = BLOB_WRITABLE, database = 'main') { - const bh = new Uint32Array(2) - assert(sqlite.blob_open(this.#db, database, table, col, row, flags, bh) === 0) + const bh = ptr(new Uint32Array(2)) + assert(sqlite.blob_open(this.#db, database, table, col, row, flags, bh.ptr) === 0) this.#handle = addr(bh) return this } @@ -168,7 +168,7 @@ class Statement { } bindBlob (index = 0, u8) { - return bind_blob(this.stmt, index, u8, u8.length, 0) + return bind_blob(this.stmt, index, u8.ptr, u8.length, 0) } columnInt (index = 0) { From 083b3ec3b15bcbc5f9fde2312cc91f6db7fd0628 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 03:49:46 +0000 Subject: [PATCH 27/33] fix: tuntap fixes --- lib/tuntap.js | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/tuntap.js b/lib/tuntap.js index d11432f..f9d8cdc 100644 --- a/lib/tuntap.js +++ b/lib/tuntap.js @@ -6,9 +6,12 @@ const { IFF_TUN, IFF_TAP, IFF_NO_PI, IFF_UP, IFF_DOWN, SIOCSIFFLAGS, SIOCSIFADDR, SIOCSIFNETMASK, TUNSETIFF, TUNSETPERSIST, AF_INET, SOCK_DGRAM, O_NONBLOCK } = net.constants -const { assert, core } = lo +const { assert, core, ptr, load } = lo const { open, fcntl } = core const { strerror } = system +const { netlink } = load('netlink') + +const { set_address, device_up, device_down, RTM_NEWADDR, RTM_DELADDR } = netlink const O_RDWR = 2 @@ -17,11 +20,11 @@ const encoder = new TextEncoder() // todo: create /dev/net/tun if it doesn't exist function device_ctrl (fd, iff, type = IFF_TAP | IFF_NO_PI, flags = TUNSETIFF) { - const ifreq = new Uint8Array(40) + const ifreq = ptr(new Uint8Array(40)) encoder.encodeInto(iff.slice(0, 16), ifreq) ifreq[16] = type & 0xff ifreq[17] = (type >> 8) & 0xff - return ioctl(fd, flags, ifreq) + return ioctl(fd, flags, ifreq.ptr) } class Device { @@ -57,23 +60,27 @@ class Device { } setAddress (addr, cidr) { + netlink.set_address(RTM_NEWADDR, this.#iff, addr, cidr) + } + + setAddress2 (addr, cidr) { const iff = this.#iff const fd = this.#fd - const ifreq = new Uint8Array(40) + const ifreq = ptr(new Uint8Array(40)) const dv = new DataView(ifreq.buffer) ifreq.fill(0) encoder.encodeInto(iff.slice(0, 16), ifreq) ifreq[16] = AF_INET & 0xff ifreq[17] = (AF_INET >> 8) & 0xff dv.setUint32(20, inet_aton(addr)) - assert(ioctl(fd, SIOCSIFADDR, ifreq) === 0, strerror) + assert(ioctl(fd, SIOCSIFADDR, ifreq.ptr) === 0, strerror) ifreq.fill(0) encoder.encodeInto(iff.slice(0, 16), ifreq) ifreq[16] = AF_INET & 0xff ifreq[17] = (AF_INET >> 8) & 0xff let netmask = 0xffffffff - (0xffffffff >>> cidr) dv.setUint32(20, netmask) - assert(ioctl(fd, SIOCSIFNETMASK, ifreq) === 0, strerror) + assert(ioctl(fd, SIOCSIFNETMASK, ifreq.ptr) === 0, strerror) } up () { @@ -84,6 +91,11 @@ class Device { assert(device_ctrl(this.#fd, this.#iff, IFF_DOWN, SIOCSIFFLAGS) === 0, strerror) } + close () { + close(this.#fd) + close(this.#dev) + } + } export { Device } From 4d415501026fbd1d738dcfa960a7682e2508793a Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 04:02:49 +0000 Subject: [PATCH 28/33] chore: assembler improvements --- lib/asm/arm64.js | 8 +++++ lib/asm/x64.js | 76 ++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/lib/asm/arm64.js b/lib/asm/arm64.js index 38b0a53..637a31b 100644 --- a/lib/asm/arm64.js +++ b/lib/asm/arm64.js @@ -781,6 +781,14 @@ class Assembler { return new Uint8Array(this.#codes.flat()) } + get size () { + let len = 0 + for (const code of this.#codes) { + len += code.length + } + return len + } + get src () { const { codes, instr } = this return instr.map((v, i) => [`# ${codes[i].reverse().map(v => '0x' + v.toString(16))}`, v]).flat().join('\n') + '\n' diff --git a/lib/asm/x64.js b/lib/asm/x64.js index ca985cc..12c5f50 100644 --- a/lib/asm/x64.js +++ b/lib/asm/x64.js @@ -105,6 +105,9 @@ const op_cmp = 0x3d const op_je8 = 0x74 const op_je32 = [0x0f, 0x84] +const op_jne8 = 0x75 +const op_jne32 = [0x0f, 0x85] + const op_jmp8 = 0xeb const op_jmp32 = 0xe9 @@ -247,6 +250,15 @@ class Assembler { return this } + test (rega, regb) { + this.#instr.push(`test %${rega}, %${regb}`) + if (rega === 'rax' && regb === 'rax') { + //this.#codes.push([0x48, 0x85, 0xc0]) + this.#codes.push([0x85, 0xc0]) + } + return this + } + // url: https://www.felixcloutier.com/x86/push // OpCode: 50 +rd // Instruction: PUSH r64 @@ -305,6 +317,16 @@ class Assembler { return this } + callr (address) { + // OpCode: E8 cd + // Instruction: call rel32 + // Op/En: D + // 1: 32 bit offset + this.#instr.push(`call ${address}`) + this.#codes.push([0xe8, ...as_four_bytes(address)]) + return this + } + // url: https://www.felixcloutier.com/x86/jmp jmp (address, reg = 'rax') { // OpCode: FF /4 @@ -315,13 +337,6 @@ class Assembler { return this } - // url: https://www.felixcloutier.com/x86/jmp - jmpl (label, reg = 'rax') { - this.#instr.push(`jmp :${label}`) - this.#codes.push([]) - return this - } - // url: https://www.felixcloutier.com/x86/mov movabs (address, reg) { // OpCode: REX.W + B8+ rd io @@ -380,12 +395,25 @@ class Assembler { return this } + // url: https://www.felixcloutier.com/x86/jmp + jmpl (label, reg = 'rax') { + this.#instr.push(`jmp :${label}`) + this.#codes.push([]) + return this + } + jel (label) { this.#instr.push(`jel :${label}`) this.#codes.push([]) return this } + jne (label) { + this.#instr.push(`jne :${label}`) + this.#codes.push([]) + return this + } + label (name) { const end = this.#codes.flat().length let start = 0 @@ -400,7 +428,15 @@ class Assembler { } else { this.#codes[i] = [...op_je32, ...as_four_bytes(distance)] } - this.#instr[i] = `je :${distance}` + this.#instr[i] = `jel ${distance}` + } else if (instr === `jne :${name}`) { + const distance = end - start + if (distance < pow8) { + this.#codes[i] = [op_jne8, distance] + } else { + this.#codes[i] = [...op_jne32, ...as_four_bytes(distance)] + } + this.#instr[i] = `jne ${distance}` } else if (instr === `jmp :${name}`) { const distance = end - start if (distance < pow8) { @@ -408,7 +444,7 @@ class Assembler { } else { this.#codes[i] = [op_jmp32, ...as_four_bytes(distance)] } - this.#instr[i] = `jmp :${distance}` + this.#instr[i] = `jmp ${distance}` } } return this @@ -499,6 +535,20 @@ class Assembler { return this } + nop () { + this.#instr.push('nop') + this.#codes.push([0x90]) + return this + } + + pad () { + const extra = this.size % 16 + if (extra) { + let padding = 16 - extra + while (padding--) this.nop() + } + } + syscall () { this.#instr.push('syscall') this.#codes.push([0x0f, 0x05]) @@ -515,6 +565,14 @@ class Assembler { return new Uint8Array(this.#codes.flat()) } + get size () { + let len = 0 + for (const code of this.#codes) { + len += code.length + } + return len + } + get src () { const { codes, instr } = this return instr.map((v, i) => [`# ${codes[i].map(v => '0x' + v.toString(16))}`, v]).flat().join('\n') + '\n' From 109b95f0c043a6dd412a584108f862030999d1d0 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 04:03:08 +0000 Subject: [PATCH 29/33] fix: don't leak memory in compiler --- lib/asm/compiler.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/asm/compiler.js b/lib/asm/compiler.js index 765274f..a66249b 100644 --- a/lib/asm/compiler.js +++ b/lib/asm/compiler.js @@ -1,7 +1,7 @@ const { assert, addr, ptr, core } = lo const { - mprotect, memcpy, mmap, + mprotect, memcpy, mmap, aligned_alloc, PROT_READ, MAP_PRIVATE, PROT_WRITE, PROT_EXEC, MAP_ANONYMOUS } = core @@ -27,8 +27,13 @@ class Compiler { const address = mmap(0, code.length, PROT_WRITE, flags, -1, u32) assert(address) - assert(memcpy(address, code.ptr, code.length) === address) - assert(mprotect(address, code.length, PROT_EXEC | PROT_READ) === 0) + try { + assert(memcpy(address, code.ptr, code.length) === address) + assert(mprotect(address, code.length, PROT_EXEC | PROT_READ) === 0) + } catch (err) { + munmap(address) + throw err + } return address } } From 829058a3b706b50202e546031eb75f186ba78f0c Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 04:03:35 +0000 Subject: [PATCH 30/33] chore: update boringssl --- lib/boringssl/api.js | 4 ++-- lib/boringssl/build.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/boringssl/api.js b/lib/boringssl/api.js index 1177aea..8941d1c 100644 --- a/lib/boringssl/api.js +++ b/lib/boringssl/api.js @@ -582,8 +582,8 @@ const includes = [ const libs = [] const obj = [ - 'deps/boringssl/build/ssl/libssl.a', - 'deps/boringssl/build/crypto/libcrypto.a' + 'deps/boringssl/build/libssl.a', + 'deps/boringssl/build/libcrypto.a' ] const include_paths = ['./deps/boringssl/include'] const lib_paths = [] diff --git a/lib/boringssl/build.js b/lib/boringssl/build.js index 17aca61..0bac95e 100644 --- a/lib/boringssl/build.js +++ b/lib/boringssl/build.js @@ -15,7 +15,7 @@ async function build () { assert(chdir('deps') === 0) if (!isFile('boringssl.tar.gz')) { console.log('fetching release') - fetch('https://codeload.github.com/google/boringssl/tar.gz/master', + fetch('https://codeload.github.com/google/boringssl/tar.gz/main', 'boringssl.tar.gz') } const bytes = readFile('boringssl.tar.gz') From 86c0f5053c4ec749422fb1c336bd636b8b1dbb68 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 04:03:58 +0000 Subject: [PATCH 31/33] chore: add some syscalls to core --- lib/core/api.js | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/lib/core/api.js b/lib/core/api.js index ebdf5fb..50c14cb 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -293,6 +293,22 @@ const api = { parameters: [], result: 'i32' }, + getsid: { + parameters: ['i32'], + result: 'i32' + }, + setsid: { + parameters: [], + result: 'i32' + }, + getpgrp: { + parameters: [], + result: 'i32' + }, + setpgid: { + parameters: ['i32', 'i32'], + result: 'i32' + }, fork: { parameters: [], result: 'i32' @@ -734,8 +750,9 @@ const constants = { S_IFBLK: 'i32', S_IFCHR: 'i32', S_IFIFO: 'i32', S_IRUSR: 'i32', S_IWUSR: 'i32', S_IRGRP: 'i32', S_IWGRP: 'i32', S_IROTH: 'i32', S_IWOTH: 'i32', O_RDONLY: 'i32', O_WRONLY: 'i32', - O_CREAT: 'i32', S_IRWXU: 'i32', S_IRWXG: 'i32', S_IXOTH: 'i32', - O_TRUNC: 'i32', STDIN: 0, STDOUT: 1, STDERR: 2, O_CLOEXEC: 'i32', + O_CREAT: 'i32', S_IXOTH: 'i32', + S_IXUSR: 'i32', S_IXGRP: 'i32', S_IRWXU: 'i32', S_IRWXG: 'i32', + O_TRUNC: 'i32', STDIN: 0, STDOUT: 1, STDERR: 2, O_CLOEXEC: 'i32', RUSAGE_SELF: 'i32', SEEK_SET: 'i32', SEEK_CUR: 'i32', SEEK_END: 'i32', S_IRWXO: 'i32', F_OK: 'i32', S_IFMT: 'i32', S_IFDIR: 'i32', S_IFREG: 'i32', NAME_MAX: 'u32', O_RDWR: 'i32', O_SYNC: 'i32', @@ -760,7 +777,7 @@ const constants = { DT_UNKNOWN: 'i32', } -const structs = ['clock_t', 'fastcall'] +const structs = ['clock_t', 'fastcall', 'struct stat', 'struct timespec', 'dev_t', 'ino_t', 'mode_t', 'nlink_t', 'uid_t', 'gid_t', 'off_t', 'blksize_t', 'blkcnt_t'] // list of headers to include const includes = [ @@ -801,9 +818,15 @@ const linux = { 'linux/reboot.h', 'sys/ioctl.h', 'dirent.h', - 'sched.h' + 'sched.h', + 'sys/sysmacros.h' ], api: { + makedev: { + parameters: ['u32', 'u32'], + result: 'u32', + name: 'gnu_dev_makedev' + }, posix_fadvise: { parameters: ['i32', 'u32', 'u32', 'i32'], result: 'i32' From cd96fc0dcb2bb65e8bf52f5959787febc8963c76 Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 04:04:12 +0000 Subject: [PATCH 32/33] chore: add some syscalls to core --- lib/core/core.cc | 133 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 132 insertions(+), 1 deletion(-) diff --git a/lib/core/core.cc b/lib/core/core.cc index 8a08935..a7552d9 100644 --- a/lib/core/core.cc +++ b/lib/core/core.cc @@ -35,6 +35,7 @@ #include #include #include +#include #endif @@ -947,6 +948,43 @@ CTypeInfo rcgetpid = CTypeInfo(CTypeInfo::Type::kInt32); CFunctionInfo infogetpid = CFunctionInfo(rcgetpid, 1, cargsgetpid); CFunction pFgetpid = CFunction((const void*)&getpidFast, &infogetpid); +int32_t getsidFast(void* p, int32_t p0); +CTypeInfo cargsgetsid[2] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcgetsid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetsid = CFunctionInfo(rcgetsid, 2, cargsgetsid); +CFunction pFgetsid = CFunction((const void*)&getsidFast, &infogetsid); + +int32_t setsidFast(void* p); +CTypeInfo cargssetsid[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcsetsid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infosetsid = CFunctionInfo(rcsetsid, 1, cargssetsid); +CFunction pFsetsid = CFunction((const void*)&setsidFast, &infosetsid); + +int32_t getpgrpFast(void* p); +CTypeInfo cargsgetpgrp[1] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + +}; +CTypeInfo rcgetpgrp = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infogetpgrp = CFunctionInfo(rcgetpgrp, 1, cargsgetpgrp); +CFunction pFgetpgrp = CFunction((const void*)&getpgrpFast, &infogetpgrp); + +int32_t setpgidFast(void* p, int32_t p0, int32_t p1); +CTypeInfo cargssetpgid[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kInt32), + CTypeInfo(CTypeInfo::Type::kInt32), +}; +CTypeInfo rcsetpgid = CTypeInfo(CTypeInfo::Type::kInt32); +CFunctionInfo infosetpgid = CFunctionInfo(rcsetpgid, 3, cargssetpgid); +CFunction pFsetpgid = CFunction((const void*)&setpgidFast, &infosetpgid); + int32_t forkFast(void* p); CTypeInfo cargsfork[1] = { CTypeInfo(CTypeInfo::Type::kV8Value), @@ -1136,6 +1174,16 @@ CFunction pFsync = CFunction((const void*)&syncFast, &infosync); #ifdef __linux__ +uint32_t makedevFast(void* p, uint32_t p0, uint32_t p1); +CTypeInfo cargsmakedev[3] = { + CTypeInfo(CTypeInfo::Type::kV8Value), + CTypeInfo(CTypeInfo::Type::kUint32), + CTypeInfo(CTypeInfo::Type::kUint32), +}; +CTypeInfo rcmakedev = CTypeInfo(CTypeInfo::Type::kUint32); +CFunctionInfo infomakedev = CFunctionInfo(rcmakedev, 3, cargsmakedev); +CFunction pFmakedev = CFunction((const void*)&makedevFast, &infomakedev); + int32_t posix_fadviseFast(void* p, int32_t p0, uint32_t p1, uint32_t p2, int32_t p3); CTypeInfo cargsposix_fadvise[5] = { CTypeInfo(CTypeInfo::Type::kV8Value), @@ -2052,6 +2100,48 @@ int32_t getpidFast(void* p) { return getpid(); } +void getsidSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t rc = getsid(v0); + args.GetReturnValue().Set(rc); +} + +int32_t getsidFast(void* p, int32_t p0) { + int32_t v0 = p0; + return getsid(v0); +} +void setsidSlow(const FunctionCallbackInfo &args) { + + int32_t rc = setsid(); + args.GetReturnValue().Set(rc); +} + +int32_t setsidFast(void* p) { + + return setsid(); +} +void getpgrpSlow(const FunctionCallbackInfo &args) { + + int32_t rc = getpgrp(); + args.GetReturnValue().Set(rc); +} + +int32_t getpgrpFast(void* p) { + + return getpgrp(); +} +void setpgidSlow(const FunctionCallbackInfo &args) { + int32_t v0 = Local::Cast(args[0])->Value(); + int32_t v1 = Local::Cast(args[1])->Value(); + int32_t rc = setpgid(v0, v1); + args.GetReturnValue().Set(rc); +} + +int32_t setpgidFast(void* p, int32_t p0, int32_t p1) { + int32_t v0 = p0; + int32_t v1 = p1; + return setpgid(v0, v1); +} void forkSlow(const FunctionCallbackInfo &args) { int32_t rc = fork(); @@ -2332,6 +2422,18 @@ void syncFast(void* p) { } #ifdef __linux__ +void makedevSlow(const FunctionCallbackInfo &args) { + uint32_t v0 = Local::Cast(args[0])->Value(); + uint32_t v1 = Local::Cast(args[1])->Value(); + uint32_t rc = gnu_dev_makedev(v0, v1); + args.GetReturnValue().Set(rc); +} + +uint32_t makedevFast(void* p, uint32_t p0, uint32_t p1) { + uint32_t v0 = p0; + uint32_t v1 = p1; + return gnu_dev_makedev(v0, v1); +} void posix_fadviseSlow(const FunctionCallbackInfo &args) { int32_t v0 = Local::Cast(args[0])->Value(); uint32_t v1 = Local::Cast(args[1])->Value(); @@ -2603,6 +2705,10 @@ void Init(Isolate* isolate, Local target) { SET_FAST_METHOD(isolate, module, "dup2", &pFdup2, dup2Slow); SET_FAST_METHOD(isolate, module, "getcwd", &pFgetcwd, getcwdSlow); SET_FAST_METHOD(isolate, module, "getpid", &pFgetpid, getpidSlow); + SET_FAST_METHOD(isolate, module, "getsid", &pFgetsid, getsidSlow); + SET_FAST_METHOD(isolate, module, "setsid", &pFsetsid, setsidSlow); + SET_FAST_METHOD(isolate, module, "getpgrp", &pFgetpgrp, getpgrpSlow); + SET_FAST_METHOD(isolate, module, "setpgid", &pFsetpgid, setpgidSlow); SET_FAST_METHOD(isolate, module, "fork", &pFfork, forkSlow); SET_FAST_METHOD(isolate, module, "kill", &pFkill, killSlow); SET_FAST_METHOD(isolate, module, "waitpid", &pFwaitpid, waitpidSlow); @@ -2628,6 +2734,7 @@ void Init(Isolate* isolate, Local target) { SET_FAST_METHOD(isolate, module, "sync", &pFsync, syncSlow); #ifdef __linux__ + SET_FAST_METHOD(isolate, module, "makedev", &pFmakedev, makedevSlow); SET_FAST_METHOD(isolate, module, "posix_fadvise", &pFposix_fadvise, posix_fadviseSlow); SET_FAST_METHOD(isolate, module, "ioctl", &pFioctl, ioctlSlow); SET_FAST_METHOD(isolate, module, "ioctl2", &pFioctl2, ioctl2Slow); @@ -2660,9 +2767,11 @@ void Init(Isolate* isolate, Local target) { SET_VALUE(isolate, module, "O_RDONLY", Integer::New(isolate, (int32_t)O_RDONLY)); SET_VALUE(isolate, module, "O_WRONLY", Integer::New(isolate, (int32_t)O_WRONLY)); SET_VALUE(isolate, module, "O_CREAT", Integer::New(isolate, (int32_t)O_CREAT)); + SET_VALUE(isolate, module, "S_IXOTH", Integer::New(isolate, (int32_t)S_IXOTH)); + SET_VALUE(isolate, module, "S_IXUSR", Integer::New(isolate, (int32_t)S_IXUSR)); + SET_VALUE(isolate, module, "S_IXGRP", Integer::New(isolate, (int32_t)S_IXGRP)); SET_VALUE(isolate, module, "S_IRWXU", Integer::New(isolate, (int32_t)S_IRWXU)); SET_VALUE(isolate, module, "S_IRWXG", Integer::New(isolate, (int32_t)S_IRWXG)); - SET_VALUE(isolate, module, "S_IXOTH", Integer::New(isolate, (int32_t)S_IXOTH)); SET_VALUE(isolate, module, "O_TRUNC", Integer::New(isolate, (int32_t)O_TRUNC)); SET_VALUE(isolate, module, "STDIN", Number::New(isolate, (int64_t)0)); SET_VALUE(isolate, module, "STDOUT", Number::New(isolate, (int64_t)1)); @@ -2744,11 +2853,33 @@ void Init(Isolate* isolate, Local target) { #ifdef __MACH__ SET_VALUE(isolate, module, "struct_clock_t_size", Integer::New(isolate, sizeof(clock_t))); SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + SET_VALUE(isolate, module, "struct_struct_stat_size", Integer::New(isolate, sizeof(struct stat))); + SET_VALUE(isolate, module, "struct_struct_timespec_size", Integer::New(isolate, sizeof(struct timespec))); + SET_VALUE(isolate, module, "struct_dev_t_size", Integer::New(isolate, sizeof(dev_t))); + SET_VALUE(isolate, module, "struct_ino_t_size", Integer::New(isolate, sizeof(ino_t))); + SET_VALUE(isolate, module, "struct_mode_t_size", Integer::New(isolate, sizeof(mode_t))); + SET_VALUE(isolate, module, "struct_nlink_t_size", Integer::New(isolate, sizeof(nlink_t))); + SET_VALUE(isolate, module, "struct_uid_t_size", Integer::New(isolate, sizeof(uid_t))); + SET_VALUE(isolate, module, "struct_gid_t_size", Integer::New(isolate, sizeof(gid_t))); + SET_VALUE(isolate, module, "struct_off_t_size", Integer::New(isolate, sizeof(off_t))); + SET_VALUE(isolate, module, "struct_blksize_t_size", Integer::New(isolate, sizeof(blksize_t))); + SET_VALUE(isolate, module, "struct_blkcnt_t_size", Integer::New(isolate, sizeof(blkcnt_t))); #endif #ifdef __linux__ SET_VALUE(isolate, module, "struct_clock_t_size", Integer::New(isolate, sizeof(clock_t))); SET_VALUE(isolate, module, "struct_fastcall_size", Integer::New(isolate, sizeof(fastcall))); + SET_VALUE(isolate, module, "struct_struct_stat_size", Integer::New(isolate, sizeof(struct stat))); + SET_VALUE(isolate, module, "struct_struct_timespec_size", Integer::New(isolate, sizeof(struct timespec))); + SET_VALUE(isolate, module, "struct_dev_t_size", Integer::New(isolate, sizeof(dev_t))); + SET_VALUE(isolate, module, "struct_ino_t_size", Integer::New(isolate, sizeof(ino_t))); + SET_VALUE(isolate, module, "struct_mode_t_size", Integer::New(isolate, sizeof(mode_t))); + SET_VALUE(isolate, module, "struct_nlink_t_size", Integer::New(isolate, sizeof(nlink_t))); + SET_VALUE(isolate, module, "struct_uid_t_size", Integer::New(isolate, sizeof(uid_t))); + SET_VALUE(isolate, module, "struct_gid_t_size", Integer::New(isolate, sizeof(gid_t))); + SET_VALUE(isolate, module, "struct_off_t_size", Integer::New(isolate, sizeof(off_t))); + SET_VALUE(isolate, module, "struct_blksize_t_size", Integer::New(isolate, sizeof(blksize_t))); + SET_VALUE(isolate, module, "struct_blkcnt_t_size", Integer::New(isolate, sizeof(blkcnt_t))); SET_VALUE(isolate, module, "struct_cpu_set_t_size", Integer::New(isolate, sizeof(cpu_set_t))); #endif From 608f967a5f54bee52272b155632c16014ef9f5ef Mon Sep 17 00:00:00 2001 From: Andrew Johnston Date: Sat, 31 Jan 2026 04:04:32 +0000 Subject: [PATCH 33/33] fix: sqlite - use pointers --- lib/sqlite/api.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/sqlite/api.js b/lib/sqlite/api.js index 374f772..ccd160c 100644 --- a/lib/sqlite/api.js +++ b/lib/sqlite/api.js @@ -8,25 +8,25 @@ const api = { }, open: { name: 'sqlite3_open', - parameters: ['pointer', 'u32array'], + parameters: ['pointer', 'pointer'], pointers: ['const char*', 'sqlite3 **'], result: 'i32' }, open2: { name: 'sqlite3_open_v2', - parameters: ['string', 'u32array', 'i32', 'pointer'], + parameters: ['string', 'pointer', 'i32', 'pointer'], pointers: ['const char*', 'sqlite3 **', , 'const char*'], result: 'i32' }, exec: { name: 'sqlite3_exec', - parameters: ['pointer', 'string', 'pointer', 'pointer', 'u32array'], + parameters: ['pointer', 'string', 'pointer', 'pointer', 'pointer'], pointers: ['sqlite3*', 'const char*', 'callback',, 'char**'], result: 'i32' }, exec2: { name: 'sqlite3_exec', - parameters: ['pointer', 'string', 'pointer', 'pointer', 'u32array'], + parameters: ['pointer', 'string', 'pointer', 'pointer', 'pointer'], pointers: ['sqlite3*', 'const char*', 'callback',, 'char**'], result: 'i32', nofast: true @@ -59,7 +59,7 @@ const api = { }, prepare2: { name: 'sqlite3_prepare_v2', - parameters: ['pointer', 'string', 'i32', 'u32array', 'pointer'], + parameters: ['pointer', 'string', 'i32', 'pointer', 'pointer'], pointers: ['sqlite3*', 'const char*', ,'sqlite3_stmt **', 'const char**'], result: 'i32' }, @@ -128,7 +128,7 @@ const api = { }, bind_blob: { name: 'sqlite3_bind_blob', - parameters: ['pointer', 'i32', 'buffer', 'i32', 'u64'], + parameters: ['pointer', 'i32', 'pointer', 'i32', 'u64'], casts: [, , , , '(sqlite3_destructor_type)'], pointers: ['sqlite3_stmt*', , 'const void*'], result: 'i32' @@ -167,7 +167,7 @@ const api = { }, blob_open: { name: 'sqlite3_blob_open', - parameters: ['pointer', 'string', 'string', 'string', 'i64', 'i32', 'u32array'], + parameters: ['pointer', 'string', 'string', 'string', 'i64', 'i32', 'pointer'], pointers: ['sqlite3*', , , , , , 'sqlite3_blob**'], result: 'i32' }, @@ -179,7 +179,7 @@ const api = { }, blob_read: { name: 'sqlite3_blob_read', - parameters: ['pointer', 'buffer', 'i32', 'i32'], + parameters: ['pointer', 'pointer', 'i32', 'i32'], pointers: ['sqlite3_blob*'], result: 'i32' }, @@ -191,20 +191,20 @@ const api = { }, blob_write: { name: 'sqlite3_blob_write', - parameters: ['pointer', 'buffer', 'i32', 'i32'], + parameters: ['pointer', 'pointer', 'i32', 'i32'], pointers: ['sqlite3_blob*'], result: 'i32' }, serialize: { name: 'sqlite3_serialize', - parameters: ['pointer', 'string', 'u32array', 'u32'], + parameters: ['pointer', 'string', 'pointer', 'u32'], pointers: ['sqlite3*', , 'sqlite3_int64*'], result: 'pointer', rpointer: 'unsigned char*' }, deserialize: { name: 'sqlite3_deserialize', - parameters: ['pointer', 'string', 'buffer', 'u32', 'u32', 'u32'], + parameters: ['pointer', 'string', 'pointer', 'u32', 'u32', 'u32'], pointers: ['sqlite3*', , 'unsigned char*'], result: 'i32' }, @@ -252,7 +252,7 @@ const obj = ['deps/sqlite/libsqlite3.a'] const constants = { SQLITE_OPEN_READWRITE: 'i32', SQLITE_OPEN_PRIVATECACHE: 'i32', SQLITE_ROW: 'i32', SQLITE_OPEN_NOMUTEX: 'i32', SQLITE_OPEN_CREATE: 'i32', - SQLITE_OK: 'i32', SQLITE_OPEN_READONLY: 'i32' + SQLITE_OK: 'i32', SQLITE_OPEN_READONLY: 'i32', SQLITE_DONE: 'i32' } const include_paths = ['deps/sqlite']