From dd38a30d224d05bb9cfab28f6024db8cc51acffd Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Sun, 19 Jul 2026 11:05:12 +0200 Subject: [PATCH 01/50] New Platform functions and maybe missed CpuID wrapper function? --- .../platform/user/code/platform-lib-calls.c | 24 +++++++++++++++++++ .../platform/user/header/platform-lib-calls.h | 9 +++++++ hyperdbg/libhyperdbg/code/common/common.cpp | 9 +++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/hyperdbg/include/platform/user/code/platform-lib-calls.c b/hyperdbg/include/platform/user/code/platform-lib-calls.c index 8564d966..f914027c 100644 --- a/hyperdbg/include/platform/user/code/platform-lib-calls.c +++ b/hyperdbg/include/platform/user/code/platform-lib-calls.c @@ -19,6 +19,7 @@ # include # include # include +# include # include #endif // defined(__linux__) @@ -231,6 +232,29 @@ PlatformStrCpy(char * Dest, SIZE_T DestSize, const char * Src) #endif } +/** + * @brief Platform independent wrapper for _stricmp + * + * @details Compares two strings ignoring case. Returns 0 when equal; a value + * less/greater than zero otherwise. Linux uses strcasecmp, which has the same + * semantics as the Win32 CRT's _stricmp. + * + * @param Str1 first string + * @param Str2 second string + * @return INT 0 if equal (case-insensitively), non-zero otherwise + */ +INT +PlatformStrCaseCmp(const char * Str1, const char * Str2) +{ +#if defined(_WIN32) + return _stricmp(Str1, Str2); +#elif defined(__linux__) + return strcasecmp(Str1, Str2); +#else +# error "Unsupported platform" +#endif +} + /** * @brief Platform independent wrapper for Sleep / usleep * diff --git a/hyperdbg/include/platform/user/header/platform-lib-calls.h b/hyperdbg/include/platform/user/header/platform-lib-calls.h index 83ea3701..903c169a 100644 --- a/hyperdbg/include/platform/user/header/platform-lib-calls.h +++ b/hyperdbg/include/platform/user/header/platform-lib-calls.h @@ -64,6 +64,15 @@ PlatformStrnlen(const char * Str, SIZE_T MaxLength); INT PlatformStrCpy(char * Dest, SIZE_T DestSize, const char * Src); +// +// CASE-INSENSITIVE STRING COMPARE +// +// Mirrors _stricmp: returns 0 when the strings are equal ignoring case, and a +// negative/positive value otherwise. Linux uses strcasecmp (same semantics). +// +INT +PlatformStrCaseCmp(const char * Str1, const char * Str2); + // // SLEEP (milliseconds) // diff --git a/hyperdbg/libhyperdbg/code/common/common.cpp b/hyperdbg/libhyperdbg/code/common/common.cpp index 2f494eab..b973b53a 100644 --- a/hyperdbg/libhyperdbg/code/common/common.cpp +++ b/hyperdbg/libhyperdbg/code/common/common.cpp @@ -11,6 +11,11 @@ */ #include "pch.h" +#ifdef __linux__ +# include // struct stat / stat() for IsFileExistA +# include // Intel TSX RTM intrinsics (_xbegin/_xend); requires -mrtm +#endif + // // Global Variables // @@ -510,7 +515,7 @@ CompareLowerCaseStrings(CommandToken TargetToken, const CHAR * StringToCompare) // // Convert the token value to 64 bit unsigned integer // - return _stricmp(TargetTokenValue.c_str(), StringToCompare) == 0; + return PlatformStrCaseCmp(TargetTokenValue.c_str(), StringToCompare) == 0; } /** @@ -920,7 +925,7 @@ ConvertStringVectorToCharPointerArray(const std::string & s) VOID CommonCpuidInstruction(UINT32 Func, UINT32 SubFunc, INT * CpuInfo) { - CpuIdEx(CpuInfo, Func, SubFunc); + CpuCpuIdEx(CpuInfo, Func, SubFunc); } /** From 860f736bd21a274930420a12ed7eac970732717a Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Sun, 19 Jul 2026 11:11:09 +0200 Subject: [PATCH 02/50] Added guards and compilation flag in cmake --- hyperdbg/libhyperdbg/CMakeLists.txt | 10 +++++ hyperdbg/libhyperdbg/code/common/common.cpp | 42 +++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/hyperdbg/libhyperdbg/CMakeLists.txt b/hyperdbg/libhyperdbg/CMakeLists.txt index 92c6c90a..26bbc5ff 100644 --- a/hyperdbg/libhyperdbg/CMakeLists.txt +++ b/hyperdbg/libhyperdbg/CMakeLists.txt @@ -196,3 +196,13 @@ if(UNIX) endif() add_library(libhyperdbg SHARED ${SourceFiles}) + +if(UNIX) + # + # Enable the Intel TSX/RTM intrinsics (_xbegin/_xend/_XBEGIN_STARTED) used by + # CheckAddressValidityUsingTsx() in common.cpp. GCC gates these behind -mrtm. + # Harmless when unused: no RTM instructions are emitted unless the intrinsics + # are actually called. + # + target_compile_options(libhyperdbg PRIVATE -mrtm) +endif() diff --git a/hyperdbg/libhyperdbg/code/common/common.cpp b/hyperdbg/libhyperdbg/code/common/common.cpp index b973b53a..c21f68d1 100644 --- a/hyperdbg/libhyperdbg/code/common/common.cpp +++ b/hyperdbg/libhyperdbg/code/common/common.cpp @@ -650,6 +650,7 @@ SetPrivilege(HANDLE Token, // access token handle BOOL EnablePrivilege // to enable or disable privilege ) { +#ifdef _WIN32 TOKEN_PRIVILEGES Tp; LUID Luid; @@ -685,6 +686,16 @@ SetPrivilege(HANDLE Token, // access token handle } return TRUE; +#else + // + // TODO(Linux): no Windows access-token/privilege model. This helper has no + // Linux callers today; wire to capabilities (e.g. CAP_SYS_ADMIN) if needed. + // + UNREFERENCED_PARAMETER(Token); + UNREFERENCED_PARAMETER(Privilege); + UNREFERENCED_PARAMETER(EnablePrivilege); + return FALSE; +#endif } /** @@ -757,8 +768,17 @@ IsFileExistA(const CHAR * FileName) BOOLEAN IsFileExistW(const WCHAR * FileName) { +#ifdef _WIN32 struct _stat64i32 buffer; return (_wstat(FileName, &buffer) == 0); +#else + // + // TODO(Linux): blocked on the wide-char (2-byte WCHAR -> UTF-8) conversion + // work; once available, convert FileName and delegate to IsFileExistA. + // + UNREFERENCED_PARAMETER(FileName); + return FALSE; +#endif } /** @@ -796,6 +816,7 @@ IsEmptyString(CHAR * Text) VOID GetConfigFilePath(PWCHAR ConfigPath) { +#ifdef _WIN32 WCHAR CurrentPath[MAX_PATH] = {0}; // @@ -812,6 +833,17 @@ GetConfigFilePath(PWCHAR ConfigPath) // Combine current exe path with config file name // PathCombineW(ConfigPath, CurrentPath, CONFIG_FILE_NAME); +#else + // + // TODO(Linux): resolve the executable's directory via readlink("/proc/self/exe") + // and append CONFIG_FILE_NAME. Blocked on the wide-char (2-byte WCHAR) work + // since ConfigPath is a PWCHAR. For now leave the path empty. + // + if (ConfigPath != NULL) + { + ConfigPath[0] = 0; + } +#endif } /** @@ -824,6 +856,7 @@ GetConfigFilePath(PWCHAR ConfigPath) std::vector ListDirectory(const std::string & Directory, const std::string & Extension) { +#ifdef _WIN32 WIN32_FIND_DATAA FindData; HANDLE Find = INVALID_HANDLE_VALUE; std::string FullPath = Directory + "\\" + Extension; @@ -842,6 +875,15 @@ ListDirectory(const std::string & Directory, const std::string & Extension) FindClose(Find); return DirList; +#else + // + // TODO(Linux): reimplement with opendir/readdir + fnmatch(Extension) over + // Directory. Only caller today is the script-engine test harness (eval.cpp). + // + UNREFERENCED_PARAMETER(Directory); + UNREFERENCED_PARAMETER(Extension); + return std::vector(); +#endif } /** From b8a4417709e0273813d85fd476b94b132c50db5a Mon Sep 17 00:00:00 2001 From: Nikzad Date: Sun, 19 Jul 2026 18:09:33 +0330 Subject: [PATCH 03/50] core: add CPUID command definitions and data structures- Add DEBUGGER_CPUID_REQUEST_RESPONSE structure - Add ucpuid command to commands.h and help.h - Add IOCTL definitions for CPUID - Use macros for CPUID leaf decoding - Update Connection.h with new packet types --- hyperdbg/hyperkd/header/common/Common.h | 3 ++ .../debugger/commands/DebuggerCommands.h | 3 ++ hyperdbg/include/SDK/headers/Connection.h | 2 ++ hyperdbg/include/SDK/headers/Ioctls.h | 7 ++++ .../include/SDK/headers/RequestStructures.h | 35 +++++++++++++++++++ .../header/debugger/commands/commands.h | 6 ++++ .../header/debugger/commands/help.h | 3 ++ .../header/debugger/core/debugger.h | 4 +++ .../header/debugger/kernel-level/kd.h | 3 ++ 9 files changed, 66 insertions(+) diff --git a/hyperdbg/hyperkd/header/common/Common.h b/hyperdbg/hyperkd/header/common/Common.h index 3a7325c9..215394f5 100644 --- a/hyperdbg/hyperkd/header/common/Common.h +++ b/hyperdbg/hyperkd/header/common/Common.h @@ -101,3 +101,6 @@ CommonKillProcess(UINT32 ProcessId, PROCESS_KILL_METHODS KillingMethod); BOOLEAN CommonValidateCoreNumber(UINT32 CoreNumber); + +VOID +CommonCpuidInstruction(UINT32 Func, UINT32 SubFunc, INT * CpuInfo); \ No newline at end of file diff --git a/hyperdbg/hyperkd/header/debugger/commands/DebuggerCommands.h b/hyperdbg/hyperkd/header/debugger/commands/DebuggerCommands.h index c0043a3f..86f357a7 100644 --- a/hyperdbg/hyperkd/header/debugger/commands/DebuggerCommands.h +++ b/hyperdbg/hyperkd/header/debugger/commands/DebuggerCommands.h @@ -45,6 +45,9 @@ DebuggerCommandSearchMemory(PDEBUGGER_SEARCH_MEMORY SearchMemRequest); NTSTATUS DebuggerCommandFlush(PDEBUGGER_FLUSH_LOGGING_BUFFERS DebuggerFlushBuffersRequest); +NTSTATUS +DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest); + NTSTATUS DebuggerCommandSignalExecutionState(PDEBUGGER_SEND_COMMAND_EXECUTION_FINISHED_SIGNAL DebuggerFinishedExecutionRequest); diff --git a/hyperdbg/include/SDK/headers/Connection.h b/hyperdbg/include/SDK/headers/Connection.h index aac62f47..ae758a1fc 100644 --- a/hyperdbg/include/SDK/headers/Connection.h +++ b/hyperdbg/include/SDK/headers/Connection.h @@ -75,6 +75,7 @@ typedef enum _DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CLOSE_AND_UNLOAD_DEBUGGEE, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CHANGE_CORE, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_FLUSH_BUFFERS, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_USER_CPUID_REQUEST, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CALLSTACK, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_TEST_QUERY, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CHANGE_PROCESS, @@ -117,6 +118,7 @@ typedef enum _DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_RUNNING_SCRIPT, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_FORMATS, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_FLUSH, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_USER_CPUID, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_CALLSTACK, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_TEST_QUERY, DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_REGISTERING_EVENT, diff --git a/hyperdbg/include/SDK/headers/Ioctls.h b/hyperdbg/include/SDK/headers/Ioctls.h index 20a2057a..df5d54ae 100644 --- a/hyperdbg/include/SDK/headers/Ioctls.h +++ b/hyperdbg/include/SDK/headers/Ioctls.h @@ -389,6 +389,13 @@ #define IOCTL_PERFORM_SMI_OPERATION \ CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_VMM_IOCTL + 0x26, METHOD_BUFFERED, FILE_ANY_ACCESS) +/** + * @brief ioctl, to request CPUID information in vmx-root mode + * + */ +#define IOCTL_DEBUGGER_CPUID \ + CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_VMM_IOCTL + 0x27, METHOD_BUFFERED, FILE_ANY_ACCESS) + ////////////////////////////////////////////////// // HyperTrace IOCTLs // ////////////////////////////////////////////////// diff --git a/hyperdbg/include/SDK/headers/RequestStructures.h b/hyperdbg/include/SDK/headers/RequestStructures.h index 5e5b66b4..0817b45e 100644 --- a/hyperdbg/include/SDK/headers/RequestStructures.h +++ b/hyperdbg/include/SDK/headers/RequestStructures.h @@ -1737,3 +1737,38 @@ static_assert(sizeof(DEBUGGEE_PCIDEVINFO_REQUEST_RESPONSE_PACKET) < PacketChunkS "err (static_assert), size of PacketChunkSize should be bigger than DEBUGGEE_PCIDEVINFO_REQUEST_RESPONSE_PACKET"); // ============================================================================================== + +#define SIZEOF_DEBUGGER_CPUID_REQUEST_RESPONSE \ + sizeof(DEBUGGER_CPUID_REQUEST_RESPONSE) + +/** + * @brief Request and response for CPUID information (for ucpuid.cpp, not cpuid.cpp) + * + */ +typedef struct _DEBUGGER_CPUID_REQUEST_RESPONSE +{ + CHAR BrandString[49]; + + UINT32 EAX; + UINT32 EBX; + UINT32 ECX; + UINT32 EDX; + + UINT32 FunctionId; + UINT32 SubFunctionId; + + UINT32 Leaf4MaxSubLeaf; + UINT32 LeafBMaxSubleaf; + UINT32 Leaf12MaxSubLeaf; + UINT32 LeafEaxMaxSubleaf; + + BOOLEAN LeafBSupported; + BOOLEAN Leaf12Supported; + + UINT64 XCR0Vector; + UINT64 IA32_XSS_Vector; + + UINT32 KernelStatus; +} DEBUGGER_CPUID_REQUEST_RESPONSE, *PDEBUGGER_CPUID_REQUEST_RESPONSE; + +// ============================================================================================== diff --git a/hyperdbg/libhyperdbg/header/debugger/commands/commands.h b/hyperdbg/libhyperdbg/header/debugger/commands/commands.h index 9e24fec9..a2fcbaf9 100644 --- a/hyperdbg/libhyperdbg/header/debugger/commands/commands.h +++ b/hyperdbg/libhyperdbg/header/debugger/commands/commands.h @@ -294,6 +294,9 @@ typedef std::map CommandType; #define DEBUGGER_COMMAND_FLUSH_ATTRIBUTES \ DEBUGGER_COMMAND_ATTRIBUTE_LOCAL_COMMAND_IN_DEBUGGER_MODE +#define DEBUGGER_COMMAND_USER_CPUID_ATTRIBUTES \ + DEBUGGER_COMMAND_ATTRIBUTE_LOCAL_COMMAND_IN_DEBUGGER_MODE + #define DEBUGGER_COMMAND_UNLOAD_ATTRIBUTES NULL #define DEBUGGER_COMMAND_SCRIPT_ATTRIBUTES \ @@ -637,6 +640,9 @@ CommandSettings(vector CommandTokens, string Command); VOID CommandFlush(vector CommandTokens, string Command); +VOID +CommandUserCpuid(vector CommandTokens, string Command); + VOID CommandPause(vector CommandTokens, string Command); diff --git a/hyperdbg/libhyperdbg/header/debugger/commands/help.h b/hyperdbg/libhyperdbg/header/debugger/commands/help.h index 70340e54..d27cae46 100644 --- a/hyperdbg/libhyperdbg/header/debugger/commands/help.h +++ b/hyperdbg/libhyperdbg/header/debugger/commands/help.h @@ -171,6 +171,9 @@ CommandSettingsHelp(); VOID CommandFlushHelp(); +VOID +CommandUserCpuidHelp(); + VOID CommandPauseHelp(); diff --git a/hyperdbg/libhyperdbg/header/debugger/core/debugger.h b/hyperdbg/libhyperdbg/header/debugger/core/debugger.h index 9ac1012c..f26bd711 100644 --- a/hyperdbg/libhyperdbg/header/debugger/core/debugger.h +++ b/hyperdbg/libhyperdbg/header/debugger/core/debugger.h @@ -64,6 +64,7 @@ #define DEBUGGER_SYNCRONIZATION_OBJECT_KERNEL_DEBUGGER_SMI_OPERATION_RESULT 0x1f #define DEBUGGER_SYNCRONIZATION_OBJECT_KERNEL_DEBUGGER_HYPERTRACE_LBR_DUMP_RESULT 0x20 #define DEBUGGER_SYNCRONIZATION_OBJECT_KERNEL_DEBUGGER_HYPERTRACE_PT_OPERATION_RESULT 0x21 +#define DEBUGGER_SYNCRONIZATION_OBJECT_KERNEL_DEBUGGER_USER_CPUID_RESULT 0x22 ////////////////////////////////////////////////// // Event Details // @@ -220,6 +221,9 @@ CommandEventsClearAllEventsAndResetTags(); VOID CommandFlushRequestFlush(); +VOID +CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId); + UINT64 GetCommandAttributes(const string & FirstCommand); diff --git a/hyperdbg/libhyperdbg/header/debugger/kernel-level/kd.h b/hyperdbg/libhyperdbg/header/debugger/kernel-level/kd.h index 9a7e2798..edd20852 100644 --- a/hyperdbg/libhyperdbg/header/debugger/kernel-level/kd.h +++ b/hyperdbg/libhyperdbg/header/debugger/kernel-level/kd.h @@ -97,6 +97,9 @@ KdSendEventQueryAndModifyPacketToDebuggee( BOOLEAN KdSendFlushPacketToDebuggee(); +BOOLEAN +KdSendUserCpuidPacketToDebuggee(UINT32 FunctionId, UINT32 SubFunctionId); + BOOLEAN KdSendCallStackPacketToDebuggee(UINT64 BaseAddress, UINT32 Size, From 0564b729c9dc2634866a6a86d4c8b9e36fd5b279 Mon Sep 17 00:00:00 2001 From: Nikzad Date: Sun, 19 Jul 2026 18:12:45 +0330 Subject: [PATCH 04/50] kernel: implement CPUID command handling in kernel mode- Add DebuggerCommandCpuid() for CPUID execution - Implement IOCTL_DEBUGGER_CPUID handler - Fill CPUID response with register values and leaf data - Add max sub-leaf detection for some special leaves like 0x4, 0xB and... - Add SGX support detection via leaf 7 --- hyperdbg/hyperkd/code/common/Common.c | 14 ++ .../code/debugger/commands/DebuggerCommands.c | 228 +++++++++++++++++- .../hyperkd/code/debugger/kernel-level/Kd.c | 20 ++ hyperdbg/hyperkd/code/driver/Ioctl.c | 29 +++ 4 files changed, 287 insertions(+), 4 deletions(-) diff --git a/hyperdbg/hyperkd/code/common/Common.c b/hyperdbg/hyperkd/code/common/Common.c index 0dbc0aef..4d397409 100644 --- a/hyperdbg/hyperkd/code/common/Common.c +++ b/hyperdbg/hyperkd/code/common/Common.c @@ -268,3 +268,17 @@ CommonValidateCoreNumber(UINT32 CoreNumber) return TRUE; } } + +/** + * @brief Get cpuid results + * + * @param Func + * @param SubFunc + * @param CpuInfo + * @return VOID + */ +VOID +CommonCpuidInstruction(UINT32 Func, UINT32 SubFunc, INT * CpuInfo) +{ + CpuCpuIdEx(CpuInfo, Func, SubFunc); +} \ No newline at end of file diff --git a/hyperdbg/hyperkd/code/debugger/commands/DebuggerCommands.c b/hyperdbg/hyperkd/code/debugger/commands/DebuggerCommands.c index 940d0946..dbb22788 100644 --- a/hyperdbg/hyperkd/code/debugger/commands/DebuggerCommands.c +++ b/hyperdbg/hyperkd/code/debugger/commands/DebuggerCommands.c @@ -14,13 +14,13 @@ /** * @brief read registers - * @param Regs + * @param CpuidRegs * @param ReadRegisterRequest * * @return BOOLEAN */ BOOLEAN -DebuggerCommandReadRegisters(GUEST_REGS * Regs, +DebuggerCommandReadRegisters(GUEST_REGS * CpuidRegs, PDEBUGGEE_REGISTER_READ_DESCRIPTION ReadRegisterRequest) { GUEST_EXTRA_REGISTERS ERegs = {0}; @@ -31,7 +31,7 @@ DebuggerCommandReadRegisters(GUEST_REGS * Regs, // Add General purpose registers // memcpy((PVOID)((CHAR *)ReadRegisterRequest + sizeof(DEBUGGEE_REGISTER_READ_DESCRIPTION)), - Regs, + CpuidRegs, sizeof(GUEST_REGS)); // @@ -55,7 +55,7 @@ DebuggerCommandReadRegisters(GUEST_REGS * Regs, } else { - ReadRegisterRequest->Value = DebuggerGetRegValueWrapper(Regs, ReadRegisterRequest->RegisterId); + ReadRegisterRequest->Value = DebuggerGetRegValueWrapper(CpuidRegs, ReadRegisterRequest->RegisterId); } return TRUE; @@ -1301,6 +1301,226 @@ DebuggerCommandFlush(PDEBUGGER_FLUSH_LOGGING_BUFFERS DebuggerFlushBuffersRequest return STATUS_SUCCESS; } +/** + * @brief Handle CPUID request in vmx-root mode + * + * @param DebuggerCpuidRequest Request with CPUID function member and output + * @return NTSTATUS + */ +NTSTATUS +DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest) +{ + BOOLEAN RunCpuid = TRUE; + UINT32 CpuidRegs[4] = {0}; + UINT32 FunctionId = DebuggerCpuidRequest->FunctionId; + UINT32 SubFunctionId = DebuggerCpuidRequest->SubFunctionId; + UINT32 CacheIndex; + + // + // Zero out memory buffer + // + RtlZeroMemory(DebuggerCpuidRequest, SIZEOF_DEBUGGER_CPUID_REQUEST_RESPONSE); + + // + // receive maximum subleaves (for special ones, e.g 14, B,...), and do some other things (e.g brand string,...) + // + switch (FunctionId) + { + // + // EAX = 4h + // + case CPUID_CACHE_PARAMETERS: + for (CacheIndex = 0;; CacheIndex++) + { + CommonCpuidInstruction(FunctionId, CacheIndex, (INT32 *)CpuidRegs); + if (CPUID_EAX_CACHE_TYPE_FIELD(CpuidRegs[0]) == 0) + { + DebuggerCpuidRequest->Leaf4MaxSubLeaf = (CacheIndex > 0) ? (CacheIndex - 1) : 0; + break; + } + } + + + + break; + + // + // EAX = 0Bh + // + case CPUID_EXTENDED_TOPOLOGY: + // + // Check if supported or not + // in order to determine maximum subleaf, we have to check whether this leaf + // is supported by the current processor or not + // + CommonCpuidInstruction(FunctionId, 0, (INT32 *)CpuidRegs); + if (CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE(CpuidRegs[1]) == 0) + { + // + // not supported + // + DebuggerCpuidRequest->LeafBSupported = FALSE; + RunCpuid = FALSE; + + break; + } + + DebuggerCpuidRequest->LeafBSupported = TRUE; + + // + // iteration for determining max subleaf supported by this leaf + // + for (CacheIndex = 0; ;CacheIndex++) + { + CommonCpuidInstruction(FunctionId, CacheIndex, (INT32 *)CpuidRegs); + if (CPUID_ECX_LEVEL_TYPE(CpuidRegs[2]) == 0) + { + // + // check if CacheIndex is 0, then there are no valid sub-leaves + // + DebuggerCpuidRequest->LeafBMaxSubleaf = (CacheIndex > 0) ? (CacheIndex - 1) : 0; + break; + } + } + + break; + + // + // EAX = 0Dh + // + case CPUID_EXTENDED_STATE_INFORMATION: + // + // Get XCR0 bits + // + CommonCpuidInstruction(FunctionId, 0, (INT32 *)CpuidRegs); + DebuggerCpuidRequest->XCR0Vector = ((UINT64)CpuidRegs[3] << 32) | CpuidRegs[0]; + + // + // Get IA32_XSS bits + // + CommonCpuidInstruction(FunctionId, 1, (INT32 *)CpuidRegs); + DebuggerCpuidRequest->IA32_XSS_Vector = ((UINT64)CpuidRegs[3] << 32) | CpuidRegs[2]; + + break; + + // + // EAX = 12h + // + case CPUID_INTEL_SGX: + // + // we need to check that if SGX is supported or not + // + CommonCpuidInstruction(7, 0, (INT32 *)CpuidRegs); + DebuggerCpuidRequest->Leaf12Supported = CPUID_EBX_SGX(CpuidRegs[1]); + + if (!CPUID_EBX_SGX(CpuidRegs[1])) + { + // + // SGX not supported + // + RunCpuid = FALSE; + break; + } + + // + // find max subleaf + // subleaves 0 and 1 are always valid if SGX is supported, so we start iteration from 2 + // + for (CacheIndex = 2; ; CacheIndex++) + { + CommonCpuidInstruction(FunctionId, CacheIndex, (INT32 *)CpuidRegs); + + // + // type 0 means invalid - stop enumeration + // + if (CPUID_EAX_SUB_LEAF_TYPE(CpuidRegs[0]) == 0) + { + DebuggerCpuidRequest->Leaf12MaxSubLeaf = (CacheIndex > 0) ? (CacheIndex - 1) : 0; + break; + } + + // + // Safety limit - shouldn't need more than 64 EPC sections + // + if (CacheIndex > 64) + { + DebuggerCpuidRequest->Leaf12MaxSubLeaf = CacheIndex; + break; + } + } + + break; + + // + // Leaves with same method to receive max subleaf: 7h, 14h, 18h (respectively) + // + case CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS: + case CPUID_INTEL_PROCESSOR_TRACE_INFORMATION: + case CPUID_DETERMINISTIC_ADDRESS_TRANSLATION_PARAMETERS: + CommonCpuidInstruction(FunctionId, 0, (INT32 *)CpuidRegs); + + // + // EAX = 7h + // + if (FunctionId == CPUID_STRUCTURED_EXTENDED_FEATURE_FLAGS) + { + DebuggerCpuidRequest->LeafEaxMaxSubleaf = CPUID_EAX_NUMBER_OF_SUB_LEAVES(CpuidRegs[0]); + break; + } + + // + // EAX = 14h or 18h -- not 7h + // + DebuggerCpuidRequest->LeafEaxMaxSubleaf = CPUID_EAX_MAX_SUB_LEAF(CpuidRegs[0]); + + break; + + // + // 0x80000002 - 0x80000004 : brand string + // + case CPUID_BRAND_STRING1: + case CPUID_BRAND_STRING2: + case CPUID_BRAND_STRING3: + for (UINT32 i = 0; i < 3; i++) + { + CommonCpuidInstruction(0x80000002 + i, 0, (INT32 *)CpuidRegs); + memcpy(DebuggerCpuidRequest->BrandString + (i * 16), CpuidRegs, 16); + } + DebuggerCpuidRequest->BrandString[48] = '\0'; + + // + // because we already EXCLUSIVELY called CPUID for these leaves, we are not going to call it again, + // as a result the RunCpuid flag is FALSE + // + RunCpuid = FALSE; + break; + + } + + // + // Call CPUID function + // + if (RunCpuid) + { + CommonCpuidInstruction(FunctionId, SubFunctionId, (INT32 *)CpuidRegs); + DebuggerCpuidRequest->EAX = CpuidRegs[0]; + DebuggerCpuidRequest->EBX = CpuidRegs[1]; + DebuggerCpuidRequest->ECX = CpuidRegs[2]; + DebuggerCpuidRequest->EDX = CpuidRegs[3]; + } + + // + // Ensure the response contains the correct FunctionId and SubFunctionId + // (they should already be set, but this makes it explicit) + // + DebuggerCpuidRequest->FunctionId = FunctionId; + DebuggerCpuidRequest->SubFunctionId = SubFunctionId; + + DebuggerCpuidRequest->KernelStatus = DEBUGGER_OPERATION_WAS_SUCCESSFUL; + + return STATUS_SUCCESS; +} + /** * @brief Perform the command finished signal * diff --git a/hyperdbg/hyperkd/code/debugger/kernel-level/Kd.c b/hyperdbg/hyperkd/code/debugger/kernel-level/Kd.c index f3f7017b..4173ea42 100644 --- a/hyperdbg/hyperkd/code/debugger/kernel-level/Kd.c +++ b/hyperdbg/hyperkd/code/debugger/kernel-level/Kd.c @@ -2260,6 +2260,7 @@ KdDispatchAndPerformCommandsFromDebugger(PROCESSOR_DEBUGGING_STATE * DbgState) PDEBUGGEE_CHANGE_CORE_PACKET ChangeCorePacket; PDEBUGGEE_STEP_PACKET SteppingPacket; PDEBUGGER_FLUSH_LOGGING_BUFFERS FlushPacket; + PDEBUGGER_CPUID_REQUEST_RESPONSE CpuidPacket; PDEBUGGER_CALLSTACK_REQUEST CallstackPacket; PDEBUGGER_SINGLE_CALLSTACK_FRAME CallstackFrameBuffer; PDEBUGGER_DEBUGGER_TEST_QUERY_BUFFER TestQueryPacket; @@ -2532,6 +2533,25 @@ KdDispatchAndPerformCommandsFromDebugger(PROCESSOR_DEBUGGING_STATE * DbgState) break; + case DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_USER_CPUID_REQUEST: + + CpuidPacket = (DEBUGGER_CPUID_REQUEST_RESPONSE *)(((CHAR *)TheActualPacket) + sizeof(DEBUGGER_REMOTE_PACKET)); + + // + // Receieve CPUID result + // + DebuggerCommandCpuid(CpuidPacket); + + // + // Send the result of CPUID back to the debugger + // + KdResponsePacketToDebugger(DEBUGGER_REMOTE_PACKET_TYPE_DEBUGGEE_TO_DEBUGGER, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_USER_CPUID, + (CHAR *)CpuidPacket, + sizeof(DEBUGGER_CPUID_REQUEST_RESPONSE)); + + break; + case DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_CALLSTACK: CallstackPacket = (DEBUGGER_CALLSTACK_REQUEST *)(((CHAR *)TheActualPacket) + sizeof(DEBUGGER_REMOTE_PACKET)); diff --git a/hyperdbg/hyperkd/code/driver/Ioctl.c b/hyperdbg/hyperkd/code/driver/Ioctl.c index ddd88593..16817ab2 100644 --- a/hyperdbg/hyperkd/code/driver/Ioctl.c +++ b/hyperdbg/hyperkd/code/driver/Ioctl.c @@ -410,6 +410,7 @@ DrvDispatchVmmIoControl(PIRP Irp, PIO_STACK_LOCATION IrpStack, BOOLEAN * DoNotCh PDEBUGGER_GENERAL_EVENT_DETAIL DebuggerNewEventRequest; PDEBUGGER_MODIFY_EVENTS DebuggerModifyEventRequest; PDEBUGGER_FLUSH_LOGGING_BUFFERS DebuggerFlushBuffersRequest; + PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest; PDEBUGGER_PREALLOC_COMMAND DebuggerReservePreallocPoolRequest; PDEBUGGER_PREACTIVATE_COMMAND DebuggerPreactivationRequest; PDEBUGGER_APIC_REQUEST DebuggerApicRequest; @@ -835,6 +836,34 @@ DrvDispatchVmmIoControl(PIRP Irp, PIO_STACK_LOCATION IrpStack, BOOLEAN * DoNotCh break; + case IOCTL_DEBUGGER_CPUID: + + // + // Validate and adjust the parameters, and set the target buffer to the system buffer of the IRP + // + if (!DrvValidateAndAdjustIoctlParameter(SIZEOF_DEBUGGER_CPUID_REQUEST_RESPONSE, + (PVOID *)&DebuggerCpuidRequest, + Irp, + IrpStack, + &InBuffLength, + &OutBuffLength)) + { + Status = STATUS_INVALID_PARAMETER; + break; + } + + // + // Perform CPUID request + // + DebuggerCommandCpuid(DebuggerCpuidRequest); + + // + // Adjust the status and output size + // + DrvAdjustStatusAndSetOutputSize(SIZEOF_DEBUGGER_CPUID_REQUEST_RESPONSE, DoNotChangeInformation, Irp, &Status); + + break; + case IOCTL_DEBUGGER_ATTACH_DETACH_USER_MODE_PROCESS: // From 632db2129074ba48167b831d59dd085fdac59c1f Mon Sep 17 00:00:00 2001 From: Nikzad Date: Sun, 19 Jul 2026 18:15:43 +0330 Subject: [PATCH 05/50] user: implement ucpuid command in user mode- Add ucpuid.cpp with leaf/sub-leaf decoding - Implement CPUID command parser and dispatcher - Add remote CPUID support via KdSendUserCpuidPacketToDebuggee() - Implement response handler in kernel-listening.cpp - Add proper validation for FunctionId and SubFunctionId - Support hex and decimal input formats --- hyperdbg/libhyperdbg/code/common/common.cpp | 44 +- .../code/debugger/core/interpreter.cpp | 2 + .../code/debugger/kernel-level/kd.cpp | 32 + .../kernel-level/kernel-listening.cpp | 2020 +++++++++++++++ hyperdbg/libhyperdbg/ucpuid.cpp | 2187 +++++++++++++++++ 5 files changed, 4274 insertions(+), 11 deletions(-) create mode 100644 hyperdbg/libhyperdbg/ucpuid.cpp diff --git a/hyperdbg/libhyperdbg/code/common/common.cpp b/hyperdbg/libhyperdbg/code/common/common.cpp index 2f494eab..76766334 100644 --- a/hyperdbg/libhyperdbg/code/common/common.cpp +++ b/hyperdbg/libhyperdbg/code/common/common.cpp @@ -386,7 +386,7 @@ ConvertStringToUInt32(string TextToConvert, PUINT32 Result) { try { - INT I = std::stoi(TextToConvert); + UINT32 I = std::stoul(TextToConvert); *Result = I; return TRUE; } @@ -419,19 +419,41 @@ ConvertStringToUInt32(string TextToConvert, PUINT32 Result) } else { - // - // It's hex number - // - UINT32 TempResult; - TempResult = stoi(TextToConvert, nullptr, 16); + try + { + // + // It's hex number + // + UINT64 TempResult; + TempResult = stoul(TextToConvert, nullptr, 16); + + // + // in order to prevent buffer overflow, compare the user's value to 0xFFFFFFFF + // + if (TempResult > 0xFFFFFFFF) + { + return FALSE; + } + // + // Apply the results + // + *Result = (UINT32)TempResult; - // - // Apply the results - // - *Result = TempResult; + return TRUE; + } + catch (std::invalid_argument const&) + { + return FALSE; + } + catch (std::out_of_range const&) + { + return FALSE; + } + + return FALSE; - return TRUE; } + } } diff --git a/hyperdbg/libhyperdbg/code/debugger/core/interpreter.cpp b/hyperdbg/libhyperdbg/code/debugger/core/interpreter.cpp index edc0ab52..3a61e437 100644 --- a/hyperdbg/libhyperdbg/code/debugger/core/interpreter.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/core/interpreter.cpp @@ -1420,6 +1420,8 @@ InitializeCommandsDictionary() g_CommandsList["flush"] = {&CommandFlush, &CommandFlushHelp, DEBUGGER_COMMAND_FLUSH_ATTRIBUTES}; + g_CommandsList["ucpuid"] = {&CommandUserCpuid, &CommandUserCpuidHelp, DEBUGGER_COMMAND_USER_CPUID_ATTRIBUTES}; + g_CommandsList["pause"] = {&CommandPause, &CommandPauseHelp, DEBUGGER_COMMAND_PAUSE_ATTRIBUTES}; g_CommandsList[".pause"] = {&CommandPause, &CommandPauseHelp, DEBUGGER_COMMAND_PAUSE_ATTRIBUTES}; diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp index 4020c620..5f145985 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp @@ -335,6 +335,38 @@ KdSendFlushPacketToDebuggee() return TRUE; } +/** + * @brief Send a CPUID request to the debuggee + * + * @return BOOLEAN + */ +BOOLEAN +KdSendUserCpuidPacketToDebuggee(UINT32 FunctionId, UINT32 SubFunctionId) +{ + DEBUGGER_CPUID_REQUEST_RESPONSE CpuidPacket = {0}; + CpuidPacket.FunctionId = FunctionId; + CpuidPacket.SubFunctionId = SubFunctionId; + + // + // Send 'ucpuid' command as CPUID packet + // + if (!KdCommandPacketAndBufferToDebuggee( + DEBUGGER_REMOTE_PACKET_TYPE_DEBUGGER_TO_DEBUGGEE_EXECUTE_ON_VMX_ROOT, + DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_ON_VMX_ROOT_MODE_USER_CPUID_REQUEST, + (CHAR *)&CpuidPacket, + sizeof(DEBUGGER_CPUID_REQUEST_RESPONSE))) + { + return FALSE; + } + + // + // Wait until the result of CPUID received + // + DbgWaitForKernelResponse(DEBUGGER_SYNCRONIZATION_OBJECT_KERNEL_DEBUGGER_USER_CPUID_RESULT); + + return TRUE; +} + /** * @brief Send a callstack request to the debuggee * @param BaseAddress diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp index 3619e430..2810c0b2 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp @@ -56,6 +56,7 @@ ListeningSerialPortInDebugger() PDEBUGGEE_RESULT_OF_SEARCH_PACKET SearchResultsPacket; PDEBUGGEE_DETAILS_AND_SWITCH_THREAD_PACKET ChangeThreadPacket; PDEBUGGER_FLUSH_LOGGING_BUFFERS FlushPacket; + PDEBUGGER_CPUID_REQUEST_RESPONSE CpuidPacket; PDEBUGGER_CALLSTACK_REQUEST CallstackPacket; PDEBUGGER_SINGLE_CALLSTACK_FRAME CallstackFramePacket; PDEBUGGER_DEBUGGER_TEST_QUERY_BUFFER TestQueryPacket; @@ -577,6 +578,2025 @@ StartAgain: break; + case DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_USER_CPUID: + + CpuidPacket = (DEBUGGER_CPUID_REQUEST_RESPONSE *)(((CHAR *)TheActualPacket) + sizeof(DEBUGGER_REMOTE_PACKET)); + + if (CpuidPacket->KernelStatus == DEBUGGER_OPERATION_WAS_SUCCESSFUL) + { + UINT32 FunctionId = CpuidPacket->FunctionId; + UINT32 SubFunctionId = CpuidPacket->SubFunctionId; + CONST CHAR * TypeName = NULL; + CONST CHAR * AssocName; + + switch (FunctionId) + { + case 0x0: + { + CHAR Vendor[13] = {0}; + memcpy(&Vendor[0], &CpuidPacket->EBX, 4); + memcpy(&Vendor[4], &CpuidPacket->EDX, 4); + memcpy(&Vendor[8], &CpuidPacket->ECX, 4); + Vendor[12] = '\0'; + + ShowMessages(" *******************************************************\n" + " * LEAF 0 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages(" Vendor : %s\n", Vendor); + ShowMessages(" Maximum supported basic leaf : %u\n", CpuidPacket->EAX); + + break; + } + case 0x1: + // + // EAX + // + ShowMessages("==== CPUID.(EAX=01H) Version / Additional / Feature Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 1 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX: Version Information --\n\n"); + ShowMessages(" SteppingId = %u\n", + CPUID_VERSION_INFORMATION_STEPPING_ID(CpuidPacket->EAX)); + ShowMessages(" Model = %u\n", + CPUID_VERSION_INFORMATION_MODEL(CpuidPacket->EAX)); + ShowMessages(" FamilyId = %u\n", + CPUID_VERSION_INFORMATION_FAMILY_ID(CpuidPacket->EAX)); + ShowMessages(" ProcessorType = %u\n", + CPUID_VERSION_INFORMATION_PROCESSOR_TYPE(CpuidPacket->EAX)); + ShowMessages(" ExtendedModelId = %u\n", + CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID(CpuidPacket->EAX)); + ShowMessages(" ExtendedFamilyId = %u\n\n", + CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID(CpuidPacket->EAX)); + + // + // EBX: additional information + // + ShowMessages("-- EBX: Additional Information --\n\n"); + ShowMessages(" BrandIndex = %u\n", + CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX(CpuidPacket->EBX)); + ShowMessages(" ClflushLineSize = %u (cache line = %u bytes)\n", + CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidPacket->EBX), + CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidPacket->EBX) * 8); + ShowMessages(" MaxAddressableIds = %u\n", + CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS(CpuidPacket->EBX)); + ShowMessages(" InitialApicId = %u\n\n", + CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID(CpuidPacket->EBX)); + + // + // ECX: feature information + // + ShowMessages("-- ECX: Feature Information --\n\n"); + ShowMessages(" SSE3 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PCLMULQDQ = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" DTES64 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MONITOR/MWAIT = %s\n", + CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CPL Qualified DS = %s\n", + CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VMX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SMX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" EIST (SpeedStep) = %s\n", + CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TM2 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSSE3 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" L1 Context ID = %s\n", + CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Silicon Debug = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" FMA = %s\n", + CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CMPXCHG16B = %s\n", + CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" xTPR Update Control = %s\n", + CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PDCM = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PCID = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" DCA = %s\n", + CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE4.1 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE4.2 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" x2APIC = %s\n", + CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVBE = %s\n", + CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" POPCNT = %s\n", + CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TSC-Deadline = %s\n", + CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AESNI = %s\n", + CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" XSAVE/XRSTOR = %s\n", + CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" OSXSAVE = %s\n", + CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" F16C = %s\n", + CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" RDRAND = %s\n\n", + CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + + // + // EDX: feature information + // + ShowMessages("-- EDX: Feature Information --\n\n"); + ShowMessages(" FPU = %s\n", + CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" VME = %s\n", + CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" DE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" TSC = %s\n", + CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MSR (RDMSR/WRMSR) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PAE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MCE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CX8 (CMPXCHG8B) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" APIC On-Chip = %s\n", + CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SEP (SYSENTER/EXIT) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MTRR = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PGE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MCA = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CMOV = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PAT = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSE-36 = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSN = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CLFSH = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CLFLUSH(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" DS (Debug Store) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" ACPI (Thermal/Clock) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MMX = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" FXSR (FXSAVE/FXRSTOR) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE2 = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SS (Self Snoop) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" HTT = %s\n", + CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" TM (Thermal Monitor) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PBE = %s\n\n", + CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + + break; + + case 0x2: + ShowMessages("==== CPUID.(EAX=02H) Legacy Cache Descriptor ====\n\n"); + ShowMessages(" This leaf is deprecated and returns legacy cache information.\n"); + ShowMessages(" Use CPUID.(EAX=04H) for deterministic cache parameters instead.\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); + break; + + case 0x3: + ShowMessages("==== CPUID.(EAX=03H) ====\n\n"); + ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); + ShowMessages(" (Was previously used for Processor Serial Number on older CPUs)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); + break; + + case 0x4: + { + UINT32 LineSize = CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE(CpuidPacket->EBX); + UINT32 Partitions = CPUID_EBX_PHYSICAL_LINE_PARTITIONS(CpuidPacket->EBX); + UINT32 Ways = CPUID_EBX_WAYS_OF_ASSOCIATIVITY(CpuidPacket->EBX); + UINT32 Sets = CPUID_ECX_NUMBER_OF_SETS(CpuidPacket->ECX); + UINT64 CacheSizeBytes = (UINT64)(Ways + 1) * + (UINT64)(Partitions + 1) * + (UINT64)(LineSize + 1) * + (UINT64)(Sets + 1); + ShowMessages("==== CPUID.(EAX=04H) Deterministic Cache Parameters ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidPacket->Leaf4MaxSubLeaf); + + ShowMessages("---- CPUID.(EAX=04H, ECX=%u) ----\n\n", SubFunctionId); + + // + // EAX + // + switch (CPUID_EAX_CACHE_TYPE_FIELD(CpuidPacket->EAX)) + { + case 0: + TypeName = "Null (no more caches)"; + break; + case 1: + TypeName = "Data Cache"; + break; + case 2: + TypeName = "Instruction Cache"; + break; + case 3: + TypeName = "Unified Cache"; + break; + default: + TypeName = "Reserved"; + break; + } + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" CacheTypeField = %u (%s)\n", + CPUID_EAX_CACHE_TYPE_FIELD(CpuidPacket->EAX), + TypeName); + + if (CPUID_EAX_CACHE_TYPE_FIELD(CpuidPacket->EAX) == 0) + { + ShowMessages(" (no more caches; stopping enumeration)\n\n"); + break; + } + + ShowMessages(" CacheLevel = %u\n", + CPUID_EAX_CACHE_LEVEL(CpuidPacket->EAX)); + ShowMessages(" SelfInitializingCacheLevel = %s\n", + CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" FullyAssociativeCache = %s%s\n", + CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidPacket->EAX) ? "TRUE" : "FALSE", + CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidPacket->EAX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIds(LogicalProcs) (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidPacket->EAX), + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidPacket->EAX) + 1); + ShowMessages(" MaxAddressableIds(Cores) (raw) = %u -> actual = %u (raw + 1)\n\n", + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidPacket->EAX), + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidPacket->EAX) + 1); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + + ShowMessages(" SystemCoherencyLineSize (raw) = %u -> actual = %u bytes (raw + 1)\n", + LineSize, + LineSize + 1); + ShowMessages(" PhysicalLinePartitions (raw) = %u -> actual = %u (raw + 1)\n", + Partitions, + Partitions + 1); + ShowMessages(" WaysOfAssociativity (raw) = %u -> actual = %u (raw + 1)\n\n", + Ways, + Ways + 1); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + + ShowMessages(" NumberOfSets (raw) = %u -> actual = %u (raw + 1)\n\n", + Sets, + Sets + 1); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" WriteBackInvalidate = %s\n", + CPUID_EDX_WRITE_BACK_INVALIDATE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CacheInclusiveness = %s%s\n", + CPUID_EDX_CACHE_INCLUSIVENESS(CpuidPacket->EDX) ? "TRUE" : "FALSE", + CPUID_EDX_CACHE_INCLUSIVENESS(CpuidPacket->EDX) ? " (inclusive of lower levels)" : ""); + ShowMessages(" ComplexCacheIndexing = %s%s\n\n", + CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidPacket->EDX) ? "TRUE" : "FALSE", + CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidPacket->EDX) ? " (complex/hashed indexing)" : " (direct mapped)"); + + // + // Cache Size Calculation (from spec formula) + // + ShowMessages("-- Cache Size --\n\n"); + ShowMessages(" Cache Size (per spec formula) = %llu bytes (%llu KB, %llu MB)\n\n", + (ULONG64)CacheSizeBytes, + (ULONG64)(CacheSizeBytes / 1024), + (ULONG64)(CacheSizeBytes / (1024 * 1024))); + + break; + } + case 0x5: + ShowMessages("==== CPUID.(EAX=05H) MONITOR/MWAIT Leaf ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 5 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SmallestMonitorLineSize = %u bytes\n\n", + CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE(CpuidPacket->EAX)); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" LargestMonitorLineSize = %u bytes\n\n", + CPUID_EBX_LARGEST_MONITOR_LINE_SIZE(CpuidPacket->EBX)); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" EnumerationOfMonitorMwaitExtensions = %s\n", + CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsTreatingInterruptsAsBreakEventForMwait = %s\n\n", + CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" NumberOfC0SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES(CpuidPacket->EDX)); + ShowMessages(" NumberOfC1SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES(CpuidPacket->EDX)); + ShowMessages(" NumberOfC2SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES(CpuidPacket->EDX)); + ShowMessages(" NumberOfC3SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES(CpuidPacket->EDX)); + ShowMessages(" NumberOfC4SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES(CpuidPacket->EDX)); + ShowMessages(" NumberOfC5SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES(CpuidPacket->EDX)); + ShowMessages(" NumberOfC6SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES(CpuidPacket->EDX)); + ShowMessages(" NumberOfC7SubCStates = %u\n\n", CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES(CpuidPacket->EDX)); + + break; + + case 0x6: + ShowMessages("==== CPUID.(EAX=06H) Thermal and Power Management Leaf ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 6 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" TemperatureSensorSupported = %s\n", + CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" IntelTurboBoostTechnologyAvailable = %s\n", + CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ARAT (ApicTimerAlwaysRunning) = %s\n", + CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PLN (PowerLimitNotification) = %s\n", + CPUID_EAX_POWER_LIMIT_NOTIFICATION(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ECMD (ClockModulationDuty) = %s\n", + CPUID_EAX_CLOCK_MODULATION_DUTY(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PTM (PackageThermalManagement) = %s\n", + CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP Base Registers = %s\n", + CPUID_EAX_HWP_BASE_REGISTERS(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Notification = %s\n", + CPUID_EAX_HWP_NOTIFICATION(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Activity_Window = %s\n", + CPUID_EAX_HWP_ACTIVITY_WINDOW(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Energy_Performance_Preference = %s\n", + CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Package_Level_Request = %s\n", + CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HDC = %s\n", + CPUID_EAX_HDC(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Turbo Boost Max Technology 3.0 = %s\n", + CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP Capabilities = %s\n", + CPUID_EAX_HWP_CAPABILITIES(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP PECI Override = %s\n", + CPUID_EAX_HWP_PECI_OVERRIDE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Flexible HWP = %s\n", + CPUID_EAX_FLEXIBLE_HWP(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Fast Access Mode for HWP Request MSR = %s\n", + CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Ignoring Idle Logical Proc HWP Request = %s\n", + CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Thread Director = %s\n\n", + CPUID_EAX_INTEL_THREAD_DIRECTOR(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" NumberOfInterruptThresholdsInThermalSensor = %u\n\n", + CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR(CpuidPacket->EBX)); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" HardwareCoordinationFeedbackCapability = %s\n", + CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" NumberOfIntelThreadDirectorClasses (bit) = %s\n", + CPUID_ECX_NUMBER_OF_INTEL_THREAD_DIRECTOR_CLASSES(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PerformanceEnergyBiasPreference = %u\n\n", + CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE(CpuidPacket->ECX)); + + // + // EDX + // EDX is fully reserved for this leaf; still routed through its macro for consistency. + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); + + break; + + case 0x7: + ShowMessages("==== CPUID.(EAX=07H) Structured Extended Feature Flags ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidPacket->LeafEaxMaxSubleaf); + + if (SubFunctionId == 0) + { + ShowMessages("---- CPUID.(EAX=07H, ECX=%u) ----\n\n", SubFunctionId); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" NumberOfSubLeaves (max ECX input) = %u\n\n", CPUID_EAX_NUMBER_OF_SUB_LEAVES(CpuidPacket->EAX)); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" FSGSBASE = %s\n", CPUID_EBX_FSGSBASE(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_TSC_ADJUST MSR = %s\n", CPUID_EBX_IA32_TSC_ADJUST_MSR(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX = %s\n", CPUID_EBX_SGX(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" BMI1 = %s\n", CPUID_EBX_BMI1(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" HLE = %s\n", CPUID_EBX_HLE(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX2 = %s\n", CPUID_EBX_AVX2(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" FDP_EXCPTN_ONLY = %s\n", CPUID_EBX_FDP_EXCPTN_ONLY(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SMEP = %s\n", CPUID_EBX_SMEP(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" BMI2 = %s\n", CPUID_EBX_BMI2(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Enhanced REP MOVSB/STOSB = %s\n", CPUID_EBX_ENHANCED_REP_MOVSB_STOSB(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" INVPCID = %s\n", CPUID_EBX_INVPCID(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RTM = %s\n", CPUID_EBX_RTM(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDT-M (Monitoring) = %s\n", CPUID_EBX_RDT_M(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Deprecates FPU CS/DS = %s\n", CPUID_EBX_DEPRECATES(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" MPX = %s\n", CPUID_EBX_MPX(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDT-A (Allocation) = %s\n", CPUID_EBX_RDT(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512F = %s\n", CPUID_EBX_AVX512F(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512DQ = %s\n", CPUID_EBX_AVX512DQ(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDSEED = %s\n", CPUID_EBX_RDSEED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" ADX = %s\n", CPUID_EBX_ADX(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SMAP = %s\n", CPUID_EBX_SMAP(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_IFMA = %s\n", CPUID_EBX_AVX512_IFMA(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" CLFLUSHOPT = %s\n", CPUID_EBX_CLFLUSHOPT(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" CLWB = %s\n", CPUID_EBX_CLWB(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Processor Trace = %s\n", CPUID_EBX_INTEL(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512PF (Xeon Phi only) = %s\n", CPUID_EBX_AVX512PF(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512ER (Xeon Phi only) = %s\n", CPUID_EBX_AVX512ER(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512CD = %s\n", CPUID_EBX_AVX512CD(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SHA = %s\n", CPUID_EBX_SHA(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512BW = %s\n", CPUID_EBX_AVX512BW(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512VL = %s\n\n", CPUID_EBX_AVX512VL(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" PREFETCHWT1 (Xeon Phi only) = %s\n", CPUID_ECX_PREFETCHWT1(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VBMI = %s\n", CPUID_ECX_AVX512_VBMI(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" UMIP = %s\n", CPUID_ECX_UMIP(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PKU = %s\n", CPUID_ECX_PKU(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" OSPKE = %s\n", CPUID_ECX_OSPKE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" WAITPKG = %s\n", CPUID_ECX_WAITPKG(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VBMI2 = %s\n", CPUID_ECX_AVX512_VBMI2(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CET_SS (shadow stack) = %s\n", CPUID_ECX_CET_SS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" GFNI = %s\n", CPUID_ECX_GFNI(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VAES = %s\n", CPUID_ECX_VAES(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VPCLMULQDQ = %s\n", CPUID_ECX_VPCLMULQDQ(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VNNI = %s\n", CPUID_ECX_AVX512_VNNI(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_BITALG = %s\n", CPUID_ECX_AVX512_BITALG(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TME_EN = %s\n", CPUID_ECX_TME_EN(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VPOPCNTDQ = %s\n", CPUID_ECX_AVX512_VPOPCNTDQ(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LA57 (5-level paging) = %s\n", CPUID_ECX_LA57(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MAWAU (BNDLDX/BNDSTX) = %u (NOT BOOLEAN)\n", CPUID_ECX_MAWAU(CpuidPacket->ECX)); + ShowMessages(" RDPID = %s\n", CPUID_ECX_RDPID(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" KL (Key Locker) = %s\n", CPUID_ECX_KL(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CLDEMOTE = %s\n", CPUID_ECX_CLDEMOTE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVDIRI = %s\n", CPUID_ECX_MOVDIRI(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVDIR64B = %s\n", CPUID_ECX_MOVDIR64B(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX_LC (Launch Config) = %s\n", CPUID_ECX_SGX_LC(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PKS = %s\n\n", CPUID_ECX_PKS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" AVX512_4VNNIW (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4VNNIW(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_4FMAPS (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4FMAPS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" Fast Short REP MOV = %s\n", CPUID_EDX_FAST_SHORT_REP_MOV(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VP2INTERSECT = %s\n", CPUID_EDX_AVX512_VP2INTERSECT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MD_CLEAR = %s\n", CPUID_EDX_MD_CLEAR(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SERIALIZE = %s\n", CPUID_EDX_SERIALIZE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" Hybrid part = %s\n", CPUID_EDX_HYBRID(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PCONFIG = %s\n", CPUID_EDX_PCONFIG(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CET_IBT (branch tracking) = %s\n", CPUID_EDX_CET_IBT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IBRS/IBPB = %s\n", CPUID_EDX_IBRS_IBPB(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" STIBP = %s\n", CPUID_EDX_STIBP(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" L1D_FLUSH = %s\n", CPUID_EDX_L1D_FLUSH(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_ARCH_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_ARCH_CAPABILITIES(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_CORE_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_CORE_CAPABILITIES(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSBD = %s\n\n", CPUID_EDX_SSBD(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + } + else + { + // + // This header only defines the EBX/ECX/EDX bitfield layout for sub-leaf + // (ECX) = 0. If the processor reports further sub-leaves, decoding them + // with the sub-leaf-0 struct would silently misinterpret the bits, so + // instead their raw dwords are printed undecoded - consistent with this + // file's rule of only reading a field through a macro that's actually + // defined for it. + // + ShowMessages(" No bitfield macros are defined for these in ia32.h, so their\n"); + ShowMessages(" raw dwords are shown without decoding:\n"); + ShowMessages(" ECX=%u: EAX=0x%08X EBX=0x%08X ECX=0x%08X EDX=0x%08X\n\n", + SubFunctionId, + CpuidPacket->EAX, + CpuidPacket->EBX, + CpuidPacket->ECX, + CpuidPacket->EDX); + } + + break; + + case 0x8: + ShowMessages("==== CPUID.(EAX=08H) ====\n\n"); + ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); + ShowMessages(" (Was previously used for Processor Serial Number on some CPUs)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n", CpuidPacket->EDX); + break; + + case 0x9: + ShowMessages("==== CPUID.(EAX=09H) Direct Cache Access Information ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 9 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX mirrors IA32_PLATFORM_DCA_CAP[31:0] verbatim. ia32.h doesn't split + // it into sub-fields here (those bit meanings live in the MSR's own + // spec, not in this CPUID leaf), so it's read through its single + // whole-dword macro and shown as raw hex rather than decoded further. + // + ShowMessages(" IA32_PLATFORM_DCA_CAP (EAX, mirrors MSR 1F8H) = 0x%08X\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidPacket->EAX)); + + // + // EBX/ECX/EDX are fully reserved for this leaf. + // + ShowMessages(" Reserved (EBX) = 0x%08X\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); + ShowMessages(" Reserved (ECX) = 0x%08X\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); + ShowMessages(" Reserved (EDX) = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); + + break; + + case 0xA: + ShowMessages("==== CPUID.(EAX=0AH) Architectural Performance Monitoring Leaf ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 10 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidPacket->EAX) == 0) + { + // + // Per the spec: architectural perfmon is only supported if VersionId > 0. + // At version 0 the rest of this leaf isn't architecturally meaningful, so stop here + // + ShowMessages(" VersionId = 0 -> architectural performance monitoring not supported;\n" + " remaining fields in this leaf are not architecturally defined.\n\n"); + + break; + } + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" VersionId = %u\n", + CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidPacket->EAX)); + ShowMessages(" NumberOfCountersPerLogicalProcessor = %u\n", + CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR(CpuidPacket->EAX)); + ShowMessages(" BitWidthOfPerformanceMonitoringCounter = %u\n", + CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER(CpuidPacket->EAX)); + ShowMessages(" EbxBitVectorLength = %u\n\n", + CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidPacket->EAX)); + + // + // EBX + // + ShowMessages("-- EBX (bit = 1 means the event is NOT available) --\n\n"); + ShowMessages(" CoreCycleEventNotAvailable = %u\n", + CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); + ShowMessages(" InstructionRetiredEventNotAvailable = %u\n", + CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); + ShowMessages(" ReferenceCyclesEventNotAvailable = %u\n", + CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); + ShowMessages(" LastLevelCacheReferenceEventNotAvailable = %u\n", + CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); + ShowMessages(" LastLevelCacheMissesEventNotAvailable = %u\n", + CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); + ShowMessages(" BranchInstructionRetiredEventNotAvailable = %u\n", + CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); + ShowMessages(" BranchMispredictRetiredEventNotAvailable = %u\n\n", + CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); + + if (CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidPacket->EAX) < 7) + { + ShowMessages(" NOTE: EbxBitVectorLength=%u (<7): bits at/after this length are not\n" + " architecturally defined on this CPU; treat them as unreliable.\n", + CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidPacket->EAX)); + } + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + // + // EDX: fixed-function counter fields only defined if VersionId > 1 + // + ShowMessages("-- EDX --\n\n"); + if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidPacket->EAX) > 1) + { + ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u\n", + CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidPacket->EDX)); + ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u\n\n", + CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidPacket->EDX)); + } + else + { + ShowMessages(" NOTE: VersionId=%u (<=1): fixed-function counter fields are not\n", + CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidPacket->EAX)); + ShowMessages(" architecturally defined; showing raw macro output anyway:\n"); + ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u (undefined)\n", + CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidPacket->EDX)); + ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u (undefined)\n", + CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidPacket->EDX)); + } + + ShowMessages(" AnyThreadDeprecation = %s\n\n", + CPUID_EDX_ANY_THREAD_DEPRECATION(CpuidPacket->EDX) ? "TRUE" : "FALSE"); + + break; + + case 0xB: + + // + // Check if this leaf is supported or not + // + if (!CpuidPacket->LeafBSupported) + { + ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n"); + ShowMessages(" Leaf presence check failed: CPUID.0BH:EBX[15:0] == 0 at sub-leaf 0.\n" + " This processor does not implement leaf 0BH (consider leaf 1FH instead).\n\n"); + break; + } + ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidPacket->LeafBMaxSubleaf); + + switch (CPUID_ECX_LEVEL_TYPE(CpuidPacket->ECX)) + { + case 0: + TypeName = "Invalid"; + break; + case 1: + TypeName = "SMT (Hyper-Threading)"; + break; + case 2: + TypeName = "Core"; + break; + default: + TypeName = "Reserved"; + break; + } + + ShowMessages("---- CPUID.(EAX=0BH, ECX=%u) ----\n\n", SubFunctionId); + + // + // ECX: Level number and type + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" LevelNumber (echoes ECX input) = %u\n", + CPUID_ECX_LEVEL_NUMBER(CpuidPacket->ECX)); + ShowMessages(" LevelType = %u (%s)\n\n", + CPUID_ECX_LEVEL_TYPE(CpuidPacket->ECX), + TypeName); + // + // EAX: Shift count + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" X2ApicIdToUniqueTopologyIdShift = %u\n\n", + CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT(CpuidPacket->EAX)); + + // + // EBX: Number of logical processors (diagnostic only) + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" NumberOfLogicalProcessorsAtThisLevelType = %u (DIAGNOSTIC ONLY - do not use for topology enumeration)\n\n", + CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE(CpuidPacket->EBX)); + + // + // EDX: x2APIC ID (constant across all sub-leaves) + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" X2ApicId (current logical processor) = %u\n\n", + CPUID_EDX_X2APIC_ID(CpuidPacket->EDX)); + + break; + + case 0xC: + ShowMessages("==== CPUID.(EAX=0CH) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); + break; + + case 0xD: + ShowMessages("==== CPUID.(EAX=0DH) Processor Extended State Enumeration ====\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = 62 *\n" + " *******************************************************\n\n"); + + if (SubFunctionId == 0) + { + ShowMessages("-- EAX (XCR0 lower 32 bits) --\n\n"); + ShowMessages(" X87State (bit 0) = %s\n", CPUID_EAX_X87_STATE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SSEState (bit 1) = %s\n", CPUID_EAX_SSE_STATE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" AVXState (bit 2) = %s\n", CPUID_EAX_AVX_STATE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" MPXState (bits 4:3) = %u\n", CPUID_EAX_MPX_STATE(CpuidPacket->EAX)); + ShowMessages(" AVX512State (bits 7:5) = %u\n", CPUID_EAX_AVX_512_STATE(CpuidPacket->EAX)); + ShowMessages(" UsedForIa32Xss1 (bit 8) = %s\n", CPUID_EAX_USED_FOR_IA32_XSS_1(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PKRUState (bit 9) = %s\n", CPUID_EAX_PKRU_STATE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" UsedForIa32Xss2 (bit 13) = %s\n\n", CPUID_EAX_USED_FOR_IA32_XSS_2(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" MaxSizeRequiredByEnabledFeaturesInXcr0 = %u bytes\n\n", + CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" MaxSizeOfXsaveXrstorSaveArea = %u bytes\n\n", + CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA(CpuidPacket->ECX)); + ShowMessages("-- EDX (XCR0 upper 32 bits) --\n\n"); + ShowMessages(" Xcr0SupportedBits (bits 63:32 of XCR0) = 0x%08X\n\n", + CPUID_EDX_XCR0_SUPPORTED_BITS(CpuidPacket->EDX)); + } + + else if (SubFunctionId == 1) + { + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SupportsXsavecAndCompactedXrstor (XSAVEC) = %s\n", + CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsXgetbvWithEcx1 = %s\n", + CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsXsaveXrstorAndIa32Xss (XSAVES) = %s\n\n", + CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SizeOfXsaveArea (XCR0 | IA32_XSS enabled) = %u bytes\n", + CPUID_EBX_SIZE_OF_XSAVE_AREAD(CpuidPacket->EBX)); + + ShowMessages("-- ECX (IA32_XSS lower 32 bits) --\n\n"); + ShowMessages(" UsedForXcr01 (bits 7:0) = 0x%02X\n", + CPUID_ECX_USED_FOR_XCR0_1(CpuidPacket->ECX)); + ShowMessages(" PtState (bit 8) = %s\n", + CPUID_ECX_PT_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" UsedForXcr02 (bit 9) = %s\n", + CPUID_ECX_USED_FOR_XCR0_2(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CetUserState (bit 11) = %s\n", + CPUID_ECX_CET_USER_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CetSupervisorState (bit 12) = %s\n", + CPUID_ECX_CET_SUPERVISOR_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" HdcState (bit 13) = %s\n", + CPUID_ECX_HDC_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LbrState (bit 15) = %s\n", + CPUID_ECX_LBR_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" HwpState (bit 16) = %s\n\n", + CPUID_ECX_HWP_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EDX (IA32_XSS upper 32 bits) --\n\n"); + ShowMessages(" SupportedUpperIa32XssBits (bits 63:32) = 0x%08X\n\n", + CPUID_EDX_SUPPORTED_UPPER_IA32_XSS_BITS(CpuidPacket->EDX)); + } + + else if (SubFunctionId >= 2) + { + // + // Check if the user input is valid + // Need to check both XCR0 and IA32_XSS vectors + // + UINT64 ValidBits = CpuidPacket->XCR0Vector | CpuidPacket->IA32_XSS_Vector; + + // + // Validate if this sub-leaf is supported + // + if (((ValidBits >> SubFunctionId) & (UINT64)1) == 0) + { + ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); + ShowMessages(" Valid sub-leaves are those with bits set in:\n"); + ShowMessages(" XCR0 vector: 0x%016llX\n", (ULONG64)CpuidPacket->XCR0Vector); + ShowMessages(" IA32_XSS vector: 0x%016llX\n", (ULONG64)CpuidPacket->IA32_XSS_Vector); + ShowMessages(" Combined vector: 0x%016llX\n\n", (ULONG64)ValidBits); + + break; + } + + ShowMessages("-- State Component Information --\n\n"); + ShowMessages(" SaveAreaSize (EAX) = %u bytes\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidPacket->EAX)); + ShowMessages(" SaveAreaOffset (EBX) = %u bytes\n", + CPUID_EBX_RESERVED(CpuidPacket->EBX)); + ShowMessages(" ManagedViaIa32Xss (ECX bit 0) = %u (%s)\n", + CPUID_ECX_ECX_2(CpuidPacket->ECX), + CPUID_ECX_ECX_2(CpuidPacket->ECX) ? "IA32_XSS" : "XCR0"); + ShowMessages(" Aligned64ByteBoundary (ECX bit 1) = %u%s\n", + CPUID_ECX_ECX_1(CpuidPacket->ECX), + CPUID_ECX_ECX_1(CpuidPacket->ECX) ? " (next 64-byte boundary)" : " (immediately following)"); + ShowMessages(" Reserved (EDX) = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidPacket->EDX)); + } + + break; + + case 0xE: + ShowMessages("==== CPUID.(EAX=0EH) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); + break; + + case 0xF: // 0xF = 15 (decimal); CPUID_INTEL_RESOURCE_DIRECTOR_TECHNOLOGY_MONITORING_INFORMATION + ShowMessages("==== CPUID.(EAX=0FH) Intel RDT Monitoring ====\n\n"); + ShowMessages(" This leaf is not yet implemented in HyperDbg.\n"); + ShowMessages(" (Intel Resource Director Technology - Monitoring)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); + break; + + case 0x10: + ShowMessages("==== CPUID.(EAX=10H, ECX=%u) Intel RDT Allocation Information ====\n\n", SubFunctionId); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = 3 *\n" + " *******************************************************\n\n"); + + if (SubFunctionId == 0) + { + // + // Resource type enumeration + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Ia32PlatformDcaCap = 0x%08X\n\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidPacket->EAX)); + + // + // EBX + // + ShowMessages("-- EBX (Supported Allocation Types) --\n\n"); + ShowMessages(" Raw value = 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" L3 Cache Allocation (bit 1) = %s\n", + CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" L2 Cache Allocation (bit 2) = %s\n", + CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Memory Bandwidth Allocation (bit 3) = %s\n\n", + CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); + } + + else if (SubFunctionId == 1) + { + // + // L3 cache allocation + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidPacket->EAX), + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidPacket->EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" CodeAndDataPriorizationTechnologySupported = %s%s\n\n", + CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidPacket->ECX) ? "TRUE" : "FALSE", + CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidPacket->ECX) ? " (CDP supported)" : ""); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX) + 1); + } + + else if (SubFunctionId == 2) + { + // + // Sub-leaf 2 (L2 Cache Allocation) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidPacket->EAX), + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidPacket->EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX) + 1); + } + + else if (SubFunctionId == 3) + { + // + // Sub-leaf 3 (Memory Bandwidth Allocation) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxMbaThrottlingValue (minus-one) = %u (actual = %u)\n\n", + CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidPacket->EAX), + CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidPacket->EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" ResponseOfDelayIsLinear = %s%s\n", + CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidPacket->ECX) ? "TRUE" : "FALSE", + CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidPacket->ECX) ? " (linear response)" : " (non-linear)\n\n"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX) + 1); + } + + else + { + ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); + ShowMessages(" raw bytes: EAX = %u\n EBX = %u\n ECX = %u\n EDX = %u\n\n", + CpuidPacket->EAX, + CpuidPacket->EBX, + CpuidPacket->ECX, + CpuidPacket->EDX); + } + + break; + + case 0x11: + ShowMessages("==== CPUID.(EAX=11H) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); + break; + + case 0x12: + { + // + // SGX, not DAT. 0x12 = 18 (decimal) + // + ShowMessages("==== CPUID.(EAX=12H) Intel SGX Information ====\n\n"); + + if (!CpuidPacket->Leaf12Supported) + { + ShowMessages(" SGX is not supported on this CPU (CPUID.7H:EBX[2] = 0).\n\n"); + break; + } + + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidPacket->Leaf12MaxSubLeaf); + + if (SubFunctionId == 0) + { + // + // SGX capabilities + // + ShowMessages("-- EAX (SGX Capabilities) --\n\n"); + ShowMessages(" SGX1 Support (bit 0) = %s\n", + CPUID_EAX_SGX1(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX2 Support (bit 1) = %s\n", + CPUID_EAX_SGX2(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ENCLV Advanced (bit 5) = %s\n", + CPUID_EAX_SGX_ENCLV_ADVANCED(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ENCLS Advanced (bit 6) = %s\n\n", + CPUID_EAX_SGX_ENCLS_ADVANCED(CpuidPacket->EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX (MISCSELECT - Extended SGX Features) --\n\n"); + ShowMessages(" Miscselect = 0x%08X\n\n", + CPUID_EBX_MISCSELECT(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + ShowMessages("-- EDX (Maximum Enclave Sizes) --\n\n"); + ShowMessages(" MaxEnclaveSizeNot64 = %u (2^%u = %llu bytes)\n", + CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidPacket->EDX), + CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidPacket->EDX), + (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidPacket->EDX))); + ShowMessages(" MaxEnclaveSize64 = %u (2^%u = %llu bytes)\n\n", + CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidPacket->EDX), + CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidPacket->EDX), + (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidPacket->EDX))); + } + + else if (SubFunctionId == 1) + { + // + // SGX attributes + // + ShowMessages("-- EAX (SECS.ATTRIBUTES[31:0]) --\n\n"); + ShowMessages(" ValidSecsAttributes0 = 0x%08X\n\n", + CPUID_EAX_VALID_SECS_ATTRIBUTES_0(CpuidPacket->EAX)); + + ShowMessages("-- EBX (SECS.ATTRIBUTES[63:32]) --\n\n"); + ShowMessages(" ValidSecsAttributes1 = 0x%08X\n\n", + CPUID_EBX_VALID_SECS_ATTRIBUTES_1(CpuidPacket->EBX)); + + ShowMessages("-- ECX (SECS.ATTRIBUTES[95:64]) --\n\n"); + ShowMessages(" ValidSecsAttributes2 = 0x%08X\n\n", + CPUID_ECX_VALID_SECS_ATTRIBUTES_2(CpuidPacket->ECX)); + + ShowMessages("-- EDX (SECS.ATTRIBUTES[127:96]) --\n\n"); + ShowMessages(" ValidSecsAttributes3 = 0x%08X\n\n", + CPUID_EDX_VALID_SECS_ATTRIBUTES_3(CpuidPacket->EDX)); + } + + else + { + // + // Subleaf 2+ (EPC sections) + // + if (CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX) == 0) + { + // + // Type 0: invalid subleaf + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SubLeafType = %u (Invalid - no EPC section)\n", + CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX)); + + ShowMessages("\n-- EBX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_EBX_ZERO(CpuidPacket->EBX)); + + ShowMessages("\n-- ECX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_ECX_ZERO(CpuidPacket->ECX)); + + ShowMessages("\n-- EDX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_EDX_ZERO(CpuidPacket->EDX)); + } + + else if (CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX) == 1) + { + // + // Reconstruct base address from EAX and EBX + // + UINT64 BaseLow = (UINT64)CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidPacket->EAX); + UINT64 BaseHigh = (UINT64)CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidPacket->EBX); + UINT64 BaseAddress = (BaseHigh << 32) | (BaseLow << 12); + + // + // Reconstruct size from ECX and EDX + // + UINT64 SizeLow = (UINT64)CPUID_ECX_EPC_SIZE_1(CpuidPacket->ECX); + UINT64 SizeHigh = (UINT64)CPUID_EDX_EPC_SIZE_2(CpuidPacket->EDX); + UINT64 SizeBytes = (SizeHigh << 32) | (SizeLow << 12); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SubLeafType = %u (EPC Section)\n", + CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX)); + ShowMessages(" EpcBasePhysicalAddress1 (bits 31:12) = 0x%05X\n\n", + CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidPacket->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" EpcBasePhysicalAddress2 (bits 51:32) = 0x%05X\n\n", + CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" EpcSectionProperty = %u", + CPUID_ECX_EPC_SECTION_PROPERTY(CpuidPacket->ECX)); + switch (CPUID_ECX_EPC_SECTION_PROPERTY(CpuidPacket->ECX)) + { + case 0: + ShowMessages(" (No confidentiality/integrity)\n\n"); + break; + case 1: + ShowMessages(" (Confidentiality and integrity protection)\n\n"); + break; + default: + ShowMessages(" (Reserved)\n\n"); + break; + } + ShowMessages(" EpcSize1 (bits 31:12) = 0x%05X\n\n", + CPUID_ECX_EPC_SIZE_1(CpuidPacket->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" EpcSize2 (bits 51:32) = 0x%05X\n\n", + CPUID_EDX_EPC_SIZE_2(CpuidPacket->EDX)); + + ShowMessages("-- EPC Section Information --\n\n"); + ShowMessages(" Base Address = 0x%016llX\n", (ULONG64)BaseAddress); + ShowMessages(" Size = 0x%016llX bytes (%llu MB)\n\n", + (ULONG64)SizeBytes, + (ULONG64)(SizeBytes / (1024 * 1024))); + } + + else + { + // + // Unknown subleaf type (reserved) + // + ShowMessages("-- Raw Data for Sub-leaf %u (Type %u) --\n\n", + SubFunctionId, + CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX)); + + ShowMessages(" EAX = 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX = 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX = 0x%08X\n\n", CpuidPacket->EDX); + ShowMessages(" Note: Reserved sub-leaf type. Please refer to the latest Intel SDM.\n\n"); + } + } + + break; + } + + case 0x13: + ShowMessages("==== CPUID.(EAX=13H) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); + break; + + case 0x14: + ShowMessages("==== CPUID.(EAX=14H) Intel Processor Trace Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidPacket->LeafEaxMaxSubleaf); + + ShowMessages("==== CPUID.(EAX=14H, ECX=%u) Intel Processor Trace Information ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // main leaf + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSubLeaf = %u\n\n", + CPUID_EAX_MAX_SUB_LEAF(CpuidPacket->EAX)); + + ShowMessages("-- EBX (Supported Features) --\n\n"); + ShowMessages(" CR3Filter support (bit 0) = %s\n", + CPUID_EBX_FLAG0(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Configurable PSB & Cycle-Accurate (bit 1) = %s\n", + CPUID_EBX_FLAG1(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" IP Filtering & TraceStop (bit 2) = %s\n", + CPUID_EBX_FLAG2(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" MTC & COFI suppression (bit 3) = %s\n", + CPUID_EBX_FLAG3(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PTWRITE support (bit 4) = %s\n", + CPUID_EBX_FLAG4(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Power Event Trace (bit 5) = %s\n", + CPUID_EBX_FLAG5(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PSB/PMI preservation (bit 6) = %s\n", + CPUID_EBX_FLAG6(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Event Trace (bit 7) = %s\n", + CPUID_EBX_FLAG7(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Disable TNT (bit 8) = %s\n\n", + CPUID_EBX_FLAG8(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + + ShowMessages("-- ECX (Output Schemes) --\n\n"); + ShowMessages(" ToPA output scheme (bit 0) = %s\n", + CPUID_ECX_FLAG0(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" ToPA tables with any entries (bit 1) = %s\n", + CPUID_ECX_FLAG1(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Single-Range Output scheme (bit 2) = %s\n", + CPUID_ECX_FLAG2(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Trace Transport subsystem (bit 3) = %s\n", + CPUID_ECX_FLAG3(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LIP values include CS base (bit 31) = %s\n\n", + CPUID_ECX_FLAG31(CpuidPacket->ECX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidPacket->EDX)); + } + + else if (SubFunctionId == 1) + { + // + // Packet generation + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" NumberOfConfigurableAddressRangesForFiltering = %u\n", + CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING(CpuidPacket->EAX)); + ShowMessages(" BitmapOfSupportedMtcPeriodEncodings = 0x%04X\n\n", + CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS(CpuidPacket->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" BitmapOfSupportedCycleThresholdValueEncodings = 0x%04X\n", + CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS(CpuidPacket->EBX)); + ShowMessages(" BitmapOfSupportedConfigurablePsbFrequencyEncodings = 0x%04X\n\n", + CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidPacket->EDX)); + } + + else + { + // + // Subleaves > 1 (if they exist) + // + ShowMessages("-- Raw Data for Sub-leaf %u --\n\n", SubFunctionId); + ShowMessages(" EAX = 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX = 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX = 0x%08X\n\n", CpuidPacket->EDX); + ShowMessages(" Note: This sub-leaf may be for future Intel PT features.\n"); + ShowMessages(" Please refer to the latest Intel SDM for interpretation.\n\n"); + } + + break; + + case 0x15: + { + ShowMessages("==== CPUID.(EAX=15H) TSC and Core Crystal Clock Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 15h HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + // + // EAX: Denominator + // + UINT32 Denominator = CPUID_EAX_DENOMINATOR(CpuidPacket->EAX); + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Denominator = %u\n\n", Denominator); + + // + // EBX: Numerator + // + UINT32 Numerator = CPUID_EBX_NUMERATOR(CpuidPacket->EBX); + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Numerator = %u\n\n", Numerator); + + // + // ECX: Nominal frequency (if available) + // + UINT32 NominalFreq = CPUID_ECX_NOMINAL_FREQUENCY(CpuidPacket->ECX); + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NominalFrequency = %u Hz", NominalFreq); + if (NominalFreq > 0) + { + ShowMessages(" (%u MHz, %u GHz)\n", + NominalFreq / 1000000, + NominalFreq / 1000000000); + } + else + { + ShowMessages(" (not enumerated)\n\n"); + } + + // + // EDX: reserved + // + ShowMessages("\n-- EDX --\n"); + ShowMessages(" Reserved = 0x%08X\n", + CPUID_EDX_RESERVED(CpuidPacket->EDX)); + + // + // Calculate and display TSC frequency if possible + // + ShowMessages("-- TSC Frequency Information --\n\n"); + + if (Denominator == 0 || Numerator == 0) + { + ShowMessages(" TSC ratio not enumerated (denominator or numerator is 0)\n\n"); + } + + else + { + ShowMessages(" TSC / Core Crystal Clock ratio = %u / %u\n", + Numerator, + Denominator); + ShowMessages(" TSC frequency = Core Crystal Clock * (%u/%u)\n", + Numerator, + Denominator); + if (NominalFreq > 0) + { + UINT64 TSCFreqHz = (UINT64)NominalFreq * Numerator / Denominator; + ShowMessages(" TSC frequency = %llu Hz (%llu MHz, %llu GHz)\n\n", + (ULONG64)TSCFreqHz, + (ULONG64)(TSCFreqHz / 1000000), + (ULONG64)(TSCFreqHz / 1000000000)); + } + else + { + ShowMessages(" TSC frequency cannot be calculated (nominal frequency not enumerated)\n\n"); + } + } + + break; + } + + case 0x16: + { + ShowMessages("==== CPUID.(EAX=16H) Processor Frequency Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 16h HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX: Processor base frequency + // + UINT32 BaseFreq = CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ(CpuidPacket->EAX); + ShowMessages("-- EAX --\n\n"); + if (BaseFreq == 0) + { + ShowMessages(" ProcessorBaseFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" ProcessorBaseFrequencyMhz = %u MHz\n", BaseFreq); + } + + // + // EBX: Maximum frequency + // + UINT32 MaxFreq = CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ(CpuidPacket->EBX); + ShowMessages("-- EBX --\n\n"); + if (MaxFreq == 0) + { + ShowMessages(" ProcessorMaximumFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" ProcessorMaximumFrequencyMhz = %u MHz\n", MaxFreq); + } + + // + // ECX: Bus (reference) frequency + // + UINT32 BusFreq = CPUID_ECX_BUS_FREQUENCY_MHZ(CpuidPacket->ECX); + ShowMessages("-- ECX --\n\n"); + if (BusFreq == 0) + { + ShowMessages(" BusFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" BusFrequencyMhz = %u MHz\n\n", BusFreq); + } + + // + // EDX: reserved + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidPacket->EDX)); + + // + // Display summary + // + ShowMessages("-- Frequency Summary --\n\n"); + ShowMessages(" Base Frequency: "); + if (BaseFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n", BaseFreq); + } + + // + // Maximum frequency + // + ShowMessages(" Maximum Frequency: "); + if (MaxFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n", MaxFreq); + } + + // + // Bus frequency + // + ShowMessages(" Bus Frequency: "); + if (BusFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n\n", BusFreq); + } + + // + // Show turbo boost if both base and max are supported and max > base + // + if (BaseFreq > 0 && MaxFreq > 0 && MaxFreq > BaseFreq) + { + UINT32 TurboBoost = MaxFreq - BaseFreq; + FLOAT TurboPercent = ((FLOAT)TurboBoost / BaseFreq) * 100.0f; + ShowMessages(" Turbo Boost: %u MHz above base (%.1f%% increase)\n\n", + TurboBoost, + TurboPercent); + } + + ShowMessages(" *******************************************************\n"); + ShowMessages(" * NOTE: These values are for display purposes only *\n"); + ShowMessages(" * They do not reflect actual running frequencies *\n"); + ShowMessages(" * Actual frequencies depend on workload, power, etc. *\n"); + ShowMessages(" *******************************************************\n\n"); + + break; + } + + case 0x17: + { + ShowMessages("==== CPUID.(EAX=17H) SoC Vendor Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CPUID_EAX_MAX_SOC_ID_INDEX(CpuidPacket->EAX)); + + ShowMessages("==== CPUID.(EAX=17H, ECX=%u) SoC Vendor Information ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // Main + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSocIdIndex = %u\n\n", CPUID_EAX_MAX_SOC_ID_INDEX(CpuidPacket->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SocVendorId = 0x%04X\n", + CPUID_EBX_SOC_VENDOR_ID(CpuidPacket->EBX)); + ShowMessages(" IsVendorScheme = %s\n\n", + CPUID_EBX_IS_VENDOR_SCHEME(CpuidPacket->EBX) ? "TRUE (Industry Standard)" : "FALSE (Intel Assigned)"); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" ProjectId = 0x%08X\n\n", + CPUID_ECX_PROJECT_ID(CpuidPacket->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SteppingId = 0x%08X\n\n", + CPUID_EDX_STEPPING_ID(CpuidPacket->EDX)); + } + + else if (SubFunctionId >= 1 && SubFunctionId <= 3) + { + // + // subleaves 1-3 (brand string) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SocVendorBrandString[0..3] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX), + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX) >> 0) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX) >> 8) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX) >> 16) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX) >> 24) & 0xFF); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SocVendorBrandString[4..7] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX), + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX) >> 0) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX) >> 8) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX) >> 16) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX) >> 24) & 0xFF); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" SocVendorBrandString[8..11] = 0x%08X (%c%c%c%c)\n\n", + CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX), + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX) >> 0) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX) >> 8) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX) >> 16) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX) >> 24) & 0xFF); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SocVendorBrandString[12..15] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX), + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX) >> 0) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX) >> 8) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX) >> 16) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX) >> 24) & 0xFF); + } + + else + { + // + // Sub-leaves > MaxSOCID_Index (Reserved, should return all zeros) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); + } + break; + } + + case 0x18: + // + // DAT, 0x18 = 24 (decimal) + // + ShowMessages("==== CPUID.(EAX=18H) Deterministic Address Translation Parameters ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidPacket->LeafEaxMaxSubleaf); + + ShowMessages("==== CPUID.(EAX=18H, ECX=%u) Deterministic Address Translation Parameters ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // main + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSubLeaf = %u\n\n", CPUID_EAX_MAX_SUB_LEAF(CpuidPacket->EAX)); + + // + // EBX: Page size support and associativity + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" PageEntries4KbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries2MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries4MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries1GbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Partitioning = %u%s\n", + CPUID_EBX_PARTITIONING(CpuidPacket->EBX), + CPUID_EBX_PARTITIONING(CpuidPacket->EBX) == 0 ? " (soft partitioning)" : ""); + ShowMessages(" WaysOfAssociativity (W) = %u\n\n", + CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00(CpuidPacket->EBX)); + + // + // ECX: Number of Sets + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NumberOfSets = %u\n\n", + CPUID_ECX_NUMBER_OF_SETS(CpuidPacket->ECX)); + + // + // EDX: Translation cache type and properties + // + ShowMessages("-- EDX --\n\n"); + + switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX)) + { + case 0: + TypeName = "Null (sub-leaf not valid)"; + break; + case 1: + TypeName = "Data TLB"; + break; + case 2: + TypeName = "Instruction TLB"; + break; + case 3: + TypeName = "Unified TLB"; + break; + default: + TypeName = "Reserved"; + break; + } + ShowMessages(" TranslationCacheTypeField = %u (%s)\n", + CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX), + TypeName); + ShowMessages(" TranslationCacheLevel = %u\n", + CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidPacket->EDX)); + ShowMessages(" FullyAssociativeStructure = %s%s\n", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidPacket->EDX) ? "TRUE" : "FALSE", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidPacket->EDX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidPacket->EDX), + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidPacket->EDX) + 1); + } + + else + { + // + // subleaves >= 1 (Translation Structure Information) + // + + // + // Check if this sub-leaf is valid (EDX[4:0] != 0) + // + if (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX) == 0) + { + ShowMessages(" Sub-leaf %u is invalid (TranslationCacheTypeField = 0)\n", SubFunctionId); + ShowMessages(" All registers should be zero according to spec:\n"); + ShowMessages(" EAX = 0x%08X\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); + ShowMessages(" EBX = 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX = 0x%08X\n", CpuidPacket->EDX); + } + + else + { + // + // EAX: Reserved for sub-leaves >= 1 + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); + + // + // EBX: Page size support and associativity + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" PageEntries4KbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries2MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries4MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries1GbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Partitioning = %u%s\n", + CPUID_EBX_PARTITIONING(CpuidPacket->EBX), + CPUID_EBX_PARTITIONING(CpuidPacket->EBX) == 0 ? " (soft partitioning)" : ""); + ShowMessages(" WaysOfAssociativity (W) = %u\n\n", + CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01(CpuidPacket->EBX)); + + // ECX: Number of Sets + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NumberOfSets = %u\n\n", + CPUID_ECX_NUMBER_OF_SETS(CpuidPacket->ECX)); + + // EDX: Translation cache type and properties + ShowMessages("-- EDX --\n\n"); + switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX)) + { + case 0: + TypeName = "Null (sub-leaf not valid)"; + break; + case 1: + TypeName = "Data TLB"; + break; + case 2: + TypeName = "Instruction TLB"; + break; + case 3: + TypeName = "Unified TLB"; + break; + default: + TypeName = "Reserved"; + break; + } + ShowMessages(" TranslationCacheTypeField = %u (%s)\n", + CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX), + TypeName); + ShowMessages(" TranslationCacheLevel = %u\n", + CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidPacket->EDX)); + ShowMessages(" FullyAssociativeStructure = %s%s\n", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidPacket->EDX) ? "TRUE" : "FALSE", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidPacket->EDX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidPacket->EDX), + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidPacket->EDX) + 1); + } + } + + break; + + case 0x80000000: + ShowMessages("==== CPUID.(EAX=80000000H) Extended Function Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000000 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxExtendedFunctions = 0x%08X (%u)\n\n", + CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidPacket->EAX), + CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidPacket->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); + + break; + + case 0x80000001: + ShowMessages("==== CPUID.(EAX=80000001H) Extended CPU Signature ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000001 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" LAHF/SAHF Available in 64-bit Mode = %s\n", + CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE(CpuidPacket->ECX) ? "True" : "False"); + ShowMessages(" LZCNT = %s\n", + CPUID_ECX_LZCNT(CpuidPacket->ECX) ? "True" : "False"); + ShowMessages(" PREFETCHW = %s\n\n", + CPUID_ECX_PREFETCHW(CpuidPacket->ECX) ? "True" : "False"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SYSCALL/SYSRET Available in 64-bit Mode = %s\n", + CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE(CpuidPacket->EDX) ? "True" : "False"); + ShowMessages(" Execute Disable Bit Available = %s\n", + CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE(CpuidPacket->EDX) ? "True" : "False"); + ShowMessages(" 1-GByte Pages Available = %s\n", + CPUID_EDX_PAGES_1GB_AVAILABLE(CpuidPacket->EDX) ? "True" : "False"); + ShowMessages(" RDTSCP Available = %s\n", + CPUID_EDX_RDTSCP_AVAILABLE(CpuidPacket->EDX) ? "True" : "False"); + ShowMessages(" Intel 64 Architecture Available = %s\n\n", + CPUID_EDX_IA64_AVAILABLE(CpuidPacket->EDX) ? "True" : "False"); + + break; + // + // 0x80000002-0x80000004 - Processor brand string + // + case 0x80000002: + case 0x80000003: + case 0x80000004: + { + ShowMessages("==== CPUID.(EAX=80000002H-80000004H) Processor Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000002-4 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + ShowMessages(" Brand String = \"%s\"\n\n", CpuidPacket->BrandString); + + break; + } + case 0x80000005: + ShowMessages("EAX = 0x80000005: not implemented.\n"); + break; + + case 0x80000006: + { + ShowMessages("==== CPUID.(EAX=80000006H) Extended Cache Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000006 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); + + ShowMessages("-- ECX (L2 Cache Information) --\n"); + + UINT32 LineSize = CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES(CpuidPacket->ECX); + UINT32 Assoc = CPUID_ECX_L2_ASSOCIATIVITY_FIELD(CpuidPacket->ECX); + UINT32 CacheSize = CPUID_ECX_CACHE_SIZE_IN_1K_UNITS(CpuidPacket->ECX); + + // + // decode associativity + // + switch (Assoc) + { + case 0x00: + AssocName = "Disabled"; + break; + case 0x01: + AssocName = "Direct mapped"; + break; + case 0x02: + AssocName = "2-way"; + break; + case 0x04: + AssocName = "4-way"; + break; + case 0x06: + AssocName = "8-way"; + break; + case 0x08: + AssocName = "16-way"; + break; + case 0x0F: + AssocName = "Fully associative"; + break; + default: + AssocName = "Reserved"; + break; + } + ShowMessages(" CacheLineSizeInBytes = %u bytes\n", LineSize); + ShowMessages(" L2AssociativityField = 0x%02X (%s)\n", Assoc, AssocName); + ShowMessages(" CacheSizeIn1KUnits = %u KB (%u MB)\n", + CacheSize, + CacheSize / 1024); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); + + break; + } + + case 0x80000007: + ShowMessages("==== CPUID.(EAX=80000007H) Extended Time Stamp Counter ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000007 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" InvariantTscAvailable = %u%s\n\n", + CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidPacket->EDX), + CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidPacket->EDX) ? " (TSC runs at constant rate)" : ""); + + break; + + case 0x80000008: + { + ShowMessages("==== CPUID.(EAX=80000008H) Virtual & Physical Address Sizes ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000008 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + UINT32 PhysicalBits = CPUID_EAX_NUMBER_OF_PHYSICAL_ADDRESS_BITS(CpuidPacket->EAX); + UINT32 LinearBits = CPUID_EAX_NUMBER_OF_LINEAR_ADDRESS_BITS(CpuidPacket->EAX); + + ShowMessages(" NumberOfPhysicalAddressBits = %u (max physical address = 2^%u = %llu bytes)\n", + PhysicalBits, + PhysicalBits, + (ULONG64)(1ULL << PhysicalBits)); + ShowMessages(" NumberOfLinearAddressBits = %u (max linear address = 2^%u = %llu bytes)\n", + LinearBits, + LinearBits, + (ULONG64)(1ULL << LinearBits)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); + + break; + } + + default: + ShowMessages("==== CPUID.(EAX=%08XH) ====\n\n", FunctionId); + ShowMessages(" CPUID leaf 0x%08X is not implemented in HyperDbg.\n", FunctionId); + ShowMessages(" You can decode the raw values yourself:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); + } + } + else + { + ShowErrorMessage(CpuidPacket->KernelStatus); + } + + // + // Signal the event relating to receiving result of CPUID + // + DbgReceivedKernelResponse(DEBUGGER_SYNCRONIZATION_OBJECT_KERNEL_DEBUGGER_USER_CPUID_RESULT); + + break; + case DEBUGGER_REMOTE_PACKET_REQUESTED_ACTION_DEBUGGEE_RESULT_OF_CALLSTACK: CallstackPacket = (DEBUGGER_CALLSTACK_REQUEST *)(((CHAR *)TheActualPacket) + sizeof(DEBUGGER_REMOTE_PACKET)); diff --git a/hyperdbg/libhyperdbg/ucpuid.cpp b/hyperdbg/libhyperdbg/ucpuid.cpp new file mode 100644 index 00000000..a8ffe97e --- /dev/null +++ b/hyperdbg/libhyperdbg/ucpuid.cpp @@ -0,0 +1,2187 @@ +/** + * @file ucpuid.cpp + * @author Sina Karvandi (sina@hyperdbg.org) + * @author Nikzad (Hossein Shirdel) + * @brief ucpuid command - reads and decodes USER specified CPUID information + * @details + * @version 0.1 + * @date 2026-06-18 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#include "pch.h" + +// +// Global Variables +// +extern BOOLEAN g_IsKdModuleLoaded; +extern BOOLEAN g_IsSerialConnectedToRemoteDebuggee; + +/** + * @brief help of the cpuid command + * + * @return VOID + */ +VOID +CommandUserCpuidHelp() +{ + ShowMessages("ucpuid : reads CPUID information.\n\n"); + ShowMessages("syntax : \tucpuid [Function] [SubFunction]\n\n"); + ShowMessages("\t\te.g : ucpuid 1\n"); + ShowMessages("\t\te.g : ucpuid 4 2\n"); + ShowMessages("\t\te.g : ucpuid D 0\n"); + ShowMessages("\t\te.g : ucpuid 0x80000008 0\n\n"); + ShowMessages(" # Input Formats:\n"); + ShowMessages(" - Hex (default): No prefix needed. Examples: 1, 4, D, 0x80000008\n"); + ShowMessages(" - Decimal: Use 'n' prefix. Examples: n10, n15, n2147483648\n"); + ShowMessages(" - Decimal: Use '0n' prefix. Examples: 0n10, 0n15\n\n"); + ShowMessages(" # Notes:\n"); + ShowMessages(" - Function IDs are 32-bit values (max 0xFFFFFFFF / 4294967295).\n"); + ShowMessages(" - Extended function IDs range: 0x80000000 - 0x8FFFFFFF.\n"); + ShowMessages(" - Values beyond 0xFFFFFFFF are automatically rejected.\n"); + ShowMessages(" - Use `ucpuid 0` to see the maximum supported CPUID leaf.\n"); + ShowMessages(" - Use `ucpuid 0x80000000` to see the maximum supported extended leaf.\n\n"); +} + +/** + * @brief cpuid command handler + * + * @return VOID + */ +VOID +CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) +{ + BOOL Status; + ULONG ReturnedLength; + DEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest = {0}; + CpuidRequest.FunctionId = FunctionId; + CpuidRequest.SubFunctionId = SubFunctionId; + + if (g_IsSerialConnectedToRemoteDebuggee) + { + // + // It's on a debugger mode + // + KdSendUserCpuidPacketToDebuggee(FunctionId, SubFunctionId); + return; + } + else + { + // + // It's on a local debugging mode + // + AssertShowMessageReturnStmt(g_IsKdModuleLoaded, g_DeviceHandle, ASSERT_MESSAGE_KD_NOT_LOADED, ASSERT_MESSAGE_DRIVER_NOT_LOADED, AssertReturn); + + + + // + // By the way, we don't need to send an input buffer + // to the kernel, but let's keep it like this, if we + // want to pass some other arguments to the kernel in + // the future + // + Status = DeviceIoControl( + g_DeviceHandle, // Handle to device + IOCTL_DEBUGGER_CPUID, // IO Control Code (IOCTL) + &CpuidRequest, // Input Buffer to driver. + SIZEOF_DEBUGGER_CPUID_REQUEST_RESPONSE, // Input buffer length + &CpuidRequest, // Output Buffer from driver. + SIZEOF_DEBUGGER_CPUID_REQUEST_RESPONSE, // Length of output buffer in + // bytes. + &ReturnedLength, // Bytes placed in buffer. + NULL // synchronous call + ); + + CONST CHAR * TypeName = NULL; + CONST CHAR * AssocName; + + if (!Status) + { + ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + return; + } + + if (CpuidRequest.KernelStatus == DEBUGGER_OPERATION_WAS_SUCCESSFUL) + { + switch (FunctionId) + { + case 0x0: + { + CHAR Vendor[13] = {0}; + memcpy(&Vendor[0], &CpuidRequest.EBX, 4); + memcpy(&Vendor[4], &CpuidRequest.EDX, 4); + memcpy(&Vendor[8], &CpuidRequest.ECX, 4); + Vendor[12] = '\0'; + + ShowMessages(" *******************************************************\n" + " * LEAF 0 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages(" Vendor : %s\n", Vendor); + ShowMessages(" Maximum supported basic leaf : %u\n", CpuidRequest.EAX); + + break; + } + case 0x1: + // + // EAX + // + ShowMessages("==== CPUID.(EAX=01H) Version / Additional / Feature Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 1 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX: Version Information --\n\n"); + ShowMessages(" SteppingId = %u\n", + CPUID_VERSION_INFORMATION_STEPPING_ID(CpuidRequest.EAX)); + ShowMessages(" Model = %u\n", + CPUID_VERSION_INFORMATION_MODEL(CpuidRequest.EAX)); + ShowMessages(" FamilyId = %u\n", + CPUID_VERSION_INFORMATION_FAMILY_ID(CpuidRequest.EAX)); + ShowMessages(" ProcessorType = %u\n", + CPUID_VERSION_INFORMATION_PROCESSOR_TYPE(CpuidRequest.EAX)); + ShowMessages(" ExtendedModelId = %u\n", + CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID(CpuidRequest.EAX)); + ShowMessages(" ExtendedFamilyId = %u\n\n", + CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID(CpuidRequest.EAX)); + + // + // EBX: additional information + // + ShowMessages("-- EBX: Additional Information --\n\n"); + ShowMessages(" BrandIndex = %u\n", + CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX(CpuidRequest.EBX)); + ShowMessages(" ClflushLineSize = %u (cache line = %u bytes)\n", + CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidRequest.EBX), + CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidRequest.EBX) * 8); + ShowMessages(" MaxAddressableIds = %u\n", + CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS(CpuidRequest.EBX)); + ShowMessages(" InitialApicId = %u\n\n", + CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID(CpuidRequest.EBX)); + + // + // ECX: feature information + // + ShowMessages("-- ECX: Feature Information --\n\n"); + ShowMessages(" SSE3 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PCLMULQDQ = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" DTES64 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MONITOR/MWAIT = %s\n", + CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CPL Qualified DS = %s\n", + CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VMX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SMX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" EIST (SpeedStep) = %s\n", + CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TM2 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSSE3 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" L1 Context ID = %s\n", + CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Silicon Debug = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" FMA = %s\n", + CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CMPXCHG16B = %s\n", + CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" xTPR Update Control = %s\n", + CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PDCM = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PCID = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" DCA = %s\n", + CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE4.1 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE4.2 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" x2APIC = %s\n", + CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVBE = %s\n", + CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" POPCNT = %s\n", + CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TSC-Deadline = %s\n", + CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AESNI = %s\n", + CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" XSAVE/XRSTOR = %s\n", + CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" OSXSAVE = %s\n", + CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" F16C = %s\n", + CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" RDRAND = %s\n\n", + CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + + // + // EDX: feature information + // + ShowMessages("-- EDX: Feature Information --\n\n"); + ShowMessages(" FPU = %s\n", + CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" VME = %s\n", + CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" DE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" TSC = %s\n", + CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MSR (RDMSR/WRMSR) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PAE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MCE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CX8 (CMPXCHG8B) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" APIC On-Chip = %s\n", + CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SEP (SYSENTER/EXIT) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MTRR = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PGE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MCA = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CMOV = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PAT = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSE-36 = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSN = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CLFSH = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CLFLUSH(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" DS (Debug Store) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" ACPI (Thermal/Clock) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MMX = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" FXSR (FXSAVE/FXRSTOR) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE2 = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SS (Self Snoop) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" HTT = %s\n", + CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" TM (Thermal Monitor) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PBE = %s\n\n", + CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + + break; + + case 0x2: + ShowMessages("==== CPUID.(EAX=02H) Legacy Cache Descriptor ====\n\n"); + ShowMessages(" This leaf is deprecated and returns legacy cache information.\n"); + ShowMessages(" Use CPUID.(EAX=04H) for deterministic cache parameters instead.\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); + break; + + case 0x3: + ShowMessages("==== CPUID.(EAX=03H) ====\n\n"); + ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); + ShowMessages(" (Was previously used for Processor Serial Number on older CPUs)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); + break; + + case 0x4: + { + UINT32 LineSize = CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE(CpuidRequest.EBX); + UINT32 Partitions = CPUID_EBX_PHYSICAL_LINE_PARTITIONS(CpuidRequest.EBX); + UINT32 Ways = CPUID_EBX_WAYS_OF_ASSOCIATIVITY(CpuidRequest.EBX); + UINT32 Sets = CPUID_ECX_NUMBER_OF_SETS(CpuidRequest.ECX); + UINT64 CacheSizeBytes = (UINT64)(Ways + 1) * + (UINT64)(Partitions + 1) * + (UINT64)(LineSize + 1) * + (UINT64)(Sets + 1); + ShowMessages("==== CPUID.(EAX=04H) Deterministic Cache Parameters ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest.Leaf4MaxSubLeaf); + + ShowMessages("---- CPUID.(EAX=04H, ECX=%u) ----\n\n", SubFunctionId); + + // + // EAX + // + switch (CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest.EAX)) + { + case 0: + TypeName = "Null (no more caches)"; + break; + case 1: + TypeName = "Data Cache"; + break; + case 2: + TypeName = "Instruction Cache"; + break; + case 3: + TypeName = "Unified Cache"; + break; + default: + TypeName = "Reserved"; + break; + } + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" CacheTypeField = %u (%s)\n", + CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest.EAX), + TypeName); + + if (CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest.EAX) == 0) + { + ShowMessages(" (no more caches; stopping enumeration)\n\n"); + break; + } + + ShowMessages(" CacheLevel = %u\n", + CPUID_EAX_CACHE_LEVEL(CpuidRequest.EAX)); + ShowMessages(" SelfInitializingCacheLevel = %s\n", + CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" FullyAssociativeCache = %s%s\n", + CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidRequest.EAX) ? "TRUE" : "FALSE", + CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidRequest.EAX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIds(LogicalProcs) (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidRequest.EAX), + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidRequest.EAX) + 1); + ShowMessages(" MaxAddressableIds(Cores) (raw) = %u -> actual = %u (raw + 1)\n\n", + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidRequest.EAX), + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidRequest.EAX) + 1); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + + ShowMessages(" SystemCoherencyLineSize (raw) = %u -> actual = %u bytes (raw + 1)\n", + LineSize, + LineSize + 1); + ShowMessages(" PhysicalLinePartitions (raw) = %u -> actual = %u (raw + 1)\n", + Partitions, + Partitions + 1); + ShowMessages(" WaysOfAssociativity (raw) = %u -> actual = %u (raw + 1)\n\n", + Ways, + Ways + 1); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + + ShowMessages(" NumberOfSets (raw) = %u -> actual = %u (raw + 1)\n\n", + Sets, + Sets + 1); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" WriteBackInvalidate = %s\n", + CPUID_EDX_WRITE_BACK_INVALIDATE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CacheInclusiveness = %s%s\n", + CPUID_EDX_CACHE_INCLUSIVENESS(CpuidRequest.EDX) ? "TRUE" : "FALSE", + CPUID_EDX_CACHE_INCLUSIVENESS(CpuidRequest.EDX) ? " (inclusive of lower levels)" : ""); + ShowMessages(" ComplexCacheIndexing = %s%s\n\n", + CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidRequest.EDX) ? "TRUE" : "FALSE", + CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidRequest.EDX) ? " (complex/hashed indexing)" : " (direct mapped)"); + + // + // Cache Size Calculation (from spec formula) + // + ShowMessages("-- Cache Size --\n\n"); + ShowMessages(" Cache Size (per spec formula) = %llu bytes (%llu KB, %llu MB)\n\n", + (ULONG64)CacheSizeBytes, + (ULONG64)(CacheSizeBytes / 1024), + (ULONG64)(CacheSizeBytes / (1024 * 1024))); + + break; + } + case 0x5: + ShowMessages("==== CPUID.(EAX=05H) MONITOR/MWAIT Leaf ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 5 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SmallestMonitorLineSize = %u bytes\n\n", + CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE(CpuidRequest.EAX)); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" LargestMonitorLineSize = %u bytes\n\n", + CPUID_EBX_LARGEST_MONITOR_LINE_SIZE(CpuidRequest.EBX)); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" EnumerationOfMonitorMwaitExtensions = %s\n", + CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsTreatingInterruptsAsBreakEventForMwait = %s\n\n", + CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" NumberOfC0SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES(CpuidRequest.EDX)); + ShowMessages(" NumberOfC1SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES(CpuidRequest.EDX)); + ShowMessages(" NumberOfC2SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES(CpuidRequest.EDX)); + ShowMessages(" NumberOfC3SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES(CpuidRequest.EDX)); + ShowMessages(" NumberOfC4SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES(CpuidRequest.EDX)); + ShowMessages(" NumberOfC5SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES(CpuidRequest.EDX)); + ShowMessages(" NumberOfC6SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES(CpuidRequest.EDX)); + ShowMessages(" NumberOfC7SubCStates = %u\n\n", CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES(CpuidRequest.EDX)); + + break; + + case 0x6: + ShowMessages("==== CPUID.(EAX=06H) Thermal and Power Management Leaf ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 6 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" TemperatureSensorSupported = %s\n", + CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" IntelTurboBoostTechnologyAvailable = %s\n", + CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ARAT (ApicTimerAlwaysRunning) = %s\n", + CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PLN (PowerLimitNotification) = %s\n", + CPUID_EAX_POWER_LIMIT_NOTIFICATION(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ECMD (ClockModulationDuty) = %s\n", + CPUID_EAX_CLOCK_MODULATION_DUTY(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PTM (PackageThermalManagement) = %s\n", + CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP Base Registers = %s\n", + CPUID_EAX_HWP_BASE_REGISTERS(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Notification = %s\n", + CPUID_EAX_HWP_NOTIFICATION(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Activity_Window = %s\n", + CPUID_EAX_HWP_ACTIVITY_WINDOW(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Energy_Performance_Preference = %s\n", + CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Package_Level_Request = %s\n", + CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HDC = %s\n", + CPUID_EAX_HDC(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Turbo Boost Max Technology 3.0 = %s\n", + CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP Capabilities = %s\n", + CPUID_EAX_HWP_CAPABILITIES(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP PECI Override = %s\n", + CPUID_EAX_HWP_PECI_OVERRIDE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Flexible HWP = %s\n", + CPUID_EAX_FLEXIBLE_HWP(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Fast Access Mode for HWP Request MSR = %s\n", + CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Ignoring Idle Logical Proc HWP Request = %s\n", + CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Thread Director = %s\n\n", + CPUID_EAX_INTEL_THREAD_DIRECTOR(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" NumberOfInterruptThresholdsInThermalSensor = %u\n\n", + CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR(CpuidRequest.EBX)); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" HardwareCoordinationFeedbackCapability = %s\n", + CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" NumberOfIntelThreadDirectorClasses (bit) = %s\n", + CPUID_ECX_NUMBER_OF_INTEL_THREAD_DIRECTOR_CLASSES(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PerformanceEnergyBiasPreference = %u\n\n", + CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE(CpuidRequest.ECX)); + + // + // EDX + // EDX is fully reserved for this leaf; still routed through its macro for consistency. + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); + + break; + + case 0x7: + ShowMessages("==== CPUID.(EAX=07H) Structured Extended Feature Flags ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest.LeafEaxMaxSubleaf); + + if (SubFunctionId == 0) + { + ShowMessages("---- CPUID.(EAX=07H, ECX=%u) ----\n\n", SubFunctionId); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" NumberOfSubLeaves (max ECX input) = %u\n\n", CPUID_EAX_NUMBER_OF_SUB_LEAVES(CpuidRequest.EAX)); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" FSGSBASE = %s\n", CPUID_EBX_FSGSBASE(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_TSC_ADJUST MSR = %s\n", CPUID_EBX_IA32_TSC_ADJUST_MSR(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX = %s\n", CPUID_EBX_SGX(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" BMI1 = %s\n", CPUID_EBX_BMI1(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" HLE = %s\n", CPUID_EBX_HLE(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX2 = %s\n", CPUID_EBX_AVX2(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" FDP_EXCPTN_ONLY = %s\n", CPUID_EBX_FDP_EXCPTN_ONLY(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SMEP = %s\n", CPUID_EBX_SMEP(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" BMI2 = %s\n", CPUID_EBX_BMI2(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Enhanced REP MOVSB/STOSB = %s\n", CPUID_EBX_ENHANCED_REP_MOVSB_STOSB(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" INVPCID = %s\n", CPUID_EBX_INVPCID(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RTM = %s\n", CPUID_EBX_RTM(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDT-M (Monitoring) = %s\n", CPUID_EBX_RDT_M(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Deprecates FPU CS/DS = %s\n", CPUID_EBX_DEPRECATES(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" MPX = %s\n", CPUID_EBX_MPX(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDT-A (Allocation) = %s\n", CPUID_EBX_RDT(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512F = %s\n", CPUID_EBX_AVX512F(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512DQ = %s\n", CPUID_EBX_AVX512DQ(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDSEED = %s\n", CPUID_EBX_RDSEED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" ADX = %s\n", CPUID_EBX_ADX(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SMAP = %s\n", CPUID_EBX_SMAP(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_IFMA = %s\n", CPUID_EBX_AVX512_IFMA(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" CLFLUSHOPT = %s\n", CPUID_EBX_CLFLUSHOPT(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" CLWB = %s\n", CPUID_EBX_CLWB(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Processor Trace = %s\n", CPUID_EBX_INTEL(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512PF (Xeon Phi only) = %s\n", CPUID_EBX_AVX512PF(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512ER (Xeon Phi only) = %s\n", CPUID_EBX_AVX512ER(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512CD = %s\n", CPUID_EBX_AVX512CD(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SHA = %s\n", CPUID_EBX_SHA(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512BW = %s\n", CPUID_EBX_AVX512BW(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512VL = %s\n\n", CPUID_EBX_AVX512VL(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" PREFETCHWT1 (Xeon Phi only) = %s\n", CPUID_ECX_PREFETCHWT1(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VBMI = %s\n", CPUID_ECX_AVX512_VBMI(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" UMIP = %s\n", CPUID_ECX_UMIP(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PKU = %s\n", CPUID_ECX_PKU(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" OSPKE = %s\n", CPUID_ECX_OSPKE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" WAITPKG = %s\n", CPUID_ECX_WAITPKG(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VBMI2 = %s\n", CPUID_ECX_AVX512_VBMI2(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CET_SS (shadow stack) = %s\n", CPUID_ECX_CET_SS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" GFNI = %s\n", CPUID_ECX_GFNI(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VAES = %s\n", CPUID_ECX_VAES(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VPCLMULQDQ = %s\n", CPUID_ECX_VPCLMULQDQ(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VNNI = %s\n", CPUID_ECX_AVX512_VNNI(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_BITALG = %s\n", CPUID_ECX_AVX512_BITALG(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TME_EN = %s\n", CPUID_ECX_TME_EN(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VPOPCNTDQ = %s\n", CPUID_ECX_AVX512_VPOPCNTDQ(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LA57 (5-level paging) = %s\n", CPUID_ECX_LA57(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MAWAU (BNDLDX/BNDSTX) = %u (NOT BOOLEAN)\n", CPUID_ECX_MAWAU(CpuidRequest.ECX)); + ShowMessages(" RDPID = %s\n", CPUID_ECX_RDPID(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" KL (Key Locker) = %s\n", CPUID_ECX_KL(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CLDEMOTE = %s\n", CPUID_ECX_CLDEMOTE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVDIRI = %s\n", CPUID_ECX_MOVDIRI(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVDIR64B = %s\n", CPUID_ECX_MOVDIR64B(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX_LC (Launch Config) = %s\n", CPUID_ECX_SGX_LC(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PKS = %s\n\n", CPUID_ECX_PKS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" AVX512_4VNNIW (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4VNNIW(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_4FMAPS (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4FMAPS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" Fast Short REP MOV = %s\n", CPUID_EDX_FAST_SHORT_REP_MOV(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VP2INTERSECT = %s\n", CPUID_EDX_AVX512_VP2INTERSECT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MD_CLEAR = %s\n", CPUID_EDX_MD_CLEAR(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SERIALIZE = %s\n", CPUID_EDX_SERIALIZE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" Hybrid part = %s\n", CPUID_EDX_HYBRID(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PCONFIG = %s\n", CPUID_EDX_PCONFIG(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CET_IBT (branch tracking) = %s\n", CPUID_EDX_CET_IBT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IBRS/IBPB = %s\n", CPUID_EDX_IBRS_IBPB(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" STIBP = %s\n", CPUID_EDX_STIBP(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" L1D_FLUSH = %s\n", CPUID_EDX_L1D_FLUSH(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_ARCH_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_ARCH_CAPABILITIES(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_CORE_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_CORE_CAPABILITIES(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSBD = %s\n\n", CPUID_EDX_SSBD(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + } + else + { + // + // This header only defines the EBX/ECX/EDX bitfield layout for sub-leaf + // (ECX) = 0. If the processor reports further sub-leaves, decoding them + // with the sub-leaf-0 struct would silently misinterpret the bits, so + // instead their raw dwords are printed undecoded - consistent with this + // file's rule of only reading a field through a macro that's actually + // defined for it. + // + ShowMessages(" No bitfield macros are defined for these in ia32.h, so their\n"); + ShowMessages(" raw dwords are shown without decoding:\n"); + ShowMessages(" ECX=%u: EAX=0x%08X EBX=0x%08X ECX=0x%08X EDX=0x%08X\n\n", + SubFunctionId, + CpuidRequest.EAX, + CpuidRequest.EBX, + CpuidRequest.ECX, + CpuidRequest.EDX); + } + + break; + + case 0x8: + ShowMessages("==== CPUID.(EAX=08H) ====\n\n"); + ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); + ShowMessages(" (Was previously used for Processor Serial Number on some CPUs)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n", CpuidRequest.EDX); + break; + + case 0x9: + ShowMessages("==== CPUID.(EAX=09H) Direct Cache Access Information ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 9 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX mirrors IA32_PLATFORM_DCA_CAP[31:0] verbatim. ia32.h doesn't split + // it into sub-fields here (those bit meanings live in the MSR's own + // spec, not in this CPUID leaf), so it's read through its single + // whole-dword macro and shown as raw hex rather than decoded further. + // + ShowMessages(" IA32_PLATFORM_DCA_CAP (EAX, mirrors MSR 1F8H) = 0x%08X\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest.EAX)); + + // + // EBX/ECX/EDX are fully reserved for this leaf. + // + ShowMessages(" Reserved (EBX) = 0x%08X\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); + ShowMessages(" Reserved (ECX) = 0x%08X\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); + ShowMessages(" Reserved (EDX) = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); + + break; + + case 0xA: + ShowMessages("==== CPUID.(EAX=0AH) Architectural Performance Monitoring Leaf ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 10 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX) == 0) + { + // + // Per the spec: architectural perfmon is only supported if VersionId > 0. + // At version 0 the rest of this leaf isn't architecturally meaningful, so stop here + // + ShowMessages(" VersionId = 0 -> architectural performance monitoring not supported;\n" + " remaining fields in this leaf are not architecturally defined.\n\n"); + + break; + } + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" VersionId = %u\n", + CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX)); + ShowMessages(" NumberOfCountersPerLogicalProcessor = %u\n", + CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR(CpuidRequest.EAX)); + ShowMessages(" BitWidthOfPerformanceMonitoringCounter = %u\n", + CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER(CpuidRequest.EAX)); + ShowMessages(" EbxBitVectorLength = %u\n\n", + CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest.EAX)); + + // + // EBX + // + ShowMessages("-- EBX (bit = 1 means the event is NOT available) --\n\n"); + ShowMessages(" CoreCycleEventNotAvailable = %u\n", + CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); + ShowMessages(" InstructionRetiredEventNotAvailable = %u\n", + CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); + ShowMessages(" ReferenceCyclesEventNotAvailable = %u\n", + CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); + ShowMessages(" LastLevelCacheReferenceEventNotAvailable = %u\n", + CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); + ShowMessages(" LastLevelCacheMissesEventNotAvailable = %u\n", + CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); + ShowMessages(" BranchInstructionRetiredEventNotAvailable = %u\n", + CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); + ShowMessages(" BranchMispredictRetiredEventNotAvailable = %u\n\n", + CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); + + if (CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest.EAX) < 7) + { + ShowMessages(" NOTE: EbxBitVectorLength=%u (<7): bits at/after this length are not\n" + " architecturally defined on this CPU; treat them as unreliable.\n", + CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest.EAX)); + } + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + // + // EDX: fixed-function counter fields only defined if VersionId > 1 + // + ShowMessages("-- EDX --\n\n"); + if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX) > 1) + { + ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u\n", + CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest.EDX)); + ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u\n\n", + CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest.EDX)); + } + else + { + ShowMessages(" NOTE: VersionId=%u (<=1): fixed-function counter fields are not\n", + CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX)); + ShowMessages(" architecturally defined; showing raw macro output anyway:\n"); + ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u (undefined)\n", + CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest.EDX)); + ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u (undefined)\n", + CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest.EDX)); + } + + ShowMessages(" AnyThreadDeprecation = %s\n\n", + CPUID_EDX_ANY_THREAD_DEPRECATION(CpuidRequest.EDX) ? "TRUE" : "FALSE"); + + break; + + case 0xB: + + // + // Check if this leaf is supported or not + // + if (!CpuidRequest.LeafBSupported) + { + ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n"); + ShowMessages(" Leaf presence check failed: CPUID.0BH:EBX[15:0] == 0 at sub-leaf 0.\n" + " This processor does not implement leaf 0BH (consider leaf 1FH instead).\n\n"); + break; + } + ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest.LeafBMaxSubleaf); + + switch (CPUID_ECX_LEVEL_TYPE(CpuidRequest.ECX)) + { + case 0: + TypeName = "Invalid"; + break; + case 1: + TypeName = "SMT (Hyper-Threading)"; + break; + case 2: + TypeName = "Core"; + break; + default: + TypeName = "Reserved"; + break; + } + + ShowMessages("---- CPUID.(EAX=0BH, ECX=%u) ----\n\n", SubFunctionId); + + // + // ECX: Level number and type + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" LevelNumber (echoes ECX input) = %u\n", + CPUID_ECX_LEVEL_NUMBER(CpuidRequest.ECX)); + ShowMessages(" LevelType = %u (%s)\n\n", + CPUID_ECX_LEVEL_TYPE(CpuidRequest.ECX), + TypeName); + // + // EAX: Shift count + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" X2ApicIdToUniqueTopologyIdShift = %u\n\n", + CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT(CpuidRequest.EAX)); + + // + // EBX: Number of logical processors (diagnostic only) + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" NumberOfLogicalProcessorsAtThisLevelType = %u (DIAGNOSTIC ONLY - do not use for topology enumeration)\n\n", + CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE(CpuidRequest.EBX)); + + // + // EDX: x2APIC ID (constant across all sub-leaves) + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" X2ApicId (current logical processor) = %u\n\n", + CPUID_EDX_X2APIC_ID(CpuidRequest.EDX)); + + break; + + case 0xC: + ShowMessages("==== CPUID.(EAX=0CH) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); + break; + + case 0xD: + ShowMessages("==== CPUID.(EAX=0DH) Processor Extended State Enumeration ====\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = 62 *\n" + " *******************************************************\n\n"); + + if (SubFunctionId == 0) + { + ShowMessages("-- EAX (XCR0 lower 32 bits) --\n\n"); + ShowMessages(" X87State (bit 0) = %s\n", CPUID_EAX_X87_STATE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SSEState (bit 1) = %s\n", CPUID_EAX_SSE_STATE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" AVXState (bit 2) = %s\n", CPUID_EAX_AVX_STATE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" MPXState (bits 4:3) = %u\n", CPUID_EAX_MPX_STATE(CpuidRequest.EAX)); + ShowMessages(" AVX512State (bits 7:5) = %u\n", CPUID_EAX_AVX_512_STATE(CpuidRequest.EAX)); + ShowMessages(" UsedForIa32Xss1 (bit 8) = %s\n", CPUID_EAX_USED_FOR_IA32_XSS_1(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PKRUState (bit 9) = %s\n", CPUID_EAX_PKRU_STATE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" UsedForIa32Xss2 (bit 13) = %s\n\n", CPUID_EAX_USED_FOR_IA32_XSS_2(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" MaxSizeRequiredByEnabledFeaturesInXcr0 = %u bytes\n\n", + CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" MaxSizeOfXsaveXrstorSaveArea = %u bytes\n\n", + CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA(CpuidRequest.ECX)); + ShowMessages("-- EDX (XCR0 upper 32 bits) --\n\n"); + ShowMessages(" Xcr0SupportedBits (bits 63:32 of XCR0) = 0x%08X\n\n", + CPUID_EDX_XCR0_SUPPORTED_BITS(CpuidRequest.EDX)); + } + + else if (SubFunctionId == 1) + { + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SupportsXsavecAndCompactedXrstor (XSAVEC) = %s\n", + CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsXgetbvWithEcx1 = %s\n", + CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsXsaveXrstorAndIa32Xss (XSAVES) = %s\n\n", + CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SizeOfXsaveArea (XCR0 | IA32_XSS enabled) = %u bytes\n", + CPUID_EBX_SIZE_OF_XSAVE_AREAD(CpuidRequest.EBX)); + + ShowMessages("-- ECX (IA32_XSS lower 32 bits) --\n\n"); + ShowMessages(" UsedForXcr01 (bits 7:0) = 0x%02X\n", + CPUID_ECX_USED_FOR_XCR0_1(CpuidRequest.ECX)); + ShowMessages(" PtState (bit 8) = %s\n", + CPUID_ECX_PT_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" UsedForXcr02 (bit 9) = %s\n", + CPUID_ECX_USED_FOR_XCR0_2(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CetUserState (bit 11) = %s\n", + CPUID_ECX_CET_USER_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CetSupervisorState (bit 12) = %s\n", + CPUID_ECX_CET_SUPERVISOR_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" HdcState (bit 13) = %s\n", + CPUID_ECX_HDC_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LbrState (bit 15) = %s\n", + CPUID_ECX_LBR_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" HwpState (bit 16) = %s\n\n", + CPUID_ECX_HWP_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EDX (IA32_XSS upper 32 bits) --\n\n"); + ShowMessages(" SupportedUpperIa32XssBits (bits 63:32) = 0x%08X\n\n", + CPUID_EDX_SUPPORTED_UPPER_IA32_XSS_BITS(CpuidRequest.EDX)); + } + + else if (SubFunctionId >= 2) + { + // + // Check if the user input is valid + // Need to check both XCR0 and IA32_XSS vectors + // + UINT64 ValidBits = CpuidRequest.XCR0Vector | CpuidRequest.IA32_XSS_Vector; + + // + // Validate if this sub-leaf is supported + // + if (((ValidBits >> SubFunctionId) & (UINT64)1) == 0) + { + ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); + ShowMessages(" Valid sub-leaves are those with bits set in:\n"); + ShowMessages(" XCR0 vector: 0x%016llX\n", (ULONG64)CpuidRequest.XCR0Vector); + ShowMessages(" IA32_XSS vector: 0x%016llX\n", (ULONG64)CpuidRequest.IA32_XSS_Vector); + ShowMessages(" Combined vector: 0x%016llX\n\n", (ULONG64)ValidBits); + + break; + } + + ShowMessages("-- State Component Information --\n\n"); + ShowMessages(" SaveAreaSize (EAX) = %u bytes\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest.EAX)); + ShowMessages(" SaveAreaOffset (EBX) = %u bytes\n", + CPUID_EBX_RESERVED(CpuidRequest.EBX)); + ShowMessages(" ManagedViaIa32Xss (ECX bit 0) = %u (%s)\n", + CPUID_ECX_ECX_2(CpuidRequest.ECX), + CPUID_ECX_ECX_2(CpuidRequest.ECX) ? "IA32_XSS" : "XCR0"); + ShowMessages(" Aligned64ByteBoundary (ECX bit 1) = %u%s\n", + CPUID_ECX_ECX_1(CpuidRequest.ECX), + CPUID_ECX_ECX_1(CpuidRequest.ECX) ? " (next 64-byte boundary)" : " (immediately following)"); + ShowMessages(" Reserved (EDX) = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidRequest.EDX)); + } + + break; + + case 0xE: + ShowMessages("==== CPUID.(EAX=0EH) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); + break; + + case 0xF: // 0xF = 15 (decimal); CPUID_INTEL_RESOURCE_DIRECTOR_TECHNOLOGY_MONITORING_INFORMATION + ShowMessages("==== CPUID.(EAX=0FH) Intel RDT Monitoring ====\n\n"); + ShowMessages(" This leaf is not yet implemented in HyperDbg.\n"); + ShowMessages(" (Intel Resource Director Technology - Monitoring)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); + break; + + case 0x10: + ShowMessages("==== CPUID.(EAX=10H, ECX=%u) Intel RDT Allocation Information ====\n\n", SubFunctionId); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = 3 *\n" + " *******************************************************\n\n"); + + if (SubFunctionId == 0) + { + // + // Resource type enumeration + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Ia32PlatformDcaCap = 0x%08X\n\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest.EAX)); + + // + // EBX + // + ShowMessages("-- EBX (Supported Allocation Types) --\n\n"); + ShowMessages(" Raw value = 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" L3 Cache Allocation (bit 1) = %s\n", + CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" L2 Cache Allocation (bit 2) = %s\n", + CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Memory Bandwidth Allocation (bit 3) = %s\n\n", + CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); + } + + else if (SubFunctionId == 1) + { + // + // L3 cache allocation + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest.EAX), + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest.EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" CodeAndDataPriorizationTechnologySupported = %s%s\n\n", + CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidRequest.ECX) ? "TRUE" : "FALSE", + CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidRequest.ECX) ? " (CDP supported)" : ""); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX) + 1); + } + + else if (SubFunctionId == 2) + { + // + // Sub-leaf 2 (L2 Cache Allocation) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest.EAX), + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest.EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX) + 1); + } + + else if (SubFunctionId == 3) + { + // + // Sub-leaf 3 (Memory Bandwidth Allocation) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxMbaThrottlingValue (minus-one) = %u (actual = %u)\n\n", + CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidRequest.EAX), + CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidRequest.EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" ResponseOfDelayIsLinear = %s%s\n", + CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidRequest.ECX) ? "TRUE" : "FALSE", + CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidRequest.ECX) ? " (linear response)" : " (non-linear)\n\n"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX) + 1); + } + + else + { + ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); + ShowMessages(" raw bytes: EAX = %u\n EBX = %u\n ECX = %u\n EDX = %u\n\n", + CpuidRequest.EAX, + CpuidRequest.EBX, + CpuidRequest.ECX, + CpuidRequest.EDX); + } + + break; + + case 0x11: + ShowMessages("==== CPUID.(EAX=11H) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); + break; + + case 0x12: + { + // + // SGX, not DAT. 0x12 = 18 (decimal) + // + ShowMessages("==== CPUID.(EAX=12H) Intel SGX Information ====\n\n"); + + if (!CpuidRequest.Leaf12Supported) + { + ShowMessages(" SGX is not supported on this CPU (CPUID.7H:EBX[2] = 0).\n\n"); + break; + } + + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest.Leaf12MaxSubLeaf); + + if (SubFunctionId == 0) + { + // + // SGX capabilities + // + ShowMessages("-- EAX (SGX Capabilities) --\n\n"); + ShowMessages(" SGX1 Support (bit 0) = %s\n", + CPUID_EAX_SGX1(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX2 Support (bit 1) = %s\n", + CPUID_EAX_SGX2(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ENCLV Advanced (bit 5) = %s\n", + CPUID_EAX_SGX_ENCLV_ADVANCED(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ENCLS Advanced (bit 6) = %s\n\n", + CPUID_EAX_SGX_ENCLS_ADVANCED(CpuidRequest.EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX (MISCSELECT - Extended SGX Features) --\n\n"); + ShowMessages(" Miscselect = 0x%08X\n\n", + CPUID_EBX_MISCSELECT(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + ShowMessages("-- EDX (Maximum Enclave Sizes) --\n\n"); + ShowMessages(" MaxEnclaveSizeNot64 = %u (2^%u = %llu bytes)\n", + CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest.EDX), + CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest.EDX), + (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest.EDX))); + ShowMessages(" MaxEnclaveSize64 = %u (2^%u = %llu bytes)\n\n", + CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest.EDX), + CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest.EDX), + (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest.EDX))); + } + + else if (SubFunctionId == 1) + { + // + // SGX attributes + // + ShowMessages("-- EAX (SECS.ATTRIBUTES[31:0]) --\n\n"); + ShowMessages(" ValidSecsAttributes0 = 0x%08X\n\n", + CPUID_EAX_VALID_SECS_ATTRIBUTES_0(CpuidRequest.EAX)); + + ShowMessages("-- EBX (SECS.ATTRIBUTES[63:32]) --\n\n"); + ShowMessages(" ValidSecsAttributes1 = 0x%08X\n\n", + CPUID_EBX_VALID_SECS_ATTRIBUTES_1(CpuidRequest.EBX)); + + ShowMessages("-- ECX (SECS.ATTRIBUTES[95:64]) --\n\n"); + ShowMessages(" ValidSecsAttributes2 = 0x%08X\n\n", + CPUID_ECX_VALID_SECS_ATTRIBUTES_2(CpuidRequest.ECX)); + + ShowMessages("-- EDX (SECS.ATTRIBUTES[127:96]) --\n\n"); + ShowMessages(" ValidSecsAttributes3 = 0x%08X\n\n", + CPUID_EDX_VALID_SECS_ATTRIBUTES_3(CpuidRequest.EDX)); + } + + else + { + // + // Subleaf 2+ (EPC sections) + // + if (CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX) == 0) + { + // + // Type 0: invalid subleaf + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SubLeafType = %u (Invalid - no EPC section)\n", + CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX)); + + ShowMessages("\n-- EBX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_EBX_ZERO(CpuidRequest.EBX)); + + ShowMessages("\n-- ECX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_ECX_ZERO(CpuidRequest.ECX)); + + ShowMessages("\n-- EDX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_EDX_ZERO(CpuidRequest.EDX)); + } + + else if (CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX) == 1) + { + // + // Reconstruct base address from EAX and EBX + // + UINT64 BaseLow = (UINT64)CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidRequest.EAX); + UINT64 BaseHigh = (UINT64)CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidRequest.EBX); + UINT64 BaseAddress = (BaseHigh << 32) | (BaseLow << 12); + + // + // Reconstruct size from ECX and EDX + // + UINT64 SizeLow = (UINT64)CPUID_ECX_EPC_SIZE_1(CpuidRequest.ECX); + UINT64 SizeHigh = (UINT64)CPUID_EDX_EPC_SIZE_2(CpuidRequest.EDX); + UINT64 SizeBytes = (SizeHigh << 32) | (SizeLow << 12); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SubLeafType = %u (EPC Section)\n", + CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX)); + ShowMessages(" EpcBasePhysicalAddress1 (bits 31:12) = 0x%05X\n\n", + CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidRequest.EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" EpcBasePhysicalAddress2 (bits 51:32) = 0x%05X\n\n", + CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" EpcSectionProperty = %u", + CPUID_ECX_EPC_SECTION_PROPERTY(CpuidRequest.ECX)); + switch (CPUID_ECX_EPC_SECTION_PROPERTY(CpuidRequest.ECX)) + { + case 0: + ShowMessages(" (No confidentiality/integrity)\n\n"); + break; + case 1: + ShowMessages(" (Confidentiality and integrity protection)\n\n"); + break; + default: + ShowMessages(" (Reserved)\n\n"); + break; + } + ShowMessages(" EpcSize1 (bits 31:12) = 0x%05X\n\n", + CPUID_ECX_EPC_SIZE_1(CpuidRequest.ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" EpcSize2 (bits 51:32) = 0x%05X\n\n", + CPUID_EDX_EPC_SIZE_2(CpuidRequest.EDX)); + + ShowMessages("-- EPC Section Information --\n\n"); + ShowMessages(" Base Address = 0x%016llX\n", (ULONG64)BaseAddress); + ShowMessages(" Size = 0x%016llX bytes (%llu MB)\n\n", + (ULONG64)SizeBytes, + (ULONG64)(SizeBytes / (1024 * 1024))); + } + + else + { + // + // Unknown subleaf type (reserved) + // + ShowMessages("-- Raw Data for Sub-leaf %u (Type %u) --\n\n", + SubFunctionId, + CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX)); + + ShowMessages(" EAX = 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX = 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX = 0x%08X\n\n", CpuidRequest.EDX); + ShowMessages(" Note: Reserved sub-leaf type. Please refer to the latest Intel SDM.\n\n"); + } + } + + break; + + } + + case 0x13: + ShowMessages("==== CPUID.(EAX=13H) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); + break; + + case 0x14: + ShowMessages("==== CPUID.(EAX=14H) Intel Processor Trace Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest.LeafEaxMaxSubleaf); + + ShowMessages("==== CPUID.(EAX=14H, ECX=%u) Intel Processor Trace Information ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // main leaf + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSubLeaf = %u\n\n", + CPUID_EAX_MAX_SUB_LEAF(CpuidRequest.EAX)); + + ShowMessages("-- EBX (Supported Features) --\n\n"); + ShowMessages(" CR3Filter support (bit 0) = %s\n", + CPUID_EBX_FLAG0(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Configurable PSB & Cycle-Accurate (bit 1) = %s\n", + CPUID_EBX_FLAG1(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" IP Filtering & TraceStop (bit 2) = %s\n", + CPUID_EBX_FLAG2(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" MTC & COFI suppression (bit 3) = %s\n", + CPUID_EBX_FLAG3(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PTWRITE support (bit 4) = %s\n", + CPUID_EBX_FLAG4(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Power Event Trace (bit 5) = %s\n", + CPUID_EBX_FLAG5(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PSB/PMI preservation (bit 6) = %s\n", + CPUID_EBX_FLAG6(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Event Trace (bit 7) = %s\n", + CPUID_EBX_FLAG7(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Disable TNT (bit 8) = %s\n\n", + CPUID_EBX_FLAG8(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + + ShowMessages("-- ECX (Output Schemes) --\n\n"); + ShowMessages(" ToPA output scheme (bit 0) = %s\n", + CPUID_ECX_FLAG0(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" ToPA tables with any entries (bit 1) = %s\n", + CPUID_ECX_FLAG1(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Single-Range Output scheme (bit 2) = %s\n", + CPUID_ECX_FLAG2(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Trace Transport subsystem (bit 3) = %s\n", + CPUID_ECX_FLAG3(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LIP values include CS base (bit 31) = %s\n\n", + CPUID_ECX_FLAG31(CpuidRequest.ECX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidRequest.EDX)); + } + + else if (SubFunctionId == 1) + { + // + // Packet generation + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" NumberOfConfigurableAddressRangesForFiltering = %u\n", + CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING(CpuidRequest.EAX)); + ShowMessages(" BitmapOfSupportedMtcPeriodEncodings = 0x%04X\n\n", + CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS(CpuidRequest.EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" BitmapOfSupportedCycleThresholdValueEncodings = 0x%04X\n", + CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS(CpuidRequest.EBX)); + ShowMessages(" BitmapOfSupportedConfigurablePsbFrequencyEncodings = 0x%04X\n\n", + CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidRequest.EDX)); + } + + else + { + // + // Subleaves > 1 (if they exist) + // + ShowMessages("-- Raw Data for Sub-leaf %u --\n\n", SubFunctionId); + ShowMessages(" EAX = 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX = 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX = 0x%08X\n\n", CpuidRequest.EDX); + ShowMessages(" Note: This sub-leaf may be for future Intel PT features.\n"); + ShowMessages(" Please refer to the latest Intel SDM for interpretation.\n\n"); + } + + break; + + case 0x15: + { + ShowMessages("==== CPUID.(EAX=15H) TSC and Core Crystal Clock Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 15h HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + // + // EAX: Denominator + // + UINT32 Denominator = CPUID_EAX_DENOMINATOR(CpuidRequest.EAX); + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Denominator = %u\n\n", Denominator); + + // + // EBX: Numerator + // + UINT32 Numerator = CPUID_EBX_NUMERATOR(CpuidRequest.EBX); + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Numerator = %u\n\n", Numerator); + + // + // ECX: Nominal frequency (if available) + // + UINT32 NominalFreq = CPUID_ECX_NOMINAL_FREQUENCY(CpuidRequest.ECX); + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NominalFrequency = %u Hz", NominalFreq); + if (NominalFreq > 0) + { + ShowMessages(" (%u MHz, %u GHz)\n", + NominalFreq / 1000000, + NominalFreq / 1000000000); + } + else + { + ShowMessages(" (not enumerated)\n\n"); + } + + // + // EDX: reserved + // + ShowMessages("\n-- EDX --\n"); + ShowMessages(" Reserved = 0x%08X\n", + CPUID_EDX_RESERVED(CpuidRequest.EDX)); + + // + // Calculate and display TSC frequency if possible + // + ShowMessages("-- TSC Frequency Information --\n\n"); + + if (Denominator == 0 || Numerator == 0) + { + ShowMessages(" TSC ratio not enumerated (denominator or numerator is 0)\n\n"); + } + + else + { + ShowMessages(" TSC / Core Crystal Clock ratio = %u / %u\n", + Numerator, + Denominator); + ShowMessages(" TSC frequency = Core Crystal Clock * (%u/%u)\n", + Numerator, + Denominator); + if (NominalFreq > 0) + { + UINT64 TSCFreqHz = (UINT64)NominalFreq * Numerator / Denominator; + ShowMessages(" TSC frequency = %llu Hz (%llu MHz, %llu GHz)\n\n", + (ULONG64)TSCFreqHz, + (ULONG64)(TSCFreqHz / 1000000), + (ULONG64)(TSCFreqHz / 1000000000)); + } + else + { + ShowMessages(" TSC frequency cannot be calculated (nominal frequency not enumerated)\n\n"); + } + } + + break; + } + + case 0x16: + { + ShowMessages("==== CPUID.(EAX=16H) Processor Frequency Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 16h HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX: Processor base frequency + // + UINT32 BaseFreq = CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ(CpuidRequest.EAX); + ShowMessages("-- EAX --\n\n"); + if (BaseFreq == 0) + { + ShowMessages(" ProcessorBaseFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" ProcessorBaseFrequencyMhz = %u MHz\n", BaseFreq); + } + + // + // EBX: Maximum frequency + // + UINT32 MaxFreq = CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ(CpuidRequest.EBX); + ShowMessages("-- EBX --\n\n"); + if (MaxFreq == 0) + { + ShowMessages(" ProcessorMaximumFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" ProcessorMaximumFrequencyMhz = %u MHz\n", MaxFreq); + } + + // + // ECX: Bus (reference) frequency + // + UINT32 BusFreq = CPUID_ECX_BUS_FREQUENCY_MHZ(CpuidRequest.ECX); + ShowMessages("-- ECX --\n\n"); + if (BusFreq == 0) + { + ShowMessages(" BusFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" BusFrequencyMhz = %u MHz\n\n", BusFreq); + } + + // + // EDX: reserved + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidRequest.EDX)); + + // + // Display summary + // + ShowMessages("-- Frequency Summary --\n\n"); + ShowMessages(" Base Frequency: "); + if (BaseFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n", BaseFreq); + } + + // + // Maximum frequency + // + ShowMessages(" Maximum Frequency: "); + if (MaxFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n", MaxFreq); + } + + // + // Bus frequency + // + ShowMessages(" Bus Frequency: "); + if (BusFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n\n", BusFreq); + } + + // + // Show turbo boost if both base and max are supported and max > base + // + if (BaseFreq > 0 && MaxFreq > 0 && MaxFreq > BaseFreq) + { + UINT32 TurboBoost = MaxFreq - BaseFreq; + FLOAT TurboPercent = ((FLOAT)TurboBoost / BaseFreq) * 100.0f; + ShowMessages(" Turbo Boost: %u MHz above base (%.1f%% increase)\n\n", + TurboBoost, + TurboPercent); + } + + ShowMessages(" *******************************************************\n"); + ShowMessages(" * NOTE: These values are for display purposes only *\n"); + ShowMessages(" * They do not reflect actual running frequencies *\n"); + ShowMessages(" * Actual frequencies depend on workload, power, etc. *\n"); + ShowMessages(" *******************************************************\n\n"); + + break; + } + + case 0x17: + { + ShowMessages("==== CPUID.(EAX=17H) SoC Vendor Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CPUID_EAX_MAX_SOC_ID_INDEX(CpuidRequest.EAX)); + + ShowMessages("==== CPUID.(EAX=17H, ECX=%u) SoC Vendor Information ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // Main + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSocIdIndex = %u\n\n", CPUID_EAX_MAX_SOC_ID_INDEX(CpuidRequest.EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SocVendorId = 0x%04X\n", + CPUID_EBX_SOC_VENDOR_ID(CpuidRequest.EBX)); + ShowMessages(" IsVendorScheme = %s\n\n", + CPUID_EBX_IS_VENDOR_SCHEME(CpuidRequest.EBX) ? "TRUE (Industry Standard)" : "FALSE (Intel Assigned)"); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" ProjectId = 0x%08X\n\n", + CPUID_ECX_PROJECT_ID(CpuidRequest.ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SteppingId = 0x%08X\n\n", + CPUID_EDX_STEPPING_ID(CpuidRequest.EDX)); + } + + else if (SubFunctionId >= 1 && SubFunctionId <= 3) + { + // + // subleaves 1-3 (brand string) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SocVendorBrandString[0..3] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX), + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX) >> 0) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX) >> 8) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX) >> 16) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX) >> 24) & 0xFF); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SocVendorBrandString[4..7] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX), + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX) >> 0) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX) >> 8) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX) >> 16) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX) >> 24) & 0xFF); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" SocVendorBrandString[8..11] = 0x%08X (%c%c%c%c)\n\n", + CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX), + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX) >> 0) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX) >> 8) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX) >> 16) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX) >> 24) & 0xFF); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SocVendorBrandString[12..15] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX), + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 0) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 8) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 16) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 24) & 0xFF); + } + + else + { + // + // Sub-leaves > MaxSOCID_Index (Reserved, should return all zeros) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); + } + break; + } + + case 0x18: + // + // DAT, 0x18 = 24 (decimal) + // + ShowMessages("==== CPUID.(EAX=18H) Deterministic Address Translation Parameters ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest.LeafEaxMaxSubleaf); + + ShowMessages("==== CPUID.(EAX=18H, ECX=%u) Deterministic Address Translation Parameters ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // main + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSubLeaf = %u\n\n", CPUID_EAX_MAX_SUB_LEAF(CpuidRequest.EAX)); + + // + // EBX: Page size support and associativity + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" PageEntries4KbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries2MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries4MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries1GbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Partitioning = %u%s\n", + CPUID_EBX_PARTITIONING(CpuidRequest.EBX), + CPUID_EBX_PARTITIONING(CpuidRequest.EBX) == 0 ? " (soft partitioning)" : ""); + ShowMessages(" WaysOfAssociativity (W) = %u\n\n", + CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00(CpuidRequest.EBX)); + + // + // ECX: Number of Sets + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NumberOfSets = %u\n\n", + CPUID_ECX_NUMBER_OF_SETS(CpuidRequest.ECX)); + + // + // EDX: Translation cache type and properties + // + ShowMessages("-- EDX --\n\n"); + + switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX)) + { + case 0: + TypeName = "Null (sub-leaf not valid)"; + break; + case 1: + TypeName = "Data TLB"; + break; + case 2: + TypeName = "Instruction TLB"; + break; + case 3: + TypeName = "Unified TLB"; + break; + default: + TypeName = "Reserved"; + break; + } + ShowMessages(" TranslationCacheTypeField = %u (%s)\n", + CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX), + TypeName); + ShowMessages(" TranslationCacheLevel = %u\n", + CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidRequest.EDX)); + ShowMessages(" FullyAssociativeStructure = %s%s\n", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest.EDX) ? "TRUE" : "FALSE", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest.EDX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX), + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX) + 1); + + } + + else + { + // + // subleaves >= 1 (Translation Structure Information) + // + + // + // Check if this sub-leaf is valid (EDX[4:0] != 0) + // + if (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX) == 0) + { + ShowMessages(" Sub-leaf %u is invalid (TranslationCacheTypeField = 0)\n", SubFunctionId); + ShowMessages(" All registers should be zero according to spec:\n"); + ShowMessages(" EAX = 0x%08X\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); + ShowMessages(" EBX = 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX = 0x%08X\n", CpuidRequest.EDX); + } + + else + { + // + // EAX: Reserved for sub-leaves >= 1 + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); + + // + // EBX: Page size support and associativity + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" PageEntries4KbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries2MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries4MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries1GbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Partitioning = %u%s\n", + CPUID_EBX_PARTITIONING(CpuidRequest.EBX), + CPUID_EBX_PARTITIONING(CpuidRequest.EBX) == 0 ? " (soft partitioning)" : ""); + ShowMessages(" WaysOfAssociativity (W) = %u\n\n", + CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01(CpuidRequest.EBX)); + + // ECX: Number of Sets + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NumberOfSets = %u\n\n", + CPUID_ECX_NUMBER_OF_SETS(CpuidRequest.ECX)); + + // EDX: Translation cache type and properties + ShowMessages("-- EDX --\n\n"); + switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX)) + { + case 0: + TypeName = "Null (sub-leaf not valid)"; + break; + case 1: + TypeName = "Data TLB"; + break; + case 2: + TypeName = "Instruction TLB"; + break; + case 3: + TypeName = "Unified TLB"; + break; + default: + TypeName = "Reserved"; + break; + } + ShowMessages(" TranslationCacheTypeField = %u (%s)\n", + CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX), + TypeName); + ShowMessages(" TranslationCacheLevel = %u\n", + CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidRequest.EDX)); + ShowMessages(" FullyAssociativeStructure = %s%s\n", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest.EDX) ? "TRUE" : "FALSE", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest.EDX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX), + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX) + 1); + } + } + + break; + + case 0x80000000: + ShowMessages("==== CPUID.(EAX=80000000H) Extended Function Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000000 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxExtendedFunctions = 0x%08X (%u)\n\n", + CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest.EAX), + CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest.EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); + + break; + + case 0x80000001: + ShowMessages("==== CPUID.(EAX=80000001H) Extended CPU Signature ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000001 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" LAHF/SAHF Available in 64-bit Mode = %s\n", + CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE(CpuidRequest.ECX) ? "True" : "False"); + ShowMessages(" LZCNT = %s\n", + CPUID_ECX_LZCNT(CpuidRequest.ECX) ? "True" : "False"); + ShowMessages(" PREFETCHW = %s\n\n", + CPUID_ECX_PREFETCHW(CpuidRequest.ECX) ? "True" : "False"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SYSCALL/SYSRET Available in 64-bit Mode = %s\n", + CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE(CpuidRequest.EDX) ? "True" : "False"); + ShowMessages(" Execute Disable Bit Available = %s\n", + CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); + ShowMessages(" 1-GByte Pages Available = %s\n", + CPUID_EDX_PAGES_1GB_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); + ShowMessages(" RDTSCP Available = %s\n", + CPUID_EDX_RDTSCP_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); + ShowMessages(" Intel 64 Architecture Available = %s\n\n", + CPUID_EDX_IA64_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); + + break; + // + // 0x80000002-0x80000004 - Processor brand string + // + case 0x80000002: + case 0x80000003: + case 0x80000004: + { + ShowMessages("==== CPUID.(EAX=80000002H-80000004H) Processor Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000002-4 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + ShowMessages(" Brand String = \"%s\"\n\n", CpuidRequest.BrandString); + + break; + + } + case 0x80000005: + ShowMessages("EAX = 0x80000005: not implemented.\n"); + break; + + case 0x80000006: + { + ShowMessages("==== CPUID.(EAX=80000006H) Extended Cache Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000006 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); + + ShowMessages("-- ECX (L2 Cache Information) --\n"); + + UINT32 LineSize = CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES(CpuidRequest.ECX); + UINT32 Assoc = CPUID_ECX_L2_ASSOCIATIVITY_FIELD(CpuidRequest.ECX); + UINT32 CacheSize = CPUID_ECX_CACHE_SIZE_IN_1K_UNITS(CpuidRequest.ECX); + + // + // decode associativity + // + switch (Assoc) + { + case 0x00: + AssocName = "Disabled"; + break; + case 0x01: + AssocName = "Direct mapped"; + break; + case 0x02: + AssocName = "2-way"; + break; + case 0x04: + AssocName = "4-way"; + break; + case 0x06: + AssocName = "8-way"; + break; + case 0x08: + AssocName = "16-way"; + break; + case 0x0F: + AssocName = "Fully associative"; + break; + default: + AssocName = "Reserved"; + break; + } + ShowMessages(" CacheLineSizeInBytes = %u bytes\n", LineSize); + ShowMessages(" L2AssociativityField = 0x%02X (%s)\n", Assoc, AssocName); + ShowMessages(" CacheSizeIn1KUnits = %u KB (%u MB)\n", + CacheSize, + CacheSize / 1024); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); + + break; + + } + + case 0x80000007: + ShowMessages("==== CPUID.(EAX=80000007H) Extended Time Stamp Counter ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000007 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" InvariantTscAvailable = %u%s\n\n", + CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidRequest.EDX), + CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidRequest.EDX) ? " (TSC runs at constant rate)" : ""); + + break; + + case 0x80000008: + { + ShowMessages("==== CPUID.(EAX=80000008H) Virtual & Physical Address Sizes ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000008 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + UINT32 PhysicalBits = CPUID_EAX_NUMBER_OF_PHYSICAL_ADDRESS_BITS(CpuidRequest.EAX); + UINT32 LinearBits = CPUID_EAX_NUMBER_OF_LINEAR_ADDRESS_BITS(CpuidRequest.EAX); + + ShowMessages(" NumberOfPhysicalAddressBits = %u (max physical address = 2^%u = %llu bytes)\n", + PhysicalBits, + PhysicalBits, + (ULONG64)(1ULL << PhysicalBits)); + ShowMessages(" NumberOfLinearAddressBits = %u (max linear address = 2^%u = %llu bytes)\n", + LinearBits, + LinearBits, + (ULONG64)(1ULL << LinearBits)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); + + break; + } + + default: + ShowMessages("==== CPUID.(EAX=%08XH) ====\n\n", FunctionId); + ShowMessages(" CPUID leaf 0x%08X is not implemented in HyperDbg.\n", FunctionId); + ShowMessages(" You can decode the raw values yourself:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); + } + } + + else + { + ShowMessages("Receiving CPUID result was not successful :(\n"); + } + } +} + +/** + * @brief cpuid command handler + * + * @param CommandTokens + * @param Command + * + * @return VOID + */ +VOID +CommandUserCpuid(vector CommandTokens, string Command) +{ + UINT32 FunctionId = 0; + UINT32 SubFunctionId = 0; + BOOL SetFunctionId = FALSE; + BOOLEAN IsFirstCommand = TRUE; + + if (CommandTokens.size() > 3) + { + ShowMessages("incorrect use of the '%s'\n\n", + GetCaseSensitiveStringFromCommandToken(CommandTokens.at(0)).c_str()); + CommandUserCpuidHelp(); + return; + } + + for (auto Section : CommandTokens) + { + if (IsFirstCommand == TRUE) + { + IsFirstCommand = FALSE; + continue; + } + + // + // Parse FunctionId (first numeric parameter) + // + if (!SetFunctionId) + { + if (!ConvertTokenToUInt32(Section, &FunctionId)) + { + ShowMessages("please specify a correct hex value for function id\n\n"); + CommandUserCpuidHelp(); + return; + } + SetFunctionId = TRUE; + continue; + } + + // + // Parse SubFunctionId (second numeric parameter, optional) + // + if (!ConvertTokenToUInt32(Section, &SubFunctionId)) + { + ShowMessages("please specify a correct hex value for sub-function id\n\n"); + CommandUserCpuidHelp(); + return; + } + } + + // + // Check if FunctionId was provided + // + if (!SetFunctionId) + { + ShowMessages("please specify a cpuid function id\n\n"); + CommandUserCpuidHelp(); + return; + } + + // + // Call CPUID with user-provided inputs + // + CommandCpuidRequestCpuid(FunctionId, SubFunctionId); +} \ No newline at end of file From 38cbfd80b1c2df47ef80853352edb340080ab2d2 Mon Sep 17 00:00:00 2001 From: Nikzad Date: Sun, 19 Jul 2026 18:18:10 +0330 Subject: [PATCH 06/50] build: update project files and SDK version --- examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj | 2 +- hyperdbg/hyperdbg.sln | 1 + hyperdbg/hyperevade/hyperevade.vcxproj | 2 +- hyperdbg/hyperhv/hyperhv.vcxproj | 2 +- hyperdbg/hyperkd/hyperkd.vcxproj | 2 +- hyperdbg/hyperlog/hyperlog.vcxproj | 2 +- hyperdbg/hyperperf/hyperperf.vcxproj | 2 +- hyperdbg/hypertrace/hypertrace.vcxproj | 2 +- hyperdbg/kdserial/kdserial.vcxproj | 2 +- hyperdbg/libhyperdbg/libhyperdbg.vcxproj | 1 + hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters | 3 +++ 11 files changed, 13 insertions(+), 8 deletions(-) diff --git a/examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj b/examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj index fd70d5dc..61dc0502 100644 --- a/examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj +++ b/examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperdbg_driver - $(LatestTargetPlatformVersion) + 10.0.28000.0 diff --git a/hyperdbg/hyperdbg.sln b/hyperdbg/hyperdbg.sln index 90b129a9..e0b3b689 100644 --- a/hyperdbg/hyperdbg.sln +++ b/hyperdbg/hyperdbg.sln @@ -2,6 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 VisualStudioVersion = 18.7.11911.148 +VisualStudioVersion = 18.5.11801.241 oobstable MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hyperdbg-cli", "hyperdbg-cli\hyperdbg-cli.vcxproj", "{FBCBBBAD-4EAE-469E-827F-F59FE9E7375B}" ProjectSection(ProjectDependencies) = postProject diff --git a/hyperdbg/hyperevade/hyperevade.vcxproj b/hyperdbg/hyperevade/hyperevade.vcxproj index ea3a07dc..95b4c9d4 100644 --- a/hyperdbg/hyperevade/hyperevade.vcxproj +++ b/hyperdbg/hyperevade/hyperevade.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperevade - $(LatestTargetPlatformVersion) + 10.0.28000.0 diff --git a/hyperdbg/hyperhv/hyperhv.vcxproj b/hyperdbg/hyperhv/hyperhv.vcxproj index 53c55a14..9ea51534 100644 --- a/hyperdbg/hyperhv/hyperhv.vcxproj +++ b/hyperdbg/hyperhv/hyperhv.vcxproj @@ -21,7 +21,7 @@ Debug Win32 hyperhv - $(LatestTargetPlatformVersion) + 10.0.28000.0 hyperhv diff --git a/hyperdbg/hyperkd/hyperkd.vcxproj b/hyperdbg/hyperkd/hyperkd.vcxproj index b165f75d..5d95adb3 100644 --- a/hyperdbg/hyperkd/hyperkd.vcxproj +++ b/hyperdbg/hyperkd/hyperkd.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperkd - $(LatestTargetPlatformVersion) + 10.0.28000.0 diff --git a/hyperdbg/hyperlog/hyperlog.vcxproj b/hyperdbg/hyperlog/hyperlog.vcxproj index 5e0ba787..13df5df3 100644 --- a/hyperdbg/hyperlog/hyperlog.vcxproj +++ b/hyperdbg/hyperlog/hyperlog.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperlog - $(LatestTargetPlatformVersion) + 10.0.28000.0 diff --git a/hyperdbg/hyperperf/hyperperf.vcxproj b/hyperdbg/hyperperf/hyperperf.vcxproj index 20624659..98bc40f6 100644 --- a/hyperdbg/hyperperf/hyperperf.vcxproj +++ b/hyperdbg/hyperperf/hyperperf.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperperf - $(LatestTargetPlatformVersion) + 10.0.28000.0 diff --git a/hyperdbg/hypertrace/hypertrace.vcxproj b/hyperdbg/hypertrace/hypertrace.vcxproj index 1b0d38f2..b96425c7 100644 --- a/hyperdbg/hypertrace/hypertrace.vcxproj +++ b/hyperdbg/hypertrace/hypertrace.vcxproj @@ -21,7 +21,7 @@ Debug x64 hypertrace - $(LatestTargetPlatformVersion) + 10.0.28000.0 diff --git a/hyperdbg/kdserial/kdserial.vcxproj b/hyperdbg/kdserial/kdserial.vcxproj index 22ed068a..2109552d 100644 --- a/hyperdbg/kdserial/kdserial.vcxproj +++ b/hyperdbg/kdserial/kdserial.vcxproj @@ -51,7 +51,7 @@ kdserial Desktop 10.0.10135.0 - $(LatestTargetPlatformVersion) + 10.0.28000.0 diff --git a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj index cd1d0655..1714302c 100644 --- a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj +++ b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj @@ -245,6 +245,7 @@ msbuild "$(SolutionDir)dependencies\zydis\msvc\Zydis.sln" /m /p:Configuration="R + Create Create diff --git a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters index 492c7f91..f15944ab 100644 --- a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters +++ b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters @@ -736,6 +736,9 @@ code\debugger\misc + + code\debugger\commands\debugging-commands + From ec5fe7cc8a9cb3d127eee2637627d6e8667330fa Mon Sep 17 00:00:00 2001 From: xmaple555 Date: Mon, 20 Jul 2026 15:03:45 +0800 Subject: [PATCH 07/50] add float in script engine --- .../hwdbg/script/script_definitions.scala | 5 +- hyperdbg/hyperdbg-test/code/main.cpp | 26 +- .../code/tests/test-script-floating-point.cpp | 271 +++ .../code/tests/test-semantic-scripts.cpp | 170 +- hyperdbg/hyperdbg-test/header/testcases.h | 5 + hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj | 7 +- .../hyperdbg-test.vcxproj.filters | 3 + hyperdbg/hyperdbg-test/pch.h | 6 + .../headers/ScriptEngineCommonDefinitions.h | 30 + .../SDK/imports/user/HyperDbgLibImports.h | 3 + .../script-engine/script-engine-wrapper.cpp | 2 + hyperdbg/libhyperdbg/code/export/export.cpp | 20 + hyperdbg/script-engine/code/common.c | 10 + hyperdbg/script-engine/code/parse-table.c | 1662 +++++++++-------- hyperdbg/script-engine/code/scanner.c | 49 + hyperdbg/script-engine/code/script-engine.c | 372 +++- hyperdbg/script-engine/header/common.h | 3 +- hyperdbg/script-engine/header/parse-table.h | 12 +- hyperdbg/script-engine/header/type.h | 5 +- .../python/Boolean_Expression_Grammar.txt | 1 + hyperdbg/script-engine/python/Grammar.txt | 3 +- hyperdbg/script-engine/python/generator.py | 7 + hyperdbg/script-engine/python/lalr1_parser.py | 2 + hyperdbg/script-engine/python/ll1_parser.py | 7 +- hyperdbg/script-eval/code/Functions.c | 343 +++- hyperdbg/script-eval/code/ScriptEngineEval.c | 712 +++++++ hyperdbg/tests/script-engine-test | 2 +- 27 files changed, 2824 insertions(+), 914 deletions(-) create mode 100644 hyperdbg/hyperdbg-test/code/tests/test-script-floating-point.cpp diff --git a/hwdbg/src/main/scala/hwdbg/script/script_definitions.scala b/hwdbg/src/main/scala/hwdbg/script/script_definitions.scala index 98689c98..f476bfea 100644 --- a/hwdbg/src/main/scala/hwdbg/script/script_definitions.scala +++ b/hwdbg/src/main/scala/hwdbg/script/script_definitions.scala @@ -31,6 +31,9 @@ object ScriptConstants { val SYMBOL_MEM_VALID_CHECK_MASK = 1 << 31 val INVALID = 0x80000000 val LALR_ACCEPT = 0x7fffffff + val SYMBOL_VALUE_KIND_INTEGER = 0 + val SYMBOL_VALUE_KIND_FLOAT32 = 1 + val SYMBOL_VALUE_KIND_FLOAT64 = 2 } /** @@ -45,6 +48,6 @@ object ScriptConstantTypes { object ScriptEvalFunc { object ScriptOperators extends ChiselEnum { - val sFuncUndefined, sFuncInc, sFuncDec, sFuncReference, sFuncOr, sFuncXor, sFuncAnd, sFuncAsr, sFuncAsl, sFuncAdd, sFuncSub, sFuncMul, sFuncDiv, sFuncMod, sFuncGt, sFuncLt, sFuncEgt, sFuncElt, sFuncEqual, sFuncNeq, sFuncJmp, sFuncJz, sFuncJnz, sFuncMov, sFuncStart_of_do_while, sFuncStart_of_do_while_commands, sFuncEnd_of_do_while, sFuncStart_of_for, sFuncFor_inc_dec, sFuncStart_of_for_ommands, sFuncEnd_of_if, sFuncIgnore_lvalue, sFuncPush, sFuncPop, sFuncCall, sFuncRet, sFuncPrint, sFuncFormats, sFuncEvent_enable, sFuncEvent_disable, sFuncEvent_clear, sFuncTest_statement, sFuncSpinlock_lock, sFuncSpinlock_unlock, sFuncEvent_sc, sFuncMicrosleep, sFuncPrintf, sFuncPause, sFuncFlush, sFuncEvent_trace_step, sFuncEvent_trace_step_in, sFuncEvent_trace_step_out, sFuncEvent_trace_instrumentation_step, sFuncEvent_trace_instrumentation_step_in, sFuncRdtsc, sFuncRdtscp, sFuncLbr_save, sFuncLbr_dump, sFuncLbr_print, sFuncLbr_restore, sFuncLbr_check, sFuncSpinlock_lock_custom_wait, sFuncEvent_inject, sFuncPoi, sFuncDb, sFuncDd, sFuncDw, sFuncDq, sFuncNeg, sFuncHi, sFuncLow, sFuncNot, sFuncCheck_address, sFuncDisassemble_len, sFuncDisassemble_len32, sFuncDisassemble_len64, sFuncInterlocked_increment, sFuncInterlocked_decrement, sFuncPhysical_to_virtual, sFuncVirtual_to_physical, sFuncPoi_pa, sFuncHi_pa, sFuncLow_pa, sFuncDb_pa, sFuncDd_pa, sFuncDw_pa, sFuncDq_pa, sFuncLbr_restore_by_filter, sFuncEd, sFuncEb, sFuncEq, sFuncInterlocked_exchange, sFuncInterlocked_exchange_add, sFuncEb_pa, sFuncEd_pa, sFuncEq_pa, sFuncInterlocked_compare_exchange, sFuncStrlen, sFuncStrcmp, sFuncMemcmp, sFuncStrncmp, sFuncWcslen, sFuncWcscmp, sFuncEvent_inject_error_code, sFuncMemcpy, sFuncMemcpy_pa, sFuncWcsncmp, sFuncStruct_forward_declaration, sFuncStruct_definition_begin, sFuncStruct_definition_end, sFuncStruct_variable_declaration, sFuncStruct_member_declaration, sFuncTypedef_declaration, sFuncStruct_pointer, sFuncStruct_array_dimension, sFuncStruct_declarator_complete, sFuncTyped_load, sFuncTyped_store, sFuncAggregate_copy, sFuncAggregate_zero, sFuncStruct_initializer_begin, sFuncStruct_initializer_end, sFuncStruct_pointer_cast, sFuncMember_address, sFuncMember_read, sFuncMember_dot_lvalue, sFuncMember_arrow_lvalue, sFuncMember_dot_read, sFuncMember_arrow_read = Value + val sFuncUndefined, sFuncInc, sFuncDec, sFuncReference, sFuncOr, sFuncXor, sFuncAnd, sFuncAsr, sFuncAsl, sFuncAdd, sFuncSub, sFuncMul, sFuncDiv, sFuncMod, sFuncGt, sFuncLt, sFuncEgt, sFuncElt, sFuncEqual, sFuncNeq, sFuncJmp, sFuncJz, sFuncJnz, sFuncMov, sFuncStart_of_do_while, sFuncStart_of_do_while_commands, sFuncEnd_of_do_while, sFuncStart_of_for, sFuncFor_inc_dec, sFuncStart_of_for_ommands, sFuncEnd_of_if, sFuncIgnore_lvalue, sFuncPush, sFuncPop, sFuncCall, sFuncRet, sFuncPrint, sFuncFormats, sFuncEvent_enable, sFuncEvent_disable, sFuncEvent_clear, sFuncTest_statement, sFuncSpinlock_lock, sFuncSpinlock_unlock, sFuncEvent_sc, sFuncMicrosleep, sFuncPrintf, sFuncPause, sFuncFlush, sFuncEvent_trace_step, sFuncEvent_trace_step_in, sFuncEvent_trace_step_out, sFuncEvent_trace_instrumentation_step, sFuncEvent_trace_instrumentation_step_in, sFuncRdtsc, sFuncRdtscp, sFuncLbr_save, sFuncLbr_dump, sFuncLbr_print, sFuncLbr_restore, sFuncLbr_check, sFuncSpinlock_lock_custom_wait, sFuncEvent_inject, sFuncPoi, sFuncDb, sFuncDd, sFuncDw, sFuncDq, sFuncNeg, sFuncHi, sFuncLow, sFuncNot, sFuncCheck_address, sFuncDisassemble_len, sFuncDisassemble_len32, sFuncDisassemble_len64, sFuncInterlocked_increment, sFuncInterlocked_decrement, sFuncPhysical_to_virtual, sFuncVirtual_to_physical, sFuncPoi_pa, sFuncHi_pa, sFuncLow_pa, sFuncDb_pa, sFuncDd_pa, sFuncDw_pa, sFuncDq_pa, sFuncLbr_restore_by_filter, sFuncEd, sFuncEb, sFuncEq, sFuncInterlocked_exchange, sFuncInterlocked_exchange_add, sFuncEb_pa, sFuncEd_pa, sFuncEq_pa, sFuncInterlocked_compare_exchange, sFuncStrlen, sFuncStrcmp, sFuncMemcmp, sFuncStrncmp, sFuncWcslen, sFuncWcscmp, sFuncEvent_inject_error_code, sFuncMemcpy, sFuncMemcpy_pa, sFuncWcsncmp, sFuncStruct_forward_declaration, sFuncStruct_definition_begin, sFuncStruct_definition_end, sFuncStruct_variable_declaration, sFuncStruct_member_declaration, sFuncTypedef_declaration, sFuncStruct_pointer, sFuncStruct_array_dimension, sFuncStruct_declarator_complete, sFuncTyped_load, sFuncTyped_store, sFuncAggregate_copy, sFuncAggregate_zero, sFuncStruct_initializer_begin, sFuncStruct_initializer_end, sFuncStruct_pointer_cast, sFuncMember_address, sFuncMember_read, sFuncMember_dot_lvalue, sFuncMember_arrow_lvalue, sFuncMember_dot_read, sFuncMember_arrow_read, sFuncMov_float, sFuncNeg_float, sFuncAdd_float, sFuncSub_float, sFuncMul_float, sFuncDiv_float, sFuncGt_float, sFuncLt_float, sFuncEgt_float, sFuncElt_float, sFuncEqual_float, sFuncNeq_float, sFuncConvert_float = Value } } \ No newline at end of file diff --git a/hyperdbg/hyperdbg-test/code/main.cpp b/hyperdbg/hyperdbg-test/code/main.cpp index d4d4b356..bc8315af 100644 --- a/hyperdbg/hyperdbg-test/code/main.cpp +++ b/hyperdbg/hyperdbg-test/code/main.cpp @@ -21,6 +21,8 @@ int main(int argc, char * argv[]) { + BOOLEAN TestResult = FALSE; + if (argc != 2) { printf("you should not test functionalities directly, instead use 'test all' " @@ -37,6 +39,7 @@ main(int argc, char * argv[]) if (TestCommandParser()) { printf("\n[*] The main command parser test cases passed successfully\n"); + TestResult = TRUE; } else { @@ -52,6 +55,7 @@ main(int argc, char * argv[]) if (TestPeParser()) { printf("\n[*] The PE parser test cases passed successfully\n"); + TestResult = TRUE; } else { @@ -67,6 +71,7 @@ main(int argc, char * argv[]) if (TestSemanticScripts()) { printf("\n[*] The script semantic test cases passed successfully\n"); + TestResult = TRUE; } else { @@ -82,6 +87,7 @@ main(int argc, char * argv[]) if (TestCodeViewRsdsParser()) { printf("\n[*] The CodeView RSDS parser test cases passed successfully\n"); + TestResult = TRUE; } else { @@ -96,20 +102,30 @@ main(int argc, char * argv[]) if (HwdbgTestCreateTestCases()) { printf("\n[*] The hwdbg test cases passed successfully\n"); + TestResult = TRUE; } else { printf("\n[x] The hwdbg test cases failed\n"); } } + else if (!strcmp(argv[1], TEST_CASE_PARAMETER_FOR_SCRIPT_FLOATING_POINT)) + { + if (TestScriptEngineFloatingPoint()) + { + printf("\n[*] The script floating-point test cases passed successfully\n"); + TestResult = TRUE; + } + else + { + printf("\n[x] The script floating-point test cases failed\n"); + } + } else { printf("unknown test case\n"); + return 1; } - printf("\npress any key to exit..."); - - _getch(); - - return 0; + return TestResult ? 0 : 1; } diff --git a/hyperdbg/hyperdbg-test/code/tests/test-script-floating-point.cpp b/hyperdbg/hyperdbg-test/code/tests/test-script-floating-point.cpp new file mode 100644 index 00000000..89d428ae --- /dev/null +++ b/hyperdbg/hyperdbg-test/code/tests/test-script-floating-point.cpp @@ -0,0 +1,271 @@ +/** + * @file test-script-floating-point.cpp + * @brief Focused scanner, IR, evaluator, and formatting tests for floating-point scripts. + */ +#include "pch.h" + +static std::string CapturedScriptOutput; + +static VOID +CaptureScriptOutput(CHAR * Message) +{ + if (Message) + { + CapturedScriptOutput.append(Message); + } +} + +static BOOLEAN +RunScriptAndExpect(const CHAR * Script, BOOLEAN ExpectedSuccess, const CHAR * ExpectedOutput) +{ + CapturedScriptOutput.clear(); + hyperdbg_u_set_text_message_callback((PVOID)CaptureScriptOutput); + BOOLEAN Result = hyperdbg_u_test_script_engine((CHAR *)Script); + hyperdbg_u_unset_text_message_callback(); + + if (Result != ExpectedSuccess) + { + std::cerr << "Unexpected script result for: " << Script + << "\nExpected success: " << (ExpectedSuccess ? "true" : "false") + << "\nActual output: " << CapturedScriptOutput << std::endl; + return FALSE; + } + + if (ExpectedOutput && CapturedScriptOutput != ExpectedOutput) + { + std::cerr << "Unexpected script output for: " << Script + << "\nExpected: " << ExpectedOutput + << "\nActual: " << CapturedScriptOutput << std::endl; + return FALSE; + } + + return TRUE; +} + +static BOOLEAN +RunScriptAndExpectRuntimeFailure(const CHAR * Script) +{ + if (!RunScriptAndExpect(Script, FALSE, NULL)) return FALSE; + if (CapturedScriptOutput.find("ScriptEngineExecute") == std::string::npos) + { + std::cerr << "Expected an evaluator failure for: " << Script + << "\nActual output: " << CapturedScriptOutput << std::endl; + return FALSE; + } + return TRUE; +} + +static BOOLEAN +TestFloatingPointIr() +{ + if (sizeof(SYMBOL) != sizeof(UINT64) * 3 || + FUNC_MEMBER_ARROW_READ != 128 || FUNC_MOV_FLOAT != 129 || FUNC_NEG_FLOAT != 130 || + FUNC_ADD_FLOAT != 131 || FUNC_SUB_FLOAT != 132 || FUNC_MUL_FLOAT != 133 || + FUNC_DIV_FLOAT != 134 || FUNC_GT_FLOAT != 135 || FUNC_LT_FLOAT != 136 || + FUNC_EGT_FLOAT != 137 || FUNC_ELT_FLOAT != 138 || FUNC_EQUAL_FLOAT != 139 || + FUNC_NEQ_FLOAT != 140 || FUNC_CONVERT_FLOAT != 141) + { + return FALSE; + } + + CHAR Script[] = "{ float single = 11.5; double wide = 0.789; double negativeZero = -0.0; }"; + PSYMBOL_BUFFER Buffer = (PSYMBOL_BUFFER)ScriptEngineParse(Script); + if (!Buffer || Buffer->Message) + { + if (Buffer) + { + RemoveSymbolBuffer(Buffer); + } + return FALSE; + } + + UINT32 MoveCount = 0; + BOOLEAN FloatBitsFound = FALSE; + BOOLEAN DoubleBitsFound = FALSE; + BOOLEAN NegativeZeroFound = FALSE; + + for (UINT32 Index = 0; Index + 2 < Buffer->Pointer; Index++) + { + PSYMBOL Operator = Buffer->Head + Index; + if (Operator->Type != SYMBOL_SEMANTIC_RULE_TYPE || Operator->Value != FUNC_MOV_FLOAT) + { + continue; + } + + PSYMBOL Source = Buffer->Head + Index + 1; + PSYMBOL Destination = Buffer->Head + Index + 2; + MoveCount++; + + if (Source->Len != Destination->Len) + { + RemoveSymbolBuffer(Buffer); + return FALSE; + } + + FloatBitsFound |= Source->Len == SYMBOL_VALUE_KIND_FLOAT32 && Source->Value == 0x41380000ULL; + DoubleBitsFound |= Source->Len == SYMBOL_VALUE_KIND_FLOAT64 && Source->Value == 0x3fe93f7ced916873ULL; + NegativeZeroFound |= Source->Len == SYMBOL_VALUE_KIND_FLOAT64 && Source->Value == 0x8000000000000000ULL; + } + + RemoveSymbolBuffer(Buffer); + return MoveCount == 3 && FloatBitsFound && DoubleBitsFound && NegativeZeroFound; +} + +static BOOLEAN +TestFloatingPointArithmeticIr() +{ + CHAR Script[] = + "{ float leftValue = 1.5; float rightValue = 0.5; " + "float addResult = leftValue + rightValue; float subResult = leftValue - rightValue; " + "float mulResult = leftValue * rightValue; float divResult = leftValue / rightValue; " + "if (addResult > subResult && addResult >= subResult && subResult < addResult && " + "subResult <= addResult && addResult == addResult && addResult != subResult) { printf(\"ok\\n\"); } }"; + PSYMBOL_BUFFER Buffer = (PSYMBOL_BUFFER)ScriptEngineParse(Script); + if (!Buffer || Buffer->Message) + { + if (Buffer) RemoveSymbolBuffer(Buffer); + return FALSE; + } + + BOOLEAN Seen[10] = {0}; + for (UINT32 Index = 0; Index < Buffer->Pointer; Index++) + { + PSYMBOL Symbol = Buffer->Head + Index; + if (Symbol->Type != SYMBOL_SEMANTIC_RULE_TYPE || + Symbol->Value < FUNC_ADD_FLOAT || Symbol->Value > FUNC_NEQ_FLOAT) + { + continue; + } + + UINT32 OpcodeIndex = (UINT32)(Symbol->Value - FUNC_ADD_FLOAT); + Seen[OpcodeIndex] = TRUE; + if (Index + 3 >= Buffer->Pointer || + Buffer->Head[Index + 1].Len != SYMBOL_VALUE_KIND_FLOAT32 || + Buffer->Head[Index + 2].Len != SYMBOL_VALUE_KIND_FLOAT32) + { + RemoveSymbolBuffer(Buffer); + return FALSE; + } + + BOOLEAN IsComparison = Symbol->Value >= FUNC_GT_FLOAT; + if (Buffer->Head[Index + 3].Len != + (IsComparison ? SYMBOL_VALUE_KIND_INTEGER : SYMBOL_VALUE_KIND_FLOAT32)) + { + RemoveSymbolBuffer(Buffer); + return FALSE; + } + } + + RemoveSymbolBuffer(Buffer); + for (UINT32 Index = 0; Index < 10; Index++) + { + if (!Seen[Index]) return FALSE; + } + return TRUE; +} + +static BOOLEAN +TestFloatingPointDifferentialCases() +{ + struct OPERANDS + { + double Left; + double Right; + } Cases[] = { + {0.1, 0.2}, {1.5, 0.5}, {-4.25, 2.5}, {7.0, 3.0}, + {31.75, -0.125}, {-9.5, -2.25}, {0.000125, 64.0}, {999.0, 0.75}}; + const CHAR Operators[] = {'+', '-', '*', '/'}; + + for (const auto & Case : Cases) + { + for (CHAR Operator : Operators) + { + volatile double DoubleLeft = Case.Left; + volatile double DoubleRight = Case.Right; + double DoubleExpected; + if (Operator == '+') DoubleExpected = DoubleLeft + DoubleRight; + else if (Operator == '-') DoubleExpected = DoubleLeft - DoubleRight; + else if (Operator == '*') DoubleExpected = DoubleLeft * DoubleRight; + else DoubleExpected = DoubleLeft / DoubleRight; + + CHAR Script[1024]; + _snprintf_s(Script, + sizeof(Script), + _TRUNCATE, + "{ double leftValue = %.20f; double rightValue = %.20f; " + "double expectedValue = %.20f; double actualValue = leftValue %c rightValue; " + "if (actualValue == expectedValue) { printf(\"ok\\n\"); } }", + Case.Left, + Case.Right, + DoubleExpected, + Operator); + if (!RunScriptAndExpect(Script, TRUE, "ok\n")) return FALSE; + + volatile float FloatLeft = (float)Case.Left; + volatile float FloatRight = (float)Case.Right; + float FloatExpected; + if (Operator == '+') FloatExpected = FloatLeft + FloatRight; + else if (Operator == '-') FloatExpected = FloatLeft - FloatRight; + else if (Operator == '*') FloatExpected = FloatLeft * FloatRight; + else FloatExpected = FloatLeft / FloatRight; + + _snprintf_s(Script, + sizeof(Script), + _TRUNCATE, + "{ float leftValue = %.20f; float rightValue = %.20f; " + "float expectedValue = %.20f; float actualValue = leftValue %c rightValue; " + "if (actualValue == expectedValue) { printf(\"ok\\n\"); } }", + (double)FloatLeft, + (double)FloatRight, + (double)FloatExpected, + Operator); + if (!RunScriptAndExpect(Script, TRUE, "ok\n")) return FALSE; + } + } + + return TRUE; +} + +BOOLEAN +TestScriptEngineFloatingPoint() +{ + const CHAR * ValidScript = + "{ float varA = 11.5; float varB = .5; double varC = 0.789; double varZ = -0.0; double varP = +.5; " + "printf(\"%f %f %f %f %f\\n\", varA, varB, varC, varZ, varP); printf(\"%f\\n\", -varC); }"; + + if (!RunScriptAndExpect(ValidScript, + TRUE, + "11.500000 0.500000 0.789000 -0.000000 0.500000\n-0.789000\n")) + { + return FALSE; + } + + if (!TestFloatingPointIr() || !TestFloatingPointArithmeticIr() || + !TestFloatingPointDifferentialCases() || + !RunScriptAndExpect("{ float var1 = 11.5; float var2 = 0.5; float result = var1 + var2; if (result == 12.0) { printf(\"arithmetic ok\\n\"); } }", + TRUE, + "arithmetic ok\n") || + !RunScriptAndExpect("{ double leftValue = 9.0; double rightValue = 4.0; double result = leftValue / rightValue; if (result >= 2.25 && result <= 2.25) { printf(\"comparison ok\\n\"); } }", + TRUE, + "comparison ok\n") || + !RunScriptAndExpect("{ float pointOne = 0.1; float pointTwo = 0.2; float expectedFloat = 0.3; float roundedFloat = pointOne + pointTwo; double third = 1.0 / 3.0; double expectedThird = 0.33333333333333331; double largeValue = 9007199254740992.0; double oneValue = 1.0; double roundedLarge = largeValue + oneValue; double negativeValue = -4.0; double positiveValue = 2.0; double negativeZeroValue = -0.0 * positiveValue; if (roundedFloat == expectedFloat && third == expectedThird && roundedLarge == largeValue && negativeValue < positiveValue && negativeValue <= positiveValue && positiveValue > negativeValue && positiveValue >= negativeValue && negativeZeroValue == 0.0) { printf(\"rounding and comparison ok %f\\n\", negativeZeroValue); } }", + TRUE, + "rounding and comparison ok -0.000000\n") || + !RunScriptAndExpect("{ float tinyValue = 0.000000000000000000000000000000000000000000001401298464324817; float expectedTinySum = 0.000000000000000000000000000000000000000000002802596928649634; float tinySum = tinyValue + tinyValue; if (tinySum == expectedTinySum) { printf(\"subnormal ok\\n\"); } }", + TRUE, + "subnormal ok\n") || + !RunScriptAndExpect("{ printf(\"%f\", 1); }", FALSE, NULL) || + !RunScriptAndExpect("{ double value = 1.5; printf(\"%x\", value); }", FALSE, NULL) || + !RunScriptAndExpect("{ double value = 1..2; }", FALSE, NULL) || + !RunScriptAndExpect("{ double value = 0x1.2; }", FALSE, NULL) || + !RunScriptAndExpect("{ double value = 1.0f; }", FALSE, NULL) || + !RunScriptAndExpect("{ float value = 999999999999999999999999999999999999999.0; }", FALSE, NULL) || + !RunScriptAndExpect("{ float value = 0.000000000000000000000000000000000000000000000000001; }", FALSE, NULL) || + !RunScriptAndExpectRuntimeFailure("{ double leftValue = 1.0; double zeroValue = 0.0; double result = leftValue / zeroValue; }") || + !RunScriptAndExpectRuntimeFailure("{ double largeValue = 99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999.0; double result = largeValue * largeValue; }")) + { + return FALSE; + } + + return TRUE; +} diff --git a/hyperdbg/hyperdbg-test/code/tests/test-semantic-scripts.cpp b/hyperdbg/hyperdbg-test/code/tests/test-semantic-scripts.cpp index 9fa7695a..368e0227 100644 --- a/hyperdbg/hyperdbg-test/code/tests/test-semantic-scripts.cpp +++ b/hyperdbg/hyperdbg-test/code/tests/test-semantic-scripts.cpp @@ -13,14 +13,69 @@ namespace fs = std::filesystem; +static std::mutex SemanticOutputMutex; +static std::condition_variable SemanticOutputChanged; +static std::string SemanticOutput; + +static VOID +CaptureSemanticOutput(CHAR * Message) +{ + if (!Message) + { + return; + } + + { + std::lock_guard Lock(SemanticOutputMutex); + SemanticOutput.append(Message); + } + SemanticOutputChanged.notify_all(); +} + +static BOOLEAN +HasAllExpectedSemanticOutput(const std::string & Output) +{ + if (Output.find("was failed") != std::string::npos) + { + return FALSE; + } + + std::set SuccessfulCases; + std::regex SuccessPattern("test case ([0-9]+) was successful"); + for (std::sregex_iterator Match(Output.begin(), Output.end(), SuccessPattern), End; + Match != End; + ++Match) + { + SuccessfulCases.insert((UINT32)std::stoul((*Match)[1].str())); + } + + return SuccessfulCases.size() == 83 && + *SuccessfulCases.begin() == 0 && + *SuccessfulCases.rbegin() == 82 && + Output.find("floating point: 11.500000 0.500000 0.500000 11.000000 0.789000") != std::string::npos && + Output.find("negative floating point: -11.500000 -0.500000 -0.789000 -0.000000") != std::string::npos && + Output.find("runtime negative floating point: -0.789000") != std::string::npos && + Output.find("runtime positive floating point: 0.500000") != std::string::npos && + Output.find("floating arithmetic was successful") != std::string::npos && + Output.find("floating arithmetic: 12.000000 11.000000 3.000000 3.000000") != std::string::npos && + Output.find("double arithmetic: 1.000000 3.500000 5.000000 2.250000") != std::string::npos && + Output.find("mixed and precedence: 1.750000 7.000000 -6.000000") != std::string::npos; +} + +static BOOLEAN +SemanticRunFinishedOrFailed(const std::string & Output) +{ + return Output.find("was failed") != std::string::npos || HasAllExpectedSemanticOutput(Output); +} + /** * @brief Read directory of semantic test cases and run each of them * * @param ScriptSemanticPath Path to the semantic test cases * - * @return VOID + * @return BOOLEAN TRUE if all files were read and submitted successfully */ -VOID +BOOLEAN ReadDirectoryAndTestSemanticTestCases(const CHAR * ScriptSemanticPath) { // @@ -28,62 +83,54 @@ ReadDirectoryAndTestSemanticTestCases(const CHAR * ScriptSemanticPath) // try { - for (const auto & entry : fs::directory_iterator(ScriptSemanticPath)) + std::vector TestFiles; + for (const auto & Entry : fs::directory_iterator(ScriptSemanticPath)) { - // - // Check if the entry is a file - // - if (entry.is_regular_file()) + if (Entry.is_regular_file() && Entry.path().extension() == ".ds") { - // - // Get the file path - // - std::string FilePath = entry.path().string(); + TestFiles.push_back(Entry.path()); + } + } - // - // Output the file name - // - // std::cout << "Test case file: " << entry.path().filename().string() << std::endl; + std::sort(TestFiles.begin(), TestFiles.end()); + if (TestFiles.empty()) + { + std::cerr << "No semantic .ds files were found in: " << ScriptSemanticPath << std::endl; + return FALSE; + } - // - // Open the file and read its contents - // - std::ifstream File(FilePath); - if (File.is_open()) - { - std::string Content((std::istreambuf_iterator(File)), - std::istreambuf_iterator()); + for (const auto & FilePath : TestFiles) + { + std::ifstream File(FilePath, std::ios::binary); + if (!File) + { + std::cerr << "Could not open file: " << FilePath.string() << std::endl; + return FALSE; + } - // - // Display the content of the file - // - std::cout << "Executing file " << entry.path().filename().string() << std::endl; + std::string Content((std::istreambuf_iterator(File)), + std::istreambuf_iterator()); + if (File.bad()) + { + std::cerr << "Could not read file: " << FilePath.string() << std::endl; + return FALSE; + } - // std::cout << content << std::endl; - - // - // Run the test case command - // - hyperdbg_u_run_command((CHAR *)Content.c_str()); - - std::cout << "--------------------------------------------" << std::endl; - - // - // Close the file - // - File.close(); - } - else - { - std::cerr << "Could not open file: " << FilePath << std::endl; - } + std::cout << "Executing file " << FilePath.filename().string() << std::endl; + if (hyperdbg_u_run_command(Content.data()) != 0) + { + std::cerr << "Command execution failed for: " << FilePath.string() << std::endl; + return FALSE; } } } catch (const fs::filesystem_error & e) { std::cerr << "Filesystem error: " << e.what() << std::endl; + return FALSE; } + + return TRUE; } /** @@ -94,7 +141,6 @@ ReadDirectoryAndTestSemanticTestCases(const CHAR * ScriptSemanticPath) BOOLEAN TestSemanticScripts() { - INT32 TestNum = 0; CHAR dirPath[MAX_PATH] = {0}; // @@ -119,15 +165,37 @@ TestSemanticScripts() return FALSE; } - // - // Run test cases - // - ReadDirectoryAndTestSemanticTestCases(dirPath); + { + std::lock_guard Lock(SemanticOutputMutex); + SemanticOutput.clear(); + } + hyperdbg_u_set_text_message_callback((PVOID)CaptureSemanticOutput); + + BOOLEAN TestResult = ReadDirectoryAndTestSemanticTestCases(dirPath); + if (TestResult) + { + std::unique_lock Lock(SemanticOutputMutex); + BOOLEAN Completed = SemanticOutputChanged.wait_for( + Lock, + std::chrono::seconds(60), + [] { return SemanticRunFinishedOrFailed(SemanticOutput); }); + + TestResult = Completed && + SemanticOutput.find("was failed") == std::string::npos && + HasAllExpectedSemanticOutput(SemanticOutput); + if (!TestResult) + { + std::cerr << "Semantic output was incomplete, timed out, or contained a failure.\n" + << SemanticOutput << std::endl; + } + } + + hyperdbg_u_unset_text_message_callback(); // // Close the connection // hyperdbg_u_debug_close_remote_debugger(); - return TRUE; + return TestResult; } diff --git a/hyperdbg/hyperdbg-test/header/testcases.h b/hyperdbg/hyperdbg-test/header/testcases.h index 79ff93fa..823e213b 100644 --- a/hyperdbg/hyperdbg-test/header/testcases.h +++ b/hyperdbg/hyperdbg-test/header/testcases.h @@ -26,3 +26,8 @@ TestCodeViewRsdsParser(); BOOLEAN TestSemanticScripts(); + +BOOLEAN +TestScriptEngineFloatingPoint(); + +#define TEST_CASE_PARAMETER_FOR_SCRIPT_FLOATING_POINT "test-script-floating-point" diff --git a/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj b/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj index b50f7554..2a9dbf44 100644 --- a/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj +++ b/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj @@ -74,7 +74,7 @@ Console true true - $(SolutionDir)build\bin\$(Configuration)\libhyperdbg.lib;%(AdditionalDependencies) + $(SolutionDir)build\bin\$(Configuration)\libhyperdbg.lib;$(SolutionDir)build\bin\$(Configuration)\script-engine.lib;%(AdditionalDependencies) @@ -99,7 +99,7 @@ true true true - $(SolutionDir)build\bin\$(Configuration)\libhyperdbg.lib;%(AdditionalDependencies) + $(SolutionDir)build\bin\$(Configuration)\libhyperdbg.lib;$(SolutionDir)build\bin\$(Configuration)\script-engine.lib;%(AdditionalDependencies) @@ -113,6 +113,7 @@ + @@ -134,4 +135,4 @@ - \ No newline at end of file + diff --git a/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj.filters b/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj.filters index 2840f4a7..5579edc4 100644 --- a/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj.filters +++ b/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj.filters @@ -56,6 +56,9 @@ code\tests + + code\tests + code\hardware diff --git a/hyperdbg/hyperdbg-test/pch.h b/hyperdbg/hyperdbg-test/pch.h index 0d6f1d11..68e2ea42 100644 --- a/hyperdbg/hyperdbg-test/pch.h +++ b/hyperdbg/hyperdbg-test/pch.h @@ -29,6 +29,11 @@ using namespace std; #include #include #include +#include +#include +#include +#include +#include #include #include #include @@ -65,3 +70,4 @@ using namespace std; // import libhyperdbg // #include "SDK/imports/user/HyperDbgLibImports.h" +#include "SDK/imports/user/HyperDbgScriptImports.h" diff --git a/hyperdbg/include/SDK/headers/ScriptEngineCommonDefinitions.h b/hyperdbg/include/SDK/headers/ScriptEngineCommonDefinitions.h index 3e8270d1..5a28d5d6 100644 --- a/hyperdbg/include/SDK/headers/ScriptEngineCommonDefinitions.h +++ b/hyperdbg/include/SDK/headers/ScriptEngineCommonDefinitions.h @@ -63,6 +63,10 @@ typedef struct ACTION_BUFFER { #define SYMBOL_DEREFERENCE_LOCAL_ID_TYPE 20 #define SYMBOL_DEREFERENCE_TEMP_TYPE 21 +#define SYMBOL_VALUE_KIND_INTEGER 0 +#define SYMBOL_VALUE_KIND_FLOAT32 1 +#define SYMBOL_VALUE_KIND_FLOAT64 2 + #define SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL 1 #define SCRIPT_ENGINE_ADDRESS_SPACE_REMOTE 2 @@ -226,6 +230,19 @@ static const char *const SymbolTypeNames[] = { #define FUNC_MEMBER_ARROW_LVALUE 126 #define FUNC_MEMBER_DOT_READ 127 #define FUNC_MEMBER_ARROW_READ 128 +#define FUNC_MOV_FLOAT 129 +#define FUNC_NEG_FLOAT 130 +#define FUNC_ADD_FLOAT 131 +#define FUNC_SUB_FLOAT 132 +#define FUNC_MUL_FLOAT 133 +#define FUNC_DIV_FLOAT 134 +#define FUNC_GT_FLOAT 135 +#define FUNC_LT_FLOAT 136 +#define FUNC_EGT_FLOAT 137 +#define FUNC_ELT_FLOAT 138 +#define FUNC_EQUAL_FLOAT 139 +#define FUNC_NEQ_FLOAT 140 +#define FUNC_CONVERT_FLOAT 141 static const char *const FunctionNames[] = { "FUNC_UNDEFINED", @@ -357,6 +374,19 @@ static const char *const FunctionNames[] = { "FUNC_MEMBER_ARROW_LVALUE", "FUNC_MEMBER_DOT_READ", "FUNC_MEMBER_ARROW_READ", +"FUNC_MOV_FLOAT", +"FUNC_NEG_FLOAT", +"FUNC_ADD_FLOAT", +"FUNC_SUB_FLOAT", +"FUNC_MUL_FLOAT", +"FUNC_DIV_FLOAT", +"FUNC_GT_FLOAT", +"FUNC_LT_FLOAT", +"FUNC_EGT_FLOAT", +"FUNC_ELT_FLOAT", +"FUNC_EQUAL_FLOAT", +"FUNC_NEQ_FLOAT", +"FUNC_CONVERT_FLOAT", }; typedef enum REGS_ENUM { diff --git a/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h b/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h index 3c6fe5f1..8b7ee904 100644 --- a/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h +++ b/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h @@ -131,6 +131,9 @@ hyperdbg_u_set_text_message_callback_using_shared_buffer(PVOID handler); IMPORT_EXPORT_LIBHYPERDBG VOID hyperdbg_u_unset_text_message_callback(); +IMPORT_EXPORT_LIBHYPERDBG BOOLEAN +hyperdbg_u_test_script_engine(CHAR * expression); + IMPORT_EXPORT_LIBHYPERDBG INT hyperdbg_u_script_read_file_and_execute_commandline(INT argc, CHAR * argv[]); diff --git a/hyperdbg/libhyperdbg/code/debugger/script-engine/script-engine-wrapper.cpp b/hyperdbg/libhyperdbg/code/debugger/script-engine/script-engine-wrapper.cpp index d0141f5f..b87778a5 100644 --- a/hyperdbg/libhyperdbg/code/debugger/script-engine/script-engine-wrapper.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/script-engine/script-engine-wrapper.cpp @@ -346,6 +346,7 @@ ScriptEngineEvalWrapper(PGUEST_REGS GuestRegs, string Expr) { SCRIPT_ENGINE_GENERAL_REGISTERS ScriptGeneralRegisters = {0}; + g_CurrentExprEvalResultHasError = FALSE; // // Allocate global variables holder @@ -477,6 +478,7 @@ ScriptEngineEvalWrapper(PGUEST_REGS GuestRegs, else { ShowMessages("%s\n", CodeBuffer->Message); + g_CurrentExprEvalResultHasError = TRUE; } RemoveSymbolBuffer(CodeBuffer); diff --git a/hyperdbg/libhyperdbg/code/export/export.cpp b/hyperdbg/libhyperdbg/code/export/export.cpp index b70938eb..49d65b2b 100644 --- a/hyperdbg/libhyperdbg/code/export/export.cpp +++ b/hyperdbg/libhyperdbg/code/export/export.cpp @@ -290,6 +290,26 @@ hyperdbg_u_unset_text_message_callback() UnsetTextMessageCallback(); } +/** + * @brief Execute a script with the deterministic local evaluator used by tests. + * + * @param expression Script body without the leading '?' command token + * @return BOOLEAN TRUE when parsing and evaluation complete without error + */ +BOOLEAN +hyperdbg_u_test_script_engine(CHAR * expression) +{ + extern BOOLEAN g_CurrentExprEvalResultHasError; + + if (!expression) + { + return FALSE; + } + + ScriptEngineWrapperTestParser(expression); + return !g_CurrentExprEvalResultHasError; +} + /** * @brief Parsing the command line options for scripts * @param argc diff --git a/hyperdbg/script-engine/code/common.c b/hyperdbg/script-engine/code/common.c index d755a222..8659750d 100644 --- a/hyperdbg/script-engine/code/common.c +++ b/hyperdbg/script-engine/code/common.c @@ -1131,6 +1131,11 @@ GetTerminalId(PSCRIPT_ENGINE_TOKEN Token) if (!strcmp("_hex", TerminalMap[i])) return i; } + else if (Token->Type == FLOAT_LITERAL) + { + if (!strcmp("_float", TerminalMap[i])) + return i; + } else if (Token->Type == GLOBAL_ID || Token->Type == GLOBAL_UNRESOLVED_ID) { if (!strcmp("_global_id", TerminalMap[i])) @@ -1257,6 +1262,11 @@ LalrGetTerminalId(PSCRIPT_ENGINE_TOKEN Token) if (!strcmp("_hex", LalrTerminalMap[i])) return i; } + else if (Token->Type == FLOAT_LITERAL) + { + if (!strcmp("_float", LalrTerminalMap[i])) + return i; + } else if (Token->Type == GLOBAL_ID || Token->Type == GLOBAL_UNRESOLVED_ID) { if (!strcmp("_global_id", LalrTerminalMap[i])) diff --git a/hyperdbg/script-engine/code/parse-table.c b/hyperdbg/script-engine/code/parse-table.c index bf3ee231..fcf0f424 100644 --- a/hyperdbg/script-engine/code/parse-table.c +++ b/hyperdbg/script-engine/code/parse-table.c @@ -310,6 +310,7 @@ const struct _SCRIPT_ENGINE_TOKEN Lhs[RULES_COUNT]= {NON_TERMINAL, "CONST_NUMBER"}, {NON_TERMINAL, "CONST_NUMBER"}, {NON_TERMINAL, "CONST_NUMBER"}, + {NON_TERMINAL, "CONST_NUMBER"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, @@ -643,6 +644,7 @@ const struct _SCRIPT_ENGINE_TOKEN Rhs[RULES_COUNT][MAX_RHS_LEN]= {{SEMANTIC_RULE, "@PUSH"},{DECIMAL, "_decimal"}}, {{SEMANTIC_RULE, "@PUSH"},{OCTAL, "_octal"}}, {{SEMANTIC_RULE, "@PUSH"},{BINARY, "_binary"}}, + {{SEMANTIC_RULE, "@PUSH"},{FLOAT_LITERAL, "_float"}}, {{NON_TERMINAL, "CONST_NUMBER"}}, {{SEMANTIC_RULE, "@PUSH"},{PSEUDO_REGISTER, "_pseudo_register"}}, {{SPECIAL_TOKEN, "-"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@NEG"}}, @@ -976,6 +978,7 @@ const unsigned int RhsSize[RULES_COUNT]= 2, 2, 2, +2, 1, 2, 3, @@ -1000,314 +1003,315 @@ const unsigned int RhsSize[RULES_COUNT]= }; const char* NoneTerminalMap[NONETERMINAL_COUNT]= { -"ASSIGNMENT_STATEMENT'", -"STRUCT_DECLARATOR", -"SIMPLE_ASSIGNMENT", -"STRUCT_DECLARATION_INITIALIZER", -"E0'", -"MEMBER_LVALUE_SUFFIX", -"ARRAY_DIMS_READ", -"STRUCT_DECLARATION_END", -"INC_DEC'", -"E5'", -"END_OF_IF", -"STATEMENT", -"TYPEDEF_DECLARATION", -"STRUCT_INITIALIZER_LIST2", -"ARRAY_DIMS2", "MEMBER_READ_SUFFIX", -"ARRAY_DIMS_WRITE2", -"TYPEDEF_BASE_TYPE", -"E2'", -"ELSIF_STATEMENT'", -"CALL_FUNC_STATEMENT", -"EXPRESSION", -"ARRAY_DIMS_READ_OPT", -"VARIABLE_TYPE2", -"ARRAY_DIMS", -"VARIABLE_TYPE4", -"E2", -"INIT_LIST_CONT", -"ARRAY_DIMS_READ2", -"STRUCT_DECLARATION2", -"STRUCT_SCALAR_TYPE2", -"S2", -"VARIABLE_TYPE6", -"STRUCT_MEMBER", -"MULTIPLE_ASSIGNMENT2", -"INIT_LIST_TAIL", "VA", -"BOOLEAN_EXPRESSION", "WSTRING", -"StringNumber", -"ASSIGNMENT_STATEMENT", -"VARIABLE_TYPE3", -"E1'", -"E3'", -"STRUCT_INITIALIZER_LIST", -"WstringNumber", -"STATEMENT2", -"WHILE_STATEMENT", -"STRUCT_MEMBER_TYPE", -"FOR_STATEMENT", -"E3", -"INIT_ITEM", -"STRUCT_DECLARATION", -"INC_DEC", +"MEMBER_LVALUE_SUFFIX", +"ELSIF_STATEMENT", +"CALL_FUNC_STATEMENT", "MULTIPLE_ASSIGNMENT", +"INC_DEC'", +"STRUCT_DECLARATION_INITIALIZER", "E4", -"L_VALUE", +"E2", +"ELSE_STATEMENT", +"WstringNumber", +"STRUCT_INITIALIZER_LIST", +"VA3", +"INIT_LIST_CONT", +"ASSIGNMENT_STATEMENT", +"E0'", "S", -"STRUCT_ARRAY_DIMS", -"VARIABLE_TYPE1", -"INIT_LIST", -"STRUCT_POINTERS", -"ARRAY_DIMS_WRITE", +"MULTIPLE_ASSIGNMENT2", +"FOR_STATEMENT", +"StringNumber", +"ARRAY_INIT", +"E3", +"ARRAY_DIMS_WRITE_OPT", +"STATEMENT", +"VARIABLE_TYPE4", +"S2", "VA2", -"E1", -"CONST_NUMBER", -"STRING", -"STRUCT_DEFINITION_TAIL", +"E5'", +"STRUCT_INITIALIZER_LIST2", +"SIMPLE_ASSIGNMENT", +"ARRAY_DIMS2", "STRUCT_INITIALIZER_ITEM", "STRUCT_DECLARATOR_LIST2", -"ELSIF_STATEMENT", -"ELSE_STATEMENT", -"STRUCT_MEMBER_LIST", -"VARIABLE_TYPE5", -"STRUCT_DECLARATOR_LIST", -"E4'", -"RETURN", +"L_VALUE", "DO_WHILE_STATEMENT", -"STRUCT_SCALAR_TYPE", -"ARRAY_INIT", -"ARRAY_DIMS_WRITE_OPT", -"E12", -"VA3", +"TYPEDEF_BASE_TYPE", +"E1", +"ARRAY_DIMS_READ_OPT", +"VARIABLE_TYPE6", +"INIT_ITEM", "IF_STATEMENT", -"E5" +"STRUCT_ARRAY_DIMS", +"VARIABLE_TYPE3", +"E4'", +"E3'", +"VARIABLE_TYPE5", +"STRUCT_DECLARATION2", +"ARRAY_DIMS_READ2", +"INIT_LIST_TAIL", +"ARRAY_DIMS_WRITE2", +"STRUCT_DEFINITION_TAIL", +"STRUCT_MEMBER_LIST", +"INIT_LIST", +"BOOLEAN_EXPRESSION", +"ARRAY_DIMS_READ", +"STRUCT_SCALAR_TYPE", +"VARIABLE_TYPE2", +"ARRAY_DIMS", +"ELSIF_STATEMENT'", +"STRUCT_DECLARATOR_LIST", +"WHILE_STATEMENT", +"STRUCT_SCALAR_TYPE2", +"STRUCT_DECLARATOR", +"TYPEDEF_DECLARATION", +"CONST_NUMBER", +"STRUCT_DECLARATION", +"STRUCT_POINTERS", +"END_OF_IF", +"E5", +"ASSIGNMENT_STATEMENT'", +"RETURN", +"STRUCT_MEMBER_TYPE", +"E1'", +"STATEMENT2", +"STRUCT_DECLARATION_END", +"E2'", +"EXPRESSION", +"STRUCT_MEMBER", +"E12", +"INC_DEC", +"VARIABLE_TYPE1", +"STRING", +"ARRAY_DIMS_WRITE" }; const char* TerminalMap[TERMINAL_COUNT]= { -"strcmp", -"poi", -"_wstring", -"eb_pa", -"hi", -"event_trace_instrumentation_step_in", -";", -"typedef", -"break", -"rdtsc", -"_string", -"disassemble_len64", -"eq", -"continue", -"_global_id", -"spinlock_lock_custom_wait", -"microsleep", -"db_pa", -"/=", -"=", -"interlocked_exchange_add", -"not", -"lbr_print", -"dd", -"lbr_restore_by_filter", -"dw", -"virtual_to_physical", -"++", -"db", -"+", -"print", -"+=", -"memcpy_pa", -"check_address", -"interlocked_exchange", -"[", -"_pseudo_register", -"|=", -"event_inject", -"(", -"->", -"spinlock_unlock", -"-", -"memcpy", -"%=", -"dq", "dd_pa", -"neg", -"wcslen", -"_function_parameter_id", -"<<=", -"event_sc", -"else", -"interlocked_increment", -"&", -"elsif", -"/", -"$", -"hi_pa", -"for", -"pause", -"^=", -"_hex", "return", -"}", -"_script_variable_type", -"-=", -"_decimal", -"*=", -"event_disable", -">>", -"interlocked_decrement", -"strlen", -"while", -"event_enable", -"do", -"lbr_check", -"ed", -"strncmp", -"formats", -"_binary", -",", -"{", -"]", -"dw_pa", -"_local_id", -"dq_pa", -"interlocked_compare_exchange", -"event_trace_step", -"%", -"--", -"_octal", -"rdtscp", -"lbr_save", -".", -"memcmp", -"lbr_restore", +"memcpy", +";", "~", -"_register", -")", -"disassemble_len32", -"^", -"reference", -"low_pa", -"printf", -"struct", -"wcsncmp", -"event_trace_step_out", -"eb", -"lbr_dump", -"|", +"/=", +"eb_pa", "eq_pa", -"event_trace_instrumentation_step", -">>=", +"event_trace_instrumentation_step_in", "ed_pa", -"if", +"++", "test_statement", -"disassemble_len", +"rdtscp", +"lbr_dump", +"interlocked_exchange", +"+=", +"poi", +"&", +"%=", +"/", "event_inject_error_code", -"*", -"&=", -"physical_to_virtual", -"event_trace_step_in", -"spinlock_lock", -"poi_pa", +">>=", +"lbr_check", +"_script_variable_type", +"strlen", +"*=", +"spinlock_unlock", +"wcsncmp", +"reference", +"do", "_function_id", -"wcscmp", -"flush", -"<<", -"#include", +"disassemble_len", +"continue", +"_wstring", +"poi_pa", +"_float", +"spinlock_lock_custom_wait", +"}", +"_binary", +"check_address", +">>", +"_hex", +"|=", +"event_trace_step", +"_register", +"|", +"$", +"dq_pa", +"wcslen", +"if", +"disassemble_len32", +"memcpy_pa", +"*", +"lbr_restore", +"<<=", +"event_trace_instrumentation_step", +"hi_pa", +"struct", +"event_trace_step_out", +"interlocked_compare_exchange", +"spinlock_lock", +"elsif", +"rdtsc", +"{", +"-", +"--", +"_decimal", +"event_clear", +"]", +"&=", +"%", +"^", +")", +"db_pa", +"dw", +"eq", +"printf", +"interlocked_exchange_add", +"memcmp", +"[", +"pause", +"event_enable", +"_global_id", +"strncmp", +"lbr_save", +"lbr_print", +"(", +"hi", +"while", +"ed", +"interlocked_increment", +"typedef", +"virtual_to_physical", +"-=", +",", +"->", "low", -"event_clear" +"dw_pa", +"microsleep", +"print", +"flush", +"not", +"_pseudo_register", +"dq", +"event_trace_step_in", +"event_sc", +"_string", +"+", +".", +"_function_parameter_id", +"_octal", +"wcscmp", +"interlocked_decrement", +"strcmp", +"break", +"formats", +"^=", +"disassemble_len64", +"event_disable", +"event_inject", +"eb", +"else", +"neg", +"#include", +"dd", +"low_pa", +"physical_to_virtual", +"<<", +"for", +"lbr_restore_by_filter", +"db", +"=", +"_local_id" }; const int ParseTable[NONETERMINAL_COUNT][TERMINAL_COUNT]= { - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,109 ,105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,200 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,224 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,97 ,2147483648 ,2147483648 ,96 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,302 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,217 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,210 ,206 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,204 ,2147483648 ,2147483648 ,2147483648 ,207 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,216 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,211 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,212 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,215 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,209 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,205 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,217 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,213 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,214 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,241 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,242 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,243 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 }, - {196 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,2147483648 ,196 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,2147483648 ,2147483648 ,196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,2147483648 ,196 ,196 ,2147483648 ,196 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 }, - {9 ,9 ,2147483648 ,9 ,9 ,9 ,2147483648 ,14 ,10 ,9 ,2147483648 ,9 ,9 ,11 ,7 ,9 ,9 ,9 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,2147483648 ,9 ,2147483648 ,9 ,9 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,2147483648 ,2147483648 ,9 ,2147483648 ,9 ,2147483648 ,9 ,9 ,9 ,9 ,7 ,2147483648 ,9 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,6 ,9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,12 ,2147483648 ,2147483648 ,2147483648 ,9 ,2147483648 ,9 ,9 ,4 ,9 ,5 ,9 ,9 ,9 ,9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,7 ,9 ,9 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,9 ,2147483648 ,9 ,9 ,2147483648 ,7 ,2147483648 ,9 ,2147483648 ,9 ,9 ,9 ,13 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,9 ,2147483648 ,9 ,3 ,9 ,9 ,9 ,7 ,2147483648 ,9 ,9 ,9 ,9 ,8 ,9 ,9 ,2147483648 ,15 ,9 ,9 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,297 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,296 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,101 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,230 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {193 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,2147483648 ,193 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,2147483648 ,2147483648 ,193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,2147483648 ,193 ,193 ,2147483648 ,193 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 }, - {179 ,143 ,2147483648 ,174 ,149 ,133 ,2147483648 ,2147483648 ,2147483648 ,134 ,2147483648 ,155 ,171 ,2147483648 ,2147483648 ,141 ,125 ,164 ,2147483648 ,2147483648 ,173 ,151 ,138 ,145 ,168 ,146 ,160 ,2147483648 ,144 ,2147483648 ,116 ,2147483648 ,186 ,152 ,172 ,2147483648 ,2147483648 ,2147483648 ,142 ,2147483648 ,2147483648 ,123 ,2147483648 ,185 ,2147483648 ,147 ,165 ,148 ,182 ,2147483648 ,2147483648 ,124 ,2147483648 ,156 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,162 ,2147483648 ,127 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,119 ,2147483648 ,157 ,178 ,2147483648 ,118 ,2147483648 ,140 ,169 ,181 ,117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,166 ,2147483648 ,167 ,177 ,129 ,2147483648 ,2147483648 ,2147483648 ,135 ,136 ,2147483648 ,180 ,139 ,2147483648 ,2147483648 ,2147483648 ,154 ,2147483648 ,158 ,163 ,126 ,2147483648 ,187 ,131 ,170 ,137 ,2147483648 ,176 ,132 ,2147483648 ,175 ,2147483648 ,121 ,153 ,184 ,2147483648 ,2147483648 ,159 ,130 ,122 ,161 ,2147483648 ,183 ,128 ,2147483648 ,2147483648 ,150 ,120 }, - {223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,223 ,223 ,2147483648 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,300 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,40 ,2147483648 ,2147483648 ,2147483648 ,52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,229 ,229 ,2147483648 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 }, - {50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,51 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,50 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,50 ,50 ,2147483648 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,303 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,59 ,2147483648 ,2147483648 ,60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {16 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,16 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,16 ,2147483648 ,2147483648 ,16 ,18 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,2147483648 ,16 ,16 ,2147483648 ,16 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,2147483648 ,16 ,16 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,221 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,188 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,189 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,317 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {326 ,326 ,2147483648 ,326 ,326 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,326 ,327 ,326 ,326 ,2147483648 ,326 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,326 ,326 ,326 ,326 ,326 ,326 ,326 ,2147483648 ,326 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,326 ,2147483648 ,326 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,326 ,326 ,326 ,326 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,326 ,326 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,326 ,326 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,326 ,326 ,2147483648 ,326 ,326 ,326 ,326 ,2147483648 ,326 ,2147483648 ,326 ,326 ,2147483648 ,2147483648 ,326 ,2147483648 ,326 ,326 ,2147483648 ,326 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,326 ,2147483648 ,326 ,2147483648 ,326 ,2147483648 ,2147483648 ,326 ,326 ,326 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,227 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,234 ,2147483648 ,2147483648 ,2147483648 }, - {67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,68 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,67 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,67 ,67 ,2147483648 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 }, - {328 ,328 ,329 ,328 ,328 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,328 ,328 ,2147483648 ,328 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,328 ,328 ,328 ,328 ,328 ,328 ,328 ,2147483648 ,328 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,328 ,2147483648 ,328 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,328 ,328 ,328 ,328 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,328 ,328 ,2147483648 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,328 ,328 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,328 ,328 ,2147483648 ,328 ,328 ,328 ,328 ,2147483648 ,328 ,2147483648 ,328 ,328 ,2147483648 ,2147483648 ,328 ,2147483648 ,328 ,328 ,2147483648 ,328 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,328 ,2147483648 ,328 ,2147483648 ,328 ,2147483648 ,2147483648 ,328 ,328 ,328 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 }, - {25 ,25 ,2147483648 ,25 ,25 ,25 ,2147483648 ,30 ,26 ,25 ,2147483648 ,25 ,25 ,27 ,23 ,25 ,25 ,25 ,2147483648 ,2147483648 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,2147483648 ,25 ,2147483648 ,25 ,25 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,2147483648 ,2147483648 ,25 ,2147483648 ,25 ,2147483648 ,25 ,25 ,25 ,25 ,23 ,2147483648 ,25 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,25 ,22 ,25 ,2147483648 ,2147483648 ,31 ,2147483648 ,28 ,2147483648 ,2147483648 ,2147483648 ,25 ,2147483648 ,25 ,25 ,20 ,25 ,21 ,25 ,25 ,25 ,25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,25 ,23 ,25 ,25 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,25 ,2147483648 ,25 ,25 ,2147483648 ,23 ,2147483648 ,25 ,2147483648 ,25 ,25 ,25 ,29 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,25 ,2147483648 ,25 ,19 ,25 ,25 ,25 ,23 ,2147483648 ,25 ,25 ,25 ,25 ,24 ,25 ,25 ,2147483648 ,2147483648 ,25 ,25 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,197 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,199 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,232 ,232 ,2147483648 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 }, - {47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,47 ,2147483648 ,46 ,2147483648 ,47 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,47 ,47 ,2147483648 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,220 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,236 ,236 ,2147483648 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,318 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,319 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,320 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {0 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,2147483648 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,2147483648 ,0 ,2147483648 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,2 ,0 ,0 ,0 ,2147483648 ,2147483648 ,2147483648 ,2 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,2147483648 ,1 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,2147483648 ,0 ,0 ,2147483648 ,0 ,2147483648 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,45 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,45 ,45 ,2147483648 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {323 ,323 ,2147483648 ,323 ,323 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 ,323 ,323 ,2147483648 ,323 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,323 ,323 ,323 ,323 ,323 ,323 ,323 ,2147483648 ,323 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,323 ,2147483648 ,323 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,323 ,323 ,323 ,323 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,323 ,323 ,2147483648 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,323 ,323 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,323 ,323 ,2147483648 ,323 ,323 ,323 ,323 ,322 ,323 ,2147483648 ,323 ,323 ,2147483648 ,2147483648 ,323 ,2147483648 ,323 ,323 ,2147483648 ,323 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,323 ,2147483648 ,323 ,2147483648 ,323 ,2147483648 ,2147483648 ,323 ,323 ,323 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 }, - {226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,226 ,226 ,2147483648 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,305 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,306 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,308 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,307 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,316 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,71 ,2147483648 ,72 ,2147483648 ,71 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,71 ,71 ,2147483648 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {192 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,2147483648 ,192 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,191 ,2147483648 ,192 ,192 ,192 ,192 ,2147483648 ,2147483648 ,192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,2147483648 ,192 ,192 ,2147483648 ,192 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 }, - {195 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,2147483648 ,195 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,194 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,2147483648 ,2147483648 ,195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,2147483648 ,195 ,195 ,2147483648 ,195 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,74 ,73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,237 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,238 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 }, - {33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,32 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,33 ,33 ,2147483648 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,198 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,98 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {288 ,252 ,2147483648 ,283 ,258 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,245 ,2147483648 ,264 ,280 ,2147483648 ,295 ,2147483648 ,2147483648 ,273 ,2147483648 ,2147483648 ,282 ,260 ,249 ,254 ,277 ,255 ,269 ,2147483648 ,253 ,312 ,2147483648 ,2147483648 ,2147483648 ,261 ,281 ,2147483648 ,310 ,2147483648 ,2147483648 ,294 ,2147483648 ,2147483648 ,311 ,2147483648 ,2147483648 ,256 ,274 ,257 ,291 ,295 ,2147483648 ,2147483648 ,2147483648 ,265 ,315 ,2147483648 ,2147483648 ,2147483648 ,271 ,2147483648 ,2147483648 ,2147483648 ,309 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,309 ,2147483648 ,2147483648 ,2147483648 ,266 ,287 ,2147483648 ,2147483648 ,2147483648 ,251 ,278 ,290 ,2147483648 ,309 ,2147483648 ,2147483648 ,2147483648 ,275 ,295 ,276 ,286 ,2147483648 ,2147483648 ,2147483648 ,309 ,246 ,247 ,2147483648 ,289 ,250 ,313 ,295 ,2147483648 ,263 ,2147483648 ,267 ,272 ,2147483648 ,2147483648 ,293 ,2147483648 ,279 ,248 ,2147483648 ,285 ,2147483648 ,2147483648 ,284 ,2147483648 ,2147483648 ,262 ,2147483648 ,314 ,2147483648 ,268 ,2147483648 ,2147483648 ,270 ,299 ,292 ,2147483648 ,2147483648 ,2147483648 ,259 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,325 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,240 ,240 ,2147483648 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 } + {2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,298 ,298 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,296 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,189 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,188 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,318 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 }, + {192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,2147483648 ,192 ,192 ,2147483648 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,191 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,192 }, + {165 ,2147483648 ,185 ,2147483648 ,2147483648 ,2147483648 ,174 ,176 ,133 ,175 ,2147483648 ,121 ,135 ,137 ,172 ,2147483648 ,143 ,2147483648 ,2147483648 ,2147483648 ,184 ,2147483648 ,140 ,2147483648 ,178 ,2147483648 ,123 ,187 ,158 ,2147483648 ,2147483648 ,153 ,2147483648 ,2147483648 ,161 ,2147483648 ,141 ,2147483648 ,2147483648 ,152 ,2147483648 ,2147483648 ,2147483648 ,129 ,2147483648 ,2147483648 ,2147483648 ,167 ,182 ,2147483648 ,154 ,186 ,2147483648 ,139 ,2147483648 ,132 ,162 ,2147483648 ,131 ,177 ,122 ,2147483648 ,134 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,164 ,146 ,171 ,126 ,173 ,180 ,2147483648 ,127 ,118 ,2147483648 ,181 ,136 ,138 ,2147483648 ,149 ,2147483648 ,169 ,156 ,2147483648 ,160 ,2147483648 ,2147483648 ,2147483648 ,150 ,166 ,125 ,116 ,128 ,151 ,2147483648 ,147 ,130 ,124 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,183 ,157 ,179 ,2147483648 ,117 ,2147483648 ,155 ,119 ,142 ,170 ,2147483648 ,148 ,2147483648 ,145 ,163 ,159 ,2147483648 ,2147483648 ,168 ,144 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,220 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,217 ,2147483648 ,210 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,204 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,207 ,2147483648 ,2147483648 ,211 ,2147483648 ,2147483648 ,213 ,2147483648 ,2147483648 ,2147483648 ,209 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,216 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,212 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,205 ,2147483648 ,2147483648 ,2147483648 ,214 ,2147483648 ,2147483648 ,217 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,215 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,206 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,236 ,236 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 }, + {229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,229 ,229 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 }, + {195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,2147483648 ,195 ,195 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,194 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,195 }, + {329 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,329 ,329 ,2147483648 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,329 ,329 ,2147483648 ,330 ,329 ,329 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,329 ,2147483648 ,329 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,329 ,329 ,329 ,2147483648 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,329 ,329 ,329 ,329 ,329 ,2147483648 ,329 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,329 ,329 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,2147483648 ,329 ,329 ,329 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,329 }, + {67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,68 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,67 ,67 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,325 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,51 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,50 ,50 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 }, + {2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,224 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 }, + {0 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,2147483648 ,0 ,2 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,2147483648 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,1 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,0 }, + {2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,221 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,199 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {327 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,327 ,327 ,327 ,327 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,327 ,327 ,327 ,2147483648 ,2147483648 ,328 ,327 ,2147483648 ,327 ,327 ,327 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,327 ,327 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,232 ,232 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 }, + {9 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,2147483648 ,9 ,12 ,9 ,2147483648 ,9 ,9 ,9 ,5 ,8 ,9 ,11 ,2147483648 ,9 ,2147483648 ,9 ,2147483648 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,7 ,2147483648 ,2147483648 ,9 ,9 ,3 ,9 ,9 ,7 ,9 ,2147483648 ,9 ,9 ,13 ,9 ,9 ,9 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,9 ,7 ,9 ,9 ,9 ,2147483648 ,9 ,4 ,9 ,9 ,14 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,9 ,9 ,2147483648 ,2147483648 ,2147483648 ,7 ,2147483648 ,9 ,9 ,9 ,10 ,9 ,2147483648 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,15 ,9 ,9 ,9 ,2147483648 ,6 ,9 ,9 ,2147483648 ,7 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,39 ,2147483648 }, + {16 ,16 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,16 ,18 ,2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,17 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 }, + {324 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,323 ,324 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,324 ,324 ,324 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,324 ,324 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,324 ,324 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 }, + {2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,241 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,243 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,242 ,244 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,200 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,43 ,2147483648 }, + {71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,72 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,71 ,71 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 }, + {2147483648 ,2147483648 ,2147483648 ,83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,83 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,319 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,322 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,320 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,198 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,226 ,226 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 }, + {2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,301 ,301 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,300 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,46 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,47 ,47 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,238 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,239 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,237 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,235 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,234 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,60 }, + {2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,304 ,304 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,303 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,62 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,45 ,45 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 }, + {2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,302 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,2147483648 ,193 ,193 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,193 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,81 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,197 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,85 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,309 ,2147483648 ,2147483648 ,308 ,2147483648 ,2147483648 ,305 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,306 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,307 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 }, + {196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,2147483648 ,196 ,196 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,196 }, + {240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,240 ,240 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,106 ,2147483648 ,2147483648 ,110 ,2147483648 ,2147483648 ,112 ,2147483648 ,2147483648 ,2147483648 ,108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,104 ,2147483648 ,2147483648 ,2147483648 ,113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,105 ,2147483648 }, + {33 ,2147483648 ,2147483648 ,32 ,33 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,33 ,33 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,227 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 }, + {25 ,31 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,2147483648 ,25 ,28 ,25 ,2147483648 ,25 ,25 ,25 ,21 ,24 ,25 ,27 ,2147483648 ,25 ,2147483648 ,25 ,2147483648 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,23 ,2147483648 ,2147483648 ,25 ,25 ,19 ,25 ,25 ,23 ,25 ,2147483648 ,25 ,25 ,29 ,25 ,25 ,25 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,25 ,25 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,25 ,23 ,25 ,25 ,25 ,2147483648 ,25 ,20 ,25 ,25 ,30 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,25 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,25 ,25 ,2147483648 ,2147483648 ,2147483648 ,23 ,2147483648 ,25 ,25 ,25 ,26 ,25 ,2147483648 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,2147483648 ,25 ,25 ,25 ,2147483648 ,22 ,25 ,25 ,2147483648 ,23 }, + {2147483648 ,2147483648 ,2147483648 ,63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,64 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,230 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,231 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 }, + {223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,223 ,223 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {274 ,2147483648 ,2147483648 ,2147483648 ,314 ,2147483648 ,283 ,285 ,2147483648 ,284 ,2147483648 ,2147483648 ,246 ,248 ,281 ,2147483648 ,252 ,316 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,251 ,2147483648 ,287 ,2147483648 ,2147483648 ,293 ,267 ,2147483648 ,299 ,262 ,2147483648 ,2147483648 ,270 ,310 ,2147483648 ,2147483648 ,310 ,261 ,2147483648 ,310 ,2147483648 ,2147483648 ,295 ,2147483648 ,2147483648 ,276 ,291 ,2147483648 ,263 ,2147483648 ,315 ,250 ,2147483648 ,2147483648 ,271 ,2147483648 ,2147483648 ,286 ,2147483648 ,2147483648 ,245 ,2147483648 ,312 ,2147483648 ,310 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,273 ,255 ,280 ,2147483648 ,282 ,289 ,2147483648 ,2147483648 ,2147483648 ,295 ,290 ,247 ,249 ,294 ,258 ,2147483648 ,278 ,265 ,2147483648 ,269 ,2147483648 ,2147483648 ,2147483648 ,259 ,275 ,2147483648 ,2147483648 ,2147483648 ,260 ,311 ,256 ,2147483648 ,2147483648 ,2147483648 ,313 ,2147483648 ,295 ,310 ,292 ,266 ,288 ,2147483648 ,2147483648 ,2147483648 ,264 ,2147483648 ,2147483648 ,279 ,2147483648 ,257 ,2147483648 ,254 ,272 ,268 ,2147483648 ,2147483648 ,277 ,253 ,2147483648 ,295 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,317 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 } }; const char* KeywordList[]= { "print", @@ -1627,6 +1631,19 @@ const SYMBOL_MAP SemanticRulesMapList[]= { {"@MEMBER_ARROW_LVALUE", FUNC_MEMBER_ARROW_LVALUE}, {"@MEMBER_DOT_READ", FUNC_MEMBER_DOT_READ}, {"@MEMBER_ARROW_READ", FUNC_MEMBER_ARROW_READ}, +{"@MOV_FLOAT", FUNC_MOV_FLOAT}, +{"@NEG_FLOAT", FUNC_NEG_FLOAT}, +{"@ADD_FLOAT", FUNC_ADD_FLOAT}, +{"@SUB_FLOAT", FUNC_SUB_FLOAT}, +{"@MUL_FLOAT", FUNC_MUL_FLOAT}, +{"@DIV_FLOAT", FUNC_DIV_FLOAT}, +{"@GT_FLOAT", FUNC_GT_FLOAT}, +{"@LT_FLOAT", FUNC_LT_FLOAT}, +{"@EGT_FLOAT", FUNC_EGT_FLOAT}, +{"@ELT_FLOAT", FUNC_ELT_FLOAT}, +{"@EQUAL_FLOAT", FUNC_EQUAL_FLOAT}, +{"@NEQ_FLOAT", FUNC_NEQ_FLOAT}, +{"@CONVERT_FLOAT", FUNC_CONVERT_FLOAT}, {"@PRINT", FUNC_PRINT}, {"@FORMATS", FUNC_FORMATS}, {"@EVENT_ENABLE", FUNC_EVENT_ENABLE}, @@ -2016,6 +2033,7 @@ const struct _SCRIPT_ENGINE_TOKEN LalrLhs[RULES_COUNT]= {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, + {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E13"}, {NON_TERMINAL, "MEMBER_NAME"}, {NON_TERMINAL, "VA2"}, @@ -2137,6 +2155,7 @@ const struct _SCRIPT_ENGINE_TOKEN LalrRhs[RULES_COUNT][MAX_RHS_LEN]= {{DECIMAL, "_decimal"},{SEMANTIC_RULE, "@PUSH"}}, {{OCTAL, "_octal"},{SEMANTIC_RULE, "@PUSH"}}, {{BINARY, "_binary"},{SEMANTIC_RULE, "@PUSH"}}, + {{FLOAT_LITERAL, "_float"},{SEMANTIC_RULE, "@PUSH"}}, {{PSEUDO_REGISTER, "_pseudo_register"},{SEMANTIC_RULE, "@PUSH"}}, {{NON_TERMINAL, "E13"},{SPECIAL_TOKEN, "("},{NON_TERMINAL, "VA2"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@END_OF_CALLING_USER_DEFINED_FUNCTION_WITH_RETURNING_VALUE"}}, {{FUNCTION_ID, "_function_id"},{SEMANTIC_RULE, "@PUSH"}}, @@ -2261,6 +2280,7 @@ const unsigned int LalrRhsSize[RULES_COUNT]= 2, 2, 2, +2, 5, 2, 2, @@ -2282,128 +2302,129 @@ const unsigned int LalrRhsSize[RULES_COUNT]= }; const char* LalrNoneTerminalMap[NONETERMINAL_COUNT]= { -"WstringNumber", -"B2", -"MEMBER_NAME", -"ARRAY4", -"B4", -"E13", -"B6", -"STRING", -"ARRAY1", -"ARRAY3", -"E3", -"B5", -"CMP", -"B3", -"EXP", -"E4", -"E10", "S", +"E13", "WSTRING", -"B1", -"BE", +"B2", "StringNumber", -"ARRAY2", -"E12", -"VA3", +"ARRAY1", +"E3", +"E4", +"ARRAY4", "VA2", -"E5" +"E5", +"WstringNumber", +"B3", +"B1", +"ARRAY2", +"VA3", +"CMP", +"ARRAY3", +"EXP", +"B5", +"MEMBER_NAME", +"BE", +"E12", +"STRING", +"B4", +"B6", +"E10" }; const char* LalrTerminalMap[TERMINAL_COUNT]= { -"strcmp", -"poi", -"_wstring", -"eb_pa", -"hi", -"rdtsc", -"_string", -"disassemble_len64", -"eq", -"_global_id", -"db_pa", -"interlocked_exchange_add", -"!=", -"not", -"lbr_print", -"dd", -"lbr_restore_by_filter", -"dw", -"virtual_to_physical", -"db", -"+", -"==", -"check_address", -"interlocked_exchange", -"_pseudo_register", -"[", -"(", -"->", -"-", -"<=", -"dq", "dd_pa", -"neg", -"wcslen", -"_function_parameter_id", -"interlocked_increment", -"&", -"/", -"$", -"hi_pa", -"<", -"_hex", -"_decimal", -">>", -"strlen", -"interlocked_decrement", -"lbr_check", -"ed", -"strncmp", -"_binary", -",", -"]", -"dw_pa", -"dq_pa", -"interlocked_compare_exchange", -"&&", -"_local_id", -"%", -"_octal", -"rdtscp", -">", -"lbr_save", -"||", -".", -"memcmp", -"lbr_restore", "~", -"_register", -")", -"^", -"disassemble_len32", -"reference", -"low_pa", -"wcsncmp", -"eb", -"lbr_dump", -"|", -">=", +"eb_pa", +"<", "eq_pa", "ed_pa", -"disassemble_len", -"*", -"physical_to_virtual", -"poi_pa", +"rdtscp", +">=", +"lbr_dump", +"interlocked_exchange", +"poi", +"&", +"/", +"lbr_check", +"strlen", +"wcsncmp", +"&&", +"reference", "_function_id", +"disassemble_len", +"_wstring", +"poi_pa", +"_float", +"_binary", +">>", +"check_address", +"_hex", +"_register", +"|", +"$", +"dq_pa", +"wcslen", +"disassemble_len32", +"==", +"*", +"lbr_restore", +"hi_pa", +"interlocked_compare_exchange", +"rdtsc", +"-", +"_decimal", +"]", +"%", +"^", +")", +"db_pa", +"dw", +"eq", +"interlocked_exchange_add", +"memcmp", +"[", +"_global_id", +"strncmp", +"lbr_save", +"lbr_print", +"(", +"hi", +"ed", +"interlocked_increment", +"virtual_to_physical", +",", +"dw_pa", +"low", +"->", +"not", +"_pseudo_register", +"dq", +"_string", +"+", +"<=", +".", +"_function_parameter_id", +"_octal", "wcscmp", +"interlocked_decrement", +"strcmp", +"||", +">", +"disassemble_len64", +"eb", +"neg", +"!=", +"dd", +"low_pa", +"physical_to_virtual", "<<", -"low" +"lbr_restore_by_filter", +"db", +"_local_id" }; const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= { - {2147483648 ,4 ,2147483648 ,2147483648 ,6 ,16 ,8 ,2147483648 ,17 ,2147483648 ,11 ,7 ,9 ,5 ,10 ,12 ,14 ,1 ,2147483648 ,3 ,2 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {1 ,16 ,2147483648 ,4 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,5 ,3 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,2 ,15 ,2147483648 ,6 ,8 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2421,7 +2442,7 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2431,17 +2452,17 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,4 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,5 ,3 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,116 ,15 ,2147483648 ,6 ,8 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,116 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,123 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,121 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2456,8 +2477,6 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,4 ,2147483648 ,2147483648 ,6 ,16 ,8 ,2147483648 ,17 ,2147483648 ,11 ,7 ,9 ,5 ,10 ,12 ,14 ,2147483648 ,2147483648 ,3 ,133 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,134 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2467,15 +2486,16 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,144 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,143 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,147 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,148 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,151 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2483,89 +2503,90 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,157 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,162 ,2147483648 ,2147483648 ,6 ,16 ,8 ,2147483648 ,17 ,2147483648 ,11 ,7 ,9 ,5 ,10 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,6 ,16 ,8 ,2147483648 ,17 ,2147483648 ,11 ,7 ,9 ,163 ,10 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,164 ,16 ,8 ,2147483648 ,17 ,2147483648 ,11 ,7 ,9 ,2147483648 ,10 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,8 ,2147483648 ,17 ,2147483648 ,11 ,165 ,9 ,2147483648 ,10 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,166 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,9 ,2147483648 ,10 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,167 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,168 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,169 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,170 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,171 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,172 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,173 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,174 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,175 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,176 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,177 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,178 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,179 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,180 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,182 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,183 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,184 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,186 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,185 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,187 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,188 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {191 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,189 ,12 ,14 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,193 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,194 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,195 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,196 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {198 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,197 ,12 ,14 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,200 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,163 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,5 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,2147483648 ,15 ,2147483648 ,6 ,8 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,164 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,2147483648 ,15 ,2147483648 ,6 ,8 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,2147483648 ,15 ,2147483648 ,165 ,8 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,166 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,8 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,167 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,168 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,169 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,170 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,171 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,172 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,173 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,174 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,175 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,176 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,177 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,178 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,179 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,180 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,181 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,183 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,185 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,184 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,187 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,186 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,188 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,189 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,192 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,194 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,201 ,12 ,14 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,203 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,204 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,206 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,205 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,207 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,209 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,210 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,206 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,205 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,211 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,212 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,213 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,214 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,198 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,199 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,206 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,216 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,217 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,218 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,219 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,220 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,203 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,205 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,206 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,209 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,222 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,223 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,224 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,225 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,226 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,227 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,228 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,229 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,230 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,210 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,211 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,212 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,213 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,214 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,216 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,215 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,217 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,221 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,223 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,233 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,227 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,235 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,236 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,230 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,233 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,238 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,239 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,240 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,206 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,205 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,241 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,243 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,244 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,245 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,246 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,235 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,234 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,237 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,238 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,241 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,242 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,243 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,245 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,246 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,247 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2586,10 +2607,10 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,247 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,250 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,185 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,248 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,251 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,186 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2651,57 +2672,57 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,297 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,189 ,12 ,14 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,299 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,299 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,300 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,189 ,12 ,14 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,300 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,301 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,302 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,206 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,205 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,302 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,303 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,206 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,205 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,303 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,304 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,305 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,306 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,305 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,307 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,306 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,308 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,309 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,310 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,311 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,307 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,308 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,206 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,205 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,309 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,310 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,311 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,312 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,312 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,313 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,313 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,314 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2717,19 +2738,20 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,329 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,330 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,330 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,331 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,331 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,17 ,2147483648 ,11 ,2147483648 ,2147483648 ,2147483648 ,332 ,12 ,14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,15 ,2147483648 ,2147483648 ,13 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,332 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,333 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, @@ -2743,343 +2765,344 @@ const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= }; const int LalrActionTable[LALR_STATE_COUNT][LALR_TERMINAL_COUNT]= { - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483647 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-1 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,2147483648 ,-13 ,2147483648 ,93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,-20 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,-21 ,2147483648 ,-21 ,2147483648 ,2147483648 ,95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,96 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,-24 ,2147483648 ,-24 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,101 ,-27 ,2147483648 ,-27 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,99 ,2147483648 ,2147483648 ,-27 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,-31 ,2147483648 ,-31 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,-31 ,2147483648 ,2147483648 ,-31 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,-32 ,2147483648 ,-32 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,-32 ,2147483648 ,2147483648 ,-32 ,2147483648 ,-32 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,-97 ,2147483648 ,-97 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,-97 ,2147483648 ,2147483648 ,-97 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,-93 ,2147483648 ,-93 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,-93 ,2147483648 ,2147483648 ,-93 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,-101 ,2147483648 ,-101 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,-101 ,2147483648 ,2147483648 ,-101 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,-99 ,2147483648 ,-99 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,-99 ,2147483648 ,2147483648 ,-99 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,-98 ,2147483648 ,-98 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,-98 ,2147483648 ,2147483648 ,-98 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,2147483648 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,2147483648 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,2147483648 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,-95 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,-95 ,2147483648 ,-95 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,-95 ,2147483648 ,2147483648 ,-95 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,2147483648 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,2147483648 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,2147483648 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,122 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,123 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,124 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,125 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,126 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,127 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,128 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,129 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,130 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,131 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,-102 ,2147483648 ,-102 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,-102 ,2147483648 ,2147483648 ,-102 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,-94 ,2147483648 ,-94 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,-94 ,2147483648 ,2147483648 ,-94 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,-100 ,2147483648 ,-100 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,-100 ,2147483648 ,2147483648 ,-100 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,132 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,2147483648 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,2147483648 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,2147483648 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,135 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,136 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,137 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,138 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,139 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,140 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,141 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,142 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,143 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,2147483648 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,2147483648 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,2147483648 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,145 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,146 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,147 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,148 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,149 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,150 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,2147483648 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,2147483648 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,2147483648 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,152 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,153 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,154 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,155 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,156 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,157 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,-96 ,2147483648 ,-96 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,-96 ,2147483648 ,2147483648 ,-96 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,158 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,159 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,160 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,161 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,181 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,181 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,-106 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,106 ,2147483648 ,-120 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,-120 ,2147483648 ,-120 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,-120 ,2147483648 ,2147483648 ,-120 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,192 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,192 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,199 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,-33 ,2147483648 ,-33 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,-33 ,2147483648 ,2147483648 ,-33 ,2147483648 ,-33 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 }, - {37 ,71 ,192 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,208 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,-37 ,2147483648 ,-37 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,-37 ,2147483648 ,2147483648 ,-37 ,2147483648 ,-37 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,208 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,215 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,208 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,221 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,-36 ,2147483648 ,-36 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,-36 ,2147483648 ,2147483648 ,-36 ,2147483648 ,-36 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,-34 ,2147483648 ,-34 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,-34 ,2147483648 ,2147483648 ,-34 ,2147483648 ,-34 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,234 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,-35 ,2147483648 ,-35 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,-35 ,2147483648 ,2147483648 ,-35 ,2147483648 ,-35 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,237 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,208 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,242 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,-14 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,-17 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,-19 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,-18 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,-15 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,-16 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,-22 ,2147483648 ,-22 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,-23 ,2147483648 ,-23 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,101 ,-26 ,2147483648 ,-26 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,99 ,2147483648 ,2147483648 ,-26 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,101 ,-25 ,2147483648 ,-25 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,99 ,2147483648 ,2147483648 ,-25 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,-29 ,2147483648 ,-29 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,-29 ,2147483648 ,2147483648 ,-29 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,-30 ,2147483648 ,-30 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,-30 ,2147483648 ,2147483648 ,-30 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,-28 ,2147483648 ,-28 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,-28 ,2147483648 ,2147483648 ,-28 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,-91 ,2147483648 ,-91 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,-91 ,2147483648 ,2147483648 ,-91 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,-105 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,-105 ,-105 ,2147483648 ,-105 ,2147483648 ,2147483648 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,-105 ,2147483648 ,2147483648 ,2147483648 ,-105 ,2147483648 ,-105 ,2147483648 ,2147483648 ,-105 ,2147483648 ,-105 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,-105 ,2147483648 ,2147483648 ,2147483648 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,-92 ,2147483648 ,-92 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,-92 ,2147483648 ,2147483648 ,-92 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,248 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,249 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,106 ,2147483648 ,-120 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,-120 ,2147483648 ,-120 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,-120 ,2147483648 ,2147483648 ,-120 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,-116 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,-116 ,-116 ,2147483648 ,-116 ,2147483648 ,2147483648 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,-116 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 ,-116 ,2147483648 ,2147483648 ,-116 ,2147483648 ,-116 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,-116 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,251 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,252 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,253 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,254 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,255 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,256 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,257 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,258 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,259 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,-40 ,2147483648 ,-40 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,-40 ,2147483648 ,2147483648 ,-40 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,260 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,261 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,262 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,263 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,264 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,265 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,266 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,267 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,268 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,269 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,270 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,271 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,-39 ,2147483648 ,-39 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,-39 ,2147483648 ,2147483648 ,-39 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,272 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,273 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,274 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,275 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,276 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,-90 ,2147483648 ,-90 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,-90 ,2147483648 ,2147483648 ,-90 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,277 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,278 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,279 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,280 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,281 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,282 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,283 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,284 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,285 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,-41 ,2147483648 ,-41 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,-41 ,2147483648 ,2147483648 ,-41 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,-44 ,2147483648 ,-44 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,-44 ,2147483648 ,2147483648 ,-44 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,286 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,-42 ,2147483648 ,-42 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,-42 ,2147483648 ,2147483648 ,-42 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,287 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,288 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,-43 ,2147483648 ,-43 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,-43 ,2147483648 ,2147483648 ,-43 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,289 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,290 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,291 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,292 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,-38 ,2147483648 ,-38 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,-38 ,2147483648 ,2147483648 ,-38 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,293 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,294 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,295 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,296 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,-103 ,2147483648 ,-103 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,-103 ,2147483648 ,2147483648 ,-103 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,-119 ,2147483648 ,-119 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,-119 ,2147483648 ,2147483648 ,-119 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,-118 ,2147483648 ,2147483648 ,2147483648 ,-118 ,2147483648 ,-118 ,-118 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,-118 ,-118 ,2147483648 ,-118 ,2147483648 ,2147483648 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,-118 ,2147483648 ,2147483648 ,2147483648 ,-118 ,2147483648 ,-118 ,2147483648 ,2147483648 ,-118 ,2147483648 ,-118 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,-118 ,2147483648 ,2147483648 ,2147483648 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,-61 ,2147483648 ,-61 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,-61 ,2147483648 ,2147483648 ,-61 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 }, - {37 ,71 ,192 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,-51 ,2147483648 ,-51 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,-51 ,2147483648 ,2147483648 ,-51 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,-54 ,2147483648 ,-54 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,-54 ,2147483648 ,2147483648 ,-54 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,-71 ,2147483648 ,-71 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,-71 ,2147483648 ,2147483648 ,-71 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,192 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,-72 ,2147483648 ,-72 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,-72 ,2147483648 ,2147483648 ,-72 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,-56 ,2147483648 ,-56 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,-56 ,2147483648 ,2147483648 ,-56 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,-87 ,2147483648 ,-87 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,-87 ,2147483648 ,2147483648 ,-87 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,-64 ,2147483648 ,-64 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,-64 ,2147483648 ,2147483648 ,-64 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,-57 ,2147483648 ,-57 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,-57 ,2147483648 ,2147483648 ,-57 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,208 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,-46 ,2147483648 ,-46 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,-46 ,2147483648 ,2147483648 ,-46 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,-58 ,2147483648 ,-58 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,-58 ,2147483648 ,2147483648 ,-58 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,208 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,-49 ,2147483648 ,-49 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,-49 ,2147483648 ,2147483648 ,-49 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,-65 ,2147483648 ,-65 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,-65 ,2147483648 ,2147483648 ,-65 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,-70 ,2147483648 ,-70 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,-70 ,2147483648 ,2147483648 ,-70 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,-55 ,2147483648 ,-55 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,-55 ,2147483648 ,2147483648 ,-55 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,-83 ,2147483648 ,-83 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,-83 ,2147483648 ,2147483648 ,-83 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,-63 ,2147483648 ,-63 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,-63 ,2147483648 ,2147483648 ,-63 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,-67 ,2147483648 ,-67 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,-67 ,2147483648 ,2147483648 ,-67 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,-66 ,2147483648 ,-66 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,-66 ,2147483648 ,2147483648 ,-66 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,-48 ,2147483648 ,-48 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,-48 ,2147483648 ,2147483648 ,-48 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,-47 ,2147483648 ,-47 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,-47 ,2147483648 ,2147483648 ,-47 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,-60 ,2147483648 ,-60 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,-60 ,2147483648 ,2147483648 ,-60 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,-68 ,2147483648 ,-68 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,-68 ,2147483648 ,2147483648 ,-68 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,-52 ,2147483648 ,-52 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,-52 ,2147483648 ,2147483648 ,-52 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,-59 ,2147483648 ,-59 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,-59 ,2147483648 ,2147483648 ,-59 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,-53 ,2147483648 ,-53 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,-53 ,2147483648 ,2147483648 ,-53 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,-62 ,2147483648 ,-62 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,-62 ,2147483648 ,2147483648 ,-62 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,-45 ,2147483648 ,-45 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,-45 ,2147483648 ,2147483648 ,-45 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,-50 ,2147483648 ,-50 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,-50 ,2147483648 ,2147483648 ,-50 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,208 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,-69 ,2147483648 ,-69 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,-69 ,2147483648 ,2147483648 ,-69 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,248 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,314 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,315 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,316 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,317 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,318 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,319 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,320 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,322 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,325 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,-75 ,2147483648 ,-75 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,-75 ,2147483648 ,2147483648 ,-75 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,-78 ,2147483648 ,-78 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,-78 ,2147483648 ,2147483648 ,-78 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,-88 ,2147483648 ,-88 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,-88 ,2147483648 ,2147483648 ,-88 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,-84 ,2147483648 ,-84 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,-84 ,2147483648 ,2147483648 ,-84 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,-74 ,2147483648 ,-74 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,-74 ,2147483648 ,2147483648 ,-74 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,-81 ,2147483648 ,-81 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,-81 ,2147483648 ,2147483648 ,-81 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,-79 ,2147483648 ,-79 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,-79 ,2147483648 ,2147483648 ,-79 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,-73 ,2147483648 ,-73 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,-73 ,2147483648 ,2147483648 ,-73 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 }, - {37 ,71 ,2147483648 ,74 ,22 ,78 ,2147483648 ,63 ,24 ,50 ,60 ,80 ,2147483648 ,68 ,69 ,58 ,31 ,56 ,34 ,39 ,64 ,2147483648 ,26 ,81 ,49 ,2147483648 ,53 ,2147483648 ,32 ,2147483648 ,42 ,83 ,76 ,33 ,79 ,59 ,38 ,2147483648 ,2147483648 ,55 ,2147483648 ,29 ,25 ,2147483648 ,46 ,19 ,66 ,75 ,41 ,23 ,2147483648 ,2147483648 ,44 ,27 ,62 ,2147483648 ,36 ,2147483648 ,51 ,45 ,2147483648 ,30 ,2147483648 ,2147483648 ,77 ,73 ,72 ,20 ,2147483648 ,2147483648 ,40 ,70 ,52 ,21 ,47 ,65 ,2147483648 ,2147483648 ,57 ,82 ,35 ,54 ,48 ,43 ,67 ,28 ,2147483648 ,61 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,-77 ,2147483648 ,-77 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,-77 ,2147483648 ,2147483648 ,-77 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,-76 ,2147483648 ,-76 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,-76 ,2147483648 ,2147483648 ,-76 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,-80 ,2147483648 ,-80 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,-80 ,2147483648 ,2147483648 ,-80 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,333 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,334 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,335 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,336 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,-89 ,2147483648 ,-89 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,-89 ,2147483648 ,2147483648 ,-89 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,-86 ,2147483648 ,-86 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,-86 ,2147483648 ,2147483648 ,-86 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,-82 ,2147483648 ,-82 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,-82 ,2147483648 ,2147483648 ,-82 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,-85 ,2147483648 ,-85 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,-85 ,2147483648 ,2147483648 ,-85 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 } + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483647 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-1 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,92 ,2147483648 ,2147483648 ,2147483648 ,91 ,2147483648 ,2147483648 ,2147483648 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,-13 ,2147483648 ,2147483648 ,2147483648 ,93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,95 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,96 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,-24 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,100 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,-27 ,101 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,-31 ,-31 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,-32 ,-32 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,-97 ,-97 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,-100 ,-100 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,122 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,124 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,125 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,126 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,-99 ,-99 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,127 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,-94 ,-94 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,-102 ,-102 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,-93 ,-93 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,128 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,129 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,-101 ,-101 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,130 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,-98 ,-98 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,131 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,132 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,133 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,134 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,-96 ,-96 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,135 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,136 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,137 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,-103 ,-103 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,138 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,139 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,140 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,141 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,142 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,144 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,145 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,146 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,149 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,150 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,151 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,152 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,153 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,154 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,-95 ,-95 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,155 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,156 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,158 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,159 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,160 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,161 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,162 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,182 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,182 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,-107 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,-121 ,-121 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,197 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,200 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,207 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,-35 ,-35 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,220 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,224 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,-37 ,-37 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,-34 ,-34 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,-36 ,-36 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,-33 ,-33 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,-23 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,-22 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,100 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,-25 ,101 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,100 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,-26 ,101 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,-28 ,-28 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,-29 ,-29 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,-30 ,-30 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,-92 ,-92 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,-106 ,-106 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,-91 ,-91 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,249 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,250 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,-121 ,-121 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,-117 ,-117 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,252 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,253 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,254 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,255 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,-42 ,-42 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,256 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,-43 ,-43 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,257 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,258 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,-90 ,-90 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,259 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,260 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,261 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,-44 ,-44 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,262 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,263 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,264 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,265 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,266 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,267 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,268 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,270 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,271 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,272 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,273 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,-39 ,-39 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,274 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,276 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,-38 ,-38 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,277 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,-41 ,-41 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,278 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,-40 ,-40 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,279 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,280 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,281 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,282 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,283 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,284 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,285 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,286 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,287 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,288 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,289 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,290 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,291 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,292 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,293 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,294 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,295 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,296 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,-104 ,-104 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,-120 ,-120 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,-119 ,-119 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,-52 ,-52 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,-47 ,-47 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,-54 ,-54 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,-68 ,-68 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,-58 ,-58 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,-45 ,-45 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,-51 ,-51 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,-71 ,-71 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,-72 ,-72 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,-59 ,-59 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,-61 ,-61 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,-55 ,-55 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,-83 ,-83 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,-48 ,-48 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,-49 ,-49 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,-53 ,-53 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,-66 ,-66 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,-64 ,-64 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,-46 ,-46 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,-70 ,-70 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,-57 ,-57 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,-65 ,-65 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,-56 ,-56 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,-87 ,-87 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,-67 ,-67 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,-69 ,-69 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,-50 ,-50 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,-62 ,-62 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,-63 ,-63 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,-60 ,-60 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,249 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,315 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,316 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,317 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,318 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,319 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,320 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,322 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,325 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,-84 ,-84 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,-80 ,-80 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,-74 ,-74 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,-76 ,-76 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,-78 ,-78 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,-88 ,-88 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,-77 ,-77 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,-81 ,-81 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,-75 ,-75 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 }, + {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, + {2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,-73 ,-73 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,-79 ,-79 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,334 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,335 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,336 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,337 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,-89 ,-89 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,-82 ,-82 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,-86 ,-86 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,-85 ,-85 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 } }; const struct _SCRIPT_ENGINE_TOKEN LalrSemanticRules[RULES_COUNT]= { @@ -3185,6 +3208,7 @@ const struct _SCRIPT_ENGINE_TOKEN LalrSemanticRules[RULES_COUNT]= {SEMANTIC_RULE, "@PUSH"}, {SEMANTIC_RULE, "@PUSH"}, {SEMANTIC_RULE, "@PUSH"}, + {SEMANTIC_RULE, "@PUSH"}, {SEMANTIC_RULE, "@END_OF_CALLING_USER_DEFINED_FUNCTION_WITH_RETURNING_VALUE"}, {SEMANTIC_RULE, "@PUSH"}, {SEMANTIC_RULE, "@PUSH"}, diff --git a/hyperdbg/script-engine/code/scanner.c b/hyperdbg/script-engine/code/scanner.c index 4cb1faa2..0aaffbfd 100644 --- a/hyperdbg/script-engine/code/scanner.c +++ b/hyperdbg/script-engine/code/scanner.c @@ -492,6 +492,18 @@ GetToken(char * c, char * str) case '.': AppendByte(Token, *c); *c = sgetc(str); + if (IsDecimal(*c)) + { + do + { + AppendByte(Token, *c); + *c = sgetc(str); + } while (IsDecimal(*c)); + + Token->Type = FLOAT_LITERAL; + Token->VariableType = (VARIABLE_TYPE *)VARIABLE_TYPE_DOUBLE; + return Token; + } if (IsLetter(*c) || IsHex(*c) || (*c == '_') || (*c == '!')) { do @@ -624,6 +636,20 @@ GetToken(char * c, char * str) return Token; } + else if (*c == '.') + { + AppendByte(Token, '0'); + AppendByte(Token, '.'); + *c = sgetc(str); + while (IsDecimal(*c)) + { + AppendByte(Token, *c); + *c = sgetc(str); + } + Token->Type = FLOAT_LITERAL; + Token->VariableType = (VARIABLE_TYPE *)VARIABLE_TYPE_DOUBLE; + return Token; + } else if (IsHex(*c)) { do @@ -727,12 +753,34 @@ GetToken(char * c, char * str) default: if (*c >= '0' && *c <= '9') { + BOOLEAN HasOnlyDecimalDigits = TRUE; do { if (*c != '`') + { AppendByte(Token, *c); + if (!IsDecimal(*c)) + { + HasOnlyDecimalDigits = FALSE; + } + } *c = sgetc(str); } while (IsHex(*c) || *c == '`'); + + if (*c == '.' && HasOnlyDecimalDigits) + { + AppendByte(Token, '.'); + *c = sgetc(str); + while (IsDecimal(*c)) + { + AppendByte(Token, *c); + *c = sgetc(str); + } + Token->Type = FLOAT_LITERAL; + Token->VariableType = (VARIABLE_TYPE *)VARIABLE_TYPE_DOUBLE; + return Token; + } + Token->Type = HEX; return Token; } @@ -1052,6 +1100,7 @@ Scan(char * str, char * c) Token->Type == FUNCTION_PARAMETER_ID || Token->Type == REGISTER || Token->Type == PSEUDO_REGISTER || Token->Type == HEX || Token->Type == DECIMAL || Token->Type == OCTAL || Token->Type == BINARY || + Token->Type == FLOAT_LITERAL || (Token->Type == SPECIAL_TOKEN && (!strcmp(Token->Value, ")") || !strcmp(Token->Value, "]"))); return Token; diff --git a/hyperdbg/script-engine/code/script-engine.c b/hyperdbg/script-engine/code/script-engine.c index 697da2ee..1252af28 100644 --- a/hyperdbg/script-engine/code/script-engine.c +++ b/hyperdbg/script-engine/code/script-engine.c @@ -13,6 +13,9 @@ #include "pch.h" #include "platform/user/header/platform-lib-calls.h" +#include +#include + // #define _SCRIPT_ENGINE_LALR_DBG_EN // #define _SCRIPT_ENGINE_LL1_DBG_EN // #define _SCRIPT_ENGINE_CODEGEN_DBG_EN @@ -40,6 +43,169 @@ static PVARIABLE_TYPE CurrentStructDefinition; static PSCRIPT_ENGINE_TOKEN LastStructObject; static PVARIABLE_TYPE LastStructObjectType; +static UINT64 +GetFloatingValueKind(PVARIABLE_TYPE VariableType) +{ + if (VariableType && VariableType->Kind == TY_FLOAT) + { + return SYMBOL_VALUE_KIND_FLOAT32; + } + + if (VariableType && VariableType->Kind == TY_DOUBLE) + { + return SYMBOL_VALUE_KIND_FLOAT64; + } + + return SYMBOL_VALUE_KIND_INTEGER; +} + +static BOOLEAN +IsFloatingVariableType(PVARIABLE_TYPE VariableType) +{ + return VariableType && (VariableType->Kind == TY_FLOAT || VariableType->Kind == TY_DOUBLE); +} + +static BOOLEAN +IsFloatingComparisonOperator(const CHAR * Operator) +{ + return !strcmp(Operator, "@GT") || !strcmp(Operator, "@LT") || + !strcmp(Operator, "@EGT") || !strcmp(Operator, "@ELT") || + !strcmp(Operator, "@EQUAL") || !strcmp(Operator, "@NEQ"); +} + +static UINT64 +GetFloatingBinaryOpcode(const CHAR * Operator) +{ + if (!strcmp(Operator, "@ADD")) + { + return FUNC_ADD_FLOAT; + } + if (!strcmp(Operator, "@SUB")) + { + return FUNC_SUB_FLOAT; + } + if (!strcmp(Operator, "@MUL")) + { + return FUNC_MUL_FLOAT; + } + if (!strcmp(Operator, "@DIV")) + { + return FUNC_DIV_FLOAT; + } + if (!strcmp(Operator, "@GT")) + { + return FUNC_GT_FLOAT; + } + if (!strcmp(Operator, "@LT")) + { + return FUNC_LT_FLOAT; + } + if (!strcmp(Operator, "@EGT")) + { + return FUNC_EGT_FLOAT; + } + if (!strcmp(Operator, "@ELT")) + { + return FUNC_ELT_FLOAT; + } + if (!strcmp(Operator, "@EQUAL")) + { + return FUNC_EQUAL_FLOAT; + } + if (!strcmp(Operator, "@NEQ")) + { + return FUNC_NEQ_FLOAT; + } + return 0; +} + +static BOOLEAN +FloatingLiteralHasNonzeroDigit(const CHAR * Text) +{ + while (*Text) + { + if (*Text >= '1' && *Text <= '9') + { + return TRUE; + } + Text++; + } + return FALSE; +} + +static BOOLEAN +ParseFloatingLiteral(const CHAR * Text, UINT64 ValueKind, PUINT64 RawBits, PSCRIPT_ENGINE_ERROR_TYPE Error) +{ + CHAR * End = NULL; + + if (!Text || !RawBits || (ValueKind != SYMBOL_VALUE_KIND_FLOAT32 && ValueKind != SYMBOL_VALUE_KIND_FLOAT64)) + { + *Error = SCRIPT_ENGINE_ERROR_INVALID_FLOAT_LITERAL; + return FALSE; + } + +#ifdef _WIN32 + _locale_t Locale = _create_locale(LC_NUMERIC, "C"); + if (!Locale) + { + *Error = SCRIPT_ENGINE_ERROR_INVALID_FLOAT_LITERAL; + return FALSE; + } + + if (ValueKind == SYMBOL_VALUE_KIND_FLOAT32) + { + float Value = _strtof_l(Text, &End, Locale); + UINT32 Bits = 0; + memcpy(&Bits, &Value, sizeof(Bits)); + *RawBits = Bits; + } + else + { + double Value = _strtod_l(Text, &End, Locale); + memcpy(RawBits, &Value, sizeof(Value)); + } + _free_locale(Locale); +#else + locale_t Locale = newlocale(LC_NUMERIC_MASK, "C", (locale_t)0); + if (!Locale) + { + *Error = SCRIPT_ENGINE_ERROR_INVALID_FLOAT_LITERAL; + return FALSE; + } + + if (ValueKind == SYMBOL_VALUE_KIND_FLOAT32) + { + float Value = strtof_l(Text, &End, Locale); + UINT32 Bits = 0; + memcpy(&Bits, &Value, sizeof(Bits)); + *RawBits = Bits; + } + else + { + double Value = strtod_l(Text, &End, Locale); + memcpy(RawBits, &Value, sizeof(Value)); + } + freelocale(Locale); +#endif + + if (End == Text || *End != '\0') + { + *Error = SCRIPT_ENGINE_ERROR_INVALID_FLOAT_LITERAL; + return FALSE; + } + + if ((ValueKind == SYMBOL_VALUE_KIND_FLOAT32 && ((*RawBits & 0x7f800000ULL) == 0x7f800000ULL)) || + (ValueKind == SYMBOL_VALUE_KIND_FLOAT64 && ((*RawBits & 0x7ff0000000000000ULL) == 0x7ff0000000000000ULL)) || + ((*RawBits & (ValueKind == SYMBOL_VALUE_KIND_FLOAT32 ? 0x7fffffffULL : 0x7fffffffffffffffULL)) == 0 && + FloatingLiteralHasNonzeroDigit(Text))) + { + *Error = SCRIPT_ENGINE_ERROR_FLOAT_OUT_OF_RANGE; + return FALSE; + } + + return TRUE; +} + static unsigned int GetStructPointerAddressSpace(PVARIABLE_TYPE PointerType, PSCRIPT_ENGINE_TOKEN PointerToken) { @@ -1986,6 +2152,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (!strcmp(Operator->Value, "@MOV")) { + BOOLEAN IsFloatingInitialization = FALSE; + PushSymbol(CodeBuffer, OperatorSymbol); Op0 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); @@ -2038,6 +2206,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI VariableType = PointerVariableType; } + Op1->VariableType = VariableType; + IsFloatingInitialization = VariableType->Kind == TY_FLOAT || VariableType->Kind == TY_DOUBLE; + if (Op1->Type == LOCAL_UNRESOLVED_ID || Op1->Type == LOCAL_ID) { SetLocalIdentifierVariableType(Op1, VariableType); @@ -2049,6 +2220,40 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } } + if (IsFloatingInitialization) + { + UINT64 ValueKind = GetFloatingValueKind(VariableType); + BOOLEAN RequiresConversion = FALSE; + + if (Op1->Type != LOCAL_UNRESOLVED_ID && Op1->Type != LOCAL_ID) + { + *Error = SCRIPT_ENGINE_ERROR_UNSUPPORTED_FLOAT_OPERATION; + break; + } + + if (Op0->Type == FLOAT_LITERAL) + { + if (!ParseFloatingLiteral(Op0->Value, ValueKind, &Op0Symbol->Value, Error)) + { + break; + } + Op0Symbol->Len = ValueKind; + } + else if (!IsFloatingVariableType((PVARIABLE_TYPE)Op0->VariableType)) + { + *Error = SCRIPT_ENGINE_ERROR_UNSUPPORTED_FLOAT_OPERATION; + break; + } + else + { + RequiresConversion = Op0Symbol->Len != ValueKind; + } + + Op1Symbol->Len = ValueKind; + (CodeBuffer->Head + CodeBuffer->Pointer - 1)->Value = + RequiresConversion ? FUNC_CONVERT_FLOAT : FUNC_MOV_FLOAT; + } + if (Op0->VariableType && Op1->VariableType && ((PVARIABLE_TYPE)Op0->VariableType)->Kind == TY_PTR && ((PVARIABLE_TYPE)Op1->VariableType)->Kind == TY_PTR) @@ -2516,22 +2721,63 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (IsType1Func(Operator)) { - PushSymbol(CodeBuffer, OperatorSymbol); - Op0 = Pop(MatchedStack); - VariableType = (VARIABLE_TYPE *)Op0->VariableType; - Op0Symbol = ToSymbol(Op0, Error); + Op0 = Pop(MatchedStack); - Temp = NewTemp(Error); - Push(MatchedStack, Temp); - TempSymbol = ToSymbol(Temp, Error); - - PushSymbol(CodeBuffer, Op0Symbol); - PushSymbol(CodeBuffer, TempSymbol); - - FreeTemp(Op0); - if (*Error != SCRIPT_ENGINE_ERROR_FREE) + if (!strcmp(Operator->Value, "@NEG") && Op0->Type == FLOAT_LITERAL) { - break; + PSCRIPT_ENGINE_TOKEN FoldedToken; + CHAR * FoldedValue; + SIZE_T ValueLength = strlen(Op0->Value); + + if (Op0->Value[0] == '-') + { + FoldedToken = NewToken(FLOAT_LITERAL, Op0->Value + 1); + } + else + { + FoldedValue = (CHAR *)malloc(ValueLength + 2); + if (!FoldedValue) + { + *Error = SCRIPT_ENGINE_ERROR_TEMP_LIST_FULL; + RemoveToken(&Op0); + break; + } + FoldedValue[0] = '-'; + memcpy(FoldedValue + 1, Op0->Value, ValueLength + 1); + FoldedToken = NewToken(FLOAT_LITERAL, FoldedValue); + free(FoldedValue); + } + + FoldedToken->VariableType = (VARIABLE_TYPE *)VARIABLE_TYPE_DOUBLE; + RemoveToken(&Op0); + Push(MatchedStack, FoldedToken); + } + else + { + VariableType = (VARIABLE_TYPE *)Op0->VariableType; + Op0Symbol = ToSymbol(Op0, Error); + + if (!strcmp(Operator->Value, "@NEG") && + VariableType && + (VariableType->Kind == TY_FLOAT || VariableType->Kind == TY_DOUBLE)) + { + OperatorSymbol->Value = FUNC_NEG_FLOAT; + } + + PushSymbol(CodeBuffer, OperatorSymbol); + Temp = NewTemp(Error); + Temp->VariableType = VariableType; + Push(MatchedStack, Temp); + TempSymbol = ToSymbol(Temp, Error); + + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, TempSymbol); + + FreeTemp(Op0); + if (*Error != SCRIPT_ENGINE_ERROR_FREE) + { + break; + } } } else if (IsType4Func(Operator)) @@ -2613,7 +2859,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI CHAR Temp = *(Str + 1); if (Temp == 'd' || Temp == 'i' || Temp == 'u' || Temp == 'o' || - Temp == 'x' || Temp == 'c' || Temp == 'p' || Temp == 's' || + Temp == 'x' || Temp == 'c' || Temp == 'p' || Temp == 's' || Temp == 'f' || !strncmp(Str, "%ws", 3) || !strncmp(Str, "%ls", 3) || @@ -2964,7 +3210,51 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0 = TopIndexed(MatchedStack, 0); Op1 = TopIndexed(MatchedStack, 1); - if (!strcmp(Operator->Value, "@ADD") || !strcmp(Operator->Value, "@SUB")) + if (IsFloatingVariableType((PVARIABLE_TYPE)Op0->VariableType) || + IsFloatingVariableType((PVARIABLE_TYPE)Op1->VariableType)) + { + UINT64 FloatingOpcode = GetFloatingBinaryOpcode(Operator->Value); + if (!FloatingOpcode || + !IsFloatingVariableType((PVARIABLE_TYPE)Op0->VariableType) || + !IsFloatingVariableType((PVARIABLE_TYPE)Op1->VariableType)) + { + *Error = SCRIPT_ENGINE_ERROR_UNSUPPORTED_FLOAT_OPERATION; + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); + RemoveToken(&Op0); + RemoveToken(&Op1); + Handled = TRUE; + } + else + { + PVARIABLE_TYPE ResultType = + ((PVARIABLE_TYPE)Op0->VariableType)->Kind == TY_DOUBLE || + ((PVARIABLE_TYPE)Op1->VariableType)->Kind == TY_DOUBLE ? + VARIABLE_TYPE_DOUBLE : VARIABLE_TYPE_FLOAT; + + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); + Op0Symbol = ToSymbol(Op0, Error); + Op1Symbol = ToSymbol(Op1, Error); + Temp = NewTemp(Error); + Temp->VariableType = IsFloatingComparisonOperator(Operator->Value) ? + VARIABLE_TYPE_LONG : ResultType; + TempSymbol = ToSymbol(Temp, Error); + + OperatorSymbol->Value = FloatingOpcode; + PushSymbol(CodeBuffer, OperatorSymbol); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, Op1Symbol); + PushSymbol(CodeBuffer, TempSymbol); + Push(MatchedStack, Temp); + + FreeTemp(Op0); + FreeTemp(Op1); + Handled = TRUE; + } + } + + if (!Handled && (!strcmp(Operator->Value, "@ADD") || !strcmp(Operator->Value, "@SUB"))) { if (((VARIABLE_TYPE *)Op0->VariableType)->Kind == TY_PTR && ((VARIABLE_TYPE *)Op1->VariableType)->Kind == TY_PTR) { @@ -4517,6 +4807,7 @@ ToSymbol(PSCRIPT_ENGINE_TOKEN Token, PSCRIPT_ENGINE_ERROR_TYPE Error) case LOCAL_ID: { Symbol->Value = GetLocalIdentifierVal(Token); + Symbol->Len = GetFloatingValueKind((PVARIABLE_TYPE)Token->VariableType); if (((VARIABLE_TYPE *)Token->VariableType)->Kind == TY_ARRAY || ((VARIABLE_TYPE *)Token->VariableType)->Kind == TY_STRUCT) @@ -4551,6 +4842,16 @@ ToSymbol(PSCRIPT_ENGINE_TOKEN Token, PSCRIPT_ENGINE_ERROR_TYPE Error) SetType(&Symbol->Type, SYMBOL_NUM_TYPE); return Symbol; + case FLOAT_LITERAL: + if (!ParseFloatingLiteral(Token->Value, SYMBOL_VALUE_KIND_FLOAT64, &Symbol->Value, Error)) + { + Symbol->Type = INVALID; + return Symbol; + } + Symbol->Len = SYMBOL_VALUE_KIND_FLOAT64; + SetType(&Symbol->Type, SYMBOL_NUM_TYPE); + return Symbol; + case REGISTER: Symbol->Value = RegisterToInt(Token->Value); SetType(&Symbol->Type, SYMBOL_REGISTER_TYPE); @@ -4569,6 +4870,7 @@ ToSymbol(PSCRIPT_ENGINE_TOKEN Token, PSCRIPT_ENGINE_ERROR_TYPE Error) case TEMP: Symbol->Value = DecimalToInt(Token->Value); + Symbol->Len = GetFloatingValueKind((PVARIABLE_TYPE)Token->VariableType); if (Token->IsAddress) { @@ -5062,6 +5364,15 @@ HandleError(PSCRIPT_ENGINE_ERROR_TYPE Error, char * str) case SCRIPT_ENGINE_ERROR_INVALID_ARRAY_SIZE: strcat(Message, "Invalid or overflowing array size"); return Message; + case SCRIPT_ENGINE_ERROR_INVALID_FLOAT_LITERAL: + strcat(Message, "Invalid floating-point literal"); + return Message; + case SCRIPT_ENGINE_ERROR_FLOAT_OUT_OF_RANGE: + strcat(Message, "Floating-point literal is out of range"); + return Message; + case SCRIPT_ENGINE_ERROR_UNSUPPORTED_FLOAT_OPERATION: + strcat(Message, "Unsupported floating-point operation"); + return Message; default: strcat(Message, "Unknown Error: "); return Message; @@ -5347,6 +5658,10 @@ LalrIsOperandType(PSCRIPT_ENGINE_TOKEN Token) { return TRUE; } + else if (Token->Type == FLOAT_LITERAL) + { + return TRUE; + } else if (Token->Type == REGISTER) { return TRUE; @@ -5409,8 +5724,31 @@ FuncGetNumberOfOperands(UINT64 FuncType, UINT32 * NumberOfGetOperands, UINT32 * { // - // This code is not tested yet, so they are commented out for now + // This code is not tested yet, so they are commented out for now // + //case FUNC_MOV_FLOAT: + //case FUNC_NEG_FLOAT: + //case FUNC_CONVERT_FLOAT: + // *NumberOfGetOperands = 1; + // *NumberOfSetOperands = 1; + // Result = TRUE; + // break; + + //case FUNC_ADD_FLOAT: + //case FUNC_SUB_FLOAT: + //case FUNC_MUL_FLOAT: + //case FUNC_DIV_FLOAT: + //case FUNC_GT_FLOAT: + //case FUNC_LT_FLOAT: + //case FUNC_EGT_FLOAT: + //case FUNC_ELT_FLOAT: + //case FUNC_EQUAL_FLOAT: + //case FUNC_NEQ_FLOAT: + // *NumberOfGetOperands = 2; + // *NumberOfSetOperands = 1; + // Result = TRUE; + // break; + //case FUNC_TYPED_LOAD: // *NumberOfGetOperands = 3; // *NumberOfSetOperands = 1; diff --git a/hyperdbg/script-engine/header/common.h b/hyperdbg/script-engine/header/common.h index f3a9d09f..a6c9cf9d 100644 --- a/hyperdbg/script-engine/header/common.h +++ b/hyperdbg/script-engine/header/common.h @@ -61,7 +61,8 @@ typedef enum _SCRIPT_ENGINE_TOKEN_TYPE FUNCTION_PARAMETER_ID, SCRIPT_VARIABLE_TYPE, DEFERENCE_TEMP, - UNKNOWN + UNKNOWN, + FLOAT_LITERAL } SCRIPT_ENGINE_TOKEN_TYPE; /** diff --git a/hyperdbg/script-engine/header/parse-table.h b/hyperdbg/script-engine/header/parse-table.h index d608f81a..83614dd7 100644 --- a/hyperdbg/script-engine/header/parse-table.h +++ b/hyperdbg/script-engine/header/parse-table.h @@ -1,8 +1,8 @@ #pragma once #ifndef PARSE_TABLE_H #define PARSE_TABLE_H -#define RULES_COUNT 330 -#define TERMINAL_COUNT 132 +#define RULES_COUNT 331 +#define TERMINAL_COUNT 133 #define NONETERMINAL_COUNT 85 #define START_VARIABLE "S" #define MAX_RHS_LEN 15 @@ -13,7 +13,7 @@ #define PSEUDO_REGISTER_MAP_LIST_LENGTH 16 #define SCRIPT_VARIABLE_TYPE_LIST_LENGTH 10 #define ASSIGNMENT_OPERATOR_LIST_LENGTH 10 -#define SEMANTIC_RULES_MAP_LIST_LENGTH 188 +#define SEMANTIC_RULES_MAP_LIST_LENGTH 201 #define THREEOPFUNC1_LENGTH 1 #define THREEOPFUNC2_LENGTH 3 #define TWOOPFUNC1_LENGTH 8 @@ -60,11 +60,11 @@ extern const SYMBOL_MAP PseudoRegisterMapList[]; extern const char* ScriptVariableTypeList[]; -#define LALR_RULES_COUNT 120 -#define LALR_TERMINAL_COUNT 88 +#define LALR_RULES_COUNT 121 +#define LALR_TERMINAL_COUNT 89 #define LALR_NONTERMINAL_COUNT 27 #define LALR_MAX_RHS_LEN 9 -#define LALR_STATE_COUNT 337 +#define LALR_STATE_COUNT 338 extern const struct _SCRIPT_ENGINE_TOKEN LalrLhs[RULES_COUNT]; extern const struct _SCRIPT_ENGINE_TOKEN LalrRhs[RULES_COUNT][MAX_RHS_LEN]; extern const unsigned int LalrRhsSize[RULES_COUNT]; diff --git a/hyperdbg/script-engine/header/type.h b/hyperdbg/script-engine/header/type.h index d9c20e6c..2c8744c1 100644 --- a/hyperdbg/script-engine/header/type.h +++ b/hyperdbg/script-engine/header/type.h @@ -104,7 +104,10 @@ typedef enum _SCRIPT_ENGINE_ERROR_TYPE SCRIPT_ENGINE_ERROR_DUPLICATE_STRUCT_DEFINITION, SCRIPT_ENGINE_ERROR_DUPLICATE_STRUCT_MEMBER, SCRIPT_ENGINE_ERROR_DUPLICATE_TYPEDEF, - SCRIPT_ENGINE_ERROR_INVALID_ARRAY_SIZE + SCRIPT_ENGINE_ERROR_INVALID_ARRAY_SIZE, + SCRIPT_ENGINE_ERROR_INVALID_FLOAT_LITERAL, + SCRIPT_ENGINE_ERROR_FLOAT_OUT_OF_RANGE, + SCRIPT_ENGINE_ERROR_UNSUPPORTED_FLOAT_OPERATION } SCRIPT_ENGINE_ERROR_TYPE, *PSCRIPT_ENGINE_ERROR_TYPE; diff --git a/hyperdbg/script-engine/python/Boolean_Expression_Grammar.txt b/hyperdbg/script-engine/python/Boolean_Expression_Grammar.txt index b31a8ce3..513972f3 100644 --- a/hyperdbg/script-engine/python/Boolean_Expression_Grammar.txt +++ b/hyperdbg/script-engine/python/Boolean_Expression_Grammar.txt @@ -116,6 +116,7 @@ E12->_hex @PUSH E12->_decimal @PUSH E12->_octal @PUSH E12->_binary @PUSH +E12->_float @PUSH E12->_pseudo_register @PUSH diff --git a/hyperdbg/script-engine/python/Grammar.txt b/hyperdbg/script-engine/python/Grammar.txt index 5db8b83b..97ebc87e 100644 --- a/hyperdbg/script-engine/python/Grammar.txt +++ b/hyperdbg/script-engine/python/Grammar.txt @@ -47,7 +47,7 @@ .AssignmentOperator->add_assignment sub_assignment mul_assignment div_assignment mod_assignment asl_assignment asr_assignment and_assignment xor_assignment or_assignment -.SemantiRules->jmp jz jnz mov start_of_do_while start_of_do_while_commands end_of_do_while start_of_for for_inc_dec start_of_for_ommands end_of_if ignore_lvalue push pop call ret struct_forward_declaration struct_definition_begin struct_definition_end struct_variable_declaration struct_member_declaration typedef_declaration struct_pointer struct_array_dimension struct_declarator_complete typed_load typed_store aggregate_copy aggregate_zero struct_initializer_begin struct_initializer_end struct_pointer_cast member_address member_read member_dot_lvalue member_arrow_lvalue member_dot_read member_arrow_read +.SemantiRules->jmp jz jnz mov start_of_do_while start_of_do_while_commands end_of_do_while start_of_for for_inc_dec start_of_for_ommands end_of_if ignore_lvalue push pop call ret struct_forward_declaration struct_definition_begin struct_definition_end struct_variable_declaration struct_member_declaration typedef_declaration struct_pointer struct_array_dimension struct_declarator_complete typed_load typed_store aggregate_copy aggregate_zero struct_initializer_begin struct_initializer_end struct_pointer_cast member_address member_read member_dot_lvalue member_arrow_lvalue member_dot_read member_arrow_read mov_float neg_float add_float sub_float mul_float div_float gt_float lt_float egt_float elt_float equal_float neq_float convert_float .Registers->rax eax ax ah al rcx ecx cx ch cl rdx edx dx dh dl rbx ebx bx bh bl rsp esp sp spl rbp ebp bp bpl rsi esi si sil rdi edi di dil r8 r8d r8w r8h r8l r9 r9d r9w r9h r9l r10 r10d r10w r10h r10l r11 r11d r11w r11h r11l r12 r12d r12w r12h r12l r13 r13d r13w r13h r13l r14 r14d r14w r14h r14l r15 r15d r15w r15h r15l ds es fs gs cs ss rflags eflags flags cf pf af zf sf tf if df of iopl nt rf vm ac vif vip id rip eip ip idtr ldtr gdtr tr cr0 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr6 dr7 @@ -363,6 +363,7 @@ CONST_NUMBER->@PUSH _hex CONST_NUMBER->@PUSH _decimal CONST_NUMBER->@PUSH _octal CONST_NUMBER->@PUSH _binary +CONST_NUMBER->@PUSH _float E12->CONST_NUMBER diff --git a/hyperdbg/script-engine/python/generator.py b/hyperdbg/script-engine/python/generator.py index c80d4c6c..37a7a151 100644 --- a/hyperdbg/script-engine/python/generator.py +++ b/hyperdbg/script-engine/python/generator.py @@ -88,6 +88,9 @@ object ScriptConstants { val SYMBOL_MEM_VALID_CHECK_MASK = 1 << 31 val INVALID = 0x80000000 val LALR_ACCEPT = 0x7fffffff + val SYMBOL_VALUE_KIND_INTEGER = 0 + val SYMBOL_VALUE_KIND_FLOAT32 = 1 + val SYMBOL_VALUE_KIND_FLOAT64 = 2 } /** @@ -170,6 +173,10 @@ typedef struct ACTION_BUFFER { #define SYMBOL_DEREFERENCE_LOCAL_ID_TYPE 20 #define SYMBOL_DEREFERENCE_TEMP_TYPE 21 +#define SYMBOL_VALUE_KIND_INTEGER 0 +#define SYMBOL_VALUE_KIND_FLOAT32 1 +#define SYMBOL_VALUE_KIND_FLOAT64 2 + #define SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL 1 #define SCRIPT_ENGINE_ADDRESS_SPACE_REMOTE 2 diff --git a/hyperdbg/script-engine/python/lalr1_parser.py b/hyperdbg/script-engine/python/lalr1_parser.py index 10a0bbc7..11a4a75d 100644 --- a/hyperdbg/script-engine/python/lalr1_parser.py +++ b/hyperdbg/script-engine/python/lalr1_parser.py @@ -201,6 +201,8 @@ class LALR1Parser: elif Var in self.SPECIAL_TOKENS: return "SPECIAL_TOKEN" + elif Var == "_float": + return "FLOAT_LITERAL" elif Var[0] == "_": return Var[1:].upper() else: diff --git a/hyperdbg/script-engine/python/ll1_parser.py b/hyperdbg/script-engine/python/ll1_parser.py index 58fe9b14..0350a6af 100644 --- a/hyperdbg/script-engine/python/ll1_parser.py +++ b/hyperdbg/script-engine/python/ll1_parser.py @@ -447,7 +447,10 @@ class LL1Parser: "aggregate_copy", "aggregate_zero" , "struct_initializer_begin", "struct_initializer_end", "struct_pointer_cast", "member_address", "member_read", - "member_dot_lvalue", "member_arrow_lvalue", "member_dot_read", "member_arrow_read" + "member_dot_lvalue", "member_arrow_lvalue", "member_dot_read", "member_arrow_read", + "mov_float", "neg_float", "add_float", "sub_float", "mul_float", "div_float", + "gt_float", "lt_float", "egt_float", "elt_float", "equal_float", "neq_float", + "convert_float" } aggregate_keywords = {"struct", "typedef"} legacy_semantics = [x for x in self.SemantiRulesList if x not in aggregate_semantics] @@ -701,6 +704,8 @@ class LL1Parser: elif Var in self.SPECIAL_TOKENS: return "SPECIAL_TOKEN" + elif Var == "_float": + return "FLOAT_LITERAL" elif Var[0] == "_": return Var[1:].upper() else: diff --git a/hyperdbg/script-eval/code/Functions.c b/hyperdbg/script-eval/code/Functions.c index b566f310..3f45ea72 100644 --- a/hyperdbg/script-eval/code/Functions.c +++ b/hyperdbg/script-eval/code/Functions.c @@ -1298,6 +1298,269 @@ CheckIfStringIsSafe(UINT64 StrAddr, BOOLEAN IsWstring) #endif // SCRIPT_ENGINE_KERNEL_MODE } +typedef struct _SCRIPT_ENGINE_FLOAT_BIGINT +{ + UINT32 Limb[40]; +} SCRIPT_ENGINE_FLOAT_BIGINT, *PSCRIPT_ENGINE_FLOAT_BIGINT; + +static BOOLEAN +ScriptEngineFloatBigintIsZero(PSCRIPT_ENGINE_FLOAT_BIGINT Value) +{ + for (UINT32 Index = 0; Index < 40; Index++) + { + if (Value->Limb[Index]) + { + return FALSE; + } + } + return TRUE; +} + +static BOOLEAN +ScriptEngineFloatBigintShiftLeftOne(PSCRIPT_ENGINE_FLOAT_BIGINT Value) +{ + UINT32 Carry = 0; + for (UINT32 Index = 0; Index < 40; Index++) + { + UINT32 NextCarry = Value->Limb[Index] >> 31; + Value->Limb[Index] = (Value->Limb[Index] << 1) | Carry; + Carry = NextCarry; + } + return Carry == 0; +} + +static VOID +ScriptEngineFloatBigintShiftRightOne(PSCRIPT_ENGINE_FLOAT_BIGINT Value) +{ + UINT32 Carry = 0; + for (INT32 Index = 39; Index >= 0; Index--) + { + UINT32 NextCarry = Value->Limb[Index] & 1; + Value->Limb[Index] = (Value->Limb[Index] >> 1) | (Carry << 31); + Carry = NextCarry; + } +} + +static BOOLEAN +ScriptEngineFloatBigintTestBit(PSCRIPT_ENGINE_FLOAT_BIGINT Value, UINT32 Bit) +{ + return Bit < 1280 && (Value->Limb[Bit / 32] & (1U << (Bit % 32))) != 0; +} + +static BOOLEAN +ScriptEngineFloatBigintAnyBitsBelow(PSCRIPT_ENGINE_FLOAT_BIGINT Value, UINT32 Bit) +{ + UINT32 Limit = Bit < 1280 ? Bit : 1280; + for (UINT32 Index = 0; Index < Limit; Index++) + { + if (ScriptEngineFloatBigintTestBit(Value, Index)) + { + return TRUE; + } + } + return FALSE; +} + +static BOOLEAN +ScriptEngineFloatBigintIncrement(PSCRIPT_ENGINE_FLOAT_BIGINT Value) +{ + for (UINT32 Index = 0; Index < 40; Index++) + { + Value->Limb[Index]++; + if (Value->Limb[Index]) + { + return TRUE; + } + } + return FALSE; +} + +static BOOLEAN +ScriptEngineFloatBigintMultiplySmall(PSCRIPT_ENGINE_FLOAT_BIGINT Value, UINT32 Multiplier) +{ + UINT64 Carry = 0; + for (UINT32 Index = 0; Index < 40; Index++) + { + UINT64 Product = ((UINT64)Value->Limb[Index] * Multiplier) + Carry; + Value->Limb[Index] = (UINT32)Product; + Carry = Product >> 32; + } + return Carry == 0; +} + +static UINT32 +ScriptEngineFloatBigintDivideByTen(PSCRIPT_ENGINE_FLOAT_BIGINT Value) +{ + UINT64 Remainder = 0; + for (INT32 Index = 39; Index >= 0; Index--) + { + UINT64 Dividend = (Remainder << 32) | Value->Limb[Index]; + Value->Limb[Index] = (UINT32)(Dividend / 10); + Remainder = Dividend % 10; + } + return (UINT32)Remainder; +} + +static BOOLEAN +ScriptEngineFormatFixedFloat(UINT64 ValueKind, UINT64 RawBits, PCHAR Output, UINT32 OutputSize, PUINT32 OutputLength) +{ + SCRIPT_ENGINE_FLOAT_BIGINT ScaledValue = {0}; + SCRIPT_ENGINE_FLOAT_BIGINT DecimalValue; + CHAR ReverseDigits[384]; + UINT32 DigitCount = 0; + UINT64 Significand; + INT32 BinaryExponent; + BOOLEAN Negative; + + if (!Output || !OutputLength || OutputSize == 0) + { + return FALSE; + } + + if (ValueKind == SYMBOL_VALUE_KIND_FLOAT32) + { + UINT32 Bits = (UINT32)RawBits; + UINT32 Exponent = (Bits >> 23) & 0xff; + UINT32 Fraction = Bits & 0x7fffff; + Negative = (Bits >> 31) != 0; + if (Exponent == 0xff) + { + return FALSE; + } + Significand = Exponent ? ((UINT64)1 << 23) | Fraction : Fraction; + BinaryExponent = Exponent ? (INT32)Exponent - 127 - 23 : -126 - 23; + } + else if (ValueKind == SYMBOL_VALUE_KIND_FLOAT64) + { + UINT64 Exponent = (RawBits >> 52) & 0x7ff; + UINT64 Fraction = RawBits & 0xfffffffffffffULL; + Negative = (RawBits >> 63) != 0; + if (Exponent == 0x7ff) + { + return FALSE; + } + Significand = Exponent ? ((UINT64)1 << 52) | Fraction : Fraction; + BinaryExponent = Exponent ? (INT32)Exponent - 1023 - 52 : -1022 - 52; + } + else + { + return FALSE; + } + + ScaledValue.Limb[0] = (UINT32)Significand; + ScaledValue.Limb[1] = (UINT32)(Significand >> 32); + if (!ScriptEngineFloatBigintMultiplySmall(&ScaledValue, 1000000)) + { + return FALSE; + } + + if (BinaryExponent > 0) + { + for (INT32 Shift = 0; Shift < BinaryExponent; Shift++) + { + if (!ScriptEngineFloatBigintShiftLeftOne(&ScaledValue)) + { + return FALSE; + } + } + } + else if (BinaryExponent < 0) + { + UINT32 Shift = (UINT32)-BinaryExponent; + BOOLEAN RoundBit = Shift && ScriptEngineFloatBigintTestBit(&ScaledValue, Shift - 1); + BOOLEAN Sticky = Shift > 1 && ScriptEngineFloatBigintAnyBitsBelow(&ScaledValue, Shift - 1); + + for (UINT32 Index = 0; Index < Shift; Index++) + { + ScriptEngineFloatBigintShiftRightOne(&ScaledValue); + } + + if (RoundBit && (Sticky || (ScaledValue.Limb[0] & 1))) + { + if (!ScriptEngineFloatBigintIncrement(&ScaledValue)) + { + return FALSE; + } + } + } + + DecimalValue = ScaledValue; + do + { + if (DigitCount >= sizeof(ReverseDigits)) + { + return FALSE; + } + ReverseDigits[DigitCount++] = (CHAR)('0' + ScriptEngineFloatBigintDivideByTen(&DecimalValue)); + } while (!ScriptEngineFloatBigintIsZero(&DecimalValue)); + + UINT32 Required = (Negative ? 1U : 0U) + (DigitCount > 6 ? DigitCount - 6 : 1) + 1 + 6; + if (Required + 1 > OutputSize) + { + return FALSE; + } + + UINT32 Position = 0; + if (Negative) + { + Output[Position++] = '-'; + } + + if (DigitCount <= 6) + { + Output[Position++] = '0'; + Output[Position++] = '.'; + for (UINT32 Pad = DigitCount; Pad < 6; Pad++) + { + Output[Position++] = '0'; + } + while (DigitCount) + { + Output[Position++] = ReverseDigits[--DigitCount]; + } + } + else + { + for (UINT32 Index = DigitCount; Index > 6; Index--) + { + Output[Position++] = ReverseDigits[Index - 1]; + } + Output[Position++] = '.'; + for (UINT32 Index = 6; Index > 0; Index--) + { + Output[Position++] = ReverseDigits[Index - 1]; + } + } + + Output[Position] = '\0'; + *OutputLength = Position; + return TRUE; +} + +static BOOLEAN +ApplyFloatingFormatSpecifier(CHAR * FinalBuffer, + PUINT32 CurrentProcessedPositionFromStartOfFormat, + PUINT32 CurrentPositionInFinalBuffer, + UINT64 RawBits, + UINT64 ValueKind, + UINT32 SizeOfFinalBuffer) +{ + CHAR TempBuffer[384] = {0}; + UINT32 TempBufferLen = 0; + + if (*CurrentPositionInFinalBuffer >= SizeOfFinalBuffer || + !ScriptEngineFormatFixedFloat(ValueKind, RawBits, TempBuffer, sizeof(TempBuffer), &TempBufferLen) || + TempBufferLen >= SizeOfFinalBuffer - *CurrentPositionInFinalBuffer) + { + return FALSE; + } + + *CurrentProcessedPositionFromStartOfFormat += 2; + memcpy(FinalBuffer + *CurrentPositionInFinalBuffer, TempBuffer, TempBufferLen); + *CurrentPositionInFinalBuffer += TempBufferLen; + return TRUE; +} + /** * @brief Apply format specifiers (%d, %x, %llx, etc.) * @@ -1309,7 +1572,7 @@ CheckIfStringIsSafe(UINT64 StrAddr, BOOLEAN IsWstring) * @param SizeOfFinalBuffer * @return VOID */ -VOID +BOOLEAN ApplyFormatSpecifier(const CHAR * CurrentSpecifier, CHAR * FinalBuffer, PUINT32 CurrentProcessedPositionFromStartOfFormat, PUINT32 CurrentPositionInFinalBuffer, UINT64 Val, UINT32 SizeOfFinalBuffer) { UINT32 TempBufferLen = 0; @@ -1319,8 +1582,12 @@ ApplyFormatSpecifier(const CHAR * CurrentSpecifier, CHAR * FinalBuffer, PUINT32 *CurrentProcessedPositionFromStartOfFormat = *CurrentProcessedPositionFromStartOfFormat + (UINT32)strlen(CurrentSpecifier); - PlatformSprintf(TempBuffer, sizeof(TempBuffer), CurrentSpecifier, Val); - TempBufferLen = (UINT32)strlen(TempBuffer); + INT FormatResult = PlatformSprintf(TempBuffer, sizeof(TempBuffer), CurrentSpecifier, Val); + if (FormatResult < 0) + { + return FALSE; + } + TempBufferLen = (UINT32)FormatResult; // // Check final buffer capacity @@ -1330,12 +1597,13 @@ ApplyFormatSpecifier(const CHAR * CurrentSpecifier, CHAR * FinalBuffer, PUINT32 // // Over passed buffer // - return; + return FALSE; } memcpy(&FinalBuffer[*CurrentPositionInFinalBuffer], TempBuffer, TempBufferLen); *CurrentPositionInFinalBuffer = *CurrentPositionInFinalBuffer + TempBufferLen; + return TRUE; } /** @@ -1586,6 +1854,12 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, Position = (Symbol->Type >> 32) + 1; + if (Position < CurrentProcessedPositionFromStartOfFormat || Position + 1 >= LenOfFormats) + { + *HasError = TRUE; + return; + } + SYMBOL TempSymbol = {0}; memcpy(&TempSymbol, Symbol, sizeof(SYMBOL)); TempSymbol.Type &= 0x7fffffff; @@ -1616,6 +1890,11 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, CurrentProcessedPositionFromStartOfFormat += StringLen; CurrentPositionInFinalBuffer += StringLen; } + else + { + *HasError = TRUE; + return; + } } // @@ -1640,6 +1919,12 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, if (IndicatorChar2 == 'l' || IndicatorChar2 == 'w' || IndicatorChar2 == 'h') { + if (Position + 2 >= LenOfFormats) + { + *HasError = TRUE; + return; + } + // // Set second char in format specifier // @@ -1647,6 +1932,12 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, if (IndicatorChar2 == 'l' && Format[Position + 2] == 'l') { + if (Position + 3 >= LenOfFormats) + { + *HasError = TRUE; + return; + } + // // Set third character in format specifier "ll" // @@ -1676,7 +1967,31 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, // // Apply the specifier // - if (!strncmp(FormatSpecifier, "%s", 2)) + UINT64 BaseType = TempSymbol.Type & 0xffffffffULL; + BOOLEAN IsFloatingValue = + BaseType != SYMBOL_STRING_TYPE && BaseType != SYMBOL_WSTRING_TYPE && + (Symbol->Len == SYMBOL_VALUE_KIND_FLOAT32 || Symbol->Len == SYMBOL_VALUE_KIND_FLOAT64); + + if (!strncmp(FormatSpecifier, "%f", 2)) + { + if (!IsFloatingValue || + !ApplyFloatingFormatSpecifier(FinalBuffer, + &CurrentProcessedPositionFromStartOfFormat, + &CurrentPositionInFinalBuffer, + Val, + Symbol->Len, + sizeof(FinalBuffer))) + { + *HasError = TRUE; + return; + } + } + else if (IsFloatingValue) + { + *HasError = TRUE; + return; + } + else if (!strncmp(FormatSpecifier, "%s", 2)) { // // for string @@ -1716,7 +2031,11 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, } else { - ApplyFormatSpecifier(FormatSpecifier, FinalBuffer, &CurrentProcessedPositionFromStartOfFormat, &CurrentPositionInFinalBuffer, Val, sizeof(FinalBuffer)); + if (!ApplyFormatSpecifier(FormatSpecifier, FinalBuffer, &CurrentProcessedPositionFromStartOfFormat, &CurrentPositionInFinalBuffer, Val, sizeof(FinalBuffer))) + { + *HasError = TRUE; + return; + } } } } @@ -1730,6 +2049,11 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, { memcpy(FinalBuffer, Format, LenOfFormats); } + else + { + *HasError = TRUE; + return; + } } else { @@ -1747,6 +2071,11 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, &Format[CurrentProcessedPositionFromStartOfFormat], RemainedLen); } + else + { + *HasError = TRUE; + return; + } } } @@ -1754,7 +2083,7 @@ ScriptEngineFunctionPrintf(PGUEST_REGS GuestRegs, // Print final result // #ifdef SCRIPT_ENGINE_USER_MODE - printf("%s", FinalBuffer); + ShowMessages("%s", FinalBuffer); #endif // SCRIPT_ENGINE_USER_MODE #ifdef SCRIPT_ENGINE_KERNEL_MODE diff --git a/hyperdbg/script-eval/code/ScriptEngineEval.c b/hyperdbg/script-eval/code/ScriptEngineEval.c index 709aceb8..43a7566d 100644 --- a/hyperdbg/script-eval/code/ScriptEngineEval.c +++ b/hyperdbg/script-eval/code/ScriptEngineEval.c @@ -59,6 +59,526 @@ ScriptEngineTransferMemory(PSCRIPT_ENGINE_GENERAL_REGISTERS Registers, return TRUE; } +static BOOLEAN +ScriptEngineFloatingSymbolIsReadable(PSCRIPT_ENGINE_GENERAL_REGISTERS Registers, PSYMBOL Symbol) +{ + UINT64 BaseType = Symbol->Type & 0xffffffffULL; + + if (Symbol->Len != SYMBOL_VALUE_KIND_FLOAT32 && Symbol->Len != SYMBOL_VALUE_KIND_FLOAT64) + { + return FALSE; + } + + if (BaseType == SYMBOL_NUM_TYPE) + { + return TRUE; + } + + return BaseType == SYMBOL_TEMP_TYPE && + Registers->StackBaseIndx < MAX_STACK_BUFFER_COUNT && + Symbol->Value < MAX_STACK_BUFFER_COUNT - Registers->StackBaseIndx; +} + +static BOOLEAN +ScriptEngineFloatingSymbolIsWritable(PSCRIPT_ENGINE_GENERAL_REGISTERS Registers, PSYMBOL Symbol) +{ + UINT64 BaseType = Symbol->Type & 0xffffffffULL; + + return (Symbol->Len == SYMBOL_VALUE_KIND_FLOAT32 || Symbol->Len == SYMBOL_VALUE_KIND_FLOAT64) && + BaseType == SYMBOL_TEMP_TYPE && + Registers->StackBaseIndx < MAX_STACK_BUFFER_COUNT && + Symbol->Value < MAX_STACK_BUFFER_COUNT - Registers->StackBaseIndx; +} + +typedef struct _SCRIPT_ENGINE_UINT128 +{ + UINT64 High; + UINT64 Low; +} SCRIPT_ENGINE_UINT128, *PSCRIPT_ENGINE_UINT128; + +// +// The software-float path represents a finite value as a sign, an unbiased +// exponent, and a normalized 128-bit significand whose leading bit is bit 127. +// Guard, round, and sticky bits remain in the low portion until packing. +// +// Keep all 128-bit transfers as explicit scalar field operations. MSVC may +// otherwise turn structure copies or zero initializers into XMM instructions +// in kernel builds, even though the source contains no C floating-point types. +// + +typedef struct _SCRIPT_ENGINE_SOFT_FLOAT +{ + BOOLEAN Negative; + BOOLEAN IsZero; + INT32 Exponent; + SCRIPT_ENGINE_UINT128 Significand; +} SCRIPT_ENGINE_SOFT_FLOAT; + +static BOOLEAN +ScriptEngineIntegerSymbolIsWritable(PSCRIPT_ENGINE_GENERAL_REGISTERS Registers, PSYMBOL Symbol) +{ + return Symbol->Len == SYMBOL_VALUE_KIND_INTEGER && + (Symbol->Type & 0xffffffffULL) == SYMBOL_TEMP_TYPE && + Registers->StackBaseIndx < MAX_STACK_BUFFER_COUNT && + Symbol->Value < MAX_STACK_BUFFER_COUNT - Registers->StackBaseIndx; +} + +static BOOLEAN +ScriptEngineIsFloatingComparisonOpcode(UINT64 Opcode) +{ + return Opcode == FUNC_GT_FLOAT || Opcode == FUNC_LT_FLOAT || + Opcode == FUNC_EGT_FLOAT || Opcode == FUNC_ELT_FLOAT || + Opcode == FUNC_EQUAL_FLOAT || Opcode == FUNC_NEQ_FLOAT; +} + +static BOOLEAN +ScriptEngineUint128IsZero(const SCRIPT_ENGINE_UINT128 * Value) +{ + return Value->High == 0 && Value->Low == 0; +} + +static INT32 +ScriptEngineUint128Compare(const SCRIPT_ENGINE_UINT128 * Left, const SCRIPT_ENGINE_UINT128 * Right) +{ + if (Left->High != Right->High) + { + return Left->High > Right->High ? 1 : -1; + } + if (Left->Low != Right->Low) + { + return Left->Low > Right->Low ? 1 : -1; + } + return 0; +} + +static VOID +ScriptEngineUint128ShiftRightJam(PSCRIPT_ENGINE_UINT128 Value, UINT32 Distance) +{ + UINT64 High = Value->High; + UINT64 Low = Value->Low; + BOOLEAN Jam; + + if (Distance == 0) + { + return; + } + if (Distance < 64) + { + Jam = (Low << (64 - Distance)) != 0; + Value->High = High >> Distance; + Value->Low = (High << (64 - Distance)) | (Low >> Distance) | Jam; + } + else if (Distance == 64) + { + Value->High = 0; + Value->Low = High | (Low != 0); + } + else if (Distance < 128) + { + UINT32 Shift = Distance - 64; + Jam = Low != 0 || (High << (64 - Shift)) != 0; + Value->High = 0; + Value->Low = (High >> Shift) | Jam; + } + else + { + Value->High = 0; + Value->Low = (High != 0 || Low != 0); + } +} + +static VOID +ScriptEngineUint128ShiftLeftOne(PSCRIPT_ENGINE_UINT128 Value) +{ + Value->High = (Value->High << 1) | (Value->Low >> 63); + Value->Low <<= 1; +} + +static VOID +ScriptEngineUint128Subtract(const SCRIPT_ENGINE_UINT128 * Left, + const SCRIPT_ENGINE_UINT128 * Right, + PSCRIPT_ENGINE_UINT128 Result) +{ + Result->Low = Left->Low - Right->Low; + Result->High = Left->High - Right->High - (Left->Low < Right->Low); +} + +static VOID +ScriptEngineUint128Add(const SCRIPT_ENGINE_UINT128 * Left, + const SCRIPT_ENGINE_UINT128 * Right, + PSCRIPT_ENGINE_UINT128 Result, + PBOOLEAN Carry) +{ + UINT64 HighWithoutCarry; + BOOLEAN LowCarry; + BOOLEAN HighCarry; + + Result->Low = Left->Low + Right->Low; + LowCarry = Result->Low < Left->Low; + HighWithoutCarry = Left->High + Right->High; + HighCarry = HighWithoutCarry < Left->High; + Result->High = HighWithoutCarry + LowCarry; + *Carry = HighCarry || (LowCarry && Result->High == 0); +} + +static VOID +ScriptEngineUint128Multiply64(UINT64 Left, UINT64 Right, PSCRIPT_ENGINE_UINT128 Result) +{ + UINT64 LeftLow = (UINT32)Left; + UINT64 LeftHigh = Left >> 32; + UINT64 RightLow = (UINT32)Right; + UINT64 RightHigh = Right >> 32; + UINT64 Product00 = LeftLow * RightLow; + UINT64 Product01 = LeftLow * RightHigh; + UINT64 Product10 = LeftHigh * RightLow; + UINT64 Product11 = LeftHigh * RightHigh; + UINT64 Middle = (Product00 >> 32) + (UINT32)Product01 + (UINT32)Product10; + Result->Low = (Middle << 32) | (UINT32)Product00; + Result->High = Product11 + (Product01 >> 32) + (Product10 >> 32) + (Middle >> 32); +} + +static BOOLEAN +ScriptEngineSoftFloatUnpack(UINT64 ValueKind, UINT64 RawBits, SCRIPT_ENGINE_SOFT_FLOAT * Value) +{ + UINT64 Fraction; + UINT32 Precision; + INT32 MinimumExponent; + UINT32 EncodedExponent; + + if (!Value) + { + return FALSE; + } + + if (ValueKind == SYMBOL_VALUE_KIND_FLOAT32) + { + UINT32 Bits = (UINT32)RawBits; + Value->Negative = (Bits >> 31) != 0; + EncodedExponent = (Bits >> 23) & 0xff; + Fraction = Bits & 0x7fffff; + Precision = 24; + MinimumExponent = -126; + if (EncodedExponent == 0xff) return FALSE; + Value->Exponent = EncodedExponent ? (INT32)EncodedExponent - 127 : MinimumExponent; + } + else if (ValueKind == SYMBOL_VALUE_KIND_FLOAT64) + { + Value->Negative = (RawBits >> 63) != 0; + EncodedExponent = (UINT32)((RawBits >> 52) & 0x7ff); + Fraction = RawBits & 0xfffffffffffffULL; + Precision = 53; + MinimumExponent = -1022; + if (EncodedExponent == 0x7ff) return FALSE; + Value->Exponent = EncodedExponent ? (INT32)EncodedExponent - 1023 : MinimumExponent; + } + else + { + return FALSE; + } + + Value->IsZero = EncodedExponent == 0 && Fraction == 0; + if (Value->IsZero) + { + Value->Significand.High = 0; + Value->Significand.Low = 0; + return TRUE; + } + + if (EncodedExponent) + { + Fraction |= 1ULL << (Precision - 1); + } + else + { + while ((Fraction & (1ULL << (Precision - 1))) == 0) + { + Fraction <<= 1; + Value->Exponent--; + } + } + + Value->Significand.High = Fraction << (64 - Precision); + Value->Significand.Low = 0; + return TRUE; +} + +static BOOLEAN +ScriptEngineSoftFloatPack(UINT64 ValueKind, + BOOLEAN Negative, + INT32 Exponent, + const SCRIPT_ENGINE_UINT128 * InputSignificand, + PUINT64 RawBits) +{ + SCRIPT_ENGINE_UINT128 Significand; + UINT32 Precision; + INT32 MinimumExponent; + INT32 MaximumExponent; + UINT32 Bias; + UINT64 SignMask; + UINT64 FractionMask; + + if (!RawBits || !InputSignificand) return FALSE; + Significand.High = InputSignificand->High; + Significand.Low = InputSignificand->Low; + if (ValueKind == SYMBOL_VALUE_KIND_FLOAT32) + { + Precision = 24; MinimumExponent = -126; MaximumExponent = 127; + Bias = 127; SignMask = 0x80000000ULL; FractionMask = 0x7fffffULL; + } + else if (ValueKind == SYMBOL_VALUE_KIND_FLOAT64) + { + Precision = 53; MinimumExponent = -1022; MaximumExponent = 1023; + Bias = 1023; SignMask = 0x8000000000000000ULL; FractionMask = 0xfffffffffffffULL; + } + else return FALSE; + + if (ScriptEngineUint128IsZero(&Significand)) + { + *RawBits = Negative ? SignMask : 0; + return TRUE; + } + + while ((Significand.High & 0x8000000000000000ULL) == 0) + { + ScriptEngineUint128ShiftLeftOne(&Significand); + Exponent--; + } + + if (Exponent < MinimumExponent) + { + ScriptEngineUint128ShiftRightJam(&Significand, (UINT32)(MinimumExponent - Exponent)); + Exponent = MinimumExponent; + } + + UINT32 DiscardedHighBits = 64 - Precision; + UINT64 Retained = Significand.High >> DiscardedHighBits; + UINT64 RoundMask = 1ULL << (DiscardedHighBits - 1); + BOOLEAN RoundBit = (Significand.High & RoundMask) != 0; + BOOLEAN Sticky = (Significand.High & (RoundMask - 1)) != 0 || Significand.Low != 0; + if (RoundBit && (Sticky || (Retained & 1))) + { + Retained++; + } + + if (Retained == (1ULL << Precision)) + { + Retained >>= 1; + Exponent++; + } + if (Exponent > MaximumExponent) + { + return FALSE; + } + + UINT64 HiddenBit = 1ULL << (Precision - 1); + UINT64 EncodedExponent = Retained >= HiddenBit ? (UINT64)(Exponent + (INT32)Bias) : 0; + UINT64 Encoded = (EncodedExponent << (Precision - 1)) | (Retained & FractionMask); + *RawBits = Encoded | (Negative ? SignMask : 0); + if (ValueKind == SYMBOL_VALUE_KIND_FLOAT32) *RawBits &= 0xffffffffULL; + return TRUE; +} + +static BOOLEAN +ScriptEngineSoftFloatAdd(const SCRIPT_ENGINE_SOFT_FLOAT * LeftValue, + const SCRIPT_ENGINE_SOFT_FLOAT * RightValue, + UINT64 ResultKind, + PUINT64 RawResult) +{ + SCRIPT_ENGINE_SOFT_FLOAT Left; + SCRIPT_ENGINE_SOFT_FLOAT Right; + Left.Negative = LeftValue->Negative; Left.IsZero = LeftValue->IsZero; Left.Exponent = LeftValue->Exponent; + Left.Significand.High = LeftValue->Significand.High; Left.Significand.Low = LeftValue->Significand.Low; + Right.Negative = RightValue->Negative; Right.IsZero = RightValue->IsZero; Right.Exponent = RightValue->Exponent; + Right.Significand.High = RightValue->Significand.High; Right.Significand.Low = RightValue->Significand.Low; + + if (Left.IsZero && Right.IsZero) + { + SCRIPT_ENGINE_UINT128 Zero; + Zero.High = 0; + Zero.Low = 0; + return ScriptEngineSoftFloatPack(ResultKind, + Left.Negative == Right.Negative ? Left.Negative : FALSE, + 0, + &Zero, + RawResult); + } + if (Left.IsZero) return ScriptEngineSoftFloatPack(ResultKind, Right.Negative, Right.Exponent, &Right.Significand, RawResult); + if (Right.IsZero) return ScriptEngineSoftFloatPack(ResultKind, Left.Negative, Left.Exponent, &Left.Significand, RawResult); + + if (Right.Exponent > Left.Exponent) + { + SCRIPT_ENGINE_SOFT_FLOAT Swap; + Swap.Negative = Left.Negative; Swap.IsZero = Left.IsZero; Swap.Exponent = Left.Exponent; + Swap.Significand.High = Left.Significand.High; Swap.Significand.Low = Left.Significand.Low; + Left.Negative = Right.Negative; Left.IsZero = Right.IsZero; Left.Exponent = Right.Exponent; + Left.Significand.High = Right.Significand.High; Left.Significand.Low = Right.Significand.Low; + Right.Negative = Swap.Negative; Right.IsZero = Swap.IsZero; Right.Exponent = Swap.Exponent; + Right.Significand.High = Swap.Significand.High; Right.Significand.Low = Swap.Significand.Low; + } + ScriptEngineUint128ShiftRightJam(&Right.Significand, + (UINT32)(Left.Exponent - Right.Exponent)); + + SCRIPT_ENGINE_UINT128 Result; + BOOLEAN ResultSign; + INT32 ResultExponent = Left.Exponent; + if (Left.Negative == Right.Negative) + { + BOOLEAN Carry; + ScriptEngineUint128Add(&Left.Significand, &Right.Significand, &Result, &Carry); + if (Carry) + { + BOOLEAN Lost = (Result.Low & 1) != 0; + Result.Low = (Result.High << 63) | (Result.Low >> 1) | Lost; + Result.High = 0x8000000000000000ULL | (Result.High >> 1); + ResultExponent++; + } + ResultSign = Left.Negative; + } + else + { + INT32 Compare = ScriptEngineUint128Compare(&Left.Significand, &Right.Significand); + if (Compare == 0) + { + SCRIPT_ENGINE_UINT128 Zero; + Zero.High = 0; + Zero.Low = 0; + return ScriptEngineSoftFloatPack(ResultKind, FALSE, 0, &Zero, RawResult); + } + if (Compare > 0) + { + ScriptEngineUint128Subtract(&Left.Significand, &Right.Significand, &Result); + ResultSign = Left.Negative; + } + else + { + ScriptEngineUint128Subtract(&Right.Significand, &Left.Significand, &Result); + ResultSign = Right.Negative; + } + } + return ScriptEngineSoftFloatPack(ResultKind, ResultSign, ResultExponent, &Result, RawResult); +} + +static BOOLEAN +ScriptEngineSoftFloatMultiply(const SCRIPT_ENGINE_SOFT_FLOAT * Left, + const SCRIPT_ENGINE_SOFT_FLOAT * Right, + UINT64 ResultKind, + PUINT64 RawResult) +{ + SCRIPT_ENGINE_UINT128 Result; + Result.High = 0; + Result.Low = 0; + BOOLEAN Negative = Left->Negative != Right->Negative; + if (Left->IsZero || Right->IsZero) + { + return ScriptEngineSoftFloatPack(ResultKind, Negative, 0, &Result, RawResult); + } + ScriptEngineUint128Multiply64(Left->Significand.High, Right->Significand.High, &Result); + INT32 Exponent = Left->Exponent + Right->Exponent; + if (Result.High & 0x8000000000000000ULL) + { + Exponent++; + } + else + { + ScriptEngineUint128ShiftLeftOne(&Result); + } + return ScriptEngineSoftFloatPack(ResultKind, Negative, Exponent, &Result, RawResult); +} + +static BOOLEAN +ScriptEngineSoftFloatDivide(const SCRIPT_ENGINE_SOFT_FLOAT * Left, + const SCRIPT_ENGINE_SOFT_FLOAT * Right, + UINT64 ResultKind, + PUINT64 RawResult) +{ + BOOLEAN Negative = Left->Negative != Right->Negative; + if (Right->IsZero) return FALSE; + if (Left->IsZero) + { + SCRIPT_ENGINE_UINT128 Zero; + Zero.High = 0; + Zero.Low = 0; + return ScriptEngineSoftFloatPack(ResultKind, Negative, 0, &Zero, RawResult); + } + + UINT64 Numerator = Left->Significand.High; + UINT64 Denominator = Right->Significand.High; + INT32 Exponent = Left->Exponent - Right->Exponent; + SCRIPT_ENGINE_UINT128 Remainder = {0, Numerator}; + SCRIPT_ENGINE_UINT128 Divisor = {0, Denominator}; + if (Numerator < Denominator) + { + ScriptEngineUint128ShiftLeftOne(&Remainder); + Exponent--; + } + + UINT64 Quotient = 0; + for (INT32 Bit = 63; Bit >= 0; Bit--) + { + if (ScriptEngineUint128Compare(&Remainder, &Divisor) >= 0) + { + SCRIPT_ENGINE_UINT128 Difference; + ScriptEngineUint128Subtract(&Remainder, &Divisor, &Difference); + Remainder.High = Difference.High; + Remainder.Low = Difference.Low; + Quotient |= 1ULL << Bit; + } + ScriptEngineUint128ShiftLeftOne(&Remainder); + } + if (!ScriptEngineUint128IsZero(&Remainder)) Quotient |= 1; + + SCRIPT_ENGINE_UINT128 Result = {Quotient, 0}; + return ScriptEngineSoftFloatPack(ResultKind, Negative, Exponent, &Result, RawResult); +} + +static INT32 +ScriptEngineSoftFloatCompare(const SCRIPT_ENGINE_SOFT_FLOAT * Left, const SCRIPT_ENGINE_SOFT_FLOAT * Right) +{ + if (Left->IsZero && Right->IsZero) return 0; + if (Left->Negative != Right->Negative) return Left->Negative ? -1 : 1; + + INT32 Magnitude; + if (Left->Exponent != Right->Exponent) + Magnitude = Left->Exponent > Right->Exponent ? 1 : -1; + else + Magnitude = ScriptEngineUint128Compare(&Left->Significand, &Right->Significand); + return Left->Negative ? -Magnitude : Magnitude; +} + +static BOOLEAN +ScriptEngineExecuteFloatingBinary(UINT64 Opcode, + UINT64 LeftKind, + UINT64 LeftBits, + UINT64 RightKind, + UINT64 RightBits, + UINT64 ResultKind, + PUINT64 Result) +{ + SCRIPT_ENGINE_SOFT_FLOAT Left; + SCRIPT_ENGINE_SOFT_FLOAT Right; + if (!ScriptEngineSoftFloatUnpack(LeftKind, LeftBits, &Left) || + !ScriptEngineSoftFloatUnpack(RightKind, RightBits, &Right)) return FALSE; + + if (Opcode == FUNC_ADD_FLOAT) return ScriptEngineSoftFloatAdd(&Left, &Right, ResultKind, Result); + if (Opcode == FUNC_SUB_FLOAT) + { + Right.Negative = !Right.Negative; + return ScriptEngineSoftFloatAdd(&Left, &Right, ResultKind, Result); + } + if (Opcode == FUNC_MUL_FLOAT) return ScriptEngineSoftFloatMultiply(&Left, &Right, ResultKind, Result); + if (Opcode == FUNC_DIV_FLOAT) return ScriptEngineSoftFloatDivide(&Left, &Right, ResultKind, Result); + + INT32 Comparison = ScriptEngineSoftFloatCompare(&Left, &Right); + if (Opcode == FUNC_GT_FLOAT) *Result = Comparison > 0; + else if (Opcode == FUNC_LT_FLOAT) *Result = Comparison < 0; + else if (Opcode == FUNC_EGT_FLOAT) *Result = Comparison >= 0; + else if (Opcode == FUNC_ELT_FLOAT) *Result = Comparison <= 0; + else if (Opcode == FUNC_EQUAL_FLOAT) *Result = Comparison == 0; + else if (Opcode == FUNC_NEQ_FLOAT) *Result = Comparison != 0; + else return FALSE; + return TRUE; +} + /** * @brief Get the Pseudo reg value * @@ -1989,6 +2509,155 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, break; + case FUNC_MOV_FLOAT: + if (*Indx > CodeBuffer->Pointer || CodeBuffer->Pointer - *Indx < 2) + { + HasError = TRUE; + break; + } + + Src0 = CodeBuffer->Head + (*Indx)++; + Des = CodeBuffer->Head + (*Indx)++; + + if (!ScriptEngineFloatingSymbolIsReadable(ScriptGeneralRegisters, Src0) || + !ScriptEngineFloatingSymbolIsWritable(ScriptGeneralRegisters, Des) || + Src0->Len != Des->Len) + { + HasError = TRUE; + break; + } + + SrcVal0 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src0, FALSE); + if (Src0->Len == SYMBOL_VALUE_KIND_FLOAT32) + { + SrcVal0 &= 0xffffffffULL; + } + SetValue(GuestRegs, ScriptGeneralRegisters, Des, SrcVal0); + break; + + case FUNC_CONVERT_FLOAT: + { + if (*Indx > CodeBuffer->Pointer || CodeBuffer->Pointer - *Indx < 2) + { + HasError = TRUE; + break; + } + + Src0 = CodeBuffer->Head + (*Indx)++; + Des = CodeBuffer->Head + (*Indx)++; + if (!ScriptEngineFloatingSymbolIsReadable(ScriptGeneralRegisters, Src0) || + !ScriptEngineFloatingSymbolIsWritable(ScriptGeneralRegisters, Des) || + Src0->Len == Des->Len) + { + HasError = TRUE; + break; + } + + SCRIPT_ENGINE_SOFT_FLOAT ConvertedValue; + SrcVal0 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src0, FALSE); + if (!ScriptEngineSoftFloatUnpack(Src0->Len, SrcVal0, &ConvertedValue) || + !ScriptEngineSoftFloatPack(Des->Len, + ConvertedValue.Negative, + ConvertedValue.Exponent, + &ConvertedValue.Significand, + &DesVal)) + { + HasError = TRUE; + break; + } + SetValue(GuestRegs, ScriptGeneralRegisters, Des, DesVal); + break; + } + + case FUNC_NEG_FLOAT: + if (*Indx > CodeBuffer->Pointer || CodeBuffer->Pointer - *Indx < 2) + { + HasError = TRUE; + break; + } + + Src0 = CodeBuffer->Head + (*Indx)++; + Des = CodeBuffer->Head + (*Indx)++; + + if (!ScriptEngineFloatingSymbolIsReadable(ScriptGeneralRegisters, Src0) || + !ScriptEngineFloatingSymbolIsWritable(ScriptGeneralRegisters, Des) || + Src0->Len != Des->Len) + { + HasError = TRUE; + break; + } + + SrcVal0 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src0, FALSE); + if (Src0->Len == SYMBOL_VALUE_KIND_FLOAT32) + { + DesVal = (SrcVal0 ^ 0x80000000ULL) & 0xffffffffULL; + } + else + { + DesVal = SrcVal0 ^ 0x8000000000000000ULL; + } + SetValue(GuestRegs, ScriptGeneralRegisters, Des, DesVal); + break; + + case FUNC_ADD_FLOAT: + case FUNC_SUB_FLOAT: + case FUNC_MUL_FLOAT: + case FUNC_DIV_FLOAT: + case FUNC_GT_FLOAT: + case FUNC_LT_FLOAT: + case FUNC_EGT_FLOAT: + case FUNC_ELT_FLOAT: + case FUNC_EQUAL_FLOAT: + case FUNC_NEQ_FLOAT: + { + if (*Indx > CodeBuffer->Pointer || CodeBuffer->Pointer - *Indx < 3) + { + HasError = TRUE; + break; + } + + Src0 = CodeBuffer->Head + (*Indx)++; + Src1 = CodeBuffer->Head + (*Indx)++; + Des = CodeBuffer->Head + (*Indx)++; + + BOOLEAN IsComparison = ScriptEngineIsFloatingComparisonOpcode(Operator->Value); + UINT64 ExpectedResultKind = + Src0->Len == SYMBOL_VALUE_KIND_FLOAT64 || Src1->Len == SYMBOL_VALUE_KIND_FLOAT64 ? + SYMBOL_VALUE_KIND_FLOAT64 : SYMBOL_VALUE_KIND_FLOAT32; + + if (!ScriptEngineFloatingSymbolIsReadable(ScriptGeneralRegisters, Src0) || + !ScriptEngineFloatingSymbolIsReadable(ScriptGeneralRegisters, Src1) || + (IsComparison ? + !ScriptEngineIntegerSymbolIsWritable(ScriptGeneralRegisters, Des) : + (!ScriptEngineFloatingSymbolIsWritable(ScriptGeneralRegisters, Des) || + Des->Len != ExpectedResultKind))) + { + HasError = TRUE; + break; + } + + SrcVal0 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src0, FALSE); + SrcVal1 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src1, FALSE); + if (!ScriptEngineExecuteFloatingBinary(Operator->Value, + Src1->Len, + SrcVal1, + Src0->Len, + SrcVal0, + IsComparison ? SYMBOL_VALUE_KIND_INTEGER : Des->Len, + &DesVal)) + { + HasError = TRUE; + break; + } + + if (!IsComparison && Des->Len == SYMBOL_VALUE_KIND_FLOAT32) + { + DesVal &= 0xffffffffULL; + } + SetValue(GuestRegs, ScriptGeneralRegisters, Des, DesVal); + break; + } + case FUNC_MOV: Src0 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + @@ -2494,6 +3163,12 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, case FUNC_PRINTF: + if (*Indx >= CodeBuffer->Pointer) + { + HasError = TRUE; + break; + } + Src0 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); *Indx = *Indx + 1; @@ -2502,6 +3177,17 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, // Call the target function // + UINT64 RemainingFormatSymbols = CodeBuffer->Pointer - *Indx; + if ((Src0->Type & 0xffffffffULL) != SYMBOL_STRING_TYPE || + Src0->Len == 0 || + Src0->Len > RemainingFormatSymbols * sizeof(SYMBOL) || + !memchr((PCHAR)&Src0->Value, '\0', (SIZE_T)Src0->Len) || + ((SIZE_SYMBOL_WITHOUT_LEN + Src0->Len) / sizeof(SYMBOL)) >= CodeBuffer->Pointer - *Indx) + { + HasError = TRUE; + break; + } + *Indx = *Indx + ((SIZE_SYMBOL_WITHOUT_LEN + Src0->Len) / sizeof(SYMBOL)); @@ -2511,6 +3197,13 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, *Indx = *Indx + 1; + if ((Src1->Type & 0xffffffffULL) != SYMBOL_VARIABLE_COUNT_TYPE || + Src1->Value > CodeBuffer->Pointer - *Indx) + { + HasError = TRUE; + break; + } + Src2 = NULL; if (Src1->Value > 0) @@ -2521,6 +3214,25 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, *Indx = *Indx + Src1->Value; } + for (UINT64 ArgumentIndex = 0; ArgumentIndex < Src1->Value; ArgumentIndex++) + { + PSYMBOL Argument = Src2 + ArgumentIndex; + UINT64 BaseType = Argument->Type & 0xffffffffULL; + + if (BaseType != SYMBOL_STRING_TYPE && BaseType != SYMBOL_WSTRING_TYPE && + Argument->Len != SYMBOL_VALUE_KIND_INTEGER && + !ScriptEngineFloatingSymbolIsReadable(ScriptGeneralRegisters, Argument)) + { + HasError = TRUE; + break; + } + } + + if (HasError) + { + break; + } + ScriptEngineFunctionPrintf( GuestRegs, ActionDetail, diff --git a/hyperdbg/tests/script-engine-test b/hyperdbg/tests/script-engine-test index 8ee847b8..a8f8b923 160000 --- a/hyperdbg/tests/script-engine-test +++ b/hyperdbg/tests/script-engine-test @@ -1 +1 @@ -Subproject commit 8ee847b83e5766de705fbf42e73ff0ff83019fd6 +Subproject commit a8f8b9231e04a47fa5426b89641db810ca90a88d From c13f45f8b05743c5d87d3a50687507defe54af2b Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Mon, 20 Jul 2026 12:12:21 +0200 Subject: [PATCH 08/50] CpuIdEx replacements --- .../commands/debugging-commands/bp.cpp | 4 +-- .../commands/debugging-commands/cpu.cpp | 4 +-- hyperdbg/linux/PORTING_STATUS.md | 34 +++++++++++++++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/bp.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/bp.cpp index 8beed864..9284c387 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/bp.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/bp.cpp @@ -72,7 +72,7 @@ CommandBpPerformApplyingBreakpointOnUserDebugger(DEBUGGEE_BP_PACKET * BpPacket) // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_SET_BREAKPOINT_USER_DEBUGGER, // IO Control Code (IOCTL) BpPacket, // Input Buffer to driver. @@ -85,7 +85,7 @@ CommandBpPerformApplyingBreakpointOnUserDebugger(DEBUGGEE_BP_PACKET * BpPacket) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/cpu.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/cpu.cpp index 970d44ec..9b636a39 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/cpu.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/cpu.cpp @@ -145,7 +145,7 @@ private: for (int i = 0; i <= nIds_; ++i) { - CpuIdEx(cpui.data(), i, 0); + CpuCpuIdEx(cpui.data(), i, 0); data_.push_back(cpui); } @@ -197,7 +197,7 @@ private: for (int i = 0x80000000; i <= nExIds_; ++i) { - CpuIdEx(cpui.data(), i, 0); + CpuCpuIdEx(cpui.data(), i, 0); extdata_.push_back(cpui); } diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index d8530a50..52e282a4 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -123,6 +123,32 @@ equivalent, behavior-preserving. wait/read via `PlatformSerial*`, `DebugBreak`→`PlatformDebugBreak`. - `readmem.cpp` — `ZeroMemory` / `DeviceIoControl` / `GetLastError` sweep. +### common +- `common.cpp` — multi-category port: + - `_stricmp`→`PlatformStrCaseCmp` (new wrapper, see platform-lib-calls). + - `CpuIdEx`→`CpuCpuIdEx`. **This also fixes an upstream typo, not just a Linux + shim.** Commit `85843494` ("add CPU intrinsics for user mode") swept the MSVC + intrinsics onto the new `Cpu*` wrappers but wrote `CpuIdEx` where the wrapper is + actually named `CpuCpuIdEx` (cf. `__cpuid`→`CpuCpuId` done correctly alongside). + `CpuIdEx` is defined **nowhere** in the tree, so this line does not compile on + Windows either — it was just never rebuilt there. Same bug also hit + `cpu.cpp:148` / `cpu.cpp:200` — **now fixed there too** (user-confirmed the swap); + still present on `master`. + - `IsFileExistA` — kept as-is (POSIX `struct stat`/`stat()`); added `#include + ` under `__linux__`. + - Whole Windows-only bodies guarded `#ifdef _WIN32` with a Linux stub + TODO: + `SetPrivilege` (token/LUID; no Linux callers → returns FALSE), + `IsFileExistW` (`_wstat`; wide-char deferred → FALSE), + `GetConfigFilePath` (`GetModuleFileNameW`/shlwapi; wide-char deferred → empties path), + `ListDirectory` (`FindFirstFileA`; → empty vector, only caller is eval.cpp test harness). + - `CheckAddressValidityUsingTsx` — TSX `_xbegin`/`_xend`/`_XBEGIN_STARTED` kept + verbatim; they resolve on GCC via `` (included under `__linux__`) + once `-mrtm` is set. Added `target_compile_options(libhyperdbg PRIVATE -mrtm)` + in `libhyperdbg/CMakeLists.txt` (UNIX block). Real 1:1 mapping, not a stub — the + path is gated by `g_RtmSupport`, which is live on Linux now that cpuid works. +- `platform-lib-calls.{h,c}` — added `PlatformStrCaseCmp(Str1, Str2)`: Windows + `_stricmp`; Linux `strcasecmp` (added `` to the Linux includes). + ### Core debugger - `debugger.cpp` — `DeviceIoControl` / `GetLastError` / `RtlZeroMemory` sweep; `DebuggerGetNtoskrnlBase` body guarded `#ifdef _WIN32` (Linux returns NULL). @@ -259,6 +285,14 @@ backend, and the Toolhelp thread-enumeration equivalent (`/proc`) — all stubbe - [ ] `$peb` pseudo-register — returns 0 on Linux (PEB is NT-only). - [ ] `DebuggerGetNtoskrnlBase` — returns NULL on Linux (NT system-module enum). - [ ] File I/O / user-debugger paths — stubbed (also blocked on wide-char above). +- [ ] `common.cpp::ListDirectory` — Linux returns empty vector; reimplement with + `opendir`/`readdir` + `fnmatch` (only caller today is eval.cpp's test harness). +- [ ] `common.cpp::GetConfigFilePath` — Linux empties the path; resolve via + `readlink("/proc/self/exe")` + append `CONFIG_FILE_NAME` (also blocked on wide-char). +- [ ] `common.cpp::SetPrivilege` / `IsFileExistW` — Linux stubs (no callers / + wide-char deferred respectively). +- [x] `cpu.cpp:148` & `cpu.cpp:200` — same `CpuIdEx`→`CpuCpuIdEx` typo fix as + common.cpp. Done. ### Build system - [ ] Add `.gitignore` rules for the in-source CMake build output From 218ade8f2456c133dcb798ce8232315c704c9315 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Mon, 20 Jul 2026 12:15:34 +0200 Subject: [PATCH 09/50] 1:1 platform swaps --- .../debugger/commands/debugging-commands/d-u.cpp | 2 +- .../code/debugger/commands/debugging-commands/e.cpp | 12 ++++++------ .../debugger/commands/debugging-commands/events.cpp | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/d-u.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/d-u.cpp index e97e7ea8..851f78cd 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/d-u.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/d-u.cpp @@ -273,7 +273,7 @@ CommandReadMemoryAndDisassembler(vector CommandTokens, string Comm // // Default process we read from current process // - Pid = GetCurrentProcessId(); + Pid = PlatformGetCurrentProcessId(); } if (CompareLowerCaseStrings(CommandTokens.at(0), "db")) diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/e.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/e.cpp index f85bf35a..ea10a93b 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/e.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/e.cpp @@ -118,7 +118,7 @@ WriteMemoryContent(UINT64 AddressToEdit, // // Zero the buffer // - ZeroMemory(FinalBuffer, FinalSize); + PlatformZeroMemory(FinalBuffer, FinalSize); // // Copy the structure on top of the allocated buffer @@ -143,7 +143,7 @@ WriteMemoryContent(UINT64 AddressToEdit, } else { - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_EDIT_MEMORY, // IO Control Code (IOCTL) FinalBuffer, // Input Buffer to driver. @@ -156,7 +156,7 @@ WriteMemoryContent(UINT64 AddressToEdit, if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); free(FinalBuffer); return FALSE; } @@ -229,7 +229,7 @@ HyperDbgWriteMemory(PVOID DestinationAddress, // // Zero the buffer // - ZeroMemory(TargetBuffer, FinalSize); + PlatformZeroMemory(TargetBuffer, FinalSize); // // Copy requested memory in 64bit chunks @@ -490,7 +490,7 @@ CommandEditMemory(vector CommandTokens, string Command) // if (ProcId == 0) { - ProcId = GetCurrentProcessId(); + ProcId = PlatformGetCurrentProcessId(); } // @@ -535,7 +535,7 @@ CommandEditMemory(vector CommandTokens, string Command) // // Zero the buffer // - ZeroMemory(FinalBuffer, FinalSize); + PlatformZeroMemory(FinalBuffer, FinalSize); // // Put the values in 64 bit structures diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/events.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/events.cpp index 27561c23..d4f89fcf 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/events.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/events.cpp @@ -712,7 +712,7 @@ CommandEventsModifyAndQueryEvents(UINT64 Tag, // Send the request to the kernel // Status = - DeviceIoControl(g_DeviceHandle, // Handle to device + PlatformDeviceIoControl(g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_MODIFY_EVENTS, // IO Control Code (IOCTL) &ModifyEventRequest, // Input Buffer to driver. SIZEOF_DEBUGGER_MODIFY_EVENTS, // Input buffer length @@ -725,7 +725,7 @@ CommandEventsModifyAndQueryEvents(UINT64 Tag, if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } From bb059c724a174e0b6f18402da1e1b0460ee5a864 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Mon, 20 Jul 2026 12:27:14 +0200 Subject: [PATCH 10/50] Big Sweep of 1:1 platform function changes --- .../debugger/commands/debugging-commands/flush.cpp | 4 ++-- .../debugger/commands/debugging-commands/lm.cpp | 14 +++++++------- .../debugger/commands/debugging-commands/load.cpp | 4 ++-- .../commands/debugging-commands/output.cpp | 2 +- .../debugger/commands/debugging-commands/rdmsr.cpp | 8 ++++---- .../debugger/commands/debugging-commands/s.cpp | 10 +++++----- .../debugger/commands/debugging-commands/test.cpp | 8 ++++---- .../debugger/commands/debugging-commands/wrmsr.cpp | 4 ++-- .../debugger/commands/extension-commands/apic.cpp | 6 +++--- .../debugger/commands/extension-commands/hide.cpp | 6 +++--- .../debugger/commands/extension-commands/idt.cpp | 6 +++--- .../commands/extension-commands/ioapic.cpp | 2 +- .../debugger/commands/extension-commands/lbr.cpp | 4 ++-- .../commands/extension-commands/lbrdump.cpp | 4 ++-- .../debugger/commands/extension-commands/pa2va.cpp | 6 +++--- .../commands/extension-commands/pcicam.cpp | 4 ++-- .../commands/extension-commands/pcitree.cpp | 4 ++-- .../debugger/commands/extension-commands/pte.cpp | 6 +++--- .../debugger/commands/extension-commands/smi.cpp | 4 ++-- .../commands/extension-commands/unhide.cpp | 4 ++-- .../debugger/commands/extension-commands/va2pa.cpp | 6 +++--- .../debugger/commands/meta-commands/disconnect.cpp | 4 ++-- .../code/debugger/commands/meta-commands/sym.cpp | 2 +- 23 files changed, 61 insertions(+), 61 deletions(-) diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/flush.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/flush.cpp index c286207b..76b7c6b7 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/flush.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/flush.cpp @@ -63,7 +63,7 @@ CommandFlushRequestFlush() // want to pass some other arguments to the kernel in // the future // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_FLUSH_LOGGING_BUFFERS, // IO Control Code (IOCTL) &FlushRequest, // Input Buffer to driver. @@ -77,7 +77,7 @@ CommandFlushRequestFlush() if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/lm.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/lm.cpp index ce0cfb12..ec0593c0 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/lm.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/lm.cpp @@ -108,7 +108,7 @@ CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) // // Send the request to the kernel // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_GET_USER_MODE_MODULE_DETAILS, // IO Control // code @@ -123,7 +123,7 @@ CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } @@ -146,7 +146,7 @@ CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) return FALSE; } - RtlZeroMemory(ModuleDetailsRequest, ModuleDetailsSize); + PlatformZeroMemory(ModuleDetailsRequest, ModuleDetailsSize); // // Set the module details to get the modules (not count) @@ -157,7 +157,7 @@ CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) // // Send the request to the kernel // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_GET_USER_MODE_MODULE_DETAILS, // IO Control // code @@ -173,7 +173,7 @@ CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) if (!Status) { free(ModuleDetailsRequest); - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } @@ -197,7 +197,7 @@ CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) return FALSE; } - RtlZeroMemory(WcharBuff, CharSize); + PlatformZeroMemory(WcharBuff, CharSize); mbstowcs(WcharBuff, SearchModule, CharSize); @@ -483,7 +483,7 @@ CommandLm(vector CommandTokens, string Command) } else { - CommandLmShowUserModeModule(GetCurrentProcessId(), SearchString); + CommandLmShowUserModeModule(PlatformGetCurrentProcessId(), SearchString); } } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/load.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/load.cpp index 3ea642c4..db7b3345 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/load.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/load.cpp @@ -87,7 +87,7 @@ CommandLoad(vector CommandTokens, string Command) // process (HyperDbg's process) as the base for user-mode // symbols // - SymbolLocalReload(GetCurrentProcessId()); + SymbolLocalReload(PlatformGetCurrentProcessId()); } else if (CompareLowerCaseStrings(CommandTokens.at(1), "vmm") || CompareLowerCaseStrings(CommandTokens.at(1), "vm")) @@ -120,7 +120,7 @@ CommandLoad(vector CommandTokens, string Command) // process (HyperDbg's process) as the base for user-mode // symbols // - SymbolLocalReload(GetCurrentProcessId()); + SymbolLocalReload(PlatformGetCurrentProcessId()); } else if (CompareLowerCaseStrings(CommandTokens.at(1), "trace") || CompareLowerCaseStrings(CommandTokens.at(1), "hypertrace")) diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/output.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/output.cpp index 0fafc899..228e1d39 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/output.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/output.cpp @@ -276,7 +276,7 @@ CommandOutput(vector CommandTokens, string Command) return; } - RtlZeroMemory(EventForwardingObject, sizeof(DEBUGGER_EVENT_FORWARDING)); + PlatformZeroMemory(EventForwardingObject, sizeof(DEBUGGER_EVENT_FORWARDING)); // // Set the state diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp index b5f948f5..b05933d7 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp @@ -76,7 +76,7 @@ GetWindowsNumaNumberOfCores() } GetLogicalProcessorInformationEx(RelationAll, NULL, &Length); - if (Length < 1 || GetLastError() != ERROR_INSUFFICIENT_BUFFER) + if (Length < 1 || PlatformGetLastError() != ERROR_INSUFFICIENT_BUFFER) { return 0; } @@ -205,9 +205,9 @@ CommandRdmsr(vector CommandTokens, string Command) // UINT64 * OutputBuffer = (UINT64 *)malloc(sizeof(UINT64) * NumCPU); - ZeroMemory(OutputBuffer, sizeof(UINT64) * NumCPU); + PlatformZeroMemory(OutputBuffer, sizeof(UINT64) * NumCPU); - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_READ_OR_WRITE_MSR, // IO Control Code (IOCTL) &MsrReadRequest, // Input Buffer to driver. @@ -221,7 +221,7 @@ CommandRdmsr(vector CommandTokens, string Command) if (!Status) { ShowMessages("ioctl failed with code (%x), either msr index or core id is invalid\n", - GetLastError()); + PlatformGetLastError()); free(OutputBuffer); return; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/s.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/s.cpp index 9c3eff59..1f7c3168 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/s.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/s.cpp @@ -76,13 +76,13 @@ CommandSearchSendRequest(UINT64 * BufferToSendAsIoctl, UINT32 BufferToSendAsIoct // Also it's better to Zero the memory; however it's not necessary // as we zero the buffer in the search routines // - ZeroMemory(ResultsBuffer, MaximumSearchResults * sizeof(UINT64)); + PlatformZeroMemory(ResultsBuffer, MaximumSearchResults * sizeof(UINT64)); // // Fire the IOCTL // Status = - DeviceIoControl(g_DeviceHandle, // Handle to device + PlatformDeviceIoControl(g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_SEARCH_MEMORY, // IO Control Code (IOCTL) BufferToSendAsIoctl, // Input Buffer to driver. BufferToSendAsIoctlSize, // Input buffer length @@ -95,7 +95,7 @@ CommandSearchSendRequest(UINT64 * BufferToSendAsIoctl, UINT32 BufferToSendAsIoct if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); free(ResultsBuffer); return; @@ -394,7 +394,7 @@ CommandSearchMemory(vector CommandTokens, string Command) if (ProcId == 0) { - ProcId = GetCurrentProcessId(); + ProcId = PlatformGetCurrentProcessId(); } // @@ -473,7 +473,7 @@ CommandSearchMemory(vector CommandTokens, string Command) // // Zero the buffer // - ZeroMemory(FinalBuffer, FinalSize); + PlatformZeroMemory(FinalBuffer, FinalSize); // // Copy the structure on top of the allocated buffer diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/test.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/test.cpp index ffe824d8..f7b7ef79 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/test.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/test.cpp @@ -61,7 +61,7 @@ CommandTestPerformKernelTestsIoctl() // want to pass some other arguments to the kernel in // the future // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_PERFORM_KERNEL_SIDE_TESTS, // IO Control Code (IOCTL) &KernelTestRequest, // Input Buffer to driver. @@ -75,7 +75,7 @@ CommandTestPerformKernelTestsIoctl() if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } @@ -192,7 +192,7 @@ CommandTestPerformTest() return FALSE; } - RtlZeroMemory(Buffer, TEST_CASE_MAXIMUM_BUFFERS_TO_COMMUNICATE); + PlatformZeroMemory(Buffer, TEST_CASE_MAXIMUM_BUFFERS_TO_COMMUNICATE); // // Create tests process to create a thread for us @@ -233,7 +233,7 @@ SendCommandAndWaitForResponse: return FALSE; } - RtlZeroMemory(Buffer, TEST_CASE_MAXIMUM_BUFFERS_TO_COMMUNICATE); + PlatformZeroMemory(Buffer, TEST_CASE_MAXIMUM_BUFFERS_TO_COMMUNICATE); ReadBytes = NamedPipeServerReadClientMessage(PipeHandle, (CHAR *)Buffer, TEST_CASE_MAXIMUM_BUFFERS_TO_COMMUNICATE); diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/wrmsr.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/wrmsr.cpp index 7e6fb434..c8447cec 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/wrmsr.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/wrmsr.cpp @@ -158,7 +158,7 @@ CommandWrmsr(vector CommandTokens, string Command) MsrWriteRequest.CoreNumber = CoreNumer; MsrWriteRequest.Value = Value; - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_READ_OR_WRITE_MSR, // IO Control Code (IOCTL) &MsrWriteRequest, // Input Buffer to driver. @@ -172,7 +172,7 @@ CommandWrmsr(vector CommandTokens, string Command) if (!Status) { ShowMessages("ioctl failed with code (%x), either msr index or core id is invalid\n", - GetLastError()); + PlatformGetLastError()); return; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/apic.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/apic.cpp index b68c93cb..12a805c3 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/apic.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/apic.cpp @@ -69,7 +69,7 @@ CommandApicSendRequest(DEBUGGER_APIC_REQUEST_TYPE ApicType, return FALSE; } - RtlZeroMemory(ApicRequest, RequestSize); + PlatformZeroMemory(ApicRequest, RequestSize); // // Set the APIC type to local apic @@ -103,7 +103,7 @@ CommandApicSendRequest(DEBUGGER_APIC_REQUEST_TYPE ApicType, // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_PERFORM_ACTIONS_ON_APIC, // IO Control Code (IOCTL) ApicRequest, // Input Buffer to driver. @@ -116,7 +116,7 @@ CommandApicSendRequest(DEBUGGER_APIC_REQUEST_TYPE ApicType, if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); free(ApicRequest); return FALSE; diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/hide.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/hide.cpp index 1675d709..71741ed2 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/hide.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/hide.cpp @@ -299,7 +299,7 @@ HyperDbgEnableTransparentModeEx(UINT32 ProcessId, CHAR * ProcessName, BOOLEAN Is // // Zero the memory // - RtlZeroMemory(FinalRequestBuffer, RequestBufferSize); + PlatformZeroMemory(FinalRequestBuffer, RequestBufferSize); // // Copy the buffer on the top of the final buffer @@ -322,7 +322,7 @@ HyperDbgEnableTransparentModeEx(UINT32 ProcessId, CHAR * ProcessName, BOOLEAN Is // // Send the request to the kernel // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_HIDE_AND_UNHIDE_TO_TRANSPARENT_THE_DEBUGGER, // IO Control // code @@ -337,7 +337,7 @@ HyperDbgEnableTransparentModeEx(UINT32 ProcessId, CHAR * ProcessName, BOOLEAN Is if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); free(FinalRequestBuffer); return FALSE; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/idt.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/idt.cpp index 69e117fd..fcdb112a 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/idt.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/idt.cpp @@ -69,7 +69,7 @@ HyperDbgGetIdtEntry(INTERRUPT_DESCRIPTOR_TABLE_ENTRIES_PACKETS * IdtPacket) // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_QUERY_IDT_ENTRY, // IO Control Code (IOCTL) IdtPacket, // Input Buffer to driver. @@ -82,7 +82,7 @@ HyperDbgGetIdtEntry(INTERRUPT_DESCRIPTOR_TABLE_ENTRIES_PACKETS * IdtPacket) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } @@ -164,7 +164,7 @@ CommandIdt(vector CommandTokens, string Command) ShowMessages("err, allocating buffer for receiving IDT entries"); } - RtlZeroMemory(IdtPacket, sizeof(INTERRUPT_DESCRIPTOR_TABLE_ENTRIES_PACKETS)); + PlatformZeroMemory(IdtPacket, sizeof(INTERRUPT_DESCRIPTOR_TABLE_ENTRIES_PACKETS)); // // Get the IDT buffer diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/ioapic.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/ioapic.cpp index ab1f18b4..baddd55b 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/ioapic.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/ioapic.cpp @@ -214,7 +214,7 @@ CommandIoapic(vector CommandTokens, string Command) ShowMessages("err, allocating buffer for receiving I/O APIC"); } - RtlZeroMemory(IoApicPackets, sizeof(IO_APIC_ENTRY_PACKETS)); + PlatformZeroMemory(IoApicPackets, sizeof(IO_APIC_ENTRY_PACKETS)); // // Get the I/O APIC buffer diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp index 3d2718e8..4074c2f4 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp @@ -86,7 +86,7 @@ CommandLbrSendRequest(HYPERTRACE_LBR_OPERATION_PACKETS * LbrRequest) // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_PERFORM_HYPERTRACE_LBR_OPERATION, // IO Control Code (IOCTL) LbrRequest, // Input Buffer to driver. @@ -99,7 +99,7 @@ CommandLbrSendRequest(HYPERTRACE_LBR_OPERATION_PACKETS * LbrRequest) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbrdump.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbrdump.cpp index 6df20e4a..e5980446 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbrdump.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbrdump.cpp @@ -48,7 +48,7 @@ HyperDbgLbrdumpSendRequest(HYPERTRACE_LBR_DUMP_PACKETS * LbrdumpRequest) // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_PERFORM_HYPERTRACE_LBR_DUMP, // IO Control Code (IOCTL) LbrdumpRequest, // Input Buffer to driver. @@ -61,7 +61,7 @@ HyperDbgLbrdumpSendRequest(HYPERTRACE_LBR_DUMP_PACKETS * LbrdumpRequest) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pa2va.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pa2va.cpp index 30a09ad7..cdf20881 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pa2va.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pa2va.cpp @@ -168,14 +168,14 @@ CommandPa2va(vector CommandTokens, string Command) if (Pid == 0) { - Pid = GetCurrentProcessId(); + Pid = PlatformGetCurrentProcessId(); AddressDetails.ProcessId = Pid; } // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_VA2PA_AND_PA2VA_COMMANDS, // IO Control Code (IOCTL) &AddressDetails, // Input Buffer to driver. @@ -189,7 +189,7 @@ CommandPa2va(vector CommandTokens, string Command) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcicam.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcicam.cpp index d82c51aa..ba0ac2ee 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcicam.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcicam.cpp @@ -128,7 +128,7 @@ CommandPcicam(vector CommandTokens, string Command) // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_PCIDEVINFO_ENUM, // IO Control Code (IOCTL) &PcidevinfoPacket, // Input Buffer to driver. @@ -142,7 +142,7 @@ CommandPcicam(vector CommandTokens, string Command) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcitree.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcitree.cpp index 0101dde8..52b34159 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcitree.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcitree.cpp @@ -70,7 +70,7 @@ CommandPcitree(vector CommandTokens, string Command) // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_PCIE_ENDPOINT_ENUM, // IO Control Code (IOCTL) &PcitreePacket, // Input Buffer to driver. @@ -84,7 +84,7 @@ CommandPcitree(vector CommandTokens, string Command) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pte.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pte.cpp index 7618f598..52f10f07 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pte.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pte.cpp @@ -211,14 +211,14 @@ CommandPte(vector CommandTokens, string Command) if (Pid == 0) { - Pid = GetCurrentProcessId(); + Pid = PlatformGetCurrentProcessId(); AddressDetails.ProcessId = Pid; } // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_READ_PAGE_TABLE_ENTRIES_DETAILS, // IO Control Code (IOCTL) &AddressDetails, // Input Buffer to driver. @@ -232,7 +232,7 @@ CommandPte(vector CommandTokens, string Command) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/smi.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/smi.cpp index 0efa6c41..89e92f70 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/smi.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/smi.cpp @@ -69,7 +69,7 @@ CommandSmiSendRequest(SMI_OPERATION_PACKETS * SmiOperationRequest) // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_PERFORM_SMI_OPERATION, // IO Control Code (IOCTL) SmiOperationRequest, // Input Buffer to driver. @@ -82,7 +82,7 @@ CommandSmiSendRequest(SMI_OPERATION_PACKETS * SmiOperationRequest) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/unhide.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/unhide.cpp index 7ede211d..95a95e11 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/unhide.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/unhide.cpp @@ -57,7 +57,7 @@ HyperDbgDisableTransparentMode() // // Send the request to the kernel // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_HIDE_AND_UNHIDE_TO_TRANSPARENT_THE_DEBUGGER, // IO Control // code @@ -72,7 +72,7 @@ HyperDbgDisableTransparentMode() if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return FALSE; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/va2pa.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/va2pa.cpp index 795462de..9daeff49 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/va2pa.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/va2pa.cpp @@ -169,14 +169,14 @@ CommandVa2pa(vector CommandTokens, string Command) if (Pid == 0) { - Pid = GetCurrentProcessId(); + Pid = PlatformGetCurrentProcessId(); AddressDetails.ProcessId = Pid; } // // Send IOCTL // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_VA2PA_AND_PA2VA_COMMANDS, // IO Control Code (IOCTL) &AddressDetails, // Input Buffer to driver. @@ -190,7 +190,7 @@ CommandVa2pa(vector CommandTokens, string Command) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return; } diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/disconnect.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/disconnect.cpp index 7a28df0b..9f25ff80 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/disconnect.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/disconnect.cpp @@ -86,8 +86,8 @@ CommandDisconnect(vector CommandTokens, string Command) // remote commands and close the connection // TerminateThread(g_RemoteDebuggeeListeningThread, 0); - CloseHandle(g_RemoteDebuggeeListeningThread); - CloseHandle(g_EndOfMessageReceivedEvent); + PlatformCloseHandle(g_RemoteDebuggeeListeningThread); + PlatformCloseHandle(g_EndOfMessageReceivedEvent); g_EndOfMessageReceivedEvent = NULL; RemoteConnectionCloseTheConnectionWithDebuggee(); diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/sym.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/sym.cpp index 0f9c1f5b..bc06ecf3 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/sym.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/sym.cpp @@ -179,7 +179,7 @@ CommandSym(vector CommandTokens, string Command) } else { - UserProcessId = GetCurrentProcessId(); + UserProcessId = PlatformGetCurrentProcessId(); } } From a29e210ab067d4a96a0d130f61aeed5b53387565 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Mon, 20 Jul 2026 12:32:10 +0200 Subject: [PATCH 11/50] Porting status update and terminate thread platform call --- .../platform/user/code/platform-lib-calls.c | 41 ++++++++++ .../platform/user/header/platform-lib-calls.h | 3 + .../commands/meta-commands/disconnect.cpp | 2 +- hyperdbg/linux/PORTING_STATUS.md | 80 +++++++++++++++++++ 4 files changed, 125 insertions(+), 1 deletion(-) diff --git a/hyperdbg/include/platform/user/code/platform-lib-calls.c b/hyperdbg/include/platform/user/code/platform-lib-calls.c index f914027c..c29d3c44 100644 --- a/hyperdbg/include/platform/user/code/platform-lib-calls.c +++ b/hyperdbg/include/platform/user/code/platform-lib-calls.c @@ -516,6 +516,47 @@ PlatformCreateThread(PLATFORM_THREAD_ROUTINE Routine, PVOID Param) #endif } +/** + * @brief Platform independent wrapper for TerminateThread + * + * @details There is no POSIX equivalent by design: no call forcibly kills a + * thread without unwinding, since doing so never releases the + * target's locks. pthread_cancel is the nearest primitive but has + * different semantics (deferred by default, and glibc implements it + * as a forced unwind that runs destructors and cleanup handlers). + * + * TODO (linux): the only caller is disconnect.cpp, whose listening + * thread blocks in recv() inside a + * `while (g_IsConnectedToRemoteDebuggee)` loop and breaks on any + * receive error. The correct teardown there is to clear the flag, + * shutdown(fd, SHUT_RDWR) to kick the thread out of recv, then + * pthread_join it — letting it exit through its own error path, with + * no cancellation primitive involved. That needs a call-site reorder + * (teardown before thread-kill, and SD_SEND -> SHUT_RDWR to wake a + * blocked reader), which the port's no-logic-changes rule defers. + * + * Returning TRUE is consistent with PlatformCreateThread, which + * returns NULL on Linux — the thread is never started there, so + * there is nothing to terminate yet. + * + * @param Thread handle to the thread to terminate + * @param ExitCode exit code for the terminated thread + * @return BOOLEAN TRUE on success + */ +BOOLEAN +PlatformTerminateThread(HANDLE Thread, DWORD ExitCode) +{ +#if defined(_WIN32) + return (BOOLEAN)TerminateThread(Thread, ExitCode); +#elif defined(__linux__) + (void)Thread; + (void)ExitCode; + return TRUE; +#else +# error "Unsupported platform" +#endif +} + /** * @brief Platform independent wrapper for GetLastError */ diff --git a/hyperdbg/include/platform/user/header/platform-lib-calls.h b/hyperdbg/include/platform/user/header/platform-lib-calls.h index 903c169a..22ad3e50 100644 --- a/hyperdbg/include/platform/user/header/platform-lib-calls.h +++ b/hyperdbg/include/platform/user/header/platform-lib-calls.h @@ -124,6 +124,9 @@ typedef DWORD(WINAPI * PLATFORM_THREAD_ROUTINE)(PVOID Param); HANDLE PlatformCreateThread(PLATFORM_THREAD_ROUTINE Routine, PVOID Param); +BOOLEAN +PlatformTerminateThread(HANDLE Thread, DWORD ExitCode); + // // LAST OS ERROR // diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/disconnect.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/disconnect.cpp index 9f25ff80..7868b5f4 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/disconnect.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/disconnect.cpp @@ -85,7 +85,7 @@ CommandDisconnect(vector CommandTokens, string Command) // We should kill the thread that was listening for the // remote commands and close the connection // - TerminateThread(g_RemoteDebuggeeListeningThread, 0); + PlatformTerminateThread(g_RemoteDebuggeeListeningThread, 0); PlatformCloseHandle(g_RemoteDebuggeeListeningThread); PlatformCloseHandle(g_EndOfMessageReceivedEvent); g_EndOfMessageReceivedEvent = NULL; diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index 52e282a4..23143b31 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -229,6 +229,36 @@ equivalent, behavior-preserving. `spinlock.cpp` (`_interlockedbittestandset`→`CpuInterlockedBitTestAndSet`). (`libhyperdbg.cpp` itself has its own entry under **App** above.) +### Commands batch sweep — DONE (2026-07-20) + +Mechanical bucket-1 sweep across 23 files in `libhyperdbg/code/debugger/commands/`. +Behaviour-preserving 1:1 substitutions only, no logic touched: + +| Swap | Count | +|------|-------| +| `DeviceIoControl` → `PlatformDeviceIoControl` | 19 | +| `GetLastError` → `PlatformGetLastError` | 20 | +| `RtlZeroMemory` / `ZeroMemory` → `PlatformZeroMemory` | 15 | +| `GetCurrentProcessId` → `PlatformGetCurrentProcessId` | 7 | +| `CloseHandle` → `PlatformCloseHandle` | 2 | +| `TerminateThread` → `PlatformTerminateThread` | 1 | + +- Debugging: `flush.cpp`, `lm.cpp`, `load.cpp`, `output.cpp`, `rdmsr.cpp`, `s.cpp`, + `test.cpp`, `wrmsr.cpp` +- Extension: `apic.cpp`, `hide.cpp`, `idt.cpp`, `ioapic.cpp`, `lbr.cpp`, + `lbrdump.cpp`, `pa2va.cpp`, `pcicam.cpp`, `pcitree.cpp`, `pte.cpp`, `smi.cpp`, + `unhide.cpp`, `va2pa.cpp` +- Meta: `sym.cpp`, `disconnect.cpp` + +**Pure addition:** `PlatformTerminateThread` in `platform-lib-calls.{h,c}` — real +`TerminateThread` on Windows, Linux stub returning TRUE (see TODO below). + +After this sweep `pt.cpp` is the only file left in `commands/` holding raw Win32 +calls. Note `lm.cpp` still does not compile, but for unrelated pre-existing +reasons (`RTL_PROCESS_MODULES` / `RTL_PROCESS_MODULE_INFORMATION` undeclared, and +`WCHAR *` vs `wchar_t *` — the wide-char item below); none of those are on lines +this sweep touched. + --- ## TODO ledger — revisit before Linux is functional @@ -280,6 +310,56 @@ Bucket 2 (Win32 process/thread mgmt) resolved two ways (user decision): TODO(Linux) still open in the wrapper bodies: real `fork`+`execve`/`ptrace` process backend, and the Toolhelp thread-enumeration equivalent (`/proc`) — all stubbed for now. +### Process control — `pt.cpp` NOT STARTED + +`extension-commands/pt.cpp` (Intel PT) is the last file in `commands/` with raw +Win32 calls — 27 sites, and no `#ifdef` guards anywhere in the file. This is +**not** a mechanical sweep: it is bucket-2 work structurally like `ud.cpp` was, so +it needs the same Group A / Group B decision per call site before anything is +swapped. What is in there: + +- Toolhelp process/thread snapshot walk (`CreateToolhelp32Snapshot` + enumeration) +- `OpenProcess` / `OpenThread` + handle lifetime (`CloseHandle` ×8) +- Thread affinity pinning (`SetThreadAffinityMask`) +- Trace-thread lifecycle (`CreateEvent` / `CreateThread` / stop-event signalling) +- Two `DeviceIoControl` + `GetLastError` pairs (these two *are* bucket-1 and could + be swapped in isolation, but leaving the file wholly untouched is cleaner than a + half-ported file) + +- [ ] Decide Group A vs Group B per call site, then port `pt.cpp`. + +### `PlatformTerminateThread` — Linux stub + +- [ ] Real teardown for the remote-debuggee listening thread. + +There is **no POSIX equivalent to `TerminateThread` by design**: nothing forcibly +kills a thread without unwinding, because doing so never releases the target's +locks. `pthread_cancel` is the nearest primitive but differs semantically — +deferred by default, and glibc implements it as a forced unwind that runs +destructors and cleanup handlers (any `catch (...)` that does not rethrow breaks +it). `PTHREAD_CANCEL_ASYNCHRONOUS` recovers the abruptness at the cost of +undefined behaviour for anything not async-cancel-safe. + +The only caller does not need a cancellation primitive at all. +`RemoteConnectionThreadListeningToDebuggee` (`remote-connection.cpp:211`) is a +`while (g_IsConnectedToRemoteDebuggee)` loop that blocks in `recv()` and `break`s +on any receive error. Correct Linux teardown is therefore: clear the flag → +`shutdown(fd, SHUT_RDWR)` to kick the thread out of `recv` → `pthread_join`. It +exits through its own existing error path. + +Deferred because that requires a **call-site reorder** in `disconnect.cpp` +(teardown before thread-kill instead of after) plus `SD_SEND` → `SHUT_RDWR` in +`CommunicationClientShutdownConnection` to wake a blocked *reader* — a behaviour +change to shared logic, which the no-logic-changes rule rules out mid-port. + +Also blocked on `PlatformCreateThread`, which returns NULL on Linux, so the +listening thread never starts there in the first place. + +**Observation, not this batch's job:** on Windows the current ordering kills the +listener while it may be mid-`recv` holding the socket, and only *then* shuts the +socket down. That looks like a latent upstream bug — worth raising separately, +but out of scope for the port. + ### Misc runtime stubs - [ ] `PlatformGetOsVersion` — Linux returns FALSE; implement via `uname`. - [ ] `$peb` pseudo-register — returns 0 on Linux (PEB is NT-only). From d44c726dff91402a1f093455b69449b65657bce0 Mon Sep 17 00:00:00 2001 From: xmaple555 Date: Mon, 20 Jul 2026 23:21:34 +0800 Subject: [PATCH 12/50] update variable type and add float type in script enginr --- .../hwdbg/script/script_definitions.scala | 16 +- hyperdbg/hyperdbg-test/code/main.cpp | 12 + .../code/tests/test-script-variable-types.cpp | 163 ++ .../code/tests/test-semantic-scripts.cpp | 55 +- hyperdbg/hyperdbg-test/header/testcases.h | 3 +- hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj | 1 + .../headers/ScriptEngineCommonDefinitions.h | 57 + hyperdbg/include/config/Definition.h | 2 + .../commands/debugging-commands/test.cpp | 12 + hyperdbg/script-engine/code/common.c | 10 + hyperdbg/script-engine/code/parse-table.c | 2414 +++++++++-------- hyperdbg/script-engine/code/scanner.c | 18 +- hyperdbg/script-engine/code/script-engine.c | 1172 +++++++- hyperdbg/script-engine/code/type.c | 248 +- hyperdbg/script-engine/header/common.h | 1 + hyperdbg/script-engine/header/parse-table.h | 20 +- hyperdbg/script-engine/header/script-engine.h | 6 + hyperdbg/script-engine/header/type.h | 30 + .../python/Boolean_Expression_Grammar.txt | 34 +- hyperdbg/script-engine/python/Grammar.txt | 40 +- hyperdbg/script-engine/python/generator.py | 46 +- hyperdbg/script-engine/python/lalr1_parser.py | 30 +- hyperdbg/script-engine/python/ll1_parser.py | 32 +- hyperdbg/script-eval/code/ScriptEngineEval.c | 472 +++- hyperdbg/tests/script-engine-test | 2 +- 25 files changed, 3595 insertions(+), 1301 deletions(-) create mode 100644 hyperdbg/hyperdbg-test/code/tests/test-script-variable-types.cpp diff --git a/hwdbg/src/main/scala/hwdbg/script/script_definitions.scala b/hwdbg/src/main/scala/hwdbg/script/script_definitions.scala index f476bfea..8af04bbc 100644 --- a/hwdbg/src/main/scala/hwdbg/script/script_definitions.scala +++ b/hwdbg/src/main/scala/hwdbg/script/script_definitions.scala @@ -34,6 +34,20 @@ object ScriptConstants { val SYMBOL_VALUE_KIND_INTEGER = 0 val SYMBOL_VALUE_KIND_FLOAT32 = 1 val SYMBOL_VALUE_KIND_FLOAT64 = 2 + val SCRIPT_SCALAR_TYPE_INVALID = 0 + val SCRIPT_SCALAR_TYPE_BOOL = 1 + val SCRIPT_SCALAR_TYPE_I8 = 2 + val SCRIPT_SCALAR_TYPE_I16 = 3 + val SCRIPT_SCALAR_TYPE_I32 = 4 + val SCRIPT_SCALAR_TYPE_I64 = 5 + val SCRIPT_SCALAR_TYPE_U8 = 6 + val SCRIPT_SCALAR_TYPE_U16 = 7 + val SCRIPT_SCALAR_TYPE_U32 = 8 + val SCRIPT_SCALAR_TYPE_U64 = 9 + val SCRIPT_SCALAR_TYPE_F32 = 10 + val SCRIPT_SCALAR_TYPE_F64 = 11 + val SCRIPT_SCALAR_TYPE_POINTER = 12 + val SCRIPT_SCALAR_TYPE_F80 = 13 } /** @@ -48,6 +62,6 @@ object ScriptConstantTypes { object ScriptEvalFunc { object ScriptOperators extends ChiselEnum { - val sFuncUndefined, sFuncInc, sFuncDec, sFuncReference, sFuncOr, sFuncXor, sFuncAnd, sFuncAsr, sFuncAsl, sFuncAdd, sFuncSub, sFuncMul, sFuncDiv, sFuncMod, sFuncGt, sFuncLt, sFuncEgt, sFuncElt, sFuncEqual, sFuncNeq, sFuncJmp, sFuncJz, sFuncJnz, sFuncMov, sFuncStart_of_do_while, sFuncStart_of_do_while_commands, sFuncEnd_of_do_while, sFuncStart_of_for, sFuncFor_inc_dec, sFuncStart_of_for_ommands, sFuncEnd_of_if, sFuncIgnore_lvalue, sFuncPush, sFuncPop, sFuncCall, sFuncRet, sFuncPrint, sFuncFormats, sFuncEvent_enable, sFuncEvent_disable, sFuncEvent_clear, sFuncTest_statement, sFuncSpinlock_lock, sFuncSpinlock_unlock, sFuncEvent_sc, sFuncMicrosleep, sFuncPrintf, sFuncPause, sFuncFlush, sFuncEvent_trace_step, sFuncEvent_trace_step_in, sFuncEvent_trace_step_out, sFuncEvent_trace_instrumentation_step, sFuncEvent_trace_instrumentation_step_in, sFuncRdtsc, sFuncRdtscp, sFuncLbr_save, sFuncLbr_dump, sFuncLbr_print, sFuncLbr_restore, sFuncLbr_check, sFuncSpinlock_lock_custom_wait, sFuncEvent_inject, sFuncPoi, sFuncDb, sFuncDd, sFuncDw, sFuncDq, sFuncNeg, sFuncHi, sFuncLow, sFuncNot, sFuncCheck_address, sFuncDisassemble_len, sFuncDisassemble_len32, sFuncDisassemble_len64, sFuncInterlocked_increment, sFuncInterlocked_decrement, sFuncPhysical_to_virtual, sFuncVirtual_to_physical, sFuncPoi_pa, sFuncHi_pa, sFuncLow_pa, sFuncDb_pa, sFuncDd_pa, sFuncDw_pa, sFuncDq_pa, sFuncLbr_restore_by_filter, sFuncEd, sFuncEb, sFuncEq, sFuncInterlocked_exchange, sFuncInterlocked_exchange_add, sFuncEb_pa, sFuncEd_pa, sFuncEq_pa, sFuncInterlocked_compare_exchange, sFuncStrlen, sFuncStrcmp, sFuncMemcmp, sFuncStrncmp, sFuncWcslen, sFuncWcscmp, sFuncEvent_inject_error_code, sFuncMemcpy, sFuncMemcpy_pa, sFuncWcsncmp, sFuncStruct_forward_declaration, sFuncStruct_definition_begin, sFuncStruct_definition_end, sFuncStruct_variable_declaration, sFuncStruct_member_declaration, sFuncTypedef_declaration, sFuncStruct_pointer, sFuncStruct_array_dimension, sFuncStruct_declarator_complete, sFuncTyped_load, sFuncTyped_store, sFuncAggregate_copy, sFuncAggregate_zero, sFuncStruct_initializer_begin, sFuncStruct_initializer_end, sFuncStruct_pointer_cast, sFuncMember_address, sFuncMember_read, sFuncMember_dot_lvalue, sFuncMember_arrow_lvalue, sFuncMember_dot_read, sFuncMember_arrow_read, sFuncMov_float, sFuncNeg_float, sFuncAdd_float, sFuncSub_float, sFuncMul_float, sFuncDiv_float, sFuncGt_float, sFuncLt_float, sFuncEgt_float, sFuncElt_float, sFuncEqual_float, sFuncNeq_float, sFuncConvert_float = Value + val sFuncUndefined, sFuncInc, sFuncDec, sFuncReference, sFuncOr, sFuncXor, sFuncAnd, sFuncAsr, sFuncAsl, sFuncAdd, sFuncSub, sFuncMul, sFuncDiv, sFuncMod, sFuncGt, sFuncLt, sFuncEgt, sFuncElt, sFuncEqual, sFuncNeq, sFuncJmp, sFuncJz, sFuncJnz, sFuncMov, sFuncStart_of_do_while, sFuncStart_of_do_while_commands, sFuncEnd_of_do_while, sFuncStart_of_for, sFuncFor_inc_dec, sFuncStart_of_for_ommands, sFuncEnd_of_if, sFuncIgnore_lvalue, sFuncPush, sFuncPop, sFuncCall, sFuncRet, sFuncPrint, sFuncFormats, sFuncEvent_enable, sFuncEvent_disable, sFuncEvent_clear, sFuncTest_statement, sFuncSpinlock_lock, sFuncSpinlock_unlock, sFuncEvent_sc, sFuncMicrosleep, sFuncPrintf, sFuncPause, sFuncFlush, sFuncEvent_trace_step, sFuncEvent_trace_step_in, sFuncEvent_trace_step_out, sFuncEvent_trace_instrumentation_step, sFuncEvent_trace_instrumentation_step_in, sFuncRdtsc, sFuncRdtscp, sFuncLbr_save, sFuncLbr_dump, sFuncLbr_print, sFuncLbr_restore, sFuncLbr_check, sFuncSpinlock_lock_custom_wait, sFuncEvent_inject, sFuncPoi, sFuncDb, sFuncDd, sFuncDw, sFuncDq, sFuncNeg, sFuncHi, sFuncLow, sFuncNot, sFuncCheck_address, sFuncDisassemble_len, sFuncDisassemble_len32, sFuncDisassemble_len64, sFuncInterlocked_increment, sFuncInterlocked_decrement, sFuncPhysical_to_virtual, sFuncVirtual_to_physical, sFuncPoi_pa, sFuncHi_pa, sFuncLow_pa, sFuncDb_pa, sFuncDd_pa, sFuncDw_pa, sFuncDq_pa, sFuncLbr_restore_by_filter, sFuncEd, sFuncEb, sFuncEq, sFuncInterlocked_exchange, sFuncInterlocked_exchange_add, sFuncEb_pa, sFuncEd_pa, sFuncEq_pa, sFuncInterlocked_compare_exchange, sFuncStrlen, sFuncStrcmp, sFuncMemcmp, sFuncStrncmp, sFuncWcslen, sFuncWcscmp, sFuncEvent_inject_error_code, sFuncMemcpy, sFuncMemcpy_pa, sFuncWcsncmp, sFuncStruct_forward_declaration, sFuncStruct_definition_begin, sFuncStruct_definition_end, sFuncStruct_variable_declaration, sFuncStruct_member_declaration, sFuncTypedef_declaration, sFuncStruct_pointer, sFuncStruct_array_dimension, sFuncStruct_declarator_complete, sFuncTyped_load, sFuncTyped_store, sFuncAggregate_copy, sFuncAggregate_zero, sFuncStruct_initializer_begin, sFuncStruct_initializer_end, sFuncStruct_pointer_cast, sFuncMember_address, sFuncMember_read, sFuncMember_dot_lvalue, sFuncMember_arrow_lvalue, sFuncMember_dot_read, sFuncMember_arrow_read, sFuncMov_float, sFuncNeg_float, sFuncAdd_float, sFuncSub_float, sFuncMul_float, sFuncDiv_float, sFuncGt_float, sFuncLt_float, sFuncEgt_float, sFuncElt_float, sFuncEqual_float, sFuncNeq_float, sFuncConvert_float, sFuncCast_scalar, sFuncAdd_typed, sFuncSub_typed, sFuncMul_typed, sFuncDiv_typed, sFuncMod_typed, sFuncBitwise_and_typed, sFuncBitwise_or_typed, sFuncBitwise_xor_typed, sFuncShift_left_typed, sFuncShift_right_typed, sFuncGt_typed, sFuncLt_typed, sFuncEgt_typed, sFuncElt_typed, sFuncEqual_typed, sFuncNeq_typed, sFuncNeg_typed, sFuncBitwise_not_typed, sFuncLogical_not_typed, sFuncPointer_diff = Value } } \ No newline at end of file diff --git a/hyperdbg/hyperdbg-test/code/main.cpp b/hyperdbg/hyperdbg-test/code/main.cpp index bc8315af..eee6991c 100644 --- a/hyperdbg/hyperdbg-test/code/main.cpp +++ b/hyperdbg/hyperdbg-test/code/main.cpp @@ -121,6 +121,18 @@ main(int argc, char * argv[]) printf("\n[x] The script floating-point test cases failed\n"); } } + else if (!strcmp(argv[1], TEST_CASE_PARAMETER_FOR_SCRIPT_VARIABLE_TYPES)) + { + if (TestScriptEngineVariableTypes()) + { + printf("\n[*] The script variable-type test cases passed successfully\n"); + TestResult = TRUE; + } + else + { + printf("\n[x] The script variable-type test cases failed\n"); + } + } else { printf("unknown test case\n"); diff --git a/hyperdbg/hyperdbg-test/code/tests/test-script-variable-types.cpp b/hyperdbg/hyperdbg-test/code/tests/test-script-variable-types.cpp new file mode 100644 index 00000000..fe747042 --- /dev/null +++ b/hyperdbg/hyperdbg-test/code/tests/test-script-variable-types.cpp @@ -0,0 +1,163 @@ +/** + * @file test-script-variable-types.cpp + * @brief Focused parser, IR, and evaluator tests for scalar variable types. + */ +#include "pch.h" + +static std::string CapturedVariableTypeOutput; + +static VOID +CaptureVariableTypeOutput(CHAR * Message) +{ + if (Message) + CapturedVariableTypeOutput.append(Message); +} + +static BOOLEAN +RunVariableTypeScript(const CHAR * Script, const CHAR * ExpectedOutput) +{ + CapturedVariableTypeOutput.clear(); + hyperdbg_u_set_text_message_callback((PVOID)CaptureVariableTypeOutput); + BOOLEAN Result = hyperdbg_u_test_script_engine((CHAR *)Script); + hyperdbg_u_unset_text_message_callback(); + if (!Result || CapturedVariableTypeOutput != ExpectedOutput) + { + std::cerr << "Variable-type script failed: " << Script + << "\nExpected: " << ExpectedOutput + << "\nActual: " << CapturedVariableTypeOutput << std::endl; + PSYMBOL_BUFFER Buffer = (PSYMBOL_BUFFER)ScriptEngineParse((CHAR *)Script); + if (Buffer && !Buffer->Message) + { + for (UINT32 Index = 0; Index < Buffer->Pointer; Index++) + { + std::cerr << Index << ": type=" << Buffer->Head[Index].Type + << " len=" << Buffer->Head[Index].Len + << " value=" << Buffer->Head[Index].Value << std::endl; + } + } + if (Buffer) RemoveSymbolBuffer(Buffer); + return FALSE; + } + return TRUE; +} + +static BOOLEAN +RunVariableTypeScriptExpectFailure(const CHAR * Script) +{ + CapturedVariableTypeOutput.clear(); + hyperdbg_u_set_text_message_callback((PVOID)CaptureVariableTypeOutput); + BOOLEAN Result = hyperdbg_u_test_script_engine((CHAR *)Script); + hyperdbg_u_unset_text_message_callback(); + if (Result) + { + std::cerr << "Variable-type script unexpectedly succeeded: " << Script << std::endl; + return FALSE; + } + return TRUE; +} + +static BOOLEAN +TestVariableTypeIrContract() +{ + if (sizeof(SYMBOL) != sizeof(UINT64) * 3 || + FUNC_CONVERT_FLOAT != 141 || FUNC_CAST_SCALAR != 142 || + FUNC_ADD_TYPED != 143 || FUNC_NEQ_TYPED != 158 || + FUNC_NEG_TYPED != 159 || FUNC_BITWISE_NOT_TYPED != 160 || + FUNC_LOGICAL_NOT_TYPED != 161 || FUNC_POINTER_DIFF != 162 || + SCRIPT_SCALAR_TYPE_INVALID != 0 || SCRIPT_SCALAR_TYPE_BOOL != 1 || + SCRIPT_SCALAR_TYPE_I8 != 2 || SCRIPT_SCALAR_TYPE_I16 != 3 || + SCRIPT_SCALAR_TYPE_I32 != 4 || SCRIPT_SCALAR_TYPE_I64 != 5 || + SCRIPT_SCALAR_TYPE_U8 != 6 || SCRIPT_SCALAR_TYPE_U16 != 7 || + SCRIPT_SCALAR_TYPE_U32 != 8 || SCRIPT_SCALAR_TYPE_U64 != 9 || + SCRIPT_SCALAR_TYPE_F32 != 10 || SCRIPT_SCALAR_TYPE_F64 != 11 || + SCRIPT_SCALAR_TYPE_POINTER != 12 || SCRIPT_SCALAR_TYPE_F80 != 13) + { + std::cerr << "Variable-type serialized IR constants changed unexpectedly" << std::endl; + return FALSE; + } + + CHAR Script[] = "{ unsigned char narrowValue = 0x12345; int value = narrowValue + 1; value %= 4; }"; + PSYMBOL_BUFFER Buffer = (PSYMBOL_BUFFER)ScriptEngineParse(Script); + if (!Buffer || Buffer->Message) + { + std::cerr << "Variable-type IR script did not parse: " + << (Buffer && Buffer->Message ? Buffer->Message : "no buffer") << std::endl; + if (Buffer) RemoveSymbolBuffer(Buffer); + return FALSE; + } + + BOOLEAN SawCast = FALSE; + BOOLEAN SawAdd = FALSE; + BOOLEAN SawModulo = FALSE; + for (UINT32 Index = 0; Index < Buffer->Pointer; Index++) + { + if (Buffer->Head[Index].Type != SYMBOL_SEMANTIC_RULE_TYPE) + continue; + SawCast |= Buffer->Head[Index].Value == FUNC_CAST_SCALAR; + SawAdd |= Buffer->Head[Index].Value == FUNC_ADD_TYPED; + SawModulo |= Buffer->Head[Index].Value == FUNC_MOD_TYPED; + } + RemoveSymbolBuffer(Buffer); + if (!SawCast || !SawAdd || !SawModulo) + { + std::cerr << "Variable-type IR is missing cast/add/modulo: " + << SawCast << "/" << SawAdd << "/" << SawModulo << std::endl; + } + return SawCast && SawAdd && SawModulo; +} + +BOOLEAN +TestScriptEngineVariableTypes() +{ + return TestVariableTypeIrContract() && + RunVariableTypeScript("{ char narrow = 0xff; unsigned char narrowValue = 0x12345; int promoted = narrowValue; printf(\"%lld %lld %lld\\n\", narrow, narrowValue, promoted); }", + "-1 69 69\n") && + RunVariableTypeScript("{ int value = 0n10; value %= 4; long wide = 0n10; wide %= 4; printf(\"%lld %lld\\n\", value, wide); }", + "2 2\n") && + RunVariableTypeScript("{ printf(\"%lld %lld %lld %lld %lld\\n\", sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long)); }", + "1 2 4 8 8\n") && + RunVariableTypeScript("{ printf(\"%lld %lld\\n\", sizeof(!(char)0), sizeof(!(long)0)); }", + "4 4\n") && + RunVariableTypeScript("{ if (sizeof(char) == 1 && (int)1 == 1) { printf(\"boolean type syntax\\n\"); } }", + "boolean type syntax\n") && + RunVariableTypeScript("{ struct Pair { int left; unsigned short right; }; printf(\"%lld\\n\", sizeof(struct Pair)); }", + "8\n") && + RunVariableTypeScript("{ struct NarrowFields { char signedValue; unsigned char unsignedValue; }; struct NarrowFields fields; fields.signedValue = 0xff; fields.unsignedValue = 0x1ff; printf(\"%lld %lld\\n\", fields.signedValue, fields.unsignedValue); }", + "-1 255\n") && + RunVariableTypeScript("{ struct CompoundFields { int signedValue; unsigned char unsignedValue; }; struct CompoundFields fields; fields.signedValue = 0n10; fields.signedValue %= 4; fields.unsignedValue = 0x105; fields.unsignedValue += 0x100; printf(\"%lld %lld\\n\", fields.signedValue, fields.unsignedValue); }", + "2 5\n") && + RunVariableTypeScript("{ char values[2] = {0xff, 0x7f}; printf(\"%lld %lld\\n\", values[0], values[1]); }", + "-1 127\n") && + RunVariableTypeScript("{ typedef unsigned short word; word value = 0x12345; printf(\"%lld %lld\\n\", value, sizeof(word)); }", + "9029 2\n") && + RunVariableTypeScript("{ int probe() { printf(\"evaluated\\n\"); return 1; } printf(\"%lld\\n\", sizeof(probe())); }", + "4\n") && + RunVariableTypeScript("{ int add_to_55(int value) { return 0n55 + value; } result = add_to_55(0n47); printf(\"%lld\\n\", result); }", + "102\n") && + RunVariableTypeScript("{ int typed_factorial(int value) { if (value == 0 || value == 1) { return 1; } return value * typed_factorial(value - 1); } result = typed_factorial(0n10); printf(\"%lld\\n\", result); }", + "3628800\n") && + RunVariableTypeScript("{ source_value = 0n123456; destination_value = 0; memcpy(&destination_value, &source_value, 8); printf(\"%lld\\n\", destination_value); }", + "123456\n") && + RunVariableTypeScript("{ local_value = 0n55; result = &local_value; printf(\"%lld %lld\\n\", sizeof(result), dq(result)); }", + "8 55\n") && + RunVariableTypeScript("{ .global_value = 0n55; result = &(.global_value); printf(\"%lld %lld\\n\", sizeof(result), dq(result)); }", + "8 55\n") && + RunVariableTypeScript("{ char narrow_value = 0x7f; char *narrow_pointer = &narrow_value; printf(\"%lld\\n\", *narrow_pointer); }", + "127\n") && + RunVariableTypeScript("{ int integerValue = (int)(unsigned char)0x12345; double doubleValue = (double)integerValue; long restored = (long)doubleValue; printf(\"%lld %f %lld\\n\", integerValue, doubleValue, restored); }", + "69 69.000000 69\n") && + RunVariableTypeScript("{ char *left = (char *)0xffffffffffffffff; char *right = (char *)0xfffffffffffffff0; if (left > right) { printf(\"%lld %lld 1\\n\", left - right, right - left); } }", + "15 -15 1\n") && + RunVariableTypeScript("{ char *base = (char *)0x1000; char *next = base + 0n2; printf(\"%lld\\n\", next - base); }", + "2\n") && + RunVariableTypeScript("{ if (1 || 1 / 0) { printf(\"or short circuit\\n\"); } if (0 && 1 / 0) { printf(\"unexpected\\n\"); } printf(\"and short circuit\\n\"); }", + "or short circuit\nand short circuit\n") && + RunVariableTypeScript("{ inferred = 0xffffffffffffffff; printf(\"%llu %lld\\n\", inferred, sizeof(inferred)); }", + "18446744073709551615 8\n") && + RunVariableTypeScriptExpectFailure("{ unsigned float invalidValue = 1.0; }") && + RunVariableTypeScriptExpectFailure("{ long double invalidValue = 1.0; }") && + RunVariableTypeScriptExpectFailure("{ long long long invalidValue = 1; }") && + RunVariableTypeScriptExpectFailure("{ local_value = 0n55; unsigned long long explicit_result = &local_value; }") && + RunVariableTypeScriptExpectFailure("{ int value = 1; value = value / 0; }") && + RunVariableTypeScriptExpectFailure("{ unsigned long value = 1; value = value << 0n64; }"); +} diff --git a/hyperdbg/hyperdbg-test/code/tests/test-semantic-scripts.cpp b/hyperdbg/hyperdbg-test/code/tests/test-semantic-scripts.cpp index 368e0227..aa8efa0b 100644 --- a/hyperdbg/hyperdbg-test/code/tests/test-semantic-scripts.cpp +++ b/hyperdbg/hyperdbg-test/code/tests/test-semantic-scripts.cpp @@ -16,6 +16,8 @@ namespace fs = std::filesystem; static std::mutex SemanticOutputMutex; static std::condition_variable SemanticOutputChanged; static std::string SemanticOutput; +static std::set ExpectedSemanticCases; +static std::set ExpectedSemanticMarkers; static VOID CaptureSemanticOutput(CHAR * Message) @@ -49,17 +51,20 @@ HasAllExpectedSemanticOutput(const std::string & Output) SuccessfulCases.insert((UINT32)std::stoul((*Match)[1].str())); } - return SuccessfulCases.size() == 83 && - *SuccessfulCases.begin() == 0 && - *SuccessfulCases.rbegin() == 82 && - Output.find("floating point: 11.500000 0.500000 0.500000 11.000000 0.789000") != std::string::npos && - Output.find("negative floating point: -11.500000 -0.500000 -0.789000 -0.000000") != std::string::npos && - Output.find("runtime negative floating point: -0.789000") != std::string::npos && - Output.find("runtime positive floating point: 0.500000") != std::string::npos && - Output.find("floating arithmetic was successful") != std::string::npos && - Output.find("floating arithmetic: 12.000000 11.000000 3.000000 3.000000") != std::string::npos && - Output.find("double arithmetic: 1.000000 3.500000 5.000000 2.250000") != std::string::npos && - Output.find("mixed and precedence: 1.750000 7.000000 -6.000000") != std::string::npos; + if (SuccessfulCases != ExpectedSemanticCases) + { + return FALSE; + } + + for (const std::string & Marker : ExpectedSemanticMarkers) + { + if (Output.find(Marker) == std::string::npos) + { + return FALSE; + } + } + + return !ExpectedSemanticCases.empty() || !ExpectedSemanticMarkers.empty(); } static BOOLEAN @@ -99,6 +104,12 @@ ReadDirectoryAndTestSemanticTestCases(const CHAR * ScriptSemanticPath) return FALSE; } + ExpectedSemanticCases.clear(); + ExpectedSemanticMarkers.clear(); + + const std::regex CasePattern("test_case([0-9]+)[[:space:]]*=[[:space:]]*1"); + const std::regex MarkerPattern("//[[:space:]]*semantic-test-marker:[[:space:]]*([^\\r\\n]+)"); + for (const auto & FilePath : TestFiles) { std::ifstream File(FilePath, std::ios::binary); @@ -116,6 +127,28 @@ ReadDirectoryAndTestSemanticTestCases(const CHAR * ScriptSemanticPath) return FALSE; } + BOOLEAN HasExpectation = FALSE; + for (std::sregex_iterator Match(Content.begin(), Content.end(), CasePattern), End; + Match != End; + ++Match) + { + ExpectedSemanticCases.insert((UINT32)std::stoul((*Match)[1].str())); + HasExpectation = TRUE; + } + for (std::sregex_iterator Match(Content.begin(), Content.end(), MarkerPattern), End; + Match != End; + ++Match) + { + ExpectedSemanticMarkers.insert((*Match)[1].str()); + HasExpectation = TRUE; + } + if (!HasExpectation) + { + std::cerr << "Semantic file has no enabled numbered case or semantic-test-marker: " + << FilePath.string() << std::endl; + return FALSE; + } + std::cout << "Executing file " << FilePath.filename().string() << std::endl; if (hyperdbg_u_run_command(Content.data()) != 0) { diff --git a/hyperdbg/hyperdbg-test/header/testcases.h b/hyperdbg/hyperdbg-test/header/testcases.h index 823e213b..ccd3e416 100644 --- a/hyperdbg/hyperdbg-test/header/testcases.h +++ b/hyperdbg/hyperdbg-test/header/testcases.h @@ -30,4 +30,5 @@ TestSemanticScripts(); BOOLEAN TestScriptEngineFloatingPoint(); -#define TEST_CASE_PARAMETER_FOR_SCRIPT_FLOATING_POINT "test-script-floating-point" +BOOLEAN +TestScriptEngineVariableTypes(); diff --git a/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj b/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj index 2a9dbf44..8d5bdd34 100644 --- a/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj +++ b/hyperdbg/hyperdbg-test/hyperdbg-test.vcxproj @@ -114,6 +114,7 @@ + diff --git a/hyperdbg/include/SDK/headers/ScriptEngineCommonDefinitions.h b/hyperdbg/include/SDK/headers/ScriptEngineCommonDefinitions.h index 5a28d5d6..774d34d2 100644 --- a/hyperdbg/include/SDK/headers/ScriptEngineCommonDefinitions.h +++ b/hyperdbg/include/SDK/headers/ScriptEngineCommonDefinitions.h @@ -70,6 +70,21 @@ typedef struct ACTION_BUFFER { #define SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL 1 #define SCRIPT_ENGINE_ADDRESS_SPACE_REMOTE 2 +#define SCRIPT_SCALAR_TYPE_INVALID 0 +#define SCRIPT_SCALAR_TYPE_BOOL 1 +#define SCRIPT_SCALAR_TYPE_I8 2 +#define SCRIPT_SCALAR_TYPE_I16 3 +#define SCRIPT_SCALAR_TYPE_I32 4 +#define SCRIPT_SCALAR_TYPE_I64 5 +#define SCRIPT_SCALAR_TYPE_U8 6 +#define SCRIPT_SCALAR_TYPE_U16 7 +#define SCRIPT_SCALAR_TYPE_U32 8 +#define SCRIPT_SCALAR_TYPE_U64 9 +#define SCRIPT_SCALAR_TYPE_F32 10 +#define SCRIPT_SCALAR_TYPE_F64 11 +#define SCRIPT_SCALAR_TYPE_POINTER 12 +#define SCRIPT_SCALAR_TYPE_F80 13 + static const char *const SymbolTypeNames[] = { "SYMBOL_UNDEFINED", "SYMBOL_GLOBAL_ID_TYPE", @@ -243,6 +258,27 @@ static const char *const SymbolTypeNames[] = { #define FUNC_EQUAL_FLOAT 139 #define FUNC_NEQ_FLOAT 140 #define FUNC_CONVERT_FLOAT 141 +#define FUNC_CAST_SCALAR 142 +#define FUNC_ADD_TYPED 143 +#define FUNC_SUB_TYPED 144 +#define FUNC_MUL_TYPED 145 +#define FUNC_DIV_TYPED 146 +#define FUNC_MOD_TYPED 147 +#define FUNC_BITWISE_AND_TYPED 148 +#define FUNC_BITWISE_OR_TYPED 149 +#define FUNC_BITWISE_XOR_TYPED 150 +#define FUNC_SHIFT_LEFT_TYPED 151 +#define FUNC_SHIFT_RIGHT_TYPED 152 +#define FUNC_GT_TYPED 153 +#define FUNC_LT_TYPED 154 +#define FUNC_EGT_TYPED 155 +#define FUNC_ELT_TYPED 156 +#define FUNC_EQUAL_TYPED 157 +#define FUNC_NEQ_TYPED 158 +#define FUNC_NEG_TYPED 159 +#define FUNC_BITWISE_NOT_TYPED 160 +#define FUNC_LOGICAL_NOT_TYPED 161 +#define FUNC_POINTER_DIFF 162 static const char *const FunctionNames[] = { "FUNC_UNDEFINED", @@ -387,6 +423,27 @@ static const char *const FunctionNames[] = { "FUNC_EQUAL_FLOAT", "FUNC_NEQ_FLOAT", "FUNC_CONVERT_FLOAT", +"FUNC_CAST_SCALAR", +"FUNC_ADD_TYPED", +"FUNC_SUB_TYPED", +"FUNC_MUL_TYPED", +"FUNC_DIV_TYPED", +"FUNC_MOD_TYPED", +"FUNC_BITWISE_AND_TYPED", +"FUNC_BITWISE_OR_TYPED", +"FUNC_BITWISE_XOR_TYPED", +"FUNC_SHIFT_LEFT_TYPED", +"FUNC_SHIFT_RIGHT_TYPED", +"FUNC_GT_TYPED", +"FUNC_LT_TYPED", +"FUNC_EGT_TYPED", +"FUNC_ELT_TYPED", +"FUNC_EQUAL_TYPED", +"FUNC_NEQ_TYPED", +"FUNC_NEG_TYPED", +"FUNC_BITWISE_NOT_TYPED", +"FUNC_LOGICAL_NOT_TYPED", +"FUNC_POINTER_DIFF", }; typedef enum REGS_ENUM { diff --git a/hyperdbg/include/config/Definition.h b/hyperdbg/include/config/Definition.h index 1580f1e4..3355172b 100644 --- a/hyperdbg/include/config/Definition.h +++ b/hyperdbg/include/config/Definition.h @@ -93,6 +93,8 @@ * @brief Test case parameter for testing semantic script tests */ #define TEST_CASE_PARAMETER_FOR_SCRIPT_SEMANTIC_TEST_CASES "test-script-semantic-test-cases" +#define TEST_CASE_PARAMETER_FOR_SCRIPT_FLOATING_POINT "test-script-floating-point" +#define TEST_CASE_PARAMETER_FOR_SCRIPT_VARIABLE_TYPES "test-script-variable-types" /** * @brief Test cases file name diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/test.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/test.cpp index ffe824d8..3ea876da 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/test.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/test.cpp @@ -134,6 +134,18 @@ CommandTestAllFunctionalities() return; } + if (!OpenHyperDbgTestProcess(&ThreadHandle, &ProcessHandle, (CHAR *)TEST_CASE_PARAMETER_FOR_SCRIPT_FLOATING_POINT)) + { + ShowMessages("err, start HyperDbg test process for testing floating-point scripts\n"); + return; + } + + if (!OpenHyperDbgTestProcess(&ThreadHandle, &ProcessHandle, (CHAR *)TEST_CASE_PARAMETER_FOR_SCRIPT_VARIABLE_TYPES)) + { + ShowMessages("err, start HyperDbg test process for testing variable-type scripts\n"); + return; + } + // // Test script engine (script parser) using semantic tests // diff --git a/hyperdbg/script-engine/code/common.c b/hyperdbg/script-engine/code/common.c index 8659750d..bb7ba92a 100644 --- a/hyperdbg/script-engine/code/common.c +++ b/hyperdbg/script-engine/code/common.c @@ -56,6 +56,7 @@ NewUnknownToken() Token->VariableMemoryIdx = 0; Token->AddressSpace = 0; Token->IsAddress = FALSE; + Token->IsImplicitType = FALSE; return Token; } @@ -95,6 +96,7 @@ NewToken(SCRIPT_ENGINE_TOKEN_TYPE Type, char * Value) Token->VariableMemoryIdx = 0; Token->AddressSpace = 0; Token->IsAddress = FALSE; + Token->IsImplicitType = FALSE; if (Token->Value == NULL) { @@ -347,6 +349,7 @@ CopyToken(PSCRIPT_ENGINE_TOKEN Token) TokenCopy->VariableMemoryIdx = Token->VariableMemoryIdx; TokenCopy->AddressSpace = Token->AddressSpace; TokenCopy->IsAddress = Token->IsAddress; + TokenCopy->IsImplicitType = Token->IsImplicitType; if (TokenCopy->Value == NULL) { @@ -1295,6 +1298,13 @@ LalrGetTerminalId(PSCRIPT_ENGINE_TOKEN Token) return i; } } + else if (Token->Type == SCRIPT_VARIABLE_TYPE) + { + if (!strcmp("_script_variable_type", LalrTerminalMap[i])) + { + return i; + } + } else if (Token->Type == REGISTER) { if (!strcmp("_register", LalrTerminalMap[i])) diff --git a/hyperdbg/script-engine/code/parse-table.c b/hyperdbg/script-engine/code/parse-table.c index fcf0f424..0e557026 100644 --- a/hyperdbg/script-engine/code/parse-table.c +++ b/hyperdbg/script-engine/code/parse-table.c @@ -296,6 +296,29 @@ const struct _SCRIPT_ENGINE_TOKEN Lhs[RULES_COUNT]= {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, + {NON_TERMINAL, "PAREN_EXPRESSION"}, + {NON_TERMINAL, "PAREN_EXPRESSION"}, + {NON_TERMINAL, "PAREN_EXPRESSION"}, + {NON_TERMINAL, "CAST_TYPE_REST"}, + {NON_TERMINAL, "CAST_TYPE_REST"}, + {NON_TERMINAL, "CAST_TYPE_REST"}, + {NON_TERMINAL, "CAST_POINTERS"}, + {NON_TERMINAL, "CAST_POINTERS"}, + {NON_TERMINAL, "E12"}, + {NON_TERMINAL, "SIZEOF_OPERAND"}, + {NON_TERMINAL, "SIZEOF_OPERAND"}, + {NON_TERMINAL, "SIZEOF_PAREN"}, + {NON_TERMINAL, "SIZEOF_PAREN"}, + {NON_TERMINAL, "SIZEOF_PAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, + {NON_TERMINAL, "SIZEOF_UNPAREN"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "MEMBER_READ_SUFFIX"}, {NON_TERMINAL, "MEMBER_READ_SUFFIX"}, @@ -318,6 +341,7 @@ const struct _SCRIPT_ENGINE_TOKEN Lhs[RULES_COUNT]= {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, + {NON_TERMINAL, "E12"}, {NON_TERMINAL, "STRING"}, {NON_TERMINAL, "WSTRING"}, {NON_TERMINAL, "L_VALUE"}, @@ -425,7 +449,7 @@ const struct _SCRIPT_ENGINE_TOKEN Rhs[RULES_COUNT][MAX_RHS_LEN]= {{EPSILON, "eps"}}, {{SPECIAL_TOKEN, "["},{SEMANTIC_RULE, "@PUSH"},{NON_TERMINAL, "CONST_NUMBER"},{SEMANTIC_RULE, "@STRUCT_ARRAY_DIMENSION"},{SPECIAL_TOKEN, "]"},{NON_TERMINAL, "STRUCT_ARRAY_DIMS"}}, {{EPSILON, "eps"}}, - {{KEYWORD, "typedef"},{NON_TERMINAL, "TYPEDEF_BASE_TYPE"},{NON_TERMINAL, "STRUCT_POINTERS"},{SEMANTIC_RULE, "@PUSH"},{LOCAL_ID, "_local_id"},{SPECIAL_TOKEN, ";"},{SEMANTIC_RULE, "@TYPEDEF_DECLARATION"}}, + {{KEYWORD, "typedef"},{NON_TERMINAL, "TYPEDEF_BASE_TYPE"},{NON_TERMINAL, "STRUCT_POINTERS"},{SEMANTIC_RULE, "@PUSH"},{LOCAL_ID, "_local_id"},{SEMANTIC_RULE, "@TYPEDEF_DECLARATION"},{SPECIAL_TOKEN, ";"}}, {{NON_TERMINAL, "STRUCT_SCALAR_TYPE"}}, {{KEYWORD, "struct"},{SEMANTIC_RULE, "@PUSH"},{LOCAL_ID, "_local_id"}}, {{SPECIAL_TOKEN, "*"},{NON_TERMINAL, "L_VALUE"},{SPECIAL_TOKEN, "="},{NON_TERMINAL, "EXPRESSION"},{SEMANTIC_RULE, "@DEREFERENCE"}}, @@ -629,7 +653,30 @@ const struct _SCRIPT_ENGINE_TOKEN Rhs[RULES_COUNT][MAX_RHS_LEN]= {{KEYWORD, "wcslen"},{SPECIAL_TOKEN, "("},{NON_TERMINAL, "WstringNumber"},{SEMANTIC_RULE, "@WCSLEN"},{SPECIAL_TOKEN, ")"}}, {{KEYWORD, "wcscmp"},{SPECIAL_TOKEN, "("},{NON_TERMINAL, "WstringNumber"},{SPECIAL_TOKEN, ","},{NON_TERMINAL, "WstringNumber"},{SEMANTIC_RULE, "@WCSCMP"},{SPECIAL_TOKEN, ")"}}, {{KEYWORD, "wcsncmp"},{SPECIAL_TOKEN, "("},{NON_TERMINAL, "WstringNumber"},{SPECIAL_TOKEN, ","},{NON_TERMINAL, "WstringNumber"},{SPECIAL_TOKEN, ","},{NON_TERMINAL, "EXPRESSION"},{SEMANTIC_RULE, "@WCSNCMP"},{SPECIAL_TOKEN, ")"}}, - {{SPECIAL_TOKEN, "("},{NON_TERMINAL, "EXPRESSION"},{SPECIAL_TOKEN, ")"}}, + {{SPECIAL_TOKEN, "("},{NON_TERMINAL, "PAREN_EXPRESSION"}}, + {{SEMANTIC_RULE, "@TYPE_NAME_BEGIN"},{NON_TERMINAL, "VARIABLE_TYPE1"},{NON_TERMINAL, "CAST_TYPE_REST"},{SPECIAL_TOKEN, ")"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@CAST_SCALAR"}}, + {{SEMANTIC_RULE, "@TYPE_NAME_BEGIN"},{KEYWORD, "struct"},{SEMANTIC_RULE, "@PUSH"},{LOCAL_ID, "_local_id"},{NON_TERMINAL, "CAST_POINTERS"},{SPECIAL_TOKEN, ")"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@CAST_SCALAR"}}, + {{NON_TERMINAL, "EXPRESSION"},{SPECIAL_TOKEN, ")"}}, + {{NON_TERMINAL, "VARIABLE_TYPE1"},{NON_TERMINAL, "CAST_TYPE_REST"}}, + {{SPECIAL_TOKEN, "*"},{SEMANTIC_RULE, "@DECLARE_POINTER_TYPE"},{NON_TERMINAL, "CAST_POINTERS"}}, + {{EPSILON, "eps"}}, + {{SPECIAL_TOKEN, "*"},{SEMANTIC_RULE, "@DECLARE_POINTER_TYPE"},{NON_TERMINAL, "CAST_POINTERS"}}, + {{EPSILON, "eps"}}, + {{KEYWORD, "sizeof"},{NON_TERMINAL, "SIZEOF_OPERAND"}}, + {{SPECIAL_TOKEN, "("},{NON_TERMINAL, "SIZEOF_PAREN"}}, + {{SEMANTIC_RULE, "@SIZEOF_BEGIN"},{NON_TERMINAL, "SIZEOF_UNPAREN"},{SEMANTIC_RULE, "@SIZEOF_EXPRESSION"}}, + {{SEMANTIC_RULE, "@TYPE_NAME_BEGIN"},{NON_TERMINAL, "VARIABLE_TYPE1"},{NON_TERMINAL, "CAST_TYPE_REST"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@SIZEOF_TYPE"}}, + {{SEMANTIC_RULE, "@TYPE_NAME_BEGIN"},{KEYWORD, "struct"},{SEMANTIC_RULE, "@PUSH"},{LOCAL_ID, "_local_id"},{NON_TERMINAL, "CAST_POINTERS"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@SIZEOF_TYPE"}}, + {{SEMANTIC_RULE, "@SIZEOF_BEGIN"},{NON_TERMINAL, "EXPRESSION"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@SIZEOF_EXPRESSION"}}, + {{NON_TERMINAL, "L_VALUE"},{NON_TERMINAL, "MEMBER_READ_SUFFIX"},{NON_TERMINAL, "ARRAY_DIMS_READ_OPT"}}, + {{NON_TERMINAL, "CONST_NUMBER"}}, + {{SEMANTIC_RULE, "@PUSH"},{PSEUDO_REGISTER, "_pseudo_register"}}, + {{SPECIAL_TOKEN, "-"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@NEG"}}, + {{SPECIAL_TOKEN, "+"},{NON_TERMINAL, "E12"}}, + {{SPECIAL_TOKEN, "~"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@NOT"}}, + {{SPECIAL_TOKEN, "!"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@LOGICAL_NOT_TYPED"}}, + {{SPECIAL_TOKEN, "*"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@POI"}}, + {{SPECIAL_TOKEN, "&"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@REFERENCE"}}, {{NON_TERMINAL, "L_VALUE"},{NON_TERMINAL, "MEMBER_READ_SUFFIX"},{NON_TERMINAL, "ARRAY_DIMS_READ_OPT"}}, {{SPECIAL_TOKEN, "."},{SEMANTIC_RULE, "@PUSH"},{LOCAL_ID, "_local_id"},{SEMANTIC_RULE, "@MEMBER_DOT_READ"},{NON_TERMINAL, "MEMBER_READ_SUFFIX"}}, {{SPECIAL_TOKEN, "->"},{SEMANTIC_RULE, "@PUSH"},{LOCAL_ID, "_local_id"},{SEMANTIC_RULE, "@MEMBER_ARROW_READ"},{NON_TERMINAL, "MEMBER_READ_SUFFIX"}}, @@ -650,6 +697,7 @@ const struct _SCRIPT_ENGINE_TOKEN Rhs[RULES_COUNT][MAX_RHS_LEN]= {{SPECIAL_TOKEN, "-"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@NEG"}}, {{SPECIAL_TOKEN, "+"},{NON_TERMINAL, "E12"}}, {{SPECIAL_TOKEN, "~"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@NOT"}}, + {{SPECIAL_TOKEN, "!"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@LOGICAL_NOT_TYPED"}}, {{SPECIAL_TOKEN, "*"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@POI"}}, {{SPECIAL_TOKEN, "&"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@REFERENCE"}}, {{SEMANTIC_RULE, "@PUSH"},{STRING, "_string"}}, @@ -963,6 +1011,29 @@ const unsigned int RhsSize[RULES_COUNT]= 5, 7, 9, +2, +6, +8, +2, +2, +3, +1, +3, +1, +2, +2, +3, +5, +7, +4, +3, +1, +2, +3, +2, +3, +3, +3, 3, 3, 5, @@ -986,6 +1057,7 @@ const unsigned int RhsSize[RULES_COUNT]= 3, 3, 3, +3, 2, 2, 2, @@ -1003,315 +1075,329 @@ const unsigned int RhsSize[RULES_COUNT]= }; const char* NoneTerminalMap[NONETERMINAL_COUNT]= { -"MEMBER_READ_SUFFIX", -"VA", -"WSTRING", -"MEMBER_LVALUE_SUFFIX", -"ELSIF_STATEMENT", -"CALL_FUNC_STATEMENT", -"MULTIPLE_ASSIGNMENT", -"INC_DEC'", -"STRUCT_DECLARATION_INITIALIZER", -"E4", -"E2", -"ELSE_STATEMENT", -"WstringNumber", -"STRUCT_INITIALIZER_LIST", -"VA3", -"INIT_LIST_CONT", -"ASSIGNMENT_STATEMENT", -"E0'", -"S", -"MULTIPLE_ASSIGNMENT2", -"FOR_STATEMENT", -"StringNumber", -"ARRAY_INIT", -"E3", -"ARRAY_DIMS_WRITE_OPT", -"STATEMENT", -"VARIABLE_TYPE4", -"S2", -"VA2", -"E5'", -"STRUCT_INITIALIZER_LIST2", -"SIMPLE_ASSIGNMENT", -"ARRAY_DIMS2", -"STRUCT_INITIALIZER_ITEM", -"STRUCT_DECLARATOR_LIST2", -"L_VALUE", -"DO_WHILE_STATEMENT", -"TYPEDEF_BASE_TYPE", -"E1", -"ARRAY_DIMS_READ_OPT", -"VARIABLE_TYPE6", -"INIT_ITEM", -"IF_STATEMENT", -"STRUCT_ARRAY_DIMS", -"VARIABLE_TYPE3", -"E4'", -"E3'", -"VARIABLE_TYPE5", -"STRUCT_DECLARATION2", -"ARRAY_DIMS_READ2", -"INIT_LIST_TAIL", -"ARRAY_DIMS_WRITE2", -"STRUCT_DEFINITION_TAIL", -"STRUCT_MEMBER_LIST", -"INIT_LIST", -"BOOLEAN_EXPRESSION", -"ARRAY_DIMS_READ", -"STRUCT_SCALAR_TYPE", -"VARIABLE_TYPE2", "ARRAY_DIMS", -"ELSIF_STATEMENT'", -"STRUCT_DECLARATOR_LIST", -"WHILE_STATEMENT", -"STRUCT_SCALAR_TYPE2", -"STRUCT_DECLARATOR", -"TYPEDEF_DECLARATION", -"CONST_NUMBER", -"STRUCT_DECLARATION", -"STRUCT_POINTERS", -"END_OF_IF", -"E5", +"ARRAY_DIMS2", +"ARRAY_DIMS_READ", +"ARRAY_DIMS_READ2", +"ARRAY_DIMS_READ_OPT", +"ARRAY_DIMS_WRITE", +"ARRAY_DIMS_WRITE2", +"ARRAY_DIMS_WRITE_OPT", +"ARRAY_INIT", +"ASSIGNMENT_STATEMENT", "ASSIGNMENT_STATEMENT'", -"RETURN", -"STRUCT_MEMBER_TYPE", +"BOOLEAN_EXPRESSION", +"CALL_FUNC_STATEMENT", +"CAST_POINTERS", +"CAST_TYPE_REST", +"CONST_NUMBER", +"DO_WHILE_STATEMENT", +"E0'", +"E1", "E1'", -"STATEMENT2", -"STRUCT_DECLARATION_END", -"E2'", -"EXPRESSION", -"STRUCT_MEMBER", "E12", +"E2", +"E2'", +"E3", +"E3'", +"E4", +"E4'", +"E5", +"E5'", +"ELSE_STATEMENT", +"ELSIF_STATEMENT", +"ELSIF_STATEMENT'", +"END_OF_IF", +"EXPRESSION", +"FOR_STATEMENT", +"IF_STATEMENT", "INC_DEC", -"VARIABLE_TYPE1", +"INC_DEC'", +"INIT_ITEM", +"INIT_LIST", +"INIT_LIST_CONT", +"INIT_LIST_TAIL", +"L_VALUE", +"MEMBER_LVALUE_SUFFIX", +"MEMBER_READ_SUFFIX", +"MULTIPLE_ASSIGNMENT", +"MULTIPLE_ASSIGNMENT2", +"PAREN_EXPRESSION", +"RETURN", +"S", +"S2", +"SIMPLE_ASSIGNMENT", +"SIZEOF_OPERAND", +"SIZEOF_PAREN", +"SIZEOF_UNPAREN", +"STATEMENT", +"STATEMENT2", "STRING", -"ARRAY_DIMS_WRITE" +"STRUCT_ARRAY_DIMS", +"STRUCT_DECLARATION", +"STRUCT_DECLARATION2", +"STRUCT_DECLARATION_END", +"STRUCT_DECLARATION_INITIALIZER", +"STRUCT_DECLARATOR", +"STRUCT_DECLARATOR_LIST", +"STRUCT_DECLARATOR_LIST2", +"STRUCT_DEFINITION_TAIL", +"STRUCT_INITIALIZER_ITEM", +"STRUCT_INITIALIZER_LIST", +"STRUCT_INITIALIZER_LIST2", +"STRUCT_MEMBER", +"STRUCT_MEMBER_LIST", +"STRUCT_MEMBER_TYPE", +"STRUCT_POINTERS", +"STRUCT_SCALAR_TYPE", +"STRUCT_SCALAR_TYPE2", +"StringNumber", +"TYPEDEF_BASE_TYPE", +"TYPEDEF_DECLARATION", +"VA", +"VA2", +"VA3", +"VARIABLE_TYPE1", +"VARIABLE_TYPE2", +"VARIABLE_TYPE3", +"VARIABLE_TYPE4", +"VARIABLE_TYPE5", +"VARIABLE_TYPE6", +"WHILE_STATEMENT", +"WSTRING", +"WstringNumber" }; const char* TerminalMap[TERMINAL_COUNT]= { -"dd_pa", -"return", -"memcpy", -";", -"~", -"/=", -"eb_pa", -"eq_pa", -"event_trace_instrumentation_step_in", -"ed_pa", -"++", -"test_statement", -"rdtscp", -"lbr_dump", -"interlocked_exchange", -"+=", -"poi", -"&", -"%=", -"/", -"event_inject_error_code", -">>=", -"lbr_check", -"_script_variable_type", -"strlen", -"*=", -"spinlock_unlock", -"wcsncmp", -"reference", -"do", -"_function_id", -"disassemble_len", -"continue", -"_wstring", -"poi_pa", -"_float", -"spinlock_lock_custom_wait", -"}", -"_binary", -"check_address", -">>", -"_hex", -"|=", -"event_trace_step", -"_register", -"|", +"!", +"#include", "$", -"dq_pa", -"wcslen", -"if", -"disassemble_len32", -"memcpy_pa", +"%", +"%=", +"&", +"&=", +"(", +")", "*", -"lbr_restore", -"<<=", -"event_trace_instrumentation_step", -"hi_pa", -"struct", -"event_trace_step_out", -"interlocked_compare_exchange", -"spinlock_lock", -"elsif", -"rdtsc", -"{", +"*=", +"+", +"++", +"+=", +",", "-", "--", -"_decimal", -"event_clear", -"]", -"&=", -"%", -"^", -")", -"db_pa", -"dw", -"eq", -"printf", -"interlocked_exchange_add", -"memcmp", +"-=", +"->", +".", +"/", +"/=", +";", +"<<", +"<<=", +"=", +">>", +">>=", "[", -"pause", -"event_enable", +"]", +"^", +"^=", +"_binary", +"_decimal", +"_float", +"_function_id", +"_function_parameter_id", "_global_id", -"strncmp", -"lbr_save", -"lbr_print", -"(", -"hi", -"while", +"_hex", +"_local_id", +"_octal", +"_pseudo_register", +"_register", +"_script_variable_type", +"_string", +"_wstring", +"break", +"check_address", +"continue", +"db", +"db_pa", +"dd", +"dd_pa", +"disassemble_len", +"disassemble_len32", +"disassemble_len64", +"do", +"dq", +"dq_pa", +"dw", +"dw_pa", +"eb", +"eb_pa", "ed", +"ed_pa", +"else", +"elsif", +"eq", +"eq_pa", +"event_clear", +"event_disable", +"event_enable", +"event_inject", +"event_inject_error_code", +"event_sc", +"event_trace_instrumentation_step", +"event_trace_instrumentation_step_in", +"event_trace_step", +"event_trace_step_in", +"event_trace_step_out", +"flush", +"for", +"formats", +"hi", +"hi_pa", +"if", +"interlocked_compare_exchange", +"interlocked_decrement", +"interlocked_exchange", +"interlocked_exchange_add", "interlocked_increment", +"lbr_check", +"lbr_dump", +"lbr_print", +"lbr_restore", +"lbr_restore_by_filter", +"lbr_save", +"low", +"low_pa", +"memcmp", +"memcpy", +"memcpy_pa", +"microsleep", +"neg", +"not", +"pause", +"physical_to_virtual", +"poi", +"poi_pa", +"print", +"printf", +"rdtsc", +"rdtscp", +"reference", +"return", +"sizeof", +"spinlock_lock", +"spinlock_lock_custom_wait", +"spinlock_unlock", +"strcmp", +"strlen", +"strncmp", +"struct", +"test_statement", "typedef", "virtual_to_physical", -"-=", -",", -"->", -"low", -"dw_pa", -"microsleep", -"print", -"flush", -"not", -"_pseudo_register", -"dq", -"event_trace_step_in", -"event_sc", -"_string", -"+", -".", -"_function_parameter_id", -"_octal", "wcscmp", -"interlocked_decrement", -"strcmp", -"break", -"formats", -"^=", -"disassemble_len64", -"event_disable", -"event_inject", -"eb", -"else", -"neg", -"#include", -"dd", -"low_pa", -"physical_to_virtual", -"<<", -"for", -"lbr_restore_by_filter", -"db", -"=", -"_local_id" +"wcslen", +"wcsncmp", +"while", +"{", +"|", +"|=", +"}", +"~" }; const int ParseTable[NONETERMINAL_COUNT][TERMINAL_COUNT]= { - {2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,298 ,298 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,296 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,189 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,188 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,318 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 }, - {192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,2147483648 ,192 ,192 ,2147483648 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,191 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,2147483648 ,192 }, - {165 ,2147483648 ,185 ,2147483648 ,2147483648 ,2147483648 ,174 ,176 ,133 ,175 ,2147483648 ,121 ,135 ,137 ,172 ,2147483648 ,143 ,2147483648 ,2147483648 ,2147483648 ,184 ,2147483648 ,140 ,2147483648 ,178 ,2147483648 ,123 ,187 ,158 ,2147483648 ,2147483648 ,153 ,2147483648 ,2147483648 ,161 ,2147483648 ,141 ,2147483648 ,2147483648 ,152 ,2147483648 ,2147483648 ,2147483648 ,129 ,2147483648 ,2147483648 ,2147483648 ,167 ,182 ,2147483648 ,154 ,186 ,2147483648 ,139 ,2147483648 ,132 ,162 ,2147483648 ,131 ,177 ,122 ,2147483648 ,134 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,164 ,146 ,171 ,126 ,173 ,180 ,2147483648 ,127 ,118 ,2147483648 ,181 ,136 ,138 ,2147483648 ,149 ,2147483648 ,169 ,156 ,2147483648 ,160 ,2147483648 ,2147483648 ,2147483648 ,150 ,166 ,125 ,116 ,128 ,151 ,2147483648 ,147 ,130 ,124 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,183 ,157 ,179 ,2147483648 ,117 ,2147483648 ,155 ,119 ,142 ,170 ,2147483648 ,148 ,2147483648 ,145 ,163 ,159 ,2147483648 ,2147483648 ,168 ,144 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,220 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,217 ,2147483648 ,210 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,204 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,207 ,2147483648 ,2147483648 ,211 ,2147483648 ,2147483648 ,213 ,2147483648 ,2147483648 ,2147483648 ,209 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,216 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,212 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,205 ,2147483648 ,2147483648 ,2147483648 ,214 ,2147483648 ,2147483648 ,217 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,215 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,206 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,236 ,236 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 }, - {229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,229 ,229 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 }, - {195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,2147483648 ,195 ,195 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,194 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,2147483648 ,195 }, - {329 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,329 ,329 ,2147483648 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,329 ,329 ,2147483648 ,330 ,329 ,329 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,329 ,2147483648 ,329 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,329 ,329 ,329 ,2147483648 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,329 ,329 ,329 ,329 ,329 ,2147483648 ,329 ,329 ,2147483648 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,329 ,329 ,329 ,329 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,329 ,2147483648 ,329 ,2147483648 ,329 ,329 ,329 ,2147483648 ,2147483648 ,329 ,329 ,2147483648 ,329 }, - {67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,68 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,67 ,67 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,325 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,51 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,50 ,50 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 }, - {2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,224 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 }, - {0 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,2147483648 ,0 ,2 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,2147483648 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,1 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,0 ,0 ,0 ,2147483648 ,0 }, - {2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,221 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,199 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {327 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,327 ,327 ,327 ,327 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,327 ,327 ,327 ,2147483648 ,2147483648 ,328 ,327 ,2147483648 ,327 ,327 ,327 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,327 ,327 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,232 ,232 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 }, - {9 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,2147483648 ,9 ,12 ,9 ,2147483648 ,9 ,9 ,9 ,5 ,8 ,9 ,11 ,2147483648 ,9 ,2147483648 ,9 ,2147483648 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,7 ,2147483648 ,2147483648 ,9 ,9 ,3 ,9 ,9 ,7 ,9 ,2147483648 ,9 ,9 ,13 ,9 ,9 ,9 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,9 ,7 ,9 ,9 ,9 ,2147483648 ,9 ,4 ,9 ,9 ,14 ,9 ,2147483648 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,9 ,9 ,2147483648 ,2147483648 ,2147483648 ,7 ,2147483648 ,9 ,9 ,9 ,10 ,9 ,2147483648 ,9 ,9 ,9 ,9 ,2147483648 ,9 ,15 ,9 ,9 ,9 ,2147483648 ,6 ,9 ,9 ,2147483648 ,7 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,39 ,2147483648 }, - {16 ,16 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,16 ,18 ,2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,17 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 }, - {324 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,323 ,324 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,324 ,324 ,324 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,324 ,324 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,324 ,324 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 }, - {2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,241 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,243 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,242 ,244 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,200 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,43 ,2147483648 }, - {71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,72 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,71 ,71 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 }, - {2147483648 ,2147483648 ,2147483648 ,83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,83 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,319 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,322 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,320 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,198 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,226 ,226 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 }, - {2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,301 ,301 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,300 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,46 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,47 ,47 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,238 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,239 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,237 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,235 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,234 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,60 }, - {2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,304 ,304 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,303 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,62 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,45 ,45 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 }, - {2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,302 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,2147483648 ,193 ,193 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,2147483648 ,193 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,81 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,197 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,85 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,309 ,2147483648 ,2147483648 ,308 ,2147483648 ,2147483648 ,305 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,306 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,307 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 }, - {196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,2147483648 ,196 ,196 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,2147483648 ,196 }, - {240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,240 ,240 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,106 ,2147483648 ,2147483648 ,110 ,2147483648 ,2147483648 ,112 ,2147483648 ,2147483648 ,2147483648 ,108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,104 ,2147483648 ,2147483648 ,2147483648 ,113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,105 ,2147483648 }, - {33 ,2147483648 ,2147483648 ,32 ,33 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,33 ,33 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,227 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 }, - {25 ,31 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,2147483648 ,25 ,28 ,25 ,2147483648 ,25 ,25 ,25 ,21 ,24 ,25 ,27 ,2147483648 ,25 ,2147483648 ,25 ,2147483648 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,23 ,2147483648 ,2147483648 ,25 ,25 ,19 ,25 ,25 ,23 ,25 ,2147483648 ,25 ,25 ,29 ,25 ,25 ,25 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,25 ,25 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,25 ,23 ,25 ,25 ,25 ,2147483648 ,25 ,20 ,25 ,25 ,30 ,25 ,2147483648 ,2147483648 ,2147483648 ,25 ,25 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,25 ,25 ,2147483648 ,2147483648 ,2147483648 ,23 ,2147483648 ,25 ,25 ,25 ,26 ,25 ,2147483648 ,25 ,25 ,25 ,25 ,2147483648 ,25 ,2147483648 ,25 ,25 ,25 ,2147483648 ,22 ,25 ,25 ,2147483648 ,23 }, - {2147483648 ,2147483648 ,2147483648 ,63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,64 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,230 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,231 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 }, - {223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,223 ,223 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {274 ,2147483648 ,2147483648 ,2147483648 ,314 ,2147483648 ,283 ,285 ,2147483648 ,284 ,2147483648 ,2147483648 ,246 ,248 ,281 ,2147483648 ,252 ,316 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,251 ,2147483648 ,287 ,2147483648 ,2147483648 ,293 ,267 ,2147483648 ,299 ,262 ,2147483648 ,2147483648 ,270 ,310 ,2147483648 ,2147483648 ,310 ,261 ,2147483648 ,310 ,2147483648 ,2147483648 ,295 ,2147483648 ,2147483648 ,276 ,291 ,2147483648 ,263 ,2147483648 ,315 ,250 ,2147483648 ,2147483648 ,271 ,2147483648 ,2147483648 ,286 ,2147483648 ,2147483648 ,245 ,2147483648 ,312 ,2147483648 ,310 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,273 ,255 ,280 ,2147483648 ,282 ,289 ,2147483648 ,2147483648 ,2147483648 ,295 ,290 ,247 ,249 ,294 ,258 ,2147483648 ,278 ,265 ,2147483648 ,269 ,2147483648 ,2147483648 ,2147483648 ,259 ,275 ,2147483648 ,2147483648 ,2147483648 ,260 ,311 ,256 ,2147483648 ,2147483648 ,2147483648 ,313 ,2147483648 ,295 ,310 ,292 ,266 ,288 ,2147483648 ,2147483648 ,2147483648 ,264 ,2147483648 ,2147483648 ,279 ,2147483648 ,257 ,2147483648 ,254 ,272 ,268 ,2147483648 ,2147483648 ,277 ,253 ,2147483648 ,295 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,317 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 } + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,43 ,2147483648 ,2147483648 ,42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,325 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,327 ,2147483648 ,2147483648 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,327 ,2147483648 ,327 ,327 ,2147483648 ,326 ,327 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,327 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,324 ,2147483648 ,2147483648 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,324 ,2147483648 ,324 ,324 ,2147483648 ,323 ,324 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,324 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,102 ,102 ,2147483648 ,2147483648 ,102 ,102 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,102 ,102 ,2147483648 ,102 ,101 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,102 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,99 ,99 ,2147483648 ,2147483648 ,99 ,99 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,99 ,99 ,2147483648 ,99 ,98 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,94 ,94 ,2147483648 ,94 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,110 ,2147483648 ,113 ,2147483648 ,2147483648 ,2147483648 ,108 ,2147483648 ,103 ,106 ,2147483648 ,2147483648 ,104 ,107 ,2147483648 ,2147483648 ,2147483648 ,109 ,2147483648 ,2147483648 ,111 ,105 ,2147483648 ,112 ,2147483648 ,2147483648 ,2147483648 ,114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,115 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,152 ,2147483648 ,144 ,164 ,145 ,165 ,153 ,154 ,155 ,2147483648 ,147 ,167 ,146 ,166 ,170 ,174 ,169 ,175 ,2147483648 ,2147483648 ,171 ,176 ,120 ,119 ,118 ,142 ,184 ,124 ,132 ,133 ,129 ,130 ,131 ,128 ,2147483648 ,117 ,149 ,162 ,2147483648 ,177 ,157 ,172 ,173 ,156 ,140 ,137 ,138 ,139 ,168 ,136 ,150 ,163 ,180 ,185 ,186 ,125 ,148 ,151 ,127 ,159 ,143 ,161 ,116 ,126 ,134 ,135 ,158 ,2147483648 ,2147483648 ,122 ,141 ,123 ,179 ,178 ,181 ,2147483648 ,121 ,2147483648 ,160 ,183 ,182 ,187 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,302 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,300 ,299 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,331 ,329 ,332 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,330 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,198 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,224 ,2147483648 ,225 ,2147483648 }, + {226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,2147483648 ,226 ,226 ,226 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,226 ,226 ,226 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,228 ,227 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,228 ,2147483648 }, + {338 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,340 ,2147483648 ,294 ,2147483648 ,339 ,2147483648 ,336 ,2147483648 ,2147483648 ,2147483648 ,335 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,333 ,333 ,333 ,322 ,318 ,318 ,333 ,318 ,333 ,334 ,318 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,261 ,2147483648 ,253 ,273 ,254 ,274 ,262 ,263 ,264 ,2147483648 ,256 ,276 ,255 ,275 ,279 ,283 ,278 ,284 ,2147483648 ,2147483648 ,280 ,285 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,258 ,271 ,2147483648 ,286 ,266 ,281 ,282 ,265 ,251 ,248 ,249 ,250 ,277 ,247 ,259 ,272 ,289 ,2147483648 ,2147483648 ,2147483648 ,257 ,260 ,2147483648 ,268 ,252 ,270 ,2147483648 ,2147483648 ,245 ,246 ,267 ,2147483648 ,303 ,2147483648 ,2147483648 ,2147483648 ,288 ,287 ,290 ,2147483648 ,2147483648 ,2147483648 ,269 ,292 ,291 ,293 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,337 }, + {229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,2147483648 ,229 ,229 ,229 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,229 ,229 ,229 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,229 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,230 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,231 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,231 ,2147483648 }, + {232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,2147483648 ,232 ,232 ,232 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,232 ,232 ,232 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,232 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,234 ,2147483648 ,235 ,233 ,2147483648 ,2147483648 ,235 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,235 ,2147483648 ,235 ,2147483648 }, + {236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,2147483648 ,236 ,236 ,236 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,236 ,236 ,236 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,236 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,237 ,2147483648 ,2147483648 ,239 ,238 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,239 ,2147483648 ,239 ,239 ,2147483648 ,2147483648 ,239 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,239 ,2147483648 }, + {240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,2147483648 ,240 ,240 ,240 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,240 ,240 ,240 ,240 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 }, + {2147483648 ,2147483648 ,2147483648 ,242 ,2147483648 ,244 ,2147483648 ,2147483648 ,244 ,243 ,2147483648 ,244 ,2147483648 ,2147483648 ,244 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,241 ,2147483648 ,244 ,244 ,2147483648 ,244 ,244 ,2147483648 ,2147483648 ,244 ,244 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,244 ,2147483648 }, + {2147483648 ,195 ,195 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,195 ,195 ,195 ,2147483648 ,195 ,2147483648 ,2147483648 ,195 ,195 ,2147483648 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,194 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,195 ,2147483648 ,2147483648 ,195 ,2147483648 }, + {2147483648 ,192 ,192 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,192 ,192 ,192 ,2147483648 ,192 ,2147483648 ,2147483648 ,192 ,192 ,2147483648 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,191 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,192 ,2147483648 ,2147483648 ,192 ,2147483648 }, + {2147483648 ,193 ,193 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,193 ,193 ,193 ,2147483648 ,193 ,2147483648 ,2147483648 ,193 ,193 ,2147483648 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,193 ,2147483648 ,2147483648 ,193 ,2147483648 }, + {2147483648 ,196 ,196 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,196 ,196 ,196 ,2147483648 ,196 ,2147483648 ,2147483648 ,196 ,196 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,196 ,2147483648 ,2147483648 ,196 ,2147483648 }, + {223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,2147483648 ,223 ,223 ,223 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,223 ,223 ,223 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,223 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,199 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,203 ,2147483648 ,203 ,2147483648 ,2147483648 ,203 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,211 ,2147483648 ,214 ,2147483648 ,217 ,2147483648 ,209 ,2147483648 ,204 ,207 ,2147483648 ,2147483648 ,205 ,208 ,2147483648 ,2147483648 ,2147483648 ,210 ,217 ,2147483648 ,212 ,206 ,2147483648 ,213 ,2147483648 ,2147483648 ,2147483648 ,215 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,216 ,2147483648 ,2147483648 }, + {47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,2147483648 ,47 ,47 ,47 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,2147483648 ,2147483648 ,2147483648 ,47 ,47 ,47 ,47 ,2147483648 ,46 ,2147483648 ,2147483648 ,2147483648 ,47 }, + {45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,2147483648 ,45 ,45 ,45 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 ,45 ,45 ,45 ,2147483648 ,45 ,2147483648 ,2147483648 ,2147483648 ,45 }, + {50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,2147483648 ,50 ,50 ,50 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,2147483648 ,2147483648 ,2147483648 ,50 ,50 ,50 ,50 ,2147483648 ,50 ,2147483648 ,2147483648 ,51 ,50 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,49 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,346 ,343 ,2147483648 ,344 ,2147483648 ,2147483648 ,345 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,97 ,97 ,2147483648 ,2147483648 ,97 ,97 ,96 ,95 ,2147483648 ,97 ,2147483648 ,2147483648 ,97 ,97 ,2147483648 ,97 ,97 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,321 ,2147483648 ,2147483648 ,321 ,321 ,2147483648 ,321 ,2147483648 ,2147483648 ,321 ,321 ,2147483648 ,2147483648 ,320 ,319 ,321 ,2147483648 ,321 ,321 ,2147483648 ,321 ,321 ,2147483648 ,321 ,321 ,321 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,321 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,220 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,221 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,297 ,2147483648 ,297 ,2147483648 ,297 ,2147483648 ,297 ,2147483648 ,2147483648 ,2147483648 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,295 ,2147483648 ,2147483648 ,2147483648 ,297 ,2147483648 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,2147483648 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,2147483648 ,2147483648 ,297 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,297 ,297 ,2147483648 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,297 ,2147483648 ,2147483648 ,2147483648 ,297 ,297 ,2147483648 ,297 ,297 ,297 ,2147483648 ,2147483648 ,297 ,297 ,297 ,2147483648 ,297 ,2147483648 ,2147483648 ,2147483648 ,297 ,297 ,297 ,296 ,2147483648 ,2147483648 ,297 ,297 ,297 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,297 }, + {33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,2147483648 ,33 ,33 ,33 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,33 ,33 ,33 ,33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,33 }, + {2147483648 ,0 ,2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,0 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,0 ,0 ,0 ,2147483648 ,0 ,2147483648 ,2147483648 ,0 ,0 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2147483648 ,2147483648 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,2147483648 ,2147483648 ,2 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,16 ,16 ,16 ,2147483648 ,16 ,2147483648 ,2147483648 ,16 ,16 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,2147483648 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,16 ,17 ,2147483648 ,2147483648 ,18 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,201 ,201 ,2147483648 ,201 ,2147483648 ,2147483648 ,201 ,200 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {305 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,305 ,2147483648 ,304 ,2147483648 ,305 ,2147483648 ,305 ,2147483648 ,2147483648 ,2147483648 ,305 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,305 ,305 ,305 ,2147483648 ,305 ,305 ,305 ,305 ,305 ,305 ,305 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,305 }, + {308 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,308 ,2147483648 ,308 ,2147483648 ,308 ,2147483648 ,308 ,2147483648 ,2147483648 ,2147483648 ,308 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,306 ,2147483648 ,2147483648 ,2147483648 ,308 ,2147483648 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,2147483648 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,2147483648 ,2147483648 ,308 ,308 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,308 ,308 ,2147483648 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,308 ,2147483648 ,2147483648 ,2147483648 ,308 ,308 ,2147483648 ,308 ,308 ,308 ,2147483648 ,2147483648 ,308 ,308 ,308 ,2147483648 ,308 ,2147483648 ,2147483648 ,2147483648 ,308 ,308 ,308 ,307 ,2147483648 ,2147483648 ,308 ,308 ,308 ,308 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,308 }, + {315 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,317 ,2147483648 ,2147483648 ,2147483648 ,316 ,2147483648 ,313 ,2147483648 ,2147483648 ,2147483648 ,312 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,310 ,310 ,310 ,2147483648 ,309 ,309 ,310 ,309 ,310 ,311 ,309 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,314 }, + {2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,8 ,7 ,7 ,2147483648 ,7 ,2147483648 ,2147483648 ,7 ,12 ,2147483648 ,2147483648 ,10 ,9 ,11 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,5 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,6 ,9 ,9 ,9 ,3 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,2147483648 ,2147483648 ,9 ,9 ,9 ,9 ,9 ,9 ,13 ,9 ,14 ,9 ,9 ,9 ,9 ,4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,24 ,23 ,23 ,2147483648 ,23 ,2147483648 ,2147483648 ,23 ,28 ,2147483648 ,2147483648 ,26 ,25 ,27 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,21 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,2147483648 ,2147483648 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,22 ,25 ,25 ,25 ,19 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,25 ,31 ,2147483648 ,25 ,25 ,25 ,25 ,25 ,25 ,29 ,25 ,30 ,25 ,25 ,25 ,25 ,20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,341 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,63 ,2147483648 ,2147483648 ,64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,83 ,2147483648 ,2147483648 ,83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,2147483648 ,71 ,71 ,71 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,2147483648 ,2147483648 ,2147483648 ,71 ,71 ,71 ,71 ,2147483648 ,72 ,2147483648 ,2147483648 ,2147483648 ,71 }, + {67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,2147483648 ,67 ,67 ,67 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,2147483648 ,2147483648 ,2147483648 ,67 ,67 ,67 ,67 ,2147483648 ,67 ,2147483648 ,2147483648 ,68 ,67 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,70 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,74 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,80 ,2147483648 ,2147483648 ,2147483648 ,79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {351 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,351 ,2147483648 ,351 ,2147483648 ,351 ,2147483648 ,351 ,2147483648 ,2147483648 ,2147483648 ,351 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,2147483648 ,352 ,2147483648 ,2147483648 ,351 ,2147483648 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,2147483648 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,2147483648 ,2147483648 ,351 ,351 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,351 ,351 ,2147483648 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,351 ,2147483648 ,2147483648 ,2147483648 ,351 ,351 ,2147483648 ,351 ,351 ,351 ,2147483648 ,2147483648 ,351 ,351 ,351 ,2147483648 ,351 ,2147483648 ,2147483648 ,2147483648 ,351 ,351 ,351 ,2147483648 ,2147483648 ,2147483648 ,351 ,351 ,351 ,351 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,351 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,189 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,188 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {348 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,348 ,2147483648 ,348 ,347 ,348 ,2147483648 ,348 ,2147483648 ,2147483648 ,2147483648 ,348 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,348 ,2147483648 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,2147483648 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,2147483648 ,2147483648 ,348 ,348 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,348 ,348 ,2147483648 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,348 ,2147483648 ,2147483648 ,2147483648 ,348 ,348 ,2147483648 ,348 ,348 ,348 ,2147483648 ,2147483648 ,348 ,348 ,348 ,2147483648 ,348 ,2147483648 ,2147483648 ,2147483648 ,348 ,348 ,348 ,2147483648 ,2147483648 ,2147483648 ,348 ,348 ,348 ,348 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,348 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,350 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,349 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,37 ,37 ,2147483648 ,37 ,2147483648 ,2147483648 ,37 ,35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,39 ,2147483648 ,2147483648 ,40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,197 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,342 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {353 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,353 ,2147483648 ,353 ,2147483648 ,353 ,2147483648 ,353 ,2147483648 ,2147483648 ,2147483648 ,353 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,2147483648 ,2147483648 ,354 ,2147483648 ,353 ,2147483648 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,2147483648 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,2147483648 ,2147483648 ,353 ,353 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,353 ,353 ,2147483648 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,353 ,2147483648 ,2147483648 ,2147483648 ,353 ,353 ,2147483648 ,353 ,353 ,353 ,2147483648 ,2147483648 ,353 ,353 ,353 ,2147483648 ,353 ,2147483648 ,2147483648 ,2147483648 ,353 ,353 ,353 ,2147483648 ,2147483648 ,2147483648 ,353 ,353 ,353 ,353 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,353 } }; const char* KeywordList[]= { "print", @@ -1644,6 +1730,16 @@ const SYMBOL_MAP SemanticRulesMapList[]= { {"@EQUAL_FLOAT", FUNC_EQUAL_FLOAT}, {"@NEQ_FLOAT", FUNC_NEQ_FLOAT}, {"@CONVERT_FLOAT", FUNC_CONVERT_FLOAT}, +{"@CAST_SCALAR", FUNC_CAST_SCALAR}, +{"@TYPE_NAME_BEGIN", FUNC_UNDEFINED}, +{"@SIZEOF_BEGIN", FUNC_UNDEFINED}, +{"@SIZEOF_TYPE", FUNC_UNDEFINED}, +{"@SIZEOF_EXPRESSION", FUNC_UNDEFINED}, +{"@LOGICAL_NOT_TYPED", FUNC_LOGICAL_NOT_TYPED}, +{"@LOGICAL_OR_BEGIN", FUNC_UNDEFINED}, +{"@LOGICAL_OR_END", FUNC_UNDEFINED}, +{"@LOGICAL_AND_BEGIN", FUNC_UNDEFINED}, +{"@LOGICAL_AND_END", FUNC_UNDEFINED}, {"@PRINT", FUNC_PRINT}, {"@FORMATS", FUNC_FORMATS}, {"@EVENT_ENABLE", FUNC_EVENT_ENABLE}, @@ -1934,8 +2030,10 @@ const struct _SCRIPT_ENGINE_TOKEN LalrLhs[RULES_COUNT]= {NON_TERMINAL, "BE"}, {NON_TERMINAL, "B1"}, {NON_TERMINAL, "B1"}, + {NON_TERMINAL, "LOGICAL_OR_BEGIN"}, {NON_TERMINAL, "B2"}, {NON_TERMINAL, "B2"}, + {NON_TERMINAL, "LOGICAL_AND_BEGIN"}, {NON_TERMINAL, "B3"}, {NON_TERMINAL, "B3"}, {NON_TERMINAL, "B4"}, @@ -1967,6 +2065,8 @@ const struct _SCRIPT_ENGINE_TOKEN LalrLhs[RULES_COUNT]= {NON_TERMINAL, "E10"}, {NON_TERMINAL, "E10"}, {NON_TERMINAL, "E10"}, + {NON_TERMINAL, "E10"}, + {NON_TERMINAL, "E10"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, @@ -2034,6 +2134,22 @@ const struct _SCRIPT_ENGINE_TOKEN LalrLhs[RULES_COUNT]= {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, {NON_TERMINAL, "E12"}, + {NON_TERMINAL, "CAST_OR_BOOLEAN"}, + {NON_TERMINAL, "CAST_OR_BOOLEAN"}, + {NON_TERMINAL, "CAST_OR_BOOLEAN"}, + {NON_TERMINAL, "CAST_TYPE"}, + {NON_TERMINAL, "CAST_TYPE_REST"}, + {NON_TERMINAL, "CAST_TYPE_REST"}, + {NON_TERMINAL, "CAST_TYPE_REST"}, + {NON_TERMINAL, "CAST_POINTERS"}, + {NON_TERMINAL, "CAST_POINTERS"}, + {NON_TERMINAL, "STRUCT_CAST_TYPE"}, + {NON_TERMINAL, "SIZEOF_BEGIN"}, + {NON_TERMINAL, "SIZEOF_VALUE"}, + {NON_TERMINAL, "SIZEOF_VALUE"}, + {NON_TERMINAL, "SIZEOF_PAREN"}, + {NON_TERMINAL, "SIZEOF_PAREN"}, + {NON_TERMINAL, "SIZEOF_PAREN"}, {NON_TERMINAL, "E13"}, {NON_TERMINAL, "MEMBER_NAME"}, {NON_TERMINAL, "VA2"}, @@ -2056,10 +2172,12 @@ const struct _SCRIPT_ENGINE_TOKEN LalrRhs[RULES_COUNT][MAX_RHS_LEN]= { {{NON_TERMINAL, "BE"}}, {{NON_TERMINAL, "B1"}}, - {{NON_TERMINAL, "B1"},{SPECIAL_TOKEN, "||"},{NON_TERMINAL, "B2"},{SEMANTIC_RULE, "@OR"}}, + {{NON_TERMINAL, "B1"},{SPECIAL_TOKEN, "||"},{NON_TERMINAL, "LOGICAL_OR_BEGIN"},{NON_TERMINAL, "B2"},{SEMANTIC_RULE, "@LOGICAL_OR_END"}}, {{NON_TERMINAL, "B2"}}, - {{NON_TERMINAL, "B2"},{SPECIAL_TOKEN, "&&"},{NON_TERMINAL, "B3"},{SEMANTIC_RULE, "@AND"}}, + {{EPSILON, "eps"},{SEMANTIC_RULE, "@LOGICAL_OR_BEGIN"}}, + {{NON_TERMINAL, "B2"},{SPECIAL_TOKEN, "&&"},{NON_TERMINAL, "LOGICAL_AND_BEGIN"},{NON_TERMINAL, "B3"},{SEMANTIC_RULE, "@LOGICAL_AND_END"}}, {{NON_TERMINAL, "B3"}}, + {{EPSILON, "eps"},{SEMANTIC_RULE, "@LOGICAL_AND_BEGIN"}}, {{NON_TERMINAL, "B3"},{SPECIAL_TOKEN, "|"},{NON_TERMINAL, "B4"},{SEMANTIC_RULE, "@OR"}}, {{NON_TERMINAL, "B4"}}, {{NON_TERMINAL, "B4"},{SPECIAL_TOKEN, "^"},{NON_TERMINAL, "B5"},{SEMANTIC_RULE, "@XOR"}}, @@ -2089,8 +2207,10 @@ const struct _SCRIPT_ENGINE_TOKEN LalrRhs[RULES_COUNT][MAX_RHS_LEN]= {{SPECIAL_TOKEN, "-"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@NEG"}}, {{SPECIAL_TOKEN, "+"},{NON_TERMINAL, "E12"}}, {{KEYWORD, "~"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@NOT"}}, + {{KEYWORD, "!"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@LOGICAL_NOT_TYPED"}}, {{SPECIAL_TOKEN, "*"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@POI"}}, {{SPECIAL_TOKEN, "&"},{NON_TERMINAL, "E12"},{SEMANTIC_RULE, "@REFERENCE"}}, + {{KEYWORD, "sizeof"},{NON_TERMINAL, "SIZEOF_VALUE"}}, {{KEYWORD, "rdtsc"},{SPECIAL_TOKEN, "("},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@RDTSC"}}, {{KEYWORD, "rdtscp"},{SPECIAL_TOKEN, "("},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@RDTSCP"}}, {{KEYWORD, "lbr_save"},{SPECIAL_TOKEN, "("},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@LBR_SAVE"}}, @@ -2143,7 +2263,7 @@ const struct _SCRIPT_ENGINE_TOKEN LalrRhs[RULES_COUNT][MAX_RHS_LEN]= {{KEYWORD, "wcslen"},{SPECIAL_TOKEN, "("},{NON_TERMINAL, "WstringNumber"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@WCSLEN"}}, {{KEYWORD, "wcscmp"},{SPECIAL_TOKEN, "("},{NON_TERMINAL, "WstringNumber"},{SPECIAL_TOKEN, ","},{NON_TERMINAL, "WstringNumber"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@WCSCMP"}}, {{KEYWORD, "wcsncmp"},{SPECIAL_TOKEN, "("},{NON_TERMINAL, "WstringNumber"},{SPECIAL_TOKEN, ","},{NON_TERMINAL, "WstringNumber"},{SPECIAL_TOKEN, ","},{NON_TERMINAL, "EXP"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@WCSNCMP"}}, - {{SPECIAL_TOKEN, "("},{NON_TERMINAL, "BE"},{SPECIAL_TOKEN, ")"}}, + {{SPECIAL_TOKEN, "("},{NON_TERMINAL, "CAST_OR_BOOLEAN"}}, {{NON_TERMINAL, "E12"},{SPECIAL_TOKEN, "."},{NON_TERMINAL, "MEMBER_NAME"},{SEMANTIC_RULE, "@MEMBER_DOT_READ"}}, {{NON_TERMINAL, "E12"},{SPECIAL_TOKEN, "->"},{NON_TERMINAL, "MEMBER_NAME"},{SEMANTIC_RULE, "@MEMBER_ARROW_READ"}}, {{REGISTER, "_register"},{SEMANTIC_RULE, "@PUSH"}}, @@ -2158,6 +2278,22 @@ const struct _SCRIPT_ENGINE_TOKEN LalrRhs[RULES_COUNT][MAX_RHS_LEN]= {{FLOAT_LITERAL, "_float"},{SEMANTIC_RULE, "@PUSH"}}, {{PSEUDO_REGISTER, "_pseudo_register"},{SEMANTIC_RULE, "@PUSH"}}, {{NON_TERMINAL, "E13"},{SPECIAL_TOKEN, "("},{NON_TERMINAL, "VA2"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@END_OF_CALLING_USER_DEFINED_FUNCTION_WITH_RETURNING_VALUE"}}, + {{NON_TERMINAL, "CAST_TYPE"},{SPECIAL_TOKEN, ")"},{NON_TERMINAL, "E10"},{SEMANTIC_RULE, "@CAST_SCALAR"}}, + {{NON_TERMINAL, "STRUCT_CAST_TYPE"},{SPECIAL_TOKEN, ")"},{NON_TERMINAL, "E10"},{SEMANTIC_RULE, "@CAST_SCALAR"}}, + {{NON_TERMINAL, "BE"},{SPECIAL_TOKEN, ")"}}, + {{SCRIPT_VARIABLE_TYPE, "_script_variable_type"},{NON_TERMINAL, "CAST_TYPE_REST"},{SEMANTIC_RULE, "@PUSH"}}, + {{SCRIPT_VARIABLE_TYPE, "_script_variable_type"},{NON_TERMINAL, "CAST_TYPE_REST"},{SEMANTIC_RULE, "@PUSH"}}, + {{SPECIAL_TOKEN, "*"},{NON_TERMINAL, "CAST_POINTERS"},{SEMANTIC_RULE, "@DECLARE_POINTER_TYPE"}}, + {{EPSILON, "eps"}}, + {{SPECIAL_TOKEN, "*"},{NON_TERMINAL, "CAST_POINTERS"},{SEMANTIC_RULE, "@DECLARE_POINTER_TYPE"}}, + {{EPSILON, "eps"}}, + {{KEYWORD, "struct"},{LOCAL_ID, "_local_id"},{NON_TERMINAL, "CAST_POINTERS"},{SEMANTIC_RULE, "@PUSH"}}, + {{EPSILON, "eps"},{SEMANTIC_RULE, "@SIZEOF_BEGIN"}}, + {{SPECIAL_TOKEN, "("},{NON_TERMINAL, "SIZEOF_PAREN"}}, + {{NON_TERMINAL, "SIZEOF_BEGIN"},{NON_TERMINAL, "E10"},{SEMANTIC_RULE, "@SIZEOF_EXPRESSION"}}, + {{NON_TERMINAL, "CAST_TYPE"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@SIZEOF_TYPE"}}, + {{NON_TERMINAL, "STRUCT_CAST_TYPE"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@SIZEOF_TYPE"}}, + {{NON_TERMINAL, "SIZEOF_BEGIN"},{NON_TERMINAL, "BE"},{SPECIAL_TOKEN, ")"},{SEMANTIC_RULE, "@SIZEOF_EXPRESSION"}}, {{FUNCTION_ID, "_function_id"},{SEMANTIC_RULE, "@PUSH"}}, {{LOCAL_ID, "_local_id"},{SEMANTIC_RULE, "@PUSH"}}, {{EPSILON, "eps"}}, @@ -2180,10 +2316,12 @@ const unsigned int LalrRhsSize[RULES_COUNT]= { 1, 1, -4, +5, 1, -4, +2, +5, 1, +2, 4, 1, 4, @@ -2215,6 +2353,8 @@ const unsigned int LalrRhsSize[RULES_COUNT]= 3, 3, 3, +3, +2, 4, 4, 4, @@ -2267,7 +2407,7 @@ const unsigned int LalrRhsSize[RULES_COUNT]= 5, 7, 9, -3, +2, 4, 4, 2, @@ -2282,6 +2422,22 @@ const unsigned int LalrRhsSize[RULES_COUNT]= 2, 2, 5, +4, +4, +2, +3, +3, +3, +1, +3, +1, +4, +2, +2, +3, +3, +3, +4, 2, 2, 1, @@ -2300,818 +2456,904 @@ const unsigned int LalrRhsSize[RULES_COUNT]= 2, 1 }; -const char* LalrNoneTerminalMap[NONETERMINAL_COUNT]= +const char* LalrNoneTerminalMap[LALR_NONTERMINAL_COUNT]= { -"S", -"E13", -"WSTRING", -"B2", -"StringNumber", "ARRAY1", +"ARRAY2", +"ARRAY3", +"ARRAY4", +"B1", +"B2", +"B3", +"B4", +"B5", +"B6", +"BE", +"CAST_OR_BOOLEAN", +"CAST_POINTERS", +"CAST_TYPE", +"CAST_TYPE_REST", +"CMP", +"E10", +"E12", +"E13", "E3", "E4", -"ARRAY4", -"VA2", "E5", -"WstringNumber", -"B3", -"B1", -"ARRAY2", -"VA3", -"CMP", -"ARRAY3", "EXP", -"B5", +"LOGICAL_AND_BEGIN", +"LOGICAL_OR_BEGIN", "MEMBER_NAME", -"BE", -"E12", +"S", +"SIZEOF_BEGIN", +"SIZEOF_PAREN", +"SIZEOF_VALUE", "STRING", -"B4", -"B6", -"E10" +"STRUCT_CAST_TYPE", +"StringNumber", +"VA2", +"VA3", +"WSTRING", +"WstringNumber" }; -const char* LalrTerminalMap[TERMINAL_COUNT]= +const char* LalrTerminalMap[LALR_TERMINAL_COUNT]= { -"dd_pa", -"~", -"eb_pa", -"<", -"eq_pa", -"ed_pa", -"rdtscp", -">=", -"lbr_dump", -"interlocked_exchange", -"poi", -"&", -"/", -"lbr_check", -"strlen", -"wcsncmp", -"&&", -"reference", -"_function_id", -"disassemble_len", -"_wstring", -"poi_pa", -"_float", -"_binary", -">>", -"check_address", -"_hex", -"_register", -"|", +"!", +"!=", "$", -"dq_pa", -"wcslen", -"disassemble_len32", -"==", +"%", +"&", +"&&", +"(", +")", "*", -"lbr_restore", +"+", +",", +"-", +"->", +".", +"/", +"<", +"<<", +"<=", +"==", +">", +">=", +">>", +"[", +"]", +"^", +"_binary", +"_decimal", +"_float", +"_function_id", +"_function_parameter_id", +"_global_id", +"_hex", +"_local_id", +"_octal", +"_pseudo_register", +"_register", +"_script_variable_type", +"_string", +"_wstring", +"check_address", +"db", +"db_pa", +"dd", +"dd_pa", +"disassemble_len", +"disassemble_len32", +"disassemble_len64", +"dq", +"dq_pa", +"dw", +"dw_pa", +"eb", +"eb_pa", +"ed", +"ed_pa", +"eq", +"eq_pa", +"hi", "hi_pa", "interlocked_compare_exchange", -"rdtsc", -"-", -"_decimal", -"]", -"%", -"^", -")", -"db_pa", -"dw", -"eq", -"interlocked_exchange_add", -"memcmp", -"[", -"_global_id", -"strncmp", -"lbr_save", -"lbr_print", -"(", -"hi", -"ed", -"interlocked_increment", -"virtual_to_physical", -",", -"dw_pa", -"low", -"->", -"not", -"_pseudo_register", -"dq", -"_string", -"+", -"<=", -".", -"_function_parameter_id", -"_octal", -"wcscmp", "interlocked_decrement", -"strcmp", -"||", -">", -"disassemble_len64", -"eb", -"neg", -"!=", -"dd", -"low_pa", -"physical_to_virtual", -"<<", +"interlocked_exchange", +"interlocked_exchange_add", +"interlocked_increment", +"lbr_check", +"lbr_dump", +"lbr_print", +"lbr_restore", "lbr_restore_by_filter", -"db", -"_local_id" +"lbr_save", +"low", +"low_pa", +"memcmp", +"neg", +"not", +"physical_to_virtual", +"poi", +"poi_pa", +"rdtsc", +"rdtscp", +"reference", +"sizeof", +"strcmp", +"strlen", +"strncmp", +"struct", +"virtual_to_physical", +"wcscmp", +"wcslen", +"wcsncmp", +"|", +"||", +"~" }; const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]= { - {1 ,16 ,2147483648 ,4 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,5 ,3 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,2 ,15 ,2147483648 ,6 ,8 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,4 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,5 ,3 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,116 ,15 ,2147483648 ,6 ,8 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,123 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,143 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,147 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,148 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,157 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,163 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,5 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,2147483648 ,15 ,2147483648 ,6 ,8 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,164 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,2147483648 ,15 ,2147483648 ,6 ,8 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,7 ,2147483648 ,2147483648 ,15 ,2147483648 ,165 ,8 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,166 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,8 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,9 ,2147483648 ,10 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,167 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,168 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,169 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,170 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,171 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,172 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,173 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,174 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,175 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,176 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,177 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,178 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,179 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,180 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,181 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,183 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,185 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,184 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,187 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,186 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,188 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,189 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,192 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,194 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,198 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,199 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,203 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,205 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,206 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,209 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,210 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,211 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,212 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,213 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,214 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,216 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,215 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,217 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,218 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,219 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,221 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,223 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,227 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,229 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,230 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,232 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,233 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,235 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,234 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,237 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,238 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,239 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,240 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,241 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,242 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,243 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,244 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,245 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,246 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,247 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,248 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,251 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,186 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,299 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,300 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,301 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,302 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,303 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,305 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,202 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,306 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,201 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,307 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,308 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,309 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,310 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,311 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,190 ,2147483648 ,2147483648 ,2147483648 ,15 ,191 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,312 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,313 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,314 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,330 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,331 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,332 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,16 ,2147483648 ,2147483648 ,2147483648 ,17 ,11 ,12 ,2147483648 ,2147483648 ,13 ,2147483648 ,2147483648 ,2147483648 ,18 ,2147483648 ,2147483648 ,2147483648 ,333 ,2147483648 ,2147483648 ,2147483648 ,15 ,2147483648 ,2147483648 ,2147483648 ,14 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 } + {17 ,18 ,2147483648 ,2147483648 ,3 ,4 ,5 ,6 ,7 ,8 ,2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,14 ,15 ,16 ,11 ,12 ,13 ,10 ,2147483648 ,2147483648 ,2147483648 ,1 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,113 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,114 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,119 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,128 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,3 ,4 ,5 ,6 ,7 ,8 ,133 ,134 ,2147483648 ,135 ,2147483648 ,9 ,14 ,15 ,16 ,11 ,12 ,13 ,10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,136 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,144 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,147 ,2147483648 ,148 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,150 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,174 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,175 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,176 ,7 ,8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,14 ,15 ,16 ,11 ,12 ,13 ,10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,177 ,8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,14 ,15 ,16 ,11 ,12 ,13 ,10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,178 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,14 ,15 ,16 ,11 ,12 ,13 ,10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,179 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,180 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,181 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,182 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,183 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,184 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,2147483648 ,185 ,13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,2147483648 ,186 ,13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,2147483648 ,2147483648 ,187 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,2147483648 ,2147483648 ,188 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,189 ,15 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,190 ,15 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,191 ,15 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,192 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,194 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,195 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,196 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,197 ,198 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,199 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,200 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,201 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,202 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,204 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,207 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,209 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,211 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,212 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,213 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,214 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,216 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,218 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,219 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,220 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,221 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,223 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,224 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,232 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,234 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,235 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,236 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,237 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,238 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,239 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,240 ,15 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,241 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,243 ,244 ,2147483648 ,2147483648 ,242 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,245 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,246 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,247 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,248 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,249 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,250 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,251 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,252 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,253 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,255 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,256 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,257 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,258 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,260 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,261 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,262 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,263 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,264 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,265 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,267 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,268 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,269 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,270 ,5 ,6 ,7 ,8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,14 ,15 ,16 ,11 ,12 ,13 ,10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,271 ,6 ,7 ,8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,14 ,15 ,16 ,11 ,12 ,13 ,10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,272 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,197 ,275 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,294 ,15 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,295 ,15 ,16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,296 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,298 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,299 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,3 ,4 ,5 ,6 ,7 ,8 ,309 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,9 ,14 ,15 ,16 ,11 ,12 ,13 ,10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,331 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,332 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,256 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,333 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,334 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,335 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,336 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,337 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,338 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,339 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,340 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,341 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,343 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,344 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,256 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,203 ,345 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,346 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,347 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,233 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,208 ,2147483648 ,348 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,349 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,365 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,366 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,367 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {17 ,18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,14 ,15 ,16 ,11 ,12 ,13 ,368 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 } }; const int LalrActionTable[LALR_STATE_COUNT][LALR_TERMINAL_COUNT]= { - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483647 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-1 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,92 ,2147483648 ,2147483648 ,2147483648 ,91 ,2147483648 ,2147483648 ,2147483648 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,-13 ,2147483648 ,2147483648 ,2147483648 ,93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,95 ,2147483648 ,2147483648 ,2147483648 ,94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,97 ,2147483648 ,2147483648 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,96 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,-24 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 ,-24 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,100 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,-27 ,101 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 ,-27 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,-31 ,-31 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 ,-31 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,-32 ,-32 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 ,-32 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,-97 ,-97 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 ,-97 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,-100 ,-100 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 ,-100 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,122 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,124 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,125 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,126 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,-99 ,-99 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 ,-99 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,127 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,-94 ,-94 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 ,-94 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,-102 ,-102 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 ,-102 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,-93 ,-93 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 ,-93 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,128 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,129 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,-101 ,-101 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 ,-101 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,130 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,-98 ,-98 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 ,-98 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,131 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,132 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,133 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,134 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,-96 ,-96 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 ,-96 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,135 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,136 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,137 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,-103 ,-103 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 ,-103 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,138 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,139 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,140 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,141 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,142 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,144 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,145 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,146 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,149 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,150 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,151 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,152 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,153 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,154 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,-95 ,-95 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 ,-95 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,155 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,156 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,2147483648 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,2147483648 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,2147483648 ,25 ,56 ,52 ,55 ,2147483648 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,158 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,159 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,160 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,161 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,162 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,182 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,182 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,-107 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,-121 ,-121 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,195 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,197 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,200 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,207 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,-35 ,-35 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 ,-35 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,220 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,224 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,228 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,-37 ,-37 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 ,-37 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,-34 ,-34 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 ,-34 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,-36 ,-36 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 ,-36 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,-33 ,-33 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 ,-33 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,88 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,-23 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,99 ,2147483648 ,-22 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,98 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,100 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,-25 ,101 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 ,-25 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,100 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,-26 ,101 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 ,-26 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,-28 ,-28 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 ,-28 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,-29 ,-29 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 ,-29 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,-30 ,-30 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 ,-30 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,-92 ,-92 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 ,-92 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,-106 ,-106 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 ,-106 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,-91 ,-91 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 ,-91 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,249 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,250 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,-121 ,-121 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 ,-121 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,-117 ,-117 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 ,-117 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,252 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,253 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,254 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,255 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,-42 ,-42 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 ,-42 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,256 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,-43 ,-43 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 ,-43 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,257 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,258 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,-90 ,-90 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 ,-90 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,259 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,260 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,261 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,-44 ,-44 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 ,-44 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,262 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,263 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,264 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,265 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,266 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,267 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,268 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,270 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,271 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,272 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,273 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,-39 ,-39 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 ,-39 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,274 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,276 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,-38 ,-38 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 ,-38 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,277 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,-41 ,-41 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 ,-41 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,278 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,-40 ,-40 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 ,-40 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,279 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,280 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,281 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,282 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,283 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,284 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,285 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,286 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,287 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,288 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,289 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,290 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,291 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,292 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,293 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,294 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,295 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,296 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,-104 ,-104 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 ,-104 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,-120 ,-120 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 ,-120 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,-119 ,-119 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,-52 ,-52 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 ,-52 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,-47 ,-47 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 ,-47 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,-54 ,-54 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 ,-54 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,-68 ,-68 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 ,-68 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,-58 ,-58 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 ,-58 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,-45 ,-45 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 ,-45 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,-51 ,-51 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 ,-51 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,-71 ,-71 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 ,-71 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,-72 ,-72 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 ,-72 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,-59 ,-59 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 ,-59 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,-61 ,-61 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 ,-61 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,-55 ,-55 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 ,-55 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,-83 ,-83 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 ,-83 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,-48 ,-48 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 ,-48 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,-49 ,-49 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 ,-49 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,-53 ,-53 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 ,-53 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,204 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,-66 ,-66 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 ,-66 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,-64 ,-64 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 ,-64 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,-46 ,-46 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 ,-46 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,-70 ,-70 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 ,-70 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,-57 ,-57 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 ,-57 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,-65 ,-65 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 ,-65 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,-56 ,-56 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 ,-56 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,-87 ,-87 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 ,-87 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,-67 ,-67 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 ,-67 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,-69 ,-69 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 ,-69 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,193 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,-50 ,-50 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 ,-50 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,-62 ,-62 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 ,-62 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,-63 ,-63 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 ,-63 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,-60 ,-60 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 ,-60 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,249 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,315 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,316 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,317 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,318 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,319 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,320 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,322 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,325 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,-84 ,-84 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 ,-84 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,-80 ,-80 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 ,-80 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,-74 ,-74 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 ,-74 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,-76 ,-76 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 ,-76 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,-78 ,-78 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 ,-78 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,-88 ,-88 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 ,-88 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,-77 ,-77 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 ,-77 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,-81 ,-81 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 ,-81 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,-75 ,-75 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 ,-75 ,2147483648 ,2147483648 ,2147483648 }, - {74 ,35 ,84 ,2147483648 ,70 ,27 ,51 ,2147483648 ,58 ,38 ,33 ,63 ,2147483648 ,32 ,45 ,29 ,2147483648 ,80 ,75 ,65 ,2147483648 ,66 ,42 ,46 ,2147483648 ,23 ,48 ,43 ,2147483648 ,2147483648 ,36 ,69 ,31 ,2147483648 ,68 ,25 ,56 ,52 ,55 ,79 ,39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,26 ,47 ,72 ,62 ,77 ,2147483648 ,41 ,71 ,60 ,22 ,28 ,34 ,81 ,83 ,59 ,2147483648 ,64 ,19 ,2147483648 ,50 ,57 ,49 ,2147483648 ,67 ,2147483648 ,2147483648 ,53 ,24 ,54 ,44 ,20 ,2147483648 ,2147483648 ,40 ,30 ,78 ,2147483648 ,21 ,73 ,82 ,2147483648 ,37 ,61 ,76 }, - {2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,-73 ,-73 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 ,-73 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,-79 ,-79 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 ,-79 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,334 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,335 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,336 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,337 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,-89 ,-89 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 ,-89 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,-82 ,-82 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 ,-82 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,-86 ,-86 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 ,-86 ,2147483648 ,2147483648 ,2147483648 }, - {2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,-85 ,-85 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 ,-85 ,2147483648 ,2147483648 ,2147483648 } + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483647 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,-1 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,-2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-2 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,87 ,2147483648 }, + {2147483648 ,2147483648 ,-4 ,2147483648 ,2147483648 ,88 ,2147483648 ,-4 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-4 ,2147483648 }, + {2147483648 ,2147483648 ,-7 ,2147483648 ,2147483648 ,-7 ,2147483648 ,-7 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,-7 ,2147483648 }, + {2147483648 ,2147483648 ,-10 ,2147483648 ,2147483648 ,-10 ,2147483648 ,-10 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-10 ,-10 ,2147483648 }, + {2147483648 ,2147483648 ,-12 ,2147483648 ,91 ,-12 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-12 ,-12 ,2147483648 }, + {2147483648 ,2147483648 ,-14 ,2147483648 ,-14 ,-14 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-14 ,-14 ,2147483648 }, + {2147483648 ,96 ,-15 ,2147483648 ,-15 ,-15 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,92 ,2147483648 ,95 ,93 ,94 ,97 ,2147483648 ,2147483648 ,2147483648 ,-15 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-15 ,-15 ,2147483648 }, + {2147483648 ,-22 ,-22 ,2147483648 ,-22 ,-22 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,-22 ,-22 ,-22 ,-22 ,2147483648 ,2147483648 ,2147483648 ,-22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-22 ,-22 ,2147483648 }, + {2147483648 ,-23 ,-23 ,2147483648 ,-23 ,-23 ,2147483648 ,-23 ,2147483648 ,2147483648 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,99 ,-23 ,-23 ,-23 ,-23 ,98 ,2147483648 ,-23 ,-23 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-23 ,-23 ,2147483648 }, + {2147483648 ,-26 ,-26 ,2147483648 ,-26 ,-26 ,2147483648 ,-26 ,2147483648 ,101 ,-26 ,100 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,-26 ,-26 ,-26 ,-26 ,-26 ,2147483648 ,-26 ,-26 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-26 ,-26 ,2147483648 }, + {2147483648 ,-29 ,-29 ,104 ,-29 ,-29 ,2147483648 ,-29 ,102 ,-29 ,-29 ,-29 ,2147483648 ,2147483648 ,103 ,-29 ,-29 ,-29 ,-29 ,-29 ,-29 ,-29 ,2147483648 ,-29 ,-29 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-29 ,-29 ,2147483648 }, + {2147483648 ,-33 ,-33 ,-33 ,-33 ,-33 ,2147483648 ,-33 ,-33 ,-33 ,-33 ,-33 ,2147483648 ,2147483648 ,-33 ,-33 ,-33 ,-33 ,-33 ,-33 ,-33 ,-33 ,2147483648 ,-33 ,-33 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-33 ,-33 ,2147483648 }, + {2147483648 ,-34 ,-34 ,-34 ,-34 ,-34 ,2147483648 ,-34 ,-34 ,-34 ,-34 ,-34 ,106 ,105 ,-34 ,-34 ,-34 ,-34 ,-34 ,-34 ,-34 ,-34 ,2147483648 ,-34 ,-34 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-34 ,-34 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-101 ,-101 ,-101 ,-101 ,-101 ,2147483648 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,-101 ,2147483648 ,-101 ,-101 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-101 ,-101 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,2147483648 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,2147483648 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,115 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,117 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-104 ,-104 ,-104 ,-104 ,-104 ,2147483648 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,-104 ,2147483648 ,-104 ,-104 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-104 ,-104 ,2147483648 }, + {2147483648 ,-99 ,-99 ,-99 ,-99 ,-99 ,2147483648 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-99 ,-138 ,-99 ,-99 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-99 ,-99 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,2147483648 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-100 ,-100 ,-100 ,-100 ,-100 ,2147483648 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,-100 ,2147483648 ,-100 ,-100 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-100 ,-100 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-102 ,-102 ,-102 ,-102 ,-102 ,2147483648 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,-102 ,2147483648 ,-102 ,-102 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-102 ,-102 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,122 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,123 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,124 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,125 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,126 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,127 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-98 ,-98 ,-98 ,-98 ,-98 ,2147483648 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,-98 ,2147483648 ,-98 ,-98 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-98 ,-98 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,2147483648 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,129 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,130 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,131 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-107 ,-107 ,-107 ,-107 ,-107 ,2147483648 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,-107 ,2147483648 ,-107 ,-107 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-107 ,-107 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,132 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,137 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,138 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-97 ,-97 ,-97 ,-97 ,-97 ,2147483648 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,-97 ,2147483648 ,-97 ,-97 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-97 ,-97 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,139 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,140 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-106 ,-106 ,-106 ,-106 ,-106 ,2147483648 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,-106 ,2147483648 ,-106 ,-106 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-106 ,-106 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,141 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,142 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,143 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,2147483648 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,145 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,146 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,149 ,2147483648 ,-119 ,-119 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,2147483648 ,-119 ,-119 ,-119 ,-119 ,2147483648 ,2147483648 ,-119 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,2147483648 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,151 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,152 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,153 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-125 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,154 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,155 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,156 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-103 ,-103 ,-103 ,-103 ,-103 ,2147483648 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,-103 ,2147483648 ,-103 ,-103 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-103 ,-103 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,157 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,158 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,159 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,160 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-105 ,-105 ,-105 ,-105 ,-105 ,2147483648 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,-105 ,2147483648 ,-105 ,-105 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-105 ,-105 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,161 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,162 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,163 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,164 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,165 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,166 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,167 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,168 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,169 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,170 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,171 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,172 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,173 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {-5 ,2147483648 ,2147483648 ,2147483648 ,-5 ,2147483648 ,-5 ,2147483648 ,-5 ,-5 ,2147483648 ,-5 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,2147483648 ,2147483648 ,2147483648 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,-5 ,2147483648 ,-5 ,-5 ,-5 ,-5 ,2147483648 ,2147483648 ,-5 }, + {-8 ,2147483648 ,2147483648 ,2147483648 ,-8 ,2147483648 ,-8 ,2147483648 ,-8 ,-8 ,2147483648 ,-8 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,2147483648 ,2147483648 ,2147483648 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,-8 ,2147483648 ,-8 ,-8 ,-8 ,-8 ,2147483648 ,2147483648 ,-8 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,193 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,-127 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-141 ,-141 ,-141 ,-141 ,-141 ,2147483648 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,109 ,-141 ,-141 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-141 ,-141 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,205 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-35 ,-35 ,-35 ,-35 ,-35 ,2147483648 ,-35 ,-35 ,-35 ,-35 ,-35 ,106 ,105 ,-35 ,-35 ,-35 ,-35 ,-35 ,-35 ,-35 ,-35 ,2147483648 ,-35 ,-35 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-35 ,-35 ,2147483648 }, + {2147483648 ,-39 ,-39 ,-39 ,-39 ,-39 ,2147483648 ,-39 ,-39 ,-39 ,-39 ,-39 ,106 ,105 ,-39 ,-39 ,-39 ,-39 ,-39 ,-39 ,-39 ,-39 ,2147483648 ,-39 ,-39 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-39 ,-39 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,206 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,210 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-37 ,-37 ,-37 ,-37 ,-37 ,2147483648 ,-37 ,-37 ,-37 ,-37 ,-37 ,106 ,105 ,-37 ,-37 ,-37 ,-37 ,-37 ,-37 ,-37 ,-37 ,2147483648 ,-37 ,-37 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-37 ,-37 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,215 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,217 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-40 ,-40 ,-40 ,-40 ,-40 ,2147483648 ,-40 ,-40 ,-40 ,-40 ,-40 ,106 ,105 ,-40 ,-40 ,-40 ,-40 ,-40 ,-40 ,-40 ,-40 ,2147483648 ,-40 ,-40 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-40 ,-40 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,222 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,225 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-94 ,-94 ,-94 ,-94 ,-94 ,2147483648 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,-94 ,2147483648 ,-94 ,-94 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-94 ,-94 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,226 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,227 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,230 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,231 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,210 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,210 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-38 ,-38 ,-38 ,-38 ,-38 ,2147483648 ,-38 ,-38 ,-38 ,-38 ,-38 ,106 ,105 ,-38 ,-38 ,-38 ,-38 ,-38 ,-38 ,-38 ,-38 ,2147483648 ,-38 ,-38 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-38 ,-38 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-41 ,-41 ,-41 ,-41 ,-41 ,2147483648 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,-41 ,2147483648 ,-41 ,-41 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-41 ,-41 ,2147483648 }, + {-119 ,2147483648 ,2147483648 ,2147483648 ,-119 ,2147483648 ,-119 ,2147483648 ,-119 ,-119 ,2147483648 ,-119 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,137 ,2147483648 ,2147483648 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,-119 ,138 ,-119 ,-119 ,-119 ,-119 ,2147483648 ,2147483648 ,-119 }, + {2147483648 ,-36 ,-36 ,-36 ,-36 ,-36 ,2147483648 ,-36 ,-36 ,-36 ,-36 ,-36 ,106 ,105 ,-36 ,-36 ,-36 ,-36 ,-36 ,-36 ,-36 ,-36 ,2147483648 ,-36 ,-36 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-36 ,-36 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,254 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,205 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,259 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,205 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,266 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,210 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,-9 ,2147483648 ,2147483648 ,-9 ,2147483648 ,-9 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-9 ,-9 ,2147483648 }, + {2147483648 ,2147483648 ,-11 ,2147483648 ,91 ,-11 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-11 ,-11 ,2147483648 }, + {2147483648 ,2147483648 ,-13 ,2147483648 ,-13 ,-13 ,2147483648 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-13 ,-13 ,2147483648 }, + {2147483648 ,-17 ,-17 ,2147483648 ,-17 ,-17 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,-17 ,-17 ,-17 ,-17 ,2147483648 ,2147483648 ,2147483648 ,-17 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-17 ,-17 ,2147483648 }, + {2147483648 ,-20 ,-20 ,2147483648 ,-20 ,-20 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,-20 ,-20 ,-20 ,-20 ,2147483648 ,2147483648 ,2147483648 ,-20 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-20 ,-20 ,2147483648 }, + {2147483648 ,-16 ,-16 ,2147483648 ,-16 ,-16 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,-16 ,-16 ,-16 ,-16 ,2147483648 ,2147483648 ,2147483648 ,-16 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-16 ,-16 ,2147483648 }, + {2147483648 ,-19 ,-19 ,2147483648 ,-19 ,-19 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,-19 ,-19 ,-19 ,-19 ,2147483648 ,2147483648 ,2147483648 ,-19 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-19 ,-19 ,2147483648 }, + {2147483648 ,-21 ,-21 ,2147483648 ,-21 ,-21 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,-21 ,-21 ,-21 ,-21 ,2147483648 ,2147483648 ,2147483648 ,-21 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-21 ,-21 ,2147483648 }, + {2147483648 ,-18 ,-18 ,2147483648 ,-18 ,-18 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,-18 ,-18 ,-18 ,-18 ,2147483648 ,2147483648 ,2147483648 ,-18 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-18 ,-18 ,2147483648 }, + {2147483648 ,-24 ,-24 ,2147483648 ,-24 ,-24 ,2147483648 ,-24 ,2147483648 ,101 ,-24 ,100 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,-24 ,-24 ,-24 ,-24 ,-24 ,2147483648 ,-24 ,-24 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-24 ,-24 ,2147483648 }, + {2147483648 ,-25 ,-25 ,2147483648 ,-25 ,-25 ,2147483648 ,-25 ,2147483648 ,101 ,-25 ,100 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,-25 ,-25 ,-25 ,-25 ,-25 ,2147483648 ,-25 ,-25 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-25 ,-25 ,2147483648 }, + {2147483648 ,-28 ,-28 ,104 ,-28 ,-28 ,2147483648 ,-28 ,102 ,-28 ,-28 ,-28 ,2147483648 ,2147483648 ,103 ,-28 ,-28 ,-28 ,-28 ,-28 ,-28 ,-28 ,2147483648 ,-28 ,-28 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-28 ,-28 ,2147483648 }, + {2147483648 ,-27 ,-27 ,104 ,-27 ,-27 ,2147483648 ,-27 ,102 ,-27 ,-27 ,-27 ,2147483648 ,2147483648 ,103 ,-27 ,-27 ,-27 ,-27 ,-27 ,-27 ,-27 ,2147483648 ,-27 ,-27 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-27 ,-27 ,2147483648 }, + {2147483648 ,-32 ,-32 ,-32 ,-32 ,-32 ,2147483648 ,-32 ,-32 ,-32 ,-32 ,-32 ,2147483648 ,2147483648 ,-32 ,-32 ,-32 ,-32 ,-32 ,-32 ,-32 ,-32 ,2147483648 ,-32 ,-32 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-32 ,-32 ,2147483648 }, + {2147483648 ,-30 ,-30 ,-30 ,-30 ,-30 ,2147483648 ,-30 ,-30 ,-30 ,-30 ,-30 ,2147483648 ,2147483648 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,-30 ,2147483648 ,-30 ,-30 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-30 ,-30 ,2147483648 }, + {2147483648 ,-31 ,-31 ,-31 ,-31 ,-31 ,2147483648 ,-31 ,-31 ,-31 ,-31 ,-31 ,2147483648 ,2147483648 ,-31 ,-31 ,-31 ,-31 ,-31 ,-31 ,-31 ,-31 ,2147483648 ,-31 ,-31 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-31 ,-31 ,2147483648 }, + {2147483648 ,-95 ,-95 ,-95 ,-95 ,-95 ,2147483648 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,-95 ,2147483648 ,-95 ,-95 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-95 ,-95 ,2147483648 }, + {2147483648 ,-126 ,-126 ,-126 ,-126 ,-126 ,2147483648 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,-126 ,2147483648 ,-126 ,-126 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-126 ,-126 ,2147483648 }, + {2147483648 ,-96 ,-96 ,-96 ,-96 ,-96 ,2147483648 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,-96 ,2147483648 ,-96 ,-96 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-96 ,-96 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-130 ,2147483648 ,2147483648 ,273 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,274 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-141 ,-141 ,-141 ,-141 ,-141 ,2147483648 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,-141 ,109 ,-141 ,-141 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-141 ,-141 ,2147483648 }, + {2147483648 ,-137 ,-137 ,-137 ,-137 ,-137 ,2147483648 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,-137 ,2147483648 ,-137 ,-137 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-137 ,-137 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,276 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,277 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,278 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,279 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-136 ,2147483648 ,2147483648 ,-136 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,280 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-132 ,2147483648 ,2147483648 ,-132 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-45 ,-45 ,-45 ,-45 ,-45 ,2147483648 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,-45 ,2147483648 ,-45 ,-45 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-45 ,-45 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,281 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-134 ,2147483648 ,2147483648 ,-134 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,282 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-131 ,2147483648 ,2147483648 ,-131 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,283 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,284 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,285 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,286 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-48 ,-48 ,-48 ,-48 ,-48 ,2147483648 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,-48 ,2147483648 ,-48 ,-48 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-48 ,-48 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,287 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-42 ,-42 ,-42 ,-42 ,-42 ,2147483648 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,-42 ,2147483648 ,-42 ,-42 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-42 ,-42 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,288 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,289 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,290 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,291 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-44 ,-44 ,-44 ,-44 ,-44 ,2147483648 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,-44 ,2147483648 ,-44 ,-44 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-44 ,-44 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,292 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,293 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-111 ,-111 ,-111 ,-111 ,-111 ,2147483648 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,-111 ,2147483648 ,-111 ,-111 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-111 ,-111 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-112 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-115 ,229 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,230 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,300 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-133 ,2147483648 ,2147483648 ,-133 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,301 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,302 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,303 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,304 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,305 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,306 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-121 ,-121 ,-121 ,-121 ,-121 ,2147483648 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,-121 ,2147483648 ,-121 ,-121 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-121 ,-121 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,307 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,308 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-120 ,-120 ,-120 ,-120 ,-120 ,2147483648 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,-120 ,2147483648 ,-120 ,-120 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-120 ,-120 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,310 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,311 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,312 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,313 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,314 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,315 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,316 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,317 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,318 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-43 ,-43 ,-43 ,-43 ,-43 ,2147483648 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,-43 ,2147483648 ,-43 ,-43 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-43 ,-43 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,319 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-135 ,2147483648 ,2147483648 ,-135 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,320 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,321 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-46 ,-46 ,-46 ,-46 ,-46 ,2147483648 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,-46 ,2147483648 ,-46 ,-46 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-46 ,-46 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,322 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,323 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,324 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,325 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,326 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,327 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-47 ,-47 ,-47 ,-47 ,-47 ,2147483648 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,-47 ,2147483648 ,-47 ,-47 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-47 ,-47 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,328 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,329 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,330 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,-3 ,2147483648 ,2147483648 ,88 ,2147483648 ,-3 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-3 ,2147483648 }, + {2147483648 ,2147483648 ,-6 ,2147483648 ,2147483648 ,-6 ,2147483648 ,-6 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,89 ,-6 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-128 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-108 ,-108 ,-108 ,-108 ,-108 ,2147483648 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,-108 ,2147483648 ,-108 ,-108 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-108 ,-108 ,2147483648 }, + {2147483648 ,-140 ,-140 ,-140 ,-140 ,-140 ,2147483648 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,-140 ,2147483648 ,-140 ,-140 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-140 ,-140 ,2147483648 }, + {2147483648 ,-139 ,-139 ,-139 ,-139 ,-139 ,2147483648 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,-139 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-139 ,-139 ,2147483648 }, + {2147483648 ,-67 ,-67 ,-67 ,-67 ,-67 ,2147483648 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,-67 ,2147483648 ,-67 ,-67 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-67 ,-67 ,2147483648 }, + {2147483648 ,-76 ,-76 ,-76 ,-76 ,-76 ,2147483648 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,-76 ,2147483648 ,-76 ,-76 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-76 ,-76 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,205 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-59 ,-59 ,-59 ,-59 ,-59 ,2147483648 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,-59 ,2147483648 ,-59 ,-59 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-59 ,-59 ,2147483648 }, + {2147483648 ,-87 ,-87 ,-87 ,-87 ,-87 ,2147483648 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,-87 ,2147483648 ,-87 ,-87 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-87 ,-87 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-71 ,-71 ,-71 ,-71 ,-71 ,2147483648 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,-71 ,2147483648 ,-71 ,-71 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-71 ,-71 ,2147483648 }, + {2147483648 ,-64 ,-64 ,-64 ,-64 ,-64 ,2147483648 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,-64 ,2147483648 ,-64 ,-64 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-64 ,-64 ,2147483648 }, + {2147483648 ,-49 ,-49 ,-49 ,-49 ,-49 ,2147483648 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,-49 ,2147483648 ,-49 ,-49 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-49 ,-49 ,2147483648 }, + {2147483648 ,-74 ,-74 ,-74 ,-74 ,-74 ,2147483648 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,-74 ,2147483648 ,-74 ,-74 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-74 ,-74 ,2147483648 }, + {2147483648 ,-57 ,-57 ,-57 ,-57 ,-57 ,2147483648 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,-57 ,2147483648 ,-57 ,-57 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-57 ,-57 ,2147483648 }, + {2147483648 ,-73 ,-73 ,-73 ,-73 ,-73 ,2147483648 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,-73 ,2147483648 ,-73 ,-73 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-73 ,-73 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-53 ,-53 ,-53 ,-53 ,-53 ,2147483648 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,-53 ,2147483648 ,-53 ,-53 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-53 ,-53 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-65 ,-65 ,-65 ,-65 ,-65 ,2147483648 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,-65 ,2147483648 ,-65 ,-65 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-65 ,-65 ,2147483648 }, + {2147483648 ,-109 ,-109 ,-109 ,-109 ,-109 ,2147483648 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,-109 ,2147483648 ,-109 ,-109 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-109 ,-109 ,2147483648 }, + {2147483648 ,-110 ,-110 ,-110 ,-110 ,-110 ,2147483648 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,-110 ,2147483648 ,-110 ,-110 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-110 ,-110 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-114 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-117 ,297 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-113 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-118 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-50 ,-50 ,-50 ,-50 ,-50 ,2147483648 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,-50 ,2147483648 ,-50 ,-50 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-50 ,-50 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,210 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-56 ,-56 ,-56 ,-56 ,-56 ,2147483648 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,-56 ,2147483648 ,-56 ,-56 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-56 ,-56 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,210 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-68 ,-68 ,-68 ,-68 ,-68 ,2147483648 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,-68 ,2147483648 ,-68 ,-68 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-68 ,-68 ,2147483648 }, + {2147483648 ,-122 ,-122 ,-122 ,-122 ,-122 ,2147483648 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,-122 ,2147483648 ,-122 ,-122 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-122 ,-122 ,2147483648 }, + {2147483648 ,-123 ,-123 ,-123 ,-123 ,-123 ,2147483648 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,-123 ,2147483648 ,-123 ,-123 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-123 ,-123 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,342 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-58 ,-58 ,-58 ,-58 ,-58 ,2147483648 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,-58 ,2147483648 ,-58 ,-58 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-58 ,-58 ,2147483648 }, + {2147483648 ,-72 ,-72 ,-72 ,-72 ,-72 ,2147483648 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,-72 ,2147483648 ,-72 ,-72 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-72 ,-72 ,2147483648 }, + {2147483648 ,-63 ,-63 ,-63 ,-63 ,-63 ,2147483648 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,-63 ,2147483648 ,-63 ,-63 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-63 ,-63 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-55 ,-55 ,-55 ,-55 ,-55 ,2147483648 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,-55 ,2147483648 ,-55 ,-55 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-55 ,-55 ,2147483648 }, + {2147483648 ,-51 ,-51 ,-51 ,-51 ,-51 ,2147483648 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,-51 ,2147483648 ,-51 ,-51 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-51 ,-51 ,2147483648 }, + {2147483648 ,-61 ,-61 ,-61 ,-61 ,-61 ,2147483648 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,-61 ,2147483648 ,-61 ,-61 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-61 ,-61 ,2147483648 }, + {2147483648 ,-54 ,-54 ,-54 ,-54 ,-54 ,2147483648 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,-54 ,2147483648 ,-54 ,-54 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-54 ,-54 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-69 ,-69 ,-69 ,-69 ,-69 ,2147483648 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,-69 ,2147483648 ,-69 ,-69 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-69 ,-69 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,205 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-75 ,-75 ,-75 ,-75 ,-75 ,2147483648 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,-75 ,2147483648 ,-75 ,-75 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-75 ,-75 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-52 ,-52 ,-52 ,-52 ,-52 ,2147483648 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,-52 ,2147483648 ,-52 ,-52 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-52 ,-52 ,2147483648 }, + {2147483648 ,-62 ,-62 ,-62 ,-62 ,-62 ,2147483648 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,-62 ,2147483648 ,-62 ,-62 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-62 ,-62 ,2147483648 }, + {2147483648 ,-66 ,-66 ,-66 ,-66 ,-66 ,2147483648 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,-66 ,2147483648 ,-66 ,-66 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-66 ,-66 ,2147483648 }, + {2147483648 ,-60 ,-60 ,-60 ,-60 ,-60 ,2147483648 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,-60 ,2147483648 ,-60 ,-60 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-60 ,-60 ,2147483648 }, + {2147483648 ,-91 ,-91 ,-91 ,-91 ,-91 ,2147483648 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,-91 ,2147483648 ,-91 ,-91 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-91 ,-91 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,210 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-70 ,-70 ,-70 ,-70 ,-70 ,2147483648 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,-70 ,2147483648 ,-70 ,-70 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-70 ,-70 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-130 ,2147483648 ,2147483648 ,273 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,350 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,351 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,352 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,353 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,354 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-116 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,355 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,356 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,357 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,358 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-124 ,-124 ,-124 ,-124 ,-124 ,2147483648 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,-124 ,2147483648 ,-124 ,-124 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-124 ,-124 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,359 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,360 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,361 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,362 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,363 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,364 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-129 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-82 ,-82 ,-82 ,-82 ,-82 ,2147483648 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,-82 ,2147483648 ,-82 ,-82 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-82 ,-82 ,2147483648 }, + {2147483648 ,-92 ,-92 ,-92 ,-92 ,-92 ,2147483648 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,-92 ,2147483648 ,-92 ,-92 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-92 ,-92 ,2147483648 }, + {2147483648 ,-83 ,-83 ,-83 ,-83 ,-83 ,2147483648 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,-83 ,2147483648 ,-83 ,-83 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-83 ,-83 ,2147483648 }, + {2147483648 ,-80 ,-80 ,-80 ,-80 ,-80 ,2147483648 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,-80 ,2147483648 ,-80 ,-80 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-80 ,-80 ,2147483648 }, + {2147483648 ,-81 ,-81 ,-81 ,-81 ,-81 ,2147483648 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,-81 ,2147483648 ,-81 ,-81 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-81 ,-81 ,2147483648 }, + {2147483648 ,-88 ,-88 ,-88 ,-88 ,-88 ,2147483648 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,-88 ,2147483648 ,-88 ,-88 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-88 ,-88 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-78 ,-78 ,-78 ,-78 ,-78 ,2147483648 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,-78 ,2147483648 ,-78 ,-78 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-78 ,-78 ,2147483648 }, + {2147483648 ,-85 ,-85 ,-85 ,-85 ,-85 ,2147483648 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,-85 ,2147483648 ,-85 ,-85 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-85 ,-85 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-84 ,-84 ,-84 ,-84 ,-84 ,2147483648 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,-84 ,2147483648 ,-84 ,-84 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-84 ,-84 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,-77 ,-77 ,-77 ,-77 ,-77 ,2147483648 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,-77 ,2147483648 ,-77 ,-77 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-77 ,-77 ,2147483648 }, + {2147483648 ,-79 ,-79 ,-79 ,-79 ,-79 ,2147483648 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,-79 ,2147483648 ,-79 ,-79 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-79 ,-79 ,2147483648 }, + {56 ,2147483648 ,2147483648 ,2147483648 ,42 ,2147483648 ,48 ,2147483648 ,23 ,60 ,2147483648 ,22 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,73 ,68 ,52 ,64 ,31 ,41 ,34 ,28 ,27 ,46 ,49 ,2147483648 ,2147483648 ,2147483648 ,61 ,50 ,62 ,67 ,39 ,69 ,80 ,63 ,43 ,76 ,79 ,36 ,55 ,26 ,78 ,71 ,84 ,57 ,66 ,86 ,65 ,47 ,40 ,45 ,32 ,35 ,24 ,77 ,83 ,20 ,44 ,53 ,29 ,54 ,70 ,38 ,19 ,33 ,74 ,37 ,72 ,81 ,59 ,51 ,25 ,85 ,2147483648 ,58 ,21 ,82 ,75 ,2147483648 ,2147483648 ,30 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,369 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,370 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,371 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,372 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 }, + {2147483648 ,-89 ,-89 ,-89 ,-89 ,-89 ,2147483648 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,-89 ,2147483648 ,-89 ,-89 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-89 ,-89 ,2147483648 }, + {2147483648 ,-86 ,-86 ,-86 ,-86 ,-86 ,2147483648 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,-86 ,2147483648 ,-86 ,-86 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-86 ,-86 ,2147483648 }, + {2147483648 ,-93 ,-93 ,-93 ,-93 ,-93 ,2147483648 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,-93 ,2147483648 ,-93 ,-93 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-93 ,-93 ,2147483648 }, + {2147483648 ,-90 ,-90 ,-90 ,-90 ,-90 ,2147483648 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,-90 ,2147483648 ,-90 ,-90 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,2147483648 ,-90 ,-90 ,2147483648 } }; const struct _SCRIPT_ENGINE_TOKEN LalrSemanticRules[RULES_COUNT]= { {UNKNOWN, ""}, {UNKNOWN, ""}, - {SEMANTIC_RULE, "@OR"}, + {SEMANTIC_RULE, "@LOGICAL_OR_END"}, {UNKNOWN, ""}, - {SEMANTIC_RULE, "@AND"}, + {SEMANTIC_RULE, "@LOGICAL_OR_BEGIN"}, + {SEMANTIC_RULE, "@LOGICAL_AND_END"}, {UNKNOWN, ""}, + {SEMANTIC_RULE, "@LOGICAL_AND_BEGIN"}, {SEMANTIC_RULE, "@OR"}, {UNKNOWN, ""}, {SEMANTIC_RULE, "@XOR"}, @@ -3141,8 +3383,10 @@ const struct _SCRIPT_ENGINE_TOKEN LalrSemanticRules[RULES_COUNT]= {SEMANTIC_RULE, "@NEG"}, {UNKNOWN, ""}, {SEMANTIC_RULE, "@NOT"}, + {SEMANTIC_RULE, "@LOGICAL_NOT_TYPED"}, {SEMANTIC_RULE, "@POI"}, {SEMANTIC_RULE, "@REFERENCE"}, + {UNKNOWN, ""}, {SEMANTIC_RULE, "@RDTSC"}, {SEMANTIC_RULE, "@RDTSCP"}, {SEMANTIC_RULE, "@LBR_SAVE"}, @@ -3210,6 +3454,22 @@ const struct _SCRIPT_ENGINE_TOKEN LalrSemanticRules[RULES_COUNT]= {SEMANTIC_RULE, "@PUSH"}, {SEMANTIC_RULE, "@PUSH"}, {SEMANTIC_RULE, "@END_OF_CALLING_USER_DEFINED_FUNCTION_WITH_RETURNING_VALUE"}, + {SEMANTIC_RULE, "@CAST_SCALAR"}, + {SEMANTIC_RULE, "@CAST_SCALAR"}, + {UNKNOWN, ""}, + {SEMANTIC_RULE, "@PUSH"}, + {SEMANTIC_RULE, "@PUSH"}, + {SEMANTIC_RULE, "@DECLARE_POINTER_TYPE"}, + {UNKNOWN, ""}, + {SEMANTIC_RULE, "@DECLARE_POINTER_TYPE"}, + {UNKNOWN, ""}, + {SEMANTIC_RULE, "@PUSH"}, + {SEMANTIC_RULE, "@SIZEOF_BEGIN"}, + {UNKNOWN, ""}, + {SEMANTIC_RULE, "@SIZEOF_EXPRESSION"}, + {SEMANTIC_RULE, "@SIZEOF_TYPE"}, + {SEMANTIC_RULE, "@SIZEOF_TYPE"}, + {SEMANTIC_RULE, "@SIZEOF_EXPRESSION"}, {SEMANTIC_RULE, "@PUSH"}, {SEMANTIC_RULE, "@PUSH"}, {UNKNOWN, ""}, diff --git a/hyperdbg/script-engine/code/scanner.c b/hyperdbg/script-engine/code/scanner.c index 0aaffbfd..1ede9f62 100644 --- a/hyperdbg/script-engine/code/scanner.c +++ b/hyperdbg/script-engine/code/scanner.c @@ -318,7 +318,7 @@ GetToken(char * c, char * str) else { strcpy(Token->Value, "!"); - Token->Type = UNKNOWN; + Token->Type = SPECIAL_TOKEN; return Token; } case '%': @@ -541,6 +541,7 @@ GetToken(char * c, char * str) { Token->Type = GLOBAL_ID; Token->VariableType = GetGlobalIdentifierVariableType(Token); + Token->IsImplicitType = GetGlobalIdentifierIsImplicitType(Token); } else { @@ -827,6 +828,10 @@ GetToken(char * c, char * str) { Token->Type = SCRIPT_VARIABLE_TYPE; } + else if ((Token->VariableType = FindTypedefType(Token->Value)) != NULL) + { + Token->Type = SCRIPT_VARIABLE_TYPE; + } else { BOOLEAN WasFound = FALSE; @@ -866,6 +871,7 @@ GetToken(char * c, char * str) { Token->Type = LOCAL_ID; Token->VariableType = GetLocalIdentifierVariableType(Token); + Token->IsImplicitType = GetLocalIdentifierIsImplicitType(Token); } else { @@ -890,6 +896,10 @@ GetToken(char * c, char * str) { Token->Type = SCRIPT_VARIABLE_TYPE; } + else if ((Token->VariableType = FindTypedefType(Token->Value)) != NULL) + { + Token->Type = SCRIPT_VARIABLE_TYPE; + } else if (IsId(Token->Value)) { BOOLEAN WasFound = FALSE; @@ -929,6 +939,7 @@ GetToken(char * c, char * str) { Token->Type = LOCAL_ID; Token->VariableType = GetLocalIdentifierVariableType(Token); + Token->IsImplicitType = GetLocalIdentifierIsImplicitType(Token); } else { @@ -965,6 +976,10 @@ GetToken(char * c, char * str) { Token->Type = SCRIPT_VARIABLE_TYPE; } + else if ((Token->VariableType = FindTypedefType(Token->Value)) != NULL) + { + Token->Type = SCRIPT_VARIABLE_TYPE; + } else { BOOLEAN WasFound = FALSE; @@ -1004,6 +1019,7 @@ GetToken(char * c, char * str) { Token->Type = LOCAL_ID; Token->VariableType = GetLocalIdentifierVariableType(Token); + Token->IsImplicitType = GetLocalIdentifierIsImplicitType(Token); } else { diff --git a/hyperdbg/script-engine/code/script-engine.c b/hyperdbg/script-engine/code/script-engine.c index 1252af28..331f737d 100644 --- a/hyperdbg/script-engine/code/script-engine.c +++ b/hyperdbg/script-engine/code/script-engine.c @@ -43,6 +43,247 @@ static PVARIABLE_TYPE CurrentStructDefinition; static PSCRIPT_ENGINE_TOKEN LastStructObject; static PVARIABLE_TYPE LastStructObjectType; +typedef struct _SIZEOF_COMPILATION_CONTEXT +{ + UINT32 CodePointer; + UINT64 MaxTempNumber; + CHAR TempMap[MAX_TEMP_COUNT]; +} SIZEOF_COMPILATION_CONTEXT; + +static SIZEOF_COMPILATION_CONTEXT SizeofContexts[16]; +static UINT32 SizeofContextCount; + +typedef struct _LOGICAL_COMPILATION_CONTEXT +{ + BOOLEAN IsOr; + UINT32 BeginJumpTargetIndex; + PSCRIPT_ENGINE_TOKEN ResultToken; +} LOGICAL_COMPILATION_CONTEXT; + +static LOGICAL_COMPILATION_CONTEXT LogicalContexts[16]; +static UINT32 LogicalContextCount; + +static UINT64 +GetScriptScalarTypeId(PVARIABLE_TYPE VariableType); + +static PVARIABLE_TYPE +ResolveIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token) +{ + PVARIABLE_TYPE VariableType = Token ? (PVARIABLE_TYPE)Token->VariableType : NULL; + + if (!Token) + { + return NULL; + } + + if (Token->Type == LOCAL_ID) + { + VariableType = GetLocalIdentifierVariableType(Token); + Token->IsImplicitType = GetLocalIdentifierIsImplicitType(Token); + } + else if (Token->Type == GLOBAL_ID) + { + VariableType = GetGlobalIdentifierVariableType(Token); + Token->IsImplicitType = GetGlobalIdentifierIsImplicitType(Token); + } + + if (VariableType) + { + Token->VariableType = VariableType; + } + + return VariableType; +} + +static PVARIABLE_TYPE +ResolveTypeNameFromStack(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, + PSCRIPT_ENGINE_ERROR_TYPE Error) +{ + UINT32 PointerDepth = 0; + PVARIABLE_TYPE BaseType; + + while (MatchedStack->Pointer && !strcmp(Top(MatchedStack)->Value, "@DECLARE_POINTER_TYPE")) + { + PSCRIPT_ENGINE_TOKEN PointerMarker = Pop(MatchedStack); + RemoveToken(&PointerMarker); + PointerDepth++; + } + + if (!MatchedStack->Pointer) + { + *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; + return VARIABLE_TYPE_UNKNOWN; + } + + if (Top(MatchedStack)->Type == SCRIPT_VARIABLE_TYPE) + { + BaseType = HandleType(MatchedStack); + } + else + { + PSCRIPT_ENGINE_TOKEN TagToken = Pop(MatchedStack); + BaseType = FindStructType(TagToken->Value); + RemoveToken(&TagToken); + } + + // LALR reductions execute their semantic action after the complete RHS, + // so abstract-declarator markers are below the reduced base-type token. + // The LL(1) grammar emits the same markers above it. Accept both stack + // layouts while preserving one serialized type representation. + while (MatchedStack->Pointer && !strcmp(Top(MatchedStack)->Value, "@DECLARE_POINTER_TYPE")) + { + PSCRIPT_ENGINE_TOKEN PointerMarker = Pop(MatchedStack); + RemoveToken(&PointerMarker); + PointerDepth++; + } + + if (!BaseType || BaseType->Kind == TY_UNKNOWN) + { + *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; + return VARIABLE_TYPE_UNKNOWN; + } + + while (PointerDepth--) + { + BaseType = CreatePointerType(BaseType); + if (!BaseType) + { + *Error = SCRIPT_ENGINE_ERROR_TEMP_LIST_FULL; + return VARIABLE_TYPE_UNKNOWN; + } + } + if (MatchedStack->Pointer && !strcmp(Top(MatchedStack)->Value, "@TYPE_NAME_BEGIN")) + { + PSCRIPT_ENGINE_TOKEN TypeMarker = Pop(MatchedStack); + RemoveToken(&TypeMarker); + } + return BaseType; +} + +static PSCRIPT_ENGINE_TOKEN +EmitTruthValue(PSYMBOL_BUFFER CodeBuffer, + PSCRIPT_ENGINE_TOKEN Operand, + PSCRIPT_ENGINE_ERROR_TYPE Error) +{ + PVARIABLE_TYPE OperandType = (PVARIABLE_TYPE)Operand->VariableType; + UINT64 TypeId = GetScriptScalarTypeId(OperandType); + PSCRIPT_ENGINE_TOKEN FirstTemp; + PSCRIPT_ENGINE_TOKEN ResultTemp; + PSYMBOL Symbol; + PSYMBOL OperandSymbol; + PSYMBOL FirstTempSymbol; + PSYMBOL ResultTempSymbol; + + if (TypeId == SCRIPT_SCALAR_TYPE_INVALID || TypeId == SCRIPT_SCALAR_TYPE_F80) + { + *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; + return NULL; + } + + FirstTemp = NewTemp(Error); + ResultTemp = NewTemp(Error); + if (!FirstTemp || !ResultTemp || *Error != SCRIPT_ENGINE_ERROR_FREE) + return NULL; + FirstTemp->VariableType = VARIABLE_TYPE_INT; + ResultTemp->VariableType = VARIABLE_TYPE_INT; + OperandSymbol = ToSymbol(Operand, Error); + FirstTempSymbol = ToSymbol(FirstTemp, Error); + ResultTempSymbol = ToSymbol(ResultTemp, Error); + Symbol = NewSymbol(); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_LOGICAL_NOT_TYPED; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, OperandSymbol); + PushSymbol(CodeBuffer, FirstTempSymbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = TypeId; + PushSymbol(CodeBuffer, Symbol); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_LOGICAL_NOT_TYPED; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, FirstTempSymbol); + PushSymbol(CodeBuffer, ResultTempSymbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = SCRIPT_SCALAR_TYPE_I32; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + FreeTemp(FirstTemp); + RemoveToken(&FirstTemp); + return ResultTemp; +} + +static PVARIABLE_TYPE +GetUnsignedTypeForAccessWidth(UINT32 AccessWidth) +{ + if (AccessWidth == 1) return VARIABLE_TYPE_UCHAR; + if (AccessWidth == 2) return VARIABLE_TYPE_USHORT; + if (AccessWidth == 4) return VARIABLE_TYPE_UINT; + if (AccessWidth == 8) return VARIABLE_TYPE_ULLONG; + return VARIABLE_TYPE_UNKNOWN; +} + +static PSCRIPT_ENGINE_TOKEN +EmitTypedScalarLoad(PSYMBOL_BUFFER CodeBuffer, + PSCRIPT_ENGINE_TOKEN AddressToken, + UINT32 AddressSpace, + PVARIABLE_TYPE DeclaredType, + PSCRIPT_ENGINE_ERROR_TYPE Error) +{ + PVARIABLE_TYPE RawType; + PSCRIPT_ENGINE_TOKEN RawTemp = NULL; + PSCRIPT_ENGINE_TOKEN ValueTemp; + PSCRIPT_ENGINE_TOKEN LoadDestination; + PSYMBOL Symbol; + BOOLEAN NeedsIntegerNormalization; + + RawType = GetUnsignedTypeForAccessWidth((UINT32)DeclaredType->Size); + if (RawType == VARIABLE_TYPE_UNKNOWN) + { + *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; + return NULL; + } + + ValueTemp = NewTemp(Error); + if (!ValueTemp || *Error != SCRIPT_ENGINE_ERROR_FREE) + return NULL; + ValueTemp->VariableType = DeclaredType; + NeedsIntegerNormalization = IsIntegerVariableType(DeclaredType) && + GetScriptScalarTypeId(RawType) != GetScriptScalarTypeId(DeclaredType); + if (NeedsIntegerNormalization) + { + RawTemp = NewTemp(Error); + if (!RawTemp || *Error != SCRIPT_ENGINE_ERROR_FREE) + { + FreeTemp(ValueTemp); + RemoveToken(&ValueTemp); + return NULL; + } + RawTemp->VariableType = RawType; + } + LoadDestination = RawTemp ? RawTemp : ValueTemp; + + Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_LOAD; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = ToSymbol(AddressToken, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = AddressSpace; PushSymbol(CodeBuffer, Symbol); + Symbol->Value = DeclaredType->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = ToSymbol(LoadDestination, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + + if (RawTemp) + { + Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = ToSymbol(RawTemp, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = ToSymbol(ValueTemp, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId(RawType); PushSymbol(CodeBuffer, Symbol); + Symbol->Value = GetScriptScalarTypeId(DeclaredType); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + FreeTemp(RawTemp); + RemoveToken(&RawTemp); + } + + return ValueTemp; +} + static UINT64 GetFloatingValueKind(PVARIABLE_TYPE VariableType) { @@ -65,6 +306,60 @@ IsFloatingVariableType(PVARIABLE_TYPE VariableType) return VariableType && (VariableType->Kind == TY_FLOAT || VariableType->Kind == TY_DOUBLE); } +static UINT64 +GetScriptScalarTypeId(PVARIABLE_TYPE VariableType) +{ + if (!VariableType) return SCRIPT_SCALAR_TYPE_INVALID; + if (VariableType->Kind == TY_BOOL) return SCRIPT_SCALAR_TYPE_BOOL; + if (VariableType->Kind == TY_CHAR) return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U8 : SCRIPT_SCALAR_TYPE_I8; + if (VariableType->Kind == TY_SHORT) return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U16 : SCRIPT_SCALAR_TYPE_I16; + if (VariableType->Kind == TY_INT || VariableType->Kind == TY_ENUM) return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U32 : SCRIPT_SCALAR_TYPE_I32; + if (VariableType->Kind == TY_LONG || VariableType->Kind == TY_LLONG) return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U64 : SCRIPT_SCALAR_TYPE_I64; + if (VariableType->Kind == TY_FLOAT) return SCRIPT_SCALAR_TYPE_F32; + if (VariableType->Kind == TY_DOUBLE) return SCRIPT_SCALAR_TYPE_F64; + if (VariableType->Kind == TY_PTR) return SCRIPT_SCALAR_TYPE_POINTER; + if (VariableType->Kind == TY_LDOUBLE) return SCRIPT_SCALAR_TYPE_F80; + return SCRIPT_SCALAR_TYPE_INVALID; +} + +static UINT64 +GetTypedBinaryOpcode(const CHAR * Operator) +{ + if (!strcmp(Operator, "@ADD")) return FUNC_ADD_TYPED; + if (!strcmp(Operator, "@SUB")) return FUNC_SUB_TYPED; + if (!strcmp(Operator, "@MUL")) return FUNC_MUL_TYPED; + if (!strcmp(Operator, "@DIV")) return FUNC_DIV_TYPED; + if (!strcmp(Operator, "@MOD")) return FUNC_MOD_TYPED; + if (!strcmp(Operator, "@AND")) return FUNC_BITWISE_AND_TYPED; + if (!strcmp(Operator, "@OR")) return FUNC_BITWISE_OR_TYPED; + if (!strcmp(Operator, "@XOR")) return FUNC_BITWISE_XOR_TYPED; + if (!strcmp(Operator, "@ASL")) return FUNC_SHIFT_LEFT_TYPED; + if (!strcmp(Operator, "@ASR")) return FUNC_SHIFT_RIGHT_TYPED; + if (!strcmp(Operator, "@GT")) return FUNC_GT_TYPED; + if (!strcmp(Operator, "@LT")) return FUNC_LT_TYPED; + if (!strcmp(Operator, "@EGT")) return FUNC_EGT_TYPED; + if (!strcmp(Operator, "@ELT")) return FUNC_ELT_TYPED; + if (!strcmp(Operator, "@EQUAL")) return FUNC_EQUAL_TYPED; + if (!strcmp(Operator, "@NEQ")) return FUNC_NEQ_TYPED; + return FUNC_UNDEFINED; +} + +static UINT64 +GetTypedAssignmentOpcode(const CHAR * Operator) +{ + if (!strcmp(Operator, "@ADD_ASSIGNMENT")) return FUNC_ADD_TYPED; + if (!strcmp(Operator, "@SUB_ASSIGNMENT")) return FUNC_SUB_TYPED; + if (!strcmp(Operator, "@MUL_ASSIGNMENT")) return FUNC_MUL_TYPED; + if (!strcmp(Operator, "@DIV_ASSIGNMENT")) return FUNC_DIV_TYPED; + if (!strcmp(Operator, "@MOD_ASSIGNMENT")) return FUNC_MOD_TYPED; + if (!strcmp(Operator, "@AND_ASSIGNMENT")) return FUNC_BITWISE_AND_TYPED; + if (!strcmp(Operator, "@OR_ASSIGNMENT")) return FUNC_BITWISE_OR_TYPED; + if (!strcmp(Operator, "@XOR_ASSIGNMENT")) return FUNC_BITWISE_XOR_TYPED; + if (!strcmp(Operator, "@ASL_ASSIGNMENT")) return FUNC_SHIFT_LEFT_TYPED; + if (!strcmp(Operator, "@ASR_ASSIGNMENT")) return FUNC_SHIFT_RIGHT_TYPED; + return FUNC_UNDEFINED; +} + static BOOLEAN IsFloatingComparisonOperator(const CHAR * Operator) { @@ -631,6 +926,8 @@ ScriptEngineParse(char * str) CurrentStructDefinition = NULL; LastStructObject = NULL; LastStructObjectType = NULL; + SizeofContextCount = 0; + LogicalContextCount = 0; PSCRIPT_ENGINE_TOKEN_LIST Stack = NewTokenList(); PSCRIPT_ENGINE_TOKEN_LIST MatchedStack = NewTokenList(); @@ -1038,7 +1335,258 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI while (TRUE) { - if (!strcmp(Operator->Value, "@STRUCT_POINTER")) + if (!strcmp(Operator->Value, "@TYPE_NAME_BEGIN")) + { + Push(MatchedStack, CopyToken(Operator)); + } + else if (!strcmp(Operator->Value, "@SIZEOF_BEGIN")) + { + if (SizeofContextCount >= 16) + { + *Error = SCRIPT_ENGINE_ERROR_SYNTAX; + break; + } + SizeofContexts[SizeofContextCount].CodePointer = CodeBuffer->Pointer; + SizeofContexts[SizeofContextCount].MaxTempNumber = CurrentUserDefinedFunction->MaxTempNumber; + memcpy(SizeofContexts[SizeofContextCount].TempMap, + CurrentUserDefinedFunction->TempMap, + MAX_TEMP_COUNT); + SizeofContextCount++; + } + else if (!strcmp(Operator->Value, "@SIZEOF_EXPRESSION")) + { + CHAR SizeText[32]; + PVARIABLE_TYPE OperandType; + PSCRIPT_ENGINE_TOKEN SizeToken; + if (!SizeofContextCount || !MatchedStack->Pointer) + { + *Error = SCRIPT_ENGINE_ERROR_SYNTAX; + break; + } + Op0 = Pop(MatchedStack); + OperandType = (PVARIABLE_TYPE)Op0->VariableType; + SizeofContextCount--; + CodeBuffer->Pointer = SizeofContexts[SizeofContextCount].CodePointer; + CurrentUserDefinedFunction->MaxTempNumber = SizeofContexts[SizeofContextCount].MaxTempNumber; + memcpy(CurrentUserDefinedFunction->TempMap, + SizeofContexts[SizeofContextCount].TempMap, + MAX_TEMP_COUNT); + if (!OperandType || OperandType->Kind == TY_VOID || OperandType->Kind == TY_FUNC || + (OperandType->Kind == TY_STRUCT && !OperandType->IsComplete) || OperandType->Size <= 0) + { + RemoveToken(&Op0); + *Error = SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE; + break; + } + _snprintf_s(SizeText, sizeof(SizeText), _TRUNCATE, "%d", OperandType->Size); + SizeToken = NewToken(DECIMAL, SizeText); + SizeToken->VariableType = VARIABLE_TYPE_ULLONG; + RemoveToken(&Op0); + Push(MatchedStack, SizeToken); + } + else if (!strcmp(Operator->Value, "@SIZEOF_TYPE")) + { + CHAR SizeText[32]; + PSCRIPT_ENGINE_TOKEN SizeToken; + PVARIABLE_TYPE ResolvedType = ResolveTypeNameFromStack(MatchedStack, Error); + if (*Error != SCRIPT_ENGINE_ERROR_FREE) + break; + if (ResolvedType->Kind == TY_VOID || ResolvedType->Kind == TY_FUNC || + (ResolvedType->Kind == TY_STRUCT && !ResolvedType->IsComplete) || ResolvedType->Size <= 0) + { + *Error = SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE; + break; + } + _snprintf_s(SizeText, sizeof(SizeText), _TRUNCATE, "%d", ResolvedType->Size); + SizeToken = NewToken(DECIMAL, SizeText); + SizeToken->VariableType = VARIABLE_TYPE_ULLONG; + Push(MatchedStack, SizeToken); + } + else if (!strcmp(Operator->Value, "@CAST_SCALAR")) + { + PVARIABLE_TYPE SourceType; + PVARIABLE_TYPE DestinationType; + UINT64 SourceTypeId; + UINT64 DestinationTypeId; + PSYMBOL TypeSymbol; + + Op0 = Pop(MatchedStack); + DestinationType = ResolveTypeNameFromStack(MatchedStack, Error); + SourceType = (PVARIABLE_TYPE)Op0->VariableType; + SourceTypeId = GetScriptScalarTypeId(SourceType); + DestinationTypeId = GetScriptScalarTypeId(DestinationType); + if (*Error != SCRIPT_ENGINE_ERROR_FREE || SourceTypeId == SCRIPT_SCALAR_TYPE_INVALID || + DestinationTypeId == SCRIPT_SCALAR_TYPE_INVALID || SourceTypeId == SCRIPT_SCALAR_TYPE_F80 || + DestinationTypeId == SCRIPT_SCALAR_TYPE_F80 || + ((SourceTypeId == SCRIPT_SCALAR_TYPE_POINTER || DestinationTypeId == SCRIPT_SCALAR_TYPE_POINTER) && + (IsFloatingVariableType(SourceType) || IsFloatingVariableType(DestinationType)))) + { + RemoveToken(&Op0); + *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; + break; + } + + if (DestinationType->Kind == TY_PTR) + { + DestinationType->PointerProvenance = SourceType->Kind == TY_PTR ? + SourceType->PointerProvenance : POINTER_PROVENANCE_REMOTE; + } + + Op0Symbol = ToSymbol(Op0, Error); + if (Op0->Type == FLOAT_LITERAL) + { + UINT64 SourceKind = GetFloatingValueKind(SourceType); + if (!ParseFloatingLiteral(Op0->Value, SourceKind, &Op0Symbol->Value, Error)) + { + RemoveToken(&Op0); + break; + } + Op0Symbol->Len = SourceKind; + } + Temp = NewTemp(Error); + Temp->VariableType = DestinationType; + TempSymbol = ToSymbol(Temp, Error); + TempSymbol->Len = GetFloatingValueKind(DestinationType); + OperatorSymbol->Value = FUNC_CAST_SCALAR; + PushSymbol(CodeBuffer, OperatorSymbol); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, TempSymbol); + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = SourceTypeId; + PushSymbol(CodeBuffer, TypeSymbol); + TypeSymbol->Value = DestinationTypeId; + PushSymbol(CodeBuffer, TypeSymbol); + RemoveSymbol(&TypeSymbol); + FreeTemp(Op0); + RemoveToken(&Op0); + Push(MatchedStack, Temp); + } + else if (!strcmp(Operator->Value, "@LOGICAL_NOT_TYPED")) + { + PSYMBOL TypeSymbol; + Op0 = Pop(MatchedStack); + VariableType = (PVARIABLE_TYPE)Op0->VariableType; + if (GetScriptScalarTypeId(VariableType) == SCRIPT_SCALAR_TYPE_INVALID || VariableType->Kind == TY_LDOUBLE) + { + RemoveToken(&Op0); + *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; + break; + } + Op0Symbol = ToSymbol(Op0, Error); + Temp = NewTemp(Error); + Temp->VariableType = VARIABLE_TYPE_INT; + TempSymbol = ToSymbol(Temp, Error); + OperatorSymbol->Value = FUNC_LOGICAL_NOT_TYPED; + PushSymbol(CodeBuffer, OperatorSymbol); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, TempSymbol); + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = GetScriptScalarTypeId(VariableType); + PushSymbol(CodeBuffer, TypeSymbol); + RemoveSymbol(&TypeSymbol); + FreeTemp(Op0); + RemoveToken(&Op0); + Push(MatchedStack, Temp); + } + else if (!strcmp(Operator->Value, "@LOGICAL_OR_BEGIN") || + !strcmp(Operator->Value, "@LOGICAL_AND_BEGIN")) + { + PSCRIPT_ENGINE_TOKEN TruthToken; + PSYMBOL TruthSymbol; + PSYMBOL ResultSymbol; + PSYMBOL Symbol; + if (!MatchedStack->Pointer || LogicalContextCount >= 16) + { + *Error = SCRIPT_ENGINE_ERROR_SYNTAX; + break; + } + TruthToken = EmitTruthValue(CodeBuffer, Top(MatchedStack), Error); + if (!TruthToken || *Error != SCRIPT_ENGINE_ERROR_FREE) + break; + TruthSymbol = ToSymbol(TruthToken, Error); + LogicalContexts[LogicalContextCount].IsOr = !strcmp(Operator->Value, "@LOGICAL_OR_BEGIN"); + LogicalContexts[LogicalContextCount].ResultToken = NewTemp(Error); + LogicalContexts[LogicalContextCount].ResultToken->VariableType = VARIABLE_TYPE_INT; + ResultSymbol = ToSymbol(LogicalContexts[LogicalContextCount].ResultToken, Error); + Symbol = NewSymbol(); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_MOV; + PushSymbol(CodeBuffer, Symbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = LogicalContexts[LogicalContextCount].IsOr ? 1 : 0; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, ResultSymbol); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = LogicalContexts[LogicalContextCount].IsOr ? FUNC_JNZ : FUNC_JZ; + PushSymbol(CodeBuffer, Symbol); + LogicalContexts[LogicalContextCount].BeginJumpTargetIndex = CodeBuffer->Pointer; + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = 0; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, TruthSymbol); + RemoveSymbol(&Symbol); + FreeTemp(TruthToken); + RemoveToken(&TruthToken); + LogicalContextCount++; + } + else if (!strcmp(Operator->Value, "@LOGICAL_OR_END") || + !strcmp(Operator->Value, "@LOGICAL_AND_END")) + { + LOGICAL_COMPILATION_CONTEXT * Context; + PSCRIPT_ENGINE_TOKEN TruthToken; + PSYMBOL TruthSymbol; + PSYMBOL ResultSymbol; + PSYMBOL Symbol; + UINT32 EndJumpTargetIndex; + if (!LogicalContextCount || MatchedStack->Pointer < 2) + { + *Error = SCRIPT_ENGINE_ERROR_SYNTAX; + break; + } + LogicalContextCount--; + Context = &LogicalContexts[LogicalContextCount]; + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); + TruthToken = EmitTruthValue(CodeBuffer, Op0, Error); + if (!TruthToken || *Error != SCRIPT_ENGINE_ERROR_FREE) + break; + TruthSymbol = ToSymbol(TruthToken, Error); + ResultSymbol = ToSymbol(Context->ResultToken, Error); + Symbol = NewSymbol(); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = Context->IsOr ? FUNC_JNZ : FUNC_JZ; + PushSymbol(CodeBuffer, Symbol); + EndJumpTargetIndex = CodeBuffer->Pointer; + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = 0; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, TruthSymbol); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_MOV; + PushSymbol(CodeBuffer, Symbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Context->IsOr ? 0 : 1; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, ResultSymbol); + RemoveSymbol(&Symbol); + + CodeBuffer->Head[Context->BeginJumpTargetIndex].Value = CodeBuffer->Pointer; + CodeBuffer->Head[EndJumpTargetIndex].Value = CodeBuffer->Pointer; + FreeTemp(TruthToken); + RemoveToken(&TruthToken); + FreeTemp(Op0); + FreeTemp(Op1); + RemoveToken(&Op0); + RemoveToken(&Op1); + Push(MatchedStack, Context->ResultToken); + } + else if (!strcmp(Operator->Value, "@STRUCT_POINTER")) { StructPointerDepth++; } @@ -1378,13 +1926,12 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI FreeTemp(Temp); break; } - ValueTemp = NewTemp(Error); - ValueTemp->VariableType = Member->Type; - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_LOAD; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Temp->AddressSpace; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Member->Type->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(ValueTemp, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + ValueTemp = EmitTypedScalarLoad(CodeBuffer, Temp, Temp->AddressSpace, Member->Type, Error); + if (!ValueTemp || *Error != SCRIPT_ENGINE_ERROR_FREE) + { + FreeTemp(Temp); + break; + } FreeTemp(Temp); Push(MatchedStack, ValueTemp); } @@ -1870,6 +2417,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI // Add return variable symbol // Temp = NewTemp(Error); + Temp->VariableType = (PVARIABLE_TYPE)Node->VariableType; Push(MatchedStack, Temp); Symbol = NewSymbol(); @@ -1900,6 +2448,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { int Op1Capacity = 8; int Op1Count = 0; + BOOLEAN HasExplicitDestinationType = FALSE; PSCRIPT_ENGINE_TOKEN * Op1Array = (PSCRIPT_ENGINE_TOKEN *)malloc(sizeof(PSCRIPT_ENGINE_TOKEN) * Op1Capacity); PSYMBOL Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; @@ -1908,6 +2457,17 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); + for (unsigned int i = 0; i < MatchedStack->Pointer; i++) + { + PSCRIPT_ENGINE_TOKEN Candidate = *(MatchedStack->Head + i); + if (Candidate->Type == SCRIPT_VARIABLE_TYPE || + !strcmp(Candidate->Value, "@DECLARE_POINTER_TYPE")) + { + HasExplicitDestinationType = TRUE; + break; + } + } + for (int i = MatchedStack->Pointer; i > 0; i--) { Op1 = Top(MatchedStack); @@ -1927,6 +2487,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (Op1->Type == GLOBAL_UNRESOLVED_ID) { + Op1->VariableType = GetDefaultImplicitVariableType(); + Op1->IsImplicitType = !HasExplicitDestinationType; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, Op0Symbol); @@ -1934,11 +2496,14 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI free((void *)Op1Symbol->Value); Op1Symbol->Value = NewGlobalIdentifier(Op1); SetType(&Op1Symbol->Type, SYMBOL_GLOBAL_ID_TYPE); + SetGlobalIdentifierVariableType(Op1, GetDefaultImplicitVariableType()); Pop(MatchedStack); PushSymbol(CodeBuffer, Op1Symbol); } else if (Op1->Type == LOCAL_UNRESOLVED_ID) { + Op1->VariableType = GetDefaultImplicitVariableType(); + Op1->IsImplicitType = !HasExplicitDestinationType; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, Op0Symbol); @@ -1946,6 +2511,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI free((void *)Op1Symbol->Value); Op1Symbol->Value = NewLocalIdentifier(Op1, 8); SetType(&Op1Symbol->Type, SYMBOL_LOCAL_ID_TYPE); + SetLocalIdentifierVariableType(Op1, GetDefaultImplicitVariableType()); Pop(MatchedStack); PushSymbol(CodeBuffer, Op1Symbol); RemoveSymbol(&Op1Symbol); @@ -2133,17 +2699,27 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (!strcmp(Operator->Value, "@ARRAY_INDEX_READ")) { - Symbol = NewSymbol(); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; - Symbol->Value = FUNC_POI; - PushSymbol(CodeBuffer, Symbol); - - PushSymbol(CodeBuffer, OffsetSymbol); - PushSymbol(CodeBuffer, OffsetSymbol); + PSCRIPT_ENGINE_TOKEN ValueToken = EmitTypedScalarLoad( + CodeBuffer, + OffsetToken, + IdToken->AddressSpace ? IdToken->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL, + VariableType, + Error); + if (!ValueToken || *Error != SCRIPT_ENGINE_ERROR_FREE) + { + break; + } + FreeTemp(OffsetToken); + RemoveToken(&OffsetToken); + OffsetToken = ValueToken; } else if (!strcmp(Operator->Value, "@ARRAY_INDEX_WRITE")) { OffsetToken->Type = DEFERENCE_TEMP; + OffsetToken->VariableType = VariableType; + OffsetToken->IsAddress = TRUE; + OffsetToken->AddressSpace = IdToken->AddressSpace ? + IdToken->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; } Push(MatchedStack, OffsetToken); @@ -2153,25 +2729,38 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI else if (!strcmp(Operator->Value, "@MOV")) { BOOLEAN IsFloatingInitialization = FALSE; + BOOLEAN ScalarAssignmentConverted = FALSE; + BOOLEAN HasExplicitDestinationType = FALSE; + PSCRIPT_ENGINE_TOKEN ConvertedTemp = NULL; + PSYMBOL ConvertedTempSymbol = NULL; PushSymbol(CodeBuffer, OperatorSymbol); Op0 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); Op1 = Pop(MatchedStack); + HasExplicitDestinationType = MatchedStack->Pointer > 0 && + (!strcmp(Top(MatchedStack)->Value, "@DECLARE_POINTER_TYPE") || + Top(MatchedStack)->Type == SCRIPT_VARIABLE_TYPE); if (Op1->Type == GLOBAL_UNRESOLVED_ID) { + Op1->VariableType = GetDefaultImplicitVariableType(); + Op1->IsImplicitType = !HasExplicitDestinationType; Op1Symbol = NewSymbol(); free((void *)Op1Symbol->Value); Op1Symbol->Value = NewGlobalIdentifier(Op1); SetType(&Op1Symbol->Type, SYMBOL_GLOBAL_ID_TYPE); + SetGlobalIdentifierVariableType(Op1, GetDefaultImplicitVariableType()); } else if (Op1->Type == LOCAL_UNRESOLVED_ID) { + Op1->VariableType = GetDefaultImplicitVariableType(); + Op1->IsImplicitType = !HasExplicitDestinationType; Op1Symbol = NewSymbol(); free((void *)Op1Symbol->Value); Op1Symbol->Value = NewLocalIdentifier(Op1, 8); SetType(&Op1Symbol->Type, SYMBOL_LOCAL_ID_TYPE); + SetLocalIdentifierVariableType(Op1, GetDefaultImplicitVariableType()); } else { @@ -2220,7 +2809,59 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } } - if (IsFloatingInitialization) + if (Op0->VariableType && Op1->VariableType) + { + UINT64 SourceTypeId = GetScriptScalarTypeId((PVARIABLE_TYPE)Op0->VariableType); + UINT64 DestinationTypeId = GetScriptScalarTypeId((PVARIABLE_TYPE)Op1->VariableType); + BOOLEAN PointerConversionAllowed = TRUE; + + if (SourceTypeId == SCRIPT_SCALAR_TYPE_POINTER && DestinationTypeId != SCRIPT_SCALAR_TYPE_POINTER && + !(Op1->IsImplicitType && DestinationTypeId == SCRIPT_SCALAR_TYPE_U64)) + PointerConversionAllowed = FALSE; + if (DestinationTypeId == SCRIPT_SCALAR_TYPE_POINTER && SourceTypeId != SCRIPT_SCALAR_TYPE_POINTER && + !((Op0->Type == HEX || Op0->Type == OCTAL || Op0->Type == BINARY || Op0->Type == DECIMAL) && + Op0Symbol->Value == 0)) + PointerConversionAllowed = FALSE; + + if (SourceTypeId != SCRIPT_SCALAR_TYPE_INVALID && DestinationTypeId != SCRIPT_SCALAR_TYPE_INVALID && + SourceTypeId != SCRIPT_SCALAR_TYPE_F80 && DestinationTypeId != SCRIPT_SCALAR_TYPE_F80 && + PointerConversionAllowed && SourceTypeId != DestinationTypeId && + !(Op0->Type == FLOAT_LITERAL && IsFloatingVariableType((PVARIABLE_TYPE)Op1->VariableType))) + { + PSYMBOL TypeSymbol; + if (Op0->Type == FLOAT_LITERAL) + { + UINT64 SourceKind = GetFloatingValueKind((PVARIABLE_TYPE)Op0->VariableType); + if (!ParseFloatingLiteral(Op0->Value, SourceKind, &Op0Symbol->Value, Error)) + break; + Op0Symbol->Len = SourceKind; + } + + ConvertedTemp = NewTemp(Error); + ConvertedTemp->VariableType = (PVARIABLE_TYPE)Op1->VariableType; + ConvertedTempSymbol = ToSymbol(ConvertedTemp, Error); + ConvertedTempSymbol->Len = GetFloatingValueKind((PVARIABLE_TYPE)Op1->VariableType); + + (CodeBuffer->Head + CodeBuffer->Pointer - 1)->Value = FUNC_CAST_SCALAR; + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, ConvertedTempSymbol); + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = SourceTypeId; + PushSymbol(CodeBuffer, TypeSymbol); + TypeSymbol->Value = DestinationTypeId; + PushSymbol(CodeBuffer, TypeSymbol); + RemoveSymbol(&TypeSymbol); + ScalarAssignmentConverted = TRUE; + } + else if (!PointerConversionAllowed) + { + *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; + break; + } + } + + if (!ScalarAssignmentConverted && IsFloatingInitialization) { UINT64 ValueKind = GetFloatingValueKind(VariableType); BOOLEAN RequiresConversion = FALSE; @@ -2296,6 +2937,36 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op0->AddressSpace ? Op0->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = ((PVARIABLE_TYPE)Op0->VariableType)->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); } + else if (ScalarAssignmentConverted) + { + PSYMBOL Symbol = NewSymbol(); + if (Op1->IsAddress) + { + PVARIABLE_TYPE DestinationType = (PVARIABLE_TYPE)Op1->VariableType; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_TYPED_STORE; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, ConvertedTempSymbol); + PushSymbol(CodeBuffer, Op1Symbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Op1->AddressSpace; + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = DestinationType->Size; + PushSymbol(CodeBuffer, Symbol); + } + else + { + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = IsFloatingVariableType((PVARIABLE_TYPE)Op1->VariableType) ? + FUNC_MOV_FLOAT : FUNC_MOV; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, ConvertedTempSymbol); + Op1Symbol->Len = GetFloatingValueKind((PVARIABLE_TYPE)Op1->VariableType); + PushSymbol(CodeBuffer, Op1Symbol); + } + RemoveSymbol(&Symbol); + FreeTemp(ConvertedTemp); + } else if (Op1->IsAddress) { PSYMBOL Symbol; @@ -2459,7 +3130,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (!VariableType) { - VariableType = VARIABLE_TYPE_LONG; + VariableType = GetDefaultImplicitVariableType(); } BaseTypeSize = VariableType->Size; @@ -2649,7 +3320,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI unsigned int AddressSpace; Op0 = Pop(MatchedStack); - if (!Op0->VariableType) + if (!ResolveIdentifierVariableType(Op0)) { *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; RemoveToken(&Op0); @@ -2756,6 +3427,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { VariableType = (VARIABLE_TYPE *)Op0->VariableType; Op0Symbol = ToSymbol(Op0, Error); + BOOLEAN IsTypedIntegerUnary = FALSE; if (!strcmp(Operator->Value, "@NEG") && VariableType && @@ -2763,15 +3435,33 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { OperatorSymbol->Value = FUNC_NEG_FLOAT; } + else if (IsIntegerVariableType(VariableType) && + (!strcmp(Operator->Value, "@NEG") || !strcmp(Operator->Value, "@NOT"))) + { + VariableType = PromoteIntegerVariableType(VariableType); + OperatorSymbol->Value = !strcmp(Operator->Value, "@NEG") ? + FUNC_NEG_TYPED : FUNC_BITWISE_NOT_TYPED; + IsTypedIntegerUnary = TRUE; + } PushSymbol(CodeBuffer, OperatorSymbol); Temp = NewTemp(Error); - Temp->VariableType = VariableType; + Temp->VariableType = (!strcmp(Operator->Value, "@NEG") || + !strcmp(Operator->Value, "@NOT")) ? + VariableType : GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, TempSymbol); + if (IsTypedIntegerUnary) + { + PSYMBOL TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = GetScriptScalarTypeId(VariableType); + PushSymbol(CodeBuffer, TypeSymbol); + RemoveSymbol(&TypeSymbol); + } FreeTemp(Op0); if (*Error != SCRIPT_ENGINE_ERROR_FREE) @@ -2912,6 +3602,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, OperatorSymbol); Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -2943,6 +3634,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -2991,6 +3683,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op2Symbol); Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -3041,6 +3734,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (Op1->IsAddress && ((VARIABLE_TYPE *)Op1->VariableType)->Kind != TY_PTR) { PVARIABLE_TYPE LValueType = (PVARIABLE_TYPE)Op1->VariableType; + PVARIABLE_TYPE CommonType; + UINT64 TypedOpcode; + PSCRIPT_ENGINE_TOKEN LoadedValue; PSYMBOL Symbol; if (LValueType->Size != 1 && LValueType->Size != 2 && @@ -3055,34 +3751,80 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0 = Pop(MatchedStack); Op1 = Pop(MatchedStack); - Temp = NewTemp(Error); - if (*Error != SCRIPT_ENGINE_ERROR_FREE) + LoadedValue = EmitTypedScalarLoad(CodeBuffer, + Op1, + Op1->AddressSpace, + LValueType, + Error); + if (!LoadedValue || *Error != SCRIPT_ENGINE_ERROR_FREE) { Handled = TRUE; break; } - Temp->VariableType = LValueType; - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_LOAD; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Op1Symbol = ToSymbol(Op1, Error); PushSymbol(CodeBuffer, Op1Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = LValueType->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); + CommonType = GetCommonVariableType((PVARIABLE_TYPE)Op0->VariableType, LValueType); + TypedOpcode = GetTypedAssignmentOpcode(Operator->Value); + Op0Symbol = ToSymbol(Op0, Error); + Op1Symbol = ToSymbol(Op1, Error); - PushSymbol(CodeBuffer, OperatorSymbol); - Op0Symbol = ToSymbol(Op0, Error); PushSymbol(CodeBuffer, Op0Symbol); - PushSymbol(CodeBuffer, TempSymbol); - PushSymbol(CodeBuffer, TempSymbol); + if (IsIntegerVariableType(CommonType) && TypedOpcode != FUNC_UNDEFINED && + IsIntegerVariableType(LValueType)) + { + PSCRIPT_ENGINE_TOKEN OperationTemp = NewTemp(Error); + PSCRIPT_ENGINE_TOKEN CastTemp = NewTemp(Error); + PSYMBOL OperationTempSymbol; + PSYMBOL CastTempSymbol; + PSYMBOL LoadedValueSymbol; - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_STORE; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - PushSymbol(CodeBuffer, TempSymbol); - PushSymbol(CodeBuffer, Op1Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = LValueType->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + OperationTemp->VariableType = CommonType; + CastTemp->VariableType = LValueType; + OperationTempSymbol = ToSymbol(OperationTemp, Error); + CastTempSymbol = ToSymbol(CastTemp, Error); + LoadedValueSymbol = ToSymbol(LoadedValue, Error); + + Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = TypedOpcode; PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, LoadedValueSymbol); + PushSymbol(CodeBuffer, OperationTempSymbol); + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId(CommonType); PushSymbol(CodeBuffer, Symbol); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, OperationTempSymbol); + PushSymbol(CodeBuffer, CastTempSymbol); + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId(CommonType); PushSymbol(CodeBuffer, Symbol); + Symbol->Value = GetScriptScalarTypeId(LValueType); PushSymbol(CodeBuffer, Symbol); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_STORE; PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, CastTempSymbol); + PushSymbol(CodeBuffer, Op1Symbol); + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace; PushSymbol(CodeBuffer, Symbol); + Symbol->Value = LValueType->Size; PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + + FreeTemp(OperationTemp); + FreeTemp(CastTemp); + RemoveToken(&OperationTemp); + RemoveToken(&CastTemp); + } + else + { + TempSymbol = ToSymbol(LoadedValue, Error); + PushSymbol(CodeBuffer, OperatorSymbol); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, TempSymbol); + PushSymbol(CodeBuffer, TempSymbol); + + Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_STORE; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + PushSymbol(CodeBuffer, TempSymbol); + PushSymbol(CodeBuffer, Op1Symbol); + Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace; PushSymbol(CodeBuffer, Symbol); + Symbol->Value = LValueType->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + } FreeTemp(Op0); FreeTemp(Op1); - FreeTemp(Temp); + FreeTemp(LoadedValue); + RemoveToken(&LoadedValue); Handled = TRUE; if (*Error != SCRIPT_ENGINE_ERROR_FREE) { @@ -3183,16 +3925,68 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (!Handled) { - PushSymbol(CodeBuffer, OperatorSymbol); - Op0 = Pop(MatchedStack); + PVARIABLE_TYPE CommonType; + UINT64 TypedOpcode; + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); - - Op1 = Pop(MatchedStack); Op1Symbol = ToSymbol(Op1, Error); + CommonType = GetCommonVariableType((PVARIABLE_TYPE)Op0->VariableType, + (PVARIABLE_TYPE)Op1->VariableType); + TypedOpcode = GetTypedAssignmentOpcode(Operator->Value); - PushSymbol(CodeBuffer, Op0Symbol); - PushSymbol(CodeBuffer, Op1Symbol); - PushSymbol(CodeBuffer, Op1Symbol); + if (IsIntegerVariableType(CommonType) && TypedOpcode != FUNC_UNDEFINED && + IsIntegerVariableType((PVARIABLE_TYPE)Op1->VariableType)) + { + PSCRIPT_ENGINE_TOKEN OperationTemp = NewTemp(Error); + PSCRIPT_ENGINE_TOKEN CastTemp = NewTemp(Error); + PSYMBOL OperationTempSymbol; + PSYMBOL CastTempSymbol; + PSYMBOL Symbol = NewSymbol(); + OperationTemp->VariableType = CommonType; + CastTemp->VariableType = (PVARIABLE_TYPE)Op1->VariableType; + OperationTempSymbol = ToSymbol(OperationTemp, Error); + CastTempSymbol = ToSymbol(CastTemp, Error); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = TypedOpcode; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, Op1Symbol); + PushSymbol(CodeBuffer, OperationTempSymbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = GetScriptScalarTypeId(CommonType); + PushSymbol(CodeBuffer, Symbol); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_CAST_SCALAR; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, OperationTempSymbol); + PushSymbol(CodeBuffer, CastTempSymbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = GetScriptScalarTypeId(CommonType); + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = GetScriptScalarTypeId((PVARIABLE_TYPE)Op1->VariableType); + PushSymbol(CodeBuffer, Symbol); + + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_MOV; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, CastTempSymbol); + PushSymbol(CodeBuffer, Op1Symbol); + RemoveSymbol(&Symbol); + FreeTemp(OperationTemp); + FreeTemp(CastTemp); + RemoveToken(&OperationTemp); + RemoveToken(&CastTemp); + } + else + { + PushSymbol(CodeBuffer, OperatorSymbol); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, Op1Symbol); + PushSymbol(CodeBuffer, Op1Symbol); + } // // Free the operand if it is a temp value @@ -3215,8 +4009,10 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { UINT64 FloatingOpcode = GetFloatingBinaryOpcode(Operator->Value); if (!FloatingOpcode || - !IsFloatingVariableType((PVARIABLE_TYPE)Op0->VariableType) || - !IsFloatingVariableType((PVARIABLE_TYPE)Op1->VariableType)) + (!IsFloatingVariableType((PVARIABLE_TYPE)Op0->VariableType) && + !IsIntegerVariableType((PVARIABLE_TYPE)Op0->VariableType)) || + (!IsFloatingVariableType((PVARIABLE_TYPE)Op1->VariableType) && + !IsIntegerVariableType((PVARIABLE_TYPE)Op1->VariableType))) { *Error = SCRIPT_ENGINE_ERROR_UNSUPPORTED_FLOAT_OPERATION; Op0 = Pop(MatchedStack); @@ -3231,14 +4027,56 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI ((PVARIABLE_TYPE)Op0->VariableType)->Kind == TY_DOUBLE || ((PVARIABLE_TYPE)Op1->VariableType)->Kind == TY_DOUBLE ? VARIABLE_TYPE_DOUBLE : VARIABLE_TYPE_FLOAT; + PSCRIPT_ENGINE_TOKEN ConvertedOp0 = NULL; + PSCRIPT_ENGINE_TOKEN ConvertedOp1 = NULL; + PSYMBOL Symbol; Op0 = Pop(MatchedStack); Op1 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); Op1Symbol = ToSymbol(Op1, Error); + + if ((PVARIABLE_TYPE)Op0->VariableType != ResultType) + { + ConvertedOp0 = NewTemp(Error); + ConvertedOp0->VariableType = ResultType; + PSYMBOL ConvertedSymbol = ToSymbol(ConvertedOp0, Error); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_CAST_SCALAR; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, ConvertedSymbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = GetScriptScalarTypeId((PVARIABLE_TYPE)Op0->VariableType); + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = GetScriptScalarTypeId(ResultType); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Op0Symbol = ConvertedSymbol; + } + if ((PVARIABLE_TYPE)Op1->VariableType != ResultType) + { + ConvertedOp1 = NewTemp(Error); + ConvertedOp1->VariableType = ResultType; + PSYMBOL ConvertedSymbol = ToSymbol(ConvertedOp1, Error); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_CAST_SCALAR; + PushSymbol(CodeBuffer, Symbol); + PushSymbol(CodeBuffer, Op1Symbol); + PushSymbol(CodeBuffer, ConvertedSymbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = GetScriptScalarTypeId((PVARIABLE_TYPE)Op1->VariableType); + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = GetScriptScalarTypeId(ResultType); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Op1Symbol = ConvertedSymbol; + } Temp = NewTemp(Error); Temp->VariableType = IsFloatingComparisonOperator(Operator->Value) ? - VARIABLE_TYPE_LONG : ResultType; + VARIABLE_TYPE_INT : ResultType; TempSymbol = ToSymbol(Temp, Error); OperatorSymbol->Value = FloatingOpcode; @@ -3250,20 +4088,61 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI FreeTemp(Op0); FreeTemp(Op1); + if (ConvertedOp0) + { + FreeTemp(ConvertedOp0); + RemoveToken(&ConvertedOp0); + } + if (ConvertedOp1) + { + FreeTemp(ConvertedOp1); + RemoveToken(&ConvertedOp1); + } Handled = TRUE; } } if (!Handled && (!strcmp(Operator->Value, "@ADD") || !strcmp(Operator->Value, "@SUB"))) { - if (((VARIABLE_TYPE *)Op0->VariableType)->Kind == TY_PTR && ((VARIABLE_TYPE *)Op1->VariableType)->Kind == TY_PTR) + PVARIABLE_TYPE Op0Type = (PVARIABLE_TYPE)Op0->VariableType; + PVARIABLE_TYPE Op1Type = (PVARIABLE_TYPE)Op1->VariableType; + + if (Op0Type && Op1Type && Op0Type->Kind == TY_PTR && Op1Type->Kind == TY_PTR) { - *Error = SCRIPT_ENGINE_ERROR_SYNTAX; - Op0 = Pop(MatchedStack); - Op1 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); + if (!strcmp(Operator->Value, "@SUB") && + ((PVARIABLE_TYPE)Op0->VariableType)->Base == ((PVARIABLE_TYPE)Op1->VariableType)->Base && + ((PVARIABLE_TYPE)Op0->VariableType)->Base && + ((PVARIABLE_TYPE)Op0->VariableType)->Base->Size > 0) + { + PSYMBOL TypeSymbol; + OperatorSymbol->Value = FUNC_POINTER_DIFF; + PushSymbol(CodeBuffer, OperatorSymbol); + Op0Symbol = ToSymbol(Op0, Error); + Op1Symbol = ToSymbol(Op1, Error); + Temp = NewTemp(Error); + Temp->VariableType = VARIABLE_TYPE_LONG; + TempSymbol = ToSymbol(Temp, Error); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, Op1Symbol); + PushSymbol(CodeBuffer, TempSymbol); + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = ((PVARIABLE_TYPE)Op0->VariableType)->Base->Size; + PushSymbol(CodeBuffer, TypeSymbol); + RemoveSymbol(&TypeSymbol); + Push(MatchedStack, Temp); + FreeTemp(Op0); + FreeTemp(Op1); + } + else + { + *Error = SCRIPT_ENGINE_ERROR_SYNTAX; + } Handled = TRUE; } - else if (((VARIABLE_TYPE *)Op0->VariableType)->Kind == TY_PTR && ((VARIABLE_TYPE *)Op1->VariableType)->Kind != TY_PTR) + else if (Op0Type && Op0Type->Kind == TY_PTR && (!Op1Type || Op1Type->Kind != TY_PTR)) { if (!strcmp(Operator->Value, "@SUB")) { @@ -3294,6 +4173,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op1Symbol); Temp = NewTemp(Error); + Temp->VariableType = (PVARIABLE_TYPE)Op0->VariableType; TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -3317,7 +4197,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } Handled = TRUE; } - else if (((VARIABLE_TYPE *)Op0->VariableType)->Kind != TY_PTR && ((VARIABLE_TYPE *)Op1->VariableType)->Kind == TY_PTR) + else if ((!Op0Type || Op0Type->Kind != TY_PTR) && Op1Type && Op1Type->Kind == TY_PTR) { PSYMBOL Symbol = NULL; @@ -3339,6 +4219,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op0Symbol); Temp = NewTemp(Error); + Temp->VariableType = (PVARIABLE_TYPE)Op1->VariableType; TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -3362,14 +4243,14 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Handled = TRUE; } - else if (((VARIABLE_TYPE *)Op0->VariableType)->Kind == TY_ARRAY && ((VARIABLE_TYPE *)Op1->VariableType)->Kind == TY_ARRAY) + else if (Op0Type && Op1Type && Op0Type->Kind == TY_ARRAY && Op1Type->Kind == TY_ARRAY) { *Error = SCRIPT_ENGINE_ERROR_SYNTAX; Op0 = Pop(MatchedStack); Op1 = Pop(MatchedStack); Handled = TRUE; } - else if (((VARIABLE_TYPE *)Op0->VariableType)->Kind == TY_ARRAY && ((VARIABLE_TYPE *)Op1->VariableType)->Kind != TY_ARRAY) + else if (Op0Type && Op0Type->Kind == TY_ARRAY && (!Op1Type || Op1Type->Kind != TY_ARRAY)) { if (!strcmp(Operator->Value, "@SUB")) { @@ -3407,6 +4288,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op1Symbol); Temp = NewTemp(Error); + Temp->VariableType = CreatePointerType(((PVARIABLE_TYPE)Op0->VariableType)->Base); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -3430,7 +4312,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } Handled = TRUE; } - else if (((VARIABLE_TYPE *)Op0->VariableType)->Kind != TY_ARRAY && ((VARIABLE_TYPE *)Op1->VariableType)->Kind == TY_ARRAY) + else if ((!Op0Type || Op0Type->Kind != TY_ARRAY) && Op1Type && Op1Type->Kind == TY_ARRAY) { PSYMBOL Symbol = NULL; int VariableBaseSize = 0; @@ -3459,6 +4341,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op0Symbol); Temp = NewTemp(Error); + Temp->VariableType = CreatePointerType(((PVARIABLE_TYPE)Op1->VariableType)->Base); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -3483,23 +4366,79 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } } + if (!Handled && IsFloatingComparisonOperator(Operator->Value) && + Op0->VariableType && Op1->VariableType && + ((PVARIABLE_TYPE)Op0->VariableType)->Kind == TY_PTR && + ((PVARIABLE_TYPE)Op1->VariableType)->Kind == TY_PTR) + { + PSYMBOL TypeSymbol; + if (((PVARIABLE_TYPE)Op0->VariableType)->Base != ((PVARIABLE_TYPE)Op1->VariableType)->Base && + ((PVARIABLE_TYPE)Op0->VariableType)->Base != VARIABLE_TYPE_VOID && + ((PVARIABLE_TYPE)Op1->VariableType)->Base != VARIABLE_TYPE_VOID) + { + *Error = SCRIPT_ENGINE_ERROR_SYNTAX; + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); + } + else + { + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); + OperatorSymbol->Value = GetTypedBinaryOpcode(Operator->Value); + PushSymbol(CodeBuffer, OperatorSymbol); + Op0Symbol = ToSymbol(Op0, Error); + Op1Symbol = ToSymbol(Op1, Error); + Temp = NewTemp(Error); + Temp->VariableType = VARIABLE_TYPE_INT; + TempSymbol = ToSymbol(Temp, Error); + PushSymbol(CodeBuffer, Op0Symbol); + PushSymbol(CodeBuffer, Op1Symbol); + PushSymbol(CodeBuffer, TempSymbol); + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = SCRIPT_SCALAR_TYPE_POINTER; + PushSymbol(CodeBuffer, TypeSymbol); + RemoveSymbol(&TypeSymbol); + Push(MatchedStack, Temp); + FreeTemp(Op0); + FreeTemp(Op1); + } + Handled = TRUE; + } + if (!Handled) { - PushSymbol(CodeBuffer, OperatorSymbol); Op0 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); Op1 = Pop(MatchedStack); Op1Symbol = ToSymbol(Op1, Error); - Temp = NewTemp(Error); - Temp->VariableType = (VARIABLE_TYPE *)GetCommonVariableType((VARIABLE_TYPE *)Op0->VariableType, (VARIABLE_TYPE *)Op1->VariableType); + PVARIABLE_TYPE CommonType = GetCommonVariableType((PVARIABLE_TYPE)Op0->VariableType, + (PVARIABLE_TYPE)Op1->VariableType); + UINT64 TypedOpcode = GetTypedBinaryOpcode(Operator->Value); + BOOLEAN TypedIntegerOperation = IsIntegerVariableType(CommonType) && TypedOpcode != FUNC_UNDEFINED; + if (TypedIntegerOperation) + OperatorSymbol->Value = TypedOpcode; + PushSymbol(CodeBuffer, OperatorSymbol); + + Temp = NewTemp(Error); + Temp->VariableType = IsFloatingComparisonOperator(Operator->Value) ? + VARIABLE_TYPE_INT : CommonType; Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, Op1Symbol); PushSymbol(CodeBuffer, TempSymbol); + if (TypedIntegerOperation) + { + PSYMBOL TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = GetScriptScalarTypeId(CommonType); + PushSymbol(CodeBuffer, TypeSymbol); + RemoveSymbol(&TypeSymbol); + } // // Free the operand if it is a temp value @@ -4213,6 +5152,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0Symbol = ToSymbol(Op0, Error); Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -4242,6 +5182,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -4269,6 +5210,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op2Symbol); Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -4291,6 +5233,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0Symbol = ToSymbol(Op0, Error); Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -4320,6 +5263,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -4348,6 +5292,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op2Symbol); Temp = NewTemp(Error); + Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); @@ -4797,6 +5742,7 @@ PSYMBOL ToSymbol(PSCRIPT_ENGINE_TOKEN Token, PSCRIPT_ENGINE_ERROR_TYPE Error) { PSYMBOL Symbol = NewSymbol(); + ResolveIdentifierVariableType(Token); switch (Token->Type) { case GLOBAL_ID: @@ -5474,6 +6420,21 @@ GetGlobalIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token) return 0; } +BOOLEAN +GetGlobalIdentifierIsImplicitType(PSCRIPT_ENGINE_TOKEN Token) +{ + PSCRIPT_ENGINE_TOKEN CurrentToken; + for (uintptr_t i = 0; i < GlobalIdTable->Pointer; i++) + { + CurrentToken = *(GlobalIdTable->Head + i); + if (!strcmp(Token->Value, CurrentToken->Value)) + { + return CurrentToken->IsImplicitType; + } + } + return FALSE; +} + /** * @brief Allocates a new local variable and returns the integer assigned to it * @@ -5531,6 +6492,21 @@ GetLocalIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token) return 0; } +BOOLEAN +GetLocalIdentifierIsImplicitType(PSCRIPT_ENGINE_TOKEN Token) +{ + PSCRIPT_ENGINE_TOKEN CurrentToken; + for (uintptr_t i = 0; i < ((PSCRIPT_ENGINE_TOKEN_LIST)CurrentUserDefinedFunction->IdTable)->Pointer; i++) + { + CurrentToken = *(((PSCRIPT_ENGINE_TOKEN_LIST)CurrentUserDefinedFunction->IdTable)->Head + i); + if (!strcmp(Token->Value, CurrentToken->Value)) + { + return CurrentToken->IsImplicitType; + } + } + return FALSE; +} + /** * @brief * @@ -5642,6 +6618,10 @@ LalrIsOperandType(PSCRIPT_ENGINE_TOKEN Token) { return TRUE; } + else if (Token->Type == SCRIPT_VARIABLE_TYPE) + { + return TRUE; + } else if (Token->Type == DECIMAL) { return TRUE; @@ -5723,6 +6703,80 @@ FuncGetNumberOfOperands(UINT64 FuncType, UINT32 * NumberOfGetOperands, UINT32 * switch (FuncType) { + case FUNC_CAST_SCALAR: + + *NumberOfGetOperands = 3; + *NumberOfSetOperands = 1; + Result = TRUE; + + break; + + case FUNC_ADD_TYPED: + case FUNC_SUB_TYPED: + case FUNC_MUL_TYPED: + case FUNC_DIV_TYPED: + case FUNC_MOD_TYPED: + case FUNC_BITWISE_AND_TYPED: + case FUNC_BITWISE_OR_TYPED: + case FUNC_BITWISE_XOR_TYPED: + case FUNC_SHIFT_LEFT_TYPED: + case FUNC_SHIFT_RIGHT_TYPED: + case FUNC_GT_TYPED: + case FUNC_LT_TYPED: + case FUNC_EGT_TYPED: + case FUNC_ELT_TYPED: + case FUNC_EQUAL_TYPED: + case FUNC_NEQ_TYPED: + case FUNC_POINTER_DIFF: + + *NumberOfGetOperands = 3; + *NumberOfSetOperands = 1; + Result = TRUE; + + break; + + case FUNC_NEG_TYPED: + case FUNC_BITWISE_NOT_TYPED: + case FUNC_LOGICAL_NOT_TYPED: + + *NumberOfGetOperands = 2; + *NumberOfSetOperands = 1; + Result = TRUE; + + break; + + case FUNC_TYPED_LOAD: + + *NumberOfGetOperands = 3; + *NumberOfSetOperands = 1; + Result = TRUE; + + break; + + case FUNC_TYPED_STORE: + + *NumberOfGetOperands = 4; + *NumberOfSetOperands = 0; + Result = TRUE; + + break; + + case FUNC_AGGREGATE_COPY: + + *NumberOfGetOperands = 5; + *NumberOfSetOperands = 0; + Result = TRUE; + + break; + + case FUNC_AGGREGATE_ZERO: + + *NumberOfGetOperands = 3; + *NumberOfSetOperands = 0; + Result = TRUE; + + break; + // // This code is not tested yet, so they are commented out for now // diff --git a/hyperdbg/script-engine/code/type.c b/hyperdbg/script-engine/code/type.c index 47b3a386..a2cfb25f 100644 --- a/hyperdbg/script-engine/code/type.c +++ b/hyperdbg/script-engine/code/type.c @@ -320,24 +320,40 @@ AddTypedefType(const char * Name, PVARIABLE_TYPE Type) return TRUE; } -VARIABLE_TYPE * VARIABLE_TYPE_UNKNOWN = &(VARIABLE_TYPE) {TY_UNKNOWN}; +PVARIABLE_TYPE +FindTypedefType(const char * Name) +{ + PTYPEDEF_NODE Node; + for (Node = Typedefs; Node; Node = Node->Next) + { + if (!strcmp(Node->Name, Name)) + { + return Node->Type; + } + } + return NULL; +} -VARIABLE_TYPE * VARIABLE_TYPE_VOID = &(VARIABLE_TYPE) {TY_VOID, 1, 1}; -VARIABLE_TYPE * VARIABLE_TYPE_BOOL = &(VARIABLE_TYPE) {TY_BOOL, 1, 1}; +VARIABLE_TYPE * VARIABLE_TYPE_UNKNOWN = &(VARIABLE_TYPE) {.Kind = TY_UNKNOWN}; -VARIABLE_TYPE * VARIABLE_TYPE_CHAR = &(VARIABLE_TYPE) {TY_CHAR, 1, 1}; -VARIABLE_TYPE * VARIABLE_TYPE_SHORT = &(VARIABLE_TYPE) {TY_SHORT, 2, 2}; -VARIABLE_TYPE * VARIABLE_TYPE_INT = &(VARIABLE_TYPE) {TY_INT, 4, 4}; -VARIABLE_TYPE * VARIABLE_TYPE_LONG = &(VARIABLE_TYPE) {TY_LONG, 8, 8}; +VARIABLE_TYPE * VARIABLE_TYPE_VOID = &(VARIABLE_TYPE) {.Kind = TY_VOID, .Size = 1, .Align = 1, .IsComplete = TRUE}; +VARIABLE_TYPE * VARIABLE_TYPE_BOOL = &(VARIABLE_TYPE) {.Kind = TY_BOOL, .Size = 1, .Align = 1, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_BOOL}; -VARIABLE_TYPE * VARIABLE_TYPE_UCHAR = &(VARIABLE_TYPE) {TY_CHAR, 1, 1, TRUE}; -VARIABLE_TYPE * VARIABLE_TYPE_USHORT = &(VARIABLE_TYPE) {TY_SHORT, 2, 2, TRUE}; -VARIABLE_TYPE * VARIABLE_TYPE_UINT = &(VARIABLE_TYPE) {TY_INT, 4, 4, TRUE}; -VARIABLE_TYPE * VARIABLE_TYPE_ULONG = &(VARIABLE_TYPE) {TY_LONG, 8, 8, TRUE}; +VARIABLE_TYPE * VARIABLE_TYPE_CHAR = &(VARIABLE_TYPE) {.Kind = TY_CHAR, .Size = 1, .Align = 1, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_CHAR}; +VARIABLE_TYPE * VARIABLE_TYPE_SHORT = &(VARIABLE_TYPE) {.Kind = TY_SHORT, .Size = 2, .Align = 2, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_SHORT}; +VARIABLE_TYPE * VARIABLE_TYPE_INT = &(VARIABLE_TYPE) {.Kind = TY_INT, .Size = 4, .Align = 4, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_INT}; +VARIABLE_TYPE * VARIABLE_TYPE_LONG = &(VARIABLE_TYPE) {.Kind = TY_LONG, .Size = 8, .Align = 8, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_LONG}; +VARIABLE_TYPE * VARIABLE_TYPE_LLONG = &(VARIABLE_TYPE) {.Kind = TY_LLONG, .Size = 8, .Align = 8, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_LONG_LONG}; -VARIABLE_TYPE * VARIABLE_TYPE_FLOAT = &(VARIABLE_TYPE) {TY_FLOAT, 4, 4}; -VARIABLE_TYPE * VARIABLE_TYPE_DOUBLE = &(VARIABLE_TYPE) {TY_DOUBLE, 8, 8}; -VARIABLE_TYPE * VARIABLE_TYPE_LDOUBLE = &(VARIABLE_TYPE) {TY_LDOUBLE, 16, 16}; +VARIABLE_TYPE * VARIABLE_TYPE_UCHAR = &(VARIABLE_TYPE) {.Kind = TY_CHAR, .Size = 1, .Align = 1, .IsUnsigned = TRUE, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_CHAR}; +VARIABLE_TYPE * VARIABLE_TYPE_USHORT = &(VARIABLE_TYPE) {.Kind = TY_SHORT, .Size = 2, .Align = 2, .IsUnsigned = TRUE, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_SHORT}; +VARIABLE_TYPE * VARIABLE_TYPE_UINT = &(VARIABLE_TYPE) {.Kind = TY_INT, .Size = 4, .Align = 4, .IsUnsigned = TRUE, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_INT}; +VARIABLE_TYPE * VARIABLE_TYPE_ULONG = &(VARIABLE_TYPE) {.Kind = TY_LONG, .Size = 8, .Align = 8, .IsUnsigned = TRUE, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_LONG}; +VARIABLE_TYPE * VARIABLE_TYPE_ULLONG = &(VARIABLE_TYPE) {.Kind = TY_LLONG, .Size = 8, .Align = 8, .IsUnsigned = TRUE, .IsComplete = TRUE, .IntegerRank = INTEGER_RANK_LONG_LONG}; + +VARIABLE_TYPE * VARIABLE_TYPE_FLOAT = &(VARIABLE_TYPE) {.Kind = TY_FLOAT, .Size = 4, .Align = 4, .IsComplete = TRUE}; +VARIABLE_TYPE * VARIABLE_TYPE_DOUBLE = &(VARIABLE_TYPE) {.Kind = TY_DOUBLE, .Size = 8, .Align = 8, .IsComplete = TRUE}; +VARIABLE_TYPE * VARIABLE_TYPE_LDOUBLE = &(VARIABLE_TYPE) {.Kind = TY_LDOUBLE, .Size = 16, .Align = 16, .IsComplete = TRUE}; /** * @brief Return a variable type based on the token stack @@ -348,23 +364,10 @@ VARIABLE_TYPE * VARIABLE_TYPE_LDOUBLE = &(VARIABLE_TYPE) {TY_LDOUBLE, 16, 16}; VARIABLE_TYPE * HandleType(PSCRIPT_ENGINE_TOKEN_LIST PtokenStack) { - enum - { - ENUM_VOID = 1 << 0, - ENUM_BOOL = 1 << 2, - ENUM_CHAR = 1 << 4, - ENUM_SHORT = 1 << 6, - ENUM_INT = 1 << 8, - ENUM_LONG = 1 << 10, - ENUM_FLOAT = 1 << 12, - ENUM_DOUBLE = 1 << 14, - ENUM_OTHER = 1 << 16, - ENUM_SIGNED = 1 << 17, - ENUM_UNSIGNED = 1 << 18, - }; - - VARIABLE_TYPE * Result = VARIABLE_TYPE_UNKNOWN; - int Counter = 0; + unsigned int VoidCount = 0, BoolCount = 0, CharCount = 0; + unsigned int ShortCount = 0, IntCount = 0, LongCount = 0; + unsigned int FloatCount = 0, DoubleCount = 0; + unsigned int SignedCount = 0, UnsignedCount = 0; PSCRIPT_ENGINE_TOKEN TopToken = NULL; while (PtokenStack->Pointer > 0) @@ -375,114 +378,102 @@ HandleType(PSCRIPT_ENGINE_TOKEN_LIST PtokenStack) Push(PtokenStack, TopToken); break; } + { + PVARIABLE_TYPE TypedefType = FindTypedefType(TopToken->Value); + if (TypedefType) + { + RemoveToken(&TopToken); + if (VoidCount || BoolCount || CharCount || ShortCount || IntCount || LongCount || + FloatCount || DoubleCount || SignedCount || UnsignedCount || + (PtokenStack->Pointer && Top(PtokenStack)->Type == SCRIPT_VARIABLE_TYPE)) + return VARIABLE_TYPE_UNKNOWN; + return TypedefType; + } + } if (!strcmp(TopToken->Value, "void")) { - Counter += ENUM_VOID; + VoidCount++; } else if (!strcmp(TopToken->Value, "bool")) { - Counter += ENUM_BOOL; + BoolCount++; } else if (!strcmp(TopToken->Value, "char")) { - Counter += ENUM_CHAR; + CharCount++; } else if (!strcmp(TopToken->Value, "short")) { - Counter += ENUM_SHORT; + ShortCount++; } else if (!strcmp(TopToken->Value, "int")) { - Counter += ENUM_INT; + IntCount++; } else if (!strcmp(TopToken->Value, "long")) { - Counter += ENUM_LONG; + LongCount++; } else if (!strcmp(TopToken->Value, "float")) { - Counter += ENUM_FLOAT; + FloatCount++; } else if (!strcmp(TopToken->Value, "double")) { - Counter += ENUM_DOUBLE; + DoubleCount++; } else if (!strcmp(TopToken->Value, "signed")) { - Counter |= ENUM_SIGNED; + SignedCount++; } else if (!strcmp(TopToken->Value, "unsigned")) { - Counter |= ENUM_UNSIGNED; + UnsignedCount++; } else { return VARIABLE_TYPE_UNKNOWN; } RemoveToken(&TopToken); - - switch (Counter) - { - case ENUM_VOID: - Result = VARIABLE_TYPE_VOID; - break; - case ENUM_BOOL: - Result = VARIABLE_TYPE_BOOL; - break; - case ENUM_CHAR: - case ENUM_SIGNED + ENUM_CHAR: - Result = VARIABLE_TYPE_CHAR; - break; - case ENUM_UNSIGNED + ENUM_CHAR: - Result = VARIABLE_TYPE_UCHAR; - break; - case ENUM_SHORT: - case ENUM_SHORT + ENUM_INT: - case ENUM_SIGNED + ENUM_SHORT: - case ENUM_SIGNED + ENUM_SHORT + ENUM_INT: - Result = VARIABLE_TYPE_INT; - break; - case ENUM_UNSIGNED + ENUM_SHORT: - case ENUM_UNSIGNED + ENUM_SHORT + ENUM_INT: - Result = VARIABLE_TYPE_USHORT; - break; - case ENUM_INT: - case ENUM_SIGNED: - case ENUM_SIGNED + ENUM_INT: - Result = VARIABLE_TYPE_INT; - break; - case ENUM_UNSIGNED: - case ENUM_UNSIGNED + ENUM_INT: - Result = VARIABLE_TYPE_UINT; - break; - case ENUM_LONG: - case ENUM_LONG + ENUM_INT: - case ENUM_LONG + ENUM_LONG: - case ENUM_LONG + ENUM_LONG + ENUM_INT: - case ENUM_SIGNED + ENUM_LONG: - case ENUM_SIGNED + ENUM_LONG + ENUM_INT: - case ENUM_SIGNED + ENUM_LONG + ENUM_LONG: - case ENUM_SIGNED + ENUM_LONG + ENUM_LONG + ENUM_INT: - Result = VARIABLE_TYPE_LONG; - break; - case ENUM_UNSIGNED + ENUM_LONG: - case ENUM_UNSIGNED + ENUM_LONG + ENUM_INT: - case ENUM_UNSIGNED + ENUM_LONG + ENUM_LONG: - case ENUM_UNSIGNED + ENUM_LONG + ENUM_LONG + ENUM_INT: - Result = VARIABLE_TYPE_ULONG; - break; - case ENUM_FLOAT: - Result = VARIABLE_TYPE_FLOAT; - break; - case ENUM_DOUBLE: - Result = VARIABLE_TYPE_DOUBLE; - break; - case ENUM_LONG + ENUM_DOUBLE: - Result = VARIABLE_TYPE_LDOUBLE; - break; - } } - return Result; + + if (SignedCount > 1 || UnsignedCount > 1 || (SignedCount && UnsignedCount) || + VoidCount > 1 || BoolCount > 1 || CharCount > 1 || ShortCount > 1 || + IntCount > 1 || LongCount > 2 || FloatCount > 1 || DoubleCount > 1) + { + return VARIABLE_TYPE_UNKNOWN; + } + + if (VoidCount || BoolCount || CharCount || ShortCount || FloatCount || DoubleCount) + { + if (VoidCount && !(BoolCount || CharCount || ShortCount || IntCount || LongCount || FloatCount || DoubleCount || SignedCount || UnsignedCount)) + return VARIABLE_TYPE_VOID; + if (BoolCount && !(VoidCount || CharCount || ShortCount || IntCount || LongCount || FloatCount || DoubleCount || SignedCount || UnsignedCount)) + return VARIABLE_TYPE_BOOL; + if (CharCount && !(VoidCount || BoolCount || ShortCount || IntCount || LongCount || FloatCount || DoubleCount)) + return UnsignedCount ? VARIABLE_TYPE_UCHAR : VARIABLE_TYPE_CHAR; + if (ShortCount && !(VoidCount || BoolCount || CharCount || LongCount || FloatCount || DoubleCount)) + return UnsignedCount ? VARIABLE_TYPE_USHORT : VARIABLE_TYPE_SHORT; + if (FloatCount && !(VoidCount || BoolCount || CharCount || ShortCount || IntCount || LongCount || DoubleCount || SignedCount || UnsignedCount)) + return VARIABLE_TYPE_FLOAT; + if (DoubleCount && !VoidCount && !BoolCount && !CharCount && !ShortCount && !IntCount && !FloatCount && !SignedCount && !UnsignedCount) + return LongCount == 0 ? VARIABLE_TYPE_DOUBLE : VARIABLE_TYPE_UNKNOWN; + return VARIABLE_TYPE_UNKNOWN; + } + + if (LongCount) + { + if (VoidCount || BoolCount || CharCount || ShortCount || FloatCount || DoubleCount) + return VARIABLE_TYPE_UNKNOWN; + if (LongCount == 2) + return UnsignedCount ? VARIABLE_TYPE_ULLONG : VARIABLE_TYPE_LLONG; + return UnsignedCount ? VARIABLE_TYPE_ULONG : VARIABLE_TYPE_LONG; + } + + if (IntCount || SignedCount || UnsignedCount) + return UnsignedCount ? VARIABLE_TYPE_UINT : VARIABLE_TYPE_INT; + + return VARIABLE_TYPE_UNKNOWN; } /** @@ -495,15 +486,48 @@ HandleType(PSCRIPT_ENGINE_TOKEN_LIST PtokenStack) VARIABLE_TYPE * GetCommonVariableType(VARIABLE_TYPE * Ty1, VARIABLE_TYPE * Ty2) { - // if (Ty1->Kind == TY_ARRAY) - //{ - // return Ty1; - // } + PVARIABLE_TYPE LeftType = PromoteIntegerVariableType(Ty1); + PVARIABLE_TYPE RightType = PromoteIntegerVariableType(Ty2); - // if (Ty2->Kind == TY_ARRAY) - //{ - // return Ty2; - // } + if (!IsIntegerVariableType(LeftType) || !IsIntegerVariableType(RightType)) + return VARIABLE_TYPE_UNKNOWN; + if (LeftType == RightType) + return LeftType; + if (LeftType->IsUnsigned == RightType->IsUnsigned) + return LeftType->IntegerRank >= RightType->IntegerRank ? LeftType : RightType; - return VARIABLE_TYPE_LONG; + PVARIABLE_TYPE UnsignedType = LeftType->IsUnsigned ? LeftType : RightType; + PVARIABLE_TYPE SignedType = LeftType->IsUnsigned ? RightType : LeftType; + if (UnsignedType->IntegerRank >= SignedType->IntegerRank) + return UnsignedType; + if (SignedType->Size > UnsignedType->Size) + return SignedType; + if (SignedType == VARIABLE_TYPE_LONG) return VARIABLE_TYPE_ULONG; + if (SignedType == VARIABLE_TYPE_LLONG) return VARIABLE_TYPE_ULLONG; + return VARIABLE_TYPE_UINT; +} + +PVARIABLE_TYPE +GetDefaultImplicitVariableType(VOID) +{ + return VARIABLE_TYPE_ULLONG; +} + +BOOLEAN +IsIntegerVariableType(PVARIABLE_TYPE Type) +{ + return Type && (Type->Kind == TY_BOOL || Type->Kind == TY_CHAR || + Type->Kind == TY_SHORT || Type->Kind == TY_INT || + Type->Kind == TY_LONG || Type->Kind == TY_LLONG || + Type->Kind == TY_ENUM); +} + +PVARIABLE_TYPE +PromoteIntegerVariableType(PVARIABLE_TYPE Type) +{ + if (!IsIntegerVariableType(Type)) + return Type; + if (Type->IntegerRank < INTEGER_RANK_INT) + return VARIABLE_TYPE_INT; + return Type; } diff --git a/hyperdbg/script-engine/header/common.h b/hyperdbg/script-engine/header/common.h index a6c9cf9d..725bbc5e 100644 --- a/hyperdbg/script-engine/header/common.h +++ b/hyperdbg/script-engine/header/common.h @@ -78,6 +78,7 @@ typedef struct _SCRIPT_ENGINE_TOKEN unsigned long long VariableMemoryIdx; unsigned int AddressSpace; BOOLEAN IsAddress; + BOOLEAN IsImplicitType; } SCRIPT_ENGINE_TOKEN, *PSCRIPT_ENGINE_TOKEN; /** diff --git a/hyperdbg/script-engine/header/parse-table.h b/hyperdbg/script-engine/header/parse-table.h index 83614dd7..d2bdf8d7 100644 --- a/hyperdbg/script-engine/header/parse-table.h +++ b/hyperdbg/script-engine/header/parse-table.h @@ -1,9 +1,9 @@ #pragma once #ifndef PARSE_TABLE_H #define PARSE_TABLE_H -#define RULES_COUNT 331 -#define TERMINAL_COUNT 133 -#define NONETERMINAL_COUNT 85 +#define RULES_COUNT 355 +#define TERMINAL_COUNT 135 +#define NONETERMINAL_COUNT 91 #define START_VARIABLE "S" #define MAX_RHS_LEN 15 #define KEYWORD_LIST_LENGTH 121 @@ -13,7 +13,7 @@ #define PSEUDO_REGISTER_MAP_LIST_LENGTH 16 #define SCRIPT_VARIABLE_TYPE_LIST_LENGTH 10 #define ASSIGNMENT_OPERATOR_LIST_LENGTH 10 -#define SEMANTIC_RULES_MAP_LIST_LENGTH 201 +#define SEMANTIC_RULES_MAP_LIST_LENGTH 211 #define THREEOPFUNC1_LENGTH 1 #define THREEOPFUNC2_LENGTH 3 #define TWOOPFUNC1_LENGTH 8 @@ -60,16 +60,16 @@ extern const SYMBOL_MAP PseudoRegisterMapList[]; extern const char* ScriptVariableTypeList[]; -#define LALR_RULES_COUNT 121 -#define LALR_TERMINAL_COUNT 89 -#define LALR_NONTERMINAL_COUNT 27 +#define LALR_RULES_COUNT 141 +#define LALR_TERMINAL_COUNT 93 +#define LALR_NONTERMINAL_COUNT 37 #define LALR_MAX_RHS_LEN 9 -#define LALR_STATE_COUNT 338 +#define LALR_STATE_COUNT 373 extern const struct _SCRIPT_ENGINE_TOKEN LalrLhs[RULES_COUNT]; extern const struct _SCRIPT_ENGINE_TOKEN LalrRhs[RULES_COUNT][MAX_RHS_LEN]; extern const unsigned int LalrRhsSize[RULES_COUNT]; -extern const char* LalrNoneTerminalMap[NONETERMINAL_COUNT]; -extern const char* LalrTerminalMap[TERMINAL_COUNT]; +extern const char* LalrNoneTerminalMap[LALR_NONTERMINAL_COUNT]; +extern const char* LalrTerminalMap[LALR_TERMINAL_COUNT]; extern const int LalrGotoTable[LALR_STATE_COUNT][LALR_NONTERMINAL_COUNT]; extern const int LalrActionTable[LALR_STATE_COUNT][LALR_TERMINAL_COUNT]; extern const struct _SCRIPT_ENGINE_TOKEN LalrSemanticRules[RULES_COUNT]; diff --git a/hyperdbg/script-engine/header/script-engine.h b/hyperdbg/script-engine/header/script-engine.h index 2fa1996c..a8988afb 100644 --- a/hyperdbg/script-engine/header/script-engine.h +++ b/hyperdbg/script-engine/header/script-engine.h @@ -90,6 +90,9 @@ SetGlobalIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token, VARIABLE_TYPE * Vari VARIABLE_TYPE * GetGlobalIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token); +BOOLEAN +GetGlobalIdentifierIsImplicitType(PSCRIPT_ENGINE_TOKEN Token); + unsigned long long NewLocalIdentifier(PSCRIPT_ENGINE_TOKEN PTOKEN, unsigned int VariableSize); @@ -102,6 +105,9 @@ SetLocalIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token, VARIABLE_TYPE * Varia VARIABLE_TYPE * GetLocalIdentifierVariableType(PSCRIPT_ENGINE_TOKEN Token); +BOOLEAN +GetLocalIdentifierIsImplicitType(PSCRIPT_ENGINE_TOKEN Token); + int NewFunctionParameterIdentifier(PSCRIPT_ENGINE_TOKEN Token); diff --git a/hyperdbg/script-engine/header/type.h b/hyperdbg/script-engine/header/type.h index 2c8744c1..b2421224 100644 --- a/hyperdbg/script-engine/header/type.h +++ b/hyperdbg/script-engine/header/type.h @@ -24,6 +24,7 @@ typedef enum _VARIABLE_TYPE_KIND TY_SHORT, TY_INT, TY_LONG, + TY_LLONG, TY_FLOAT, TY_DOUBLE, TY_LDOUBLE, @@ -43,6 +44,17 @@ typedef enum _POINTER_PROVENANCE POINTER_PROVENANCE_REMOTE, } POINTER_PROVENANCE; +typedef enum _INTEGER_TYPE_RANK +{ + INTEGER_RANK_NONE, + INTEGER_RANK_BOOL, + INTEGER_RANK_CHAR, + INTEGER_RANK_SHORT, + INTEGER_RANK_INT, + INTEGER_RANK_LONG, + INTEGER_RANK_LONG_LONG, +} INTEGER_TYPE_RANK; + typedef struct _STRUCT_MEMBER STRUCT_MEMBER, *PSTRUCT_MEMBER; typedef struct _VARIABLE_TYPE @@ -57,6 +69,7 @@ typedef struct _VARIABLE_TYPE char * TagName; BOOLEAN IsComplete; PSTRUCT_MEMBER Members; + INTEGER_TYPE_RANK IntegerRank; } VARIABLE_TYPE, *PVARIABLE_TYPE; struct _STRUCT_MEMBER @@ -77,11 +90,13 @@ extern VARIABLE_TYPE * VARIABLE_TYPE_CHAR; extern VARIABLE_TYPE * VARIABLE_TYPE_SHORT; extern VARIABLE_TYPE * VARIABLE_TYPE_INT; extern VARIABLE_TYPE * VARIABLE_TYPE_LONG; +extern VARIABLE_TYPE * VARIABLE_TYPE_LLONG; extern VARIABLE_TYPE * VARIABLE_TYPE_UCHAR; extern VARIABLE_TYPE * VARIABLE_TYPE_USHORT; extern VARIABLE_TYPE * VARIABLE_TYPE_UINT; extern VARIABLE_TYPE * VARIABLE_TYPE_ULONG; +extern VARIABLE_TYPE * VARIABLE_TYPE_ULLONG; extern VARIABLE_TYPE * VARIABLE_TYPE_FLOAT; extern VARIABLE_TYPE * VARIABLE_TYPE_DOUBLE; @@ -141,4 +156,19 @@ CreateArrayType(PVARIABLE_TYPE BaseType, unsigned int ArrayLength); BOOLEAN AddTypedefType(const char * Name, PVARIABLE_TYPE Type); +PVARIABLE_TYPE +FindTypedefType(const char * Name); + +PVARIABLE_TYPE +GetDefaultImplicitVariableType(VOID); + +BOOLEAN +IsIntegerVariableType(PVARIABLE_TYPE Type); + +PVARIABLE_TYPE +PromoteIntegerVariableType(PVARIABLE_TYPE Type); + +PVARIABLE_TYPE +GetCommonVariableType(PVARIABLE_TYPE LeftType, PVARIABLE_TYPE RightType); + #endif diff --git a/hyperdbg/script-engine/python/Boolean_Expression_Grammar.txt b/hyperdbg/script-engine/python/Boolean_Expression_Grammar.txt index 513972f3..30aca284 100644 --- a/hyperdbg/script-engine/python/Boolean_Expression_Grammar.txt +++ b/hyperdbg/script-engine/python/Boolean_Expression_Grammar.txt @@ -29,6 +29,7 @@ .ThreeOpFunc4->wcsncmp .OperatorsOneOperand->inc dec reference dereference +.ScriptVariableType->void bool char short int long unsigned signed float double S->BE @@ -36,13 +37,17 @@ S->BE BE->B1 -B1->B1 || B2 @OR +B1->B1 || LOGICAL_OR_BEGIN B2 @LOGICAL_OR_END B1->B2 +LOGICAL_OR_BEGIN->eps @LOGICAL_OR_BEGIN -B2->B2 && B3 @AND + +B2->B2 && LOGICAL_AND_BEGIN B3 @LOGICAL_AND_END B2->B3 +LOGICAL_AND_BEGIN->eps @LOGICAL_AND_BEGIN + B3->B3 | B4 @OR B3->B4 @@ -81,8 +86,10 @@ E10->E12 E10->- E12 @NEG E10->+ E12 E10->~ E12 @NOT +E10->! E12 @LOGICAL_NOT_TYPED E10->* E12 @POI E10->& E12 @REFERENCE +E10->sizeof SIZEOF_VALUE E12->.ZeroOpFunc2 ( ) @.ZeroOpFunc2 @@ -96,8 +103,7 @@ E12->.OneOpFunc4 ( WstringNumber ) @.OneOpFunc4 E12->.TwoOpFunc4 ( WstringNumber , WstringNumber ) @.TwoOpFunc4 E12->.ThreeOpFunc4 ( WstringNumber , WstringNumber , EXP ) @.ThreeOpFunc4 -E12->( BE ) - +E12->( CAST_OR_BOOLEAN E12->E12 . MEMBER_NAME @MEMBER_DOT_READ E12->E12 -> MEMBER_NAME @MEMBER_ARROW_READ @@ -121,6 +127,26 @@ E12->_pseudo_register @PUSH E12->E13 ( VA2 ) @END_OF_CALLING_USER_DEFINED_FUNCTION_WITH_RETURNING_VALUE + +CAST_OR_BOOLEAN->CAST_TYPE ) E10 @CAST_SCALAR +CAST_OR_BOOLEAN->STRUCT_CAST_TYPE ) E10 @CAST_SCALAR +CAST_OR_BOOLEAN->BE ) + +CAST_TYPE->_script_variable_type CAST_TYPE_REST @PUSH +CAST_TYPE_REST->_script_variable_type CAST_TYPE_REST @PUSH +CAST_TYPE_REST->* CAST_POINTERS @DECLARE_POINTER_TYPE +CAST_TYPE_REST->eps +CAST_POINTERS->* CAST_POINTERS @DECLARE_POINTER_TYPE +CAST_POINTERS->eps +STRUCT_CAST_TYPE->struct _local_id CAST_POINTERS @PUSH + +SIZEOF_BEGIN->eps @SIZEOF_BEGIN +SIZEOF_VALUE->( SIZEOF_PAREN +SIZEOF_VALUE->SIZEOF_BEGIN E10 @SIZEOF_EXPRESSION +SIZEOF_PAREN->CAST_TYPE ) @SIZEOF_TYPE +SIZEOF_PAREN->STRUCT_CAST_TYPE ) @SIZEOF_TYPE +SIZEOF_PAREN->SIZEOF_BEGIN BE ) @SIZEOF_EXPRESSION + E13->_function_id @PUSH MEMBER_NAME->_local_id @PUSH diff --git a/hyperdbg/script-engine/python/Grammar.txt b/hyperdbg/script-engine/python/Grammar.txt index 97ebc87e..4474c29e 100644 --- a/hyperdbg/script-engine/python/Grammar.txt +++ b/hyperdbg/script-engine/python/Grammar.txt @@ -47,7 +47,7 @@ .AssignmentOperator->add_assignment sub_assignment mul_assignment div_assignment mod_assignment asl_assignment asr_assignment and_assignment xor_assignment or_assignment -.SemantiRules->jmp jz jnz mov start_of_do_while start_of_do_while_commands end_of_do_while start_of_for for_inc_dec start_of_for_ommands end_of_if ignore_lvalue push pop call ret struct_forward_declaration struct_definition_begin struct_definition_end struct_variable_declaration struct_member_declaration typedef_declaration struct_pointer struct_array_dimension struct_declarator_complete typed_load typed_store aggregate_copy aggregate_zero struct_initializer_begin struct_initializer_end struct_pointer_cast member_address member_read member_dot_lvalue member_arrow_lvalue member_dot_read member_arrow_read mov_float neg_float add_float sub_float mul_float div_float gt_float lt_float egt_float elt_float equal_float neq_float convert_float +.SemantiRules->jmp jz jnz mov start_of_do_while start_of_do_while_commands end_of_do_while start_of_for for_inc_dec start_of_for_ommands end_of_if ignore_lvalue push pop call ret struct_forward_declaration struct_definition_begin struct_definition_end struct_variable_declaration struct_member_declaration typedef_declaration struct_pointer struct_array_dimension struct_declarator_complete typed_load typed_store aggregate_copy aggregate_zero struct_initializer_begin struct_initializer_end struct_pointer_cast member_address member_read member_dot_lvalue member_arrow_lvalue member_dot_read member_arrow_read mov_float neg_float add_float sub_float mul_float div_float gt_float lt_float egt_float elt_float equal_float neq_float convert_float cast_scalar type_name_begin sizeof_begin sizeof_type sizeof_expression logical_not_typed logical_or_begin logical_or_end logical_and_begin logical_and_end .Registers->rax eax ax ah al rcx ecx cx ch cl rdx edx dx dh dl rbx ebx bx bh bl rsp esp sp spl rbp ebp bp bpl rsi esi si sil rdi edi di dil r8 r8d r8w r8h r8l r9 r9d r9w r9h r9l r10 r10d r10w r10h r10l r11 r11d r11w r11h r11l r12 r12d r12w r12h r12l r13 r13d r13w r13h r13l r14 r14d r14w r14h r14l r15 r15d r15w r15h r15l ds es fs gs cs ss rflags eflags flags cf pf af zf sf tf if df of iopl nt rf vm ac vif vip id rip eip ip idtr ldtr gdtr tr cr0 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr6 dr7 @@ -188,9 +188,11 @@ STRUCT_ARRAY_DIMS->[ @PUSH CONST_NUMBER @STRUCT_ARRAY_DIMENSION ] STRUCT_ARRAY_D STRUCT_ARRAY_DIMS->eps -# Typedef declarations are accepted, but typedef-name lookup is implemented in -# a later type-system stage. Until then an alias cannot be used as a type. -TYPEDEF_DECLARATION->typedef TYPEDEF_BASE_TYPE STRUCT_POINTERS @PUSH _local_id ; @TYPEDEF_DECLARATION +# Register the alias before consuming ';'. The LL(1) driver scans one token of +# lookahead after every terminal, so placing the semantic action after ';' +# would classify the first token in the next declaration before the typedef +# exists in the type context. +TYPEDEF_DECLARATION->typedef TYPEDEF_BASE_TYPE STRUCT_POINTERS @PUSH _local_id @TYPEDEF_DECLARATION ; TYPEDEF_BASE_TYPE->STRUCT_SCALAR_TYPE TYPEDEF_BASE_TYPE->struct @PUSH _local_id @@ -337,7 +339,34 @@ E12->.OneOpFunc4 ( WstringNumber @.OneOpFunc4 ) E12->.TwoOpFunc4 ( WstringNumber , WstringNumber @.TwoOpFunc4 ) E12->.ThreeOpFunc4 ( WstringNumber , WstringNumber , EXPRESSION @.ThreeOpFunc4 ) -E12->( EXPRESSION ) +E12->( PAREN_EXPRESSION + +PAREN_EXPRESSION->@TYPE_NAME_BEGIN VARIABLE_TYPE1 CAST_TYPE_REST ) E12 @CAST_SCALAR +PAREN_EXPRESSION->@TYPE_NAME_BEGIN struct @PUSH _local_id CAST_POINTERS ) E12 @CAST_SCALAR +PAREN_EXPRESSION->EXPRESSION ) + +CAST_TYPE_REST->VARIABLE_TYPE1 CAST_TYPE_REST +CAST_TYPE_REST->* @DECLARE_POINTER_TYPE CAST_POINTERS +CAST_TYPE_REST->eps +CAST_POINTERS->* @DECLARE_POINTER_TYPE CAST_POINTERS +CAST_POINTERS->eps + +E12->sizeof SIZEOF_OPERAND +SIZEOF_OPERAND->( SIZEOF_PAREN +SIZEOF_OPERAND->@SIZEOF_BEGIN SIZEOF_UNPAREN @SIZEOF_EXPRESSION +SIZEOF_PAREN->@TYPE_NAME_BEGIN VARIABLE_TYPE1 CAST_TYPE_REST ) @SIZEOF_TYPE +SIZEOF_PAREN->@TYPE_NAME_BEGIN struct @PUSH _local_id CAST_POINTERS ) @SIZEOF_TYPE +SIZEOF_PAREN->@SIZEOF_BEGIN EXPRESSION ) @SIZEOF_EXPRESSION + +SIZEOF_UNPAREN->L_VALUE MEMBER_READ_SUFFIX ARRAY_DIMS_READ_OPT +SIZEOF_UNPAREN->CONST_NUMBER +SIZEOF_UNPAREN->@PUSH _pseudo_register +SIZEOF_UNPAREN->- E12 @NEG +SIZEOF_UNPAREN->+ E12 +SIZEOF_UNPAREN->~ E12 @NOT +SIZEOF_UNPAREN->! E12 @LOGICAL_NOT_TYPED +SIZEOF_UNPAREN->* E12 @POI +SIZEOF_UNPAREN->& E12 @REFERENCE E12->L_VALUE MEMBER_READ_SUFFIX ARRAY_DIMS_READ_OPT @@ -372,6 +401,7 @@ E12->@PUSH _pseudo_register E12->- E12 @NEG E12->+ E12 E12->~ E12 @NOT +E12->! E12 @LOGICAL_NOT_TYPED E12->* E12 @POI E12->& E12 @REFERENCE diff --git a/hyperdbg/script-engine/python/generator.py b/hyperdbg/script-engine/python/generator.py index 37a7a151..1bfc6e93 100644 --- a/hyperdbg/script-engine/python/generator.py +++ b/hyperdbg/script-engine/python/generator.py @@ -14,9 +14,23 @@ """ +import os +import subprocess +import sys + from ll1_parser import * from lalr1_parser import * + +def EnsureDeterministicHashSeed(): + """Restart the generator with stable set/dict iteration ordering.""" + if os.environ.get("PYTHONHASHSEED") == "0": + return + + Environment = os.environ.copy() + Environment["PYTHONHASHSEED"] = "0" + raise SystemExit(subprocess.call([sys.executable] + sys.argv, env=Environment)) + class Generator(): def __init__(self): self.SourceFile = open("..\\code\\parse-table.c", "w") @@ -91,6 +105,20 @@ object ScriptConstants { val SYMBOL_VALUE_KIND_INTEGER = 0 val SYMBOL_VALUE_KIND_FLOAT32 = 1 val SYMBOL_VALUE_KIND_FLOAT64 = 2 + val SCRIPT_SCALAR_TYPE_INVALID = 0 + val SCRIPT_SCALAR_TYPE_BOOL = 1 + val SCRIPT_SCALAR_TYPE_I8 = 2 + val SCRIPT_SCALAR_TYPE_I16 = 3 + val SCRIPT_SCALAR_TYPE_I32 = 4 + val SCRIPT_SCALAR_TYPE_I64 = 5 + val SCRIPT_SCALAR_TYPE_U8 = 6 + val SCRIPT_SCALAR_TYPE_U16 = 7 + val SCRIPT_SCALAR_TYPE_U32 = 8 + val SCRIPT_SCALAR_TYPE_U64 = 9 + val SCRIPT_SCALAR_TYPE_F32 = 10 + val SCRIPT_SCALAR_TYPE_F64 = 11 + val SCRIPT_SCALAR_TYPE_POINTER = 12 + val SCRIPT_SCALAR_TYPE_F80 = 13 } /** @@ -180,6 +208,21 @@ typedef struct ACTION_BUFFER { #define SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL 1 #define SCRIPT_ENGINE_ADDRESS_SPACE_REMOTE 2 +#define SCRIPT_SCALAR_TYPE_INVALID 0 +#define SCRIPT_SCALAR_TYPE_BOOL 1 +#define SCRIPT_SCALAR_TYPE_I8 2 +#define SCRIPT_SCALAR_TYPE_I16 3 +#define SCRIPT_SCALAR_TYPE_I32 4 +#define SCRIPT_SCALAR_TYPE_I64 5 +#define SCRIPT_SCALAR_TYPE_U8 6 +#define SCRIPT_SCALAR_TYPE_U16 7 +#define SCRIPT_SCALAR_TYPE_U32 8 +#define SCRIPT_SCALAR_TYPE_U64 9 +#define SCRIPT_SCALAR_TYPE_F32 10 +#define SCRIPT_SCALAR_TYPE_F64 11 +#define SCRIPT_SCALAR_TYPE_POINTER 12 +#define SCRIPT_SCALAR_TYPE_F80 13 + static const char *const SymbolTypeNames[] = { "SYMBOL_UNDEFINED", "SYMBOL_GLOBAL_ID_TYPE", @@ -219,7 +262,8 @@ static const char *const SymbolTypeNames[] = { if __name__ == "__main__": - + EnsureDeterministicHashSeed() + gen = Generator() gen.Run() diff --git a/hyperdbg/script-engine/python/lalr1_parser.py b/hyperdbg/script-engine/python/lalr1_parser.py index 11a4a75d..70038b4a 100644 --- a/hyperdbg/script-engine/python/lalr1_parser.py +++ b/hyperdbg/script-engine/python/lalr1_parser.py @@ -142,8 +142,8 @@ class LALR1Parser: self.SourceFile.write("};\n") def WriteTerminalList(self): - self.SourceFile.write("const char* LalrTerminalMap[TERMINAL_COUNT]= \n{\n") - self.HeaderFile.write("extern const char* LalrTerminalMap[TERMINAL_COUNT];\n") + self.SourceFile.write("const char* LalrTerminalMap[LALR_TERMINAL_COUNT]=\n{\n") + self.HeaderFile.write("extern const char* LalrTerminalMap[LALR_TERMINAL_COUNT];\n") Counter = 0 for X in self.TerminalList: if Counter == len(self.TerminalList)-1: @@ -154,8 +154,8 @@ class LALR1Parser: self.SourceFile.write("};\n") def WriteNoneTermianlList(self): - self.SourceFile.write("const char* LalrNoneTerminalMap[NONETERMINAL_COUNT]= \n{\n") - self.HeaderFile.write("extern const char* LalrNoneTerminalMap[NONETERMINAL_COUNT];\n") + self.SourceFile.write("const char* LalrNoneTerminalMap[LALR_NONTERMINAL_COUNT]=\n{\n") + self.HeaderFile.write("extern const char* LalrNoneTerminalMap[LALR_NONTERMINAL_COUNT];\n") Counter = 0 for X in self.NonTerminalList: if Counter == len(self.NonTerminalList)-1: @@ -292,9 +292,9 @@ class LALR1Parser: self.TerminalSet.add("$") - self.NonTerminalList = list(self.NonTerminalSet) + self.NonTerminalList = sorted(self.NonTerminalSet) - self.TerminalList = list(self.TerminalSet) + self.TerminalList = sorted(self.TerminalSet) def FillActionTable(self): self.ActionTable = [[self.INVALID for y in range(len(self.TerminalList))] for X in range(self.StateCount)] @@ -305,9 +305,21 @@ class LALR1Parser: Action = self.ParseTable.action[RowId][Terminal] Type = None StateId = None - for Element in Action: - Type = Element[0] - StateId = Element[1] + Elements = list(Action) + ShiftActions = [Element for Element in Elements if Element[0] == 'S'] + AcceptActions = [Element for Element in Elements if Element[0] == 'accept'] + ReduceActions = [Element for Element in Elements if Element[0] == 'R'] + if AcceptActions: + Type, StateId = AcceptActions[0] + elif ShiftActions: + # Match conventional yacc behavior for shift/reduce + # conflicts. In particular, sizeof '(' must shift so + # SIZEOF_PAREN can distinguish a type-name from an + # expression instead of prematurely reducing the + # unparenthesized sizeof production. + Type, StateId = sorted(ShiftActions, key=lambda Element: int(Element[1]))[0] + elif ReduceActions: + Type, StateId = sorted(ReduceActions, key=lambda Element: int(Element[1]))[0] if Type != None: if Type == 'S': self.ActionTable[RowId][self.GetTerminalId(Terminal)] = StateId diff --git a/hyperdbg/script-engine/python/ll1_parser.py b/hyperdbg/script-engine/python/ll1_parser.py index 0350a6af..cae747f4 100644 --- a/hyperdbg/script-engine/python/ll1_parser.py +++ b/hyperdbg/script-engine/python/ll1_parser.py @@ -48,7 +48,7 @@ class LL1Parser: self.MAXIMUM_RHS_LEN = 0 - self.SPECIAL_TOKENS = ['%', '+', '~', '++', '-', '--', '->', '.', "*", "/", "=", "==", "!=", ",", ";", "(", ")", "{", "}", "|", "||", ">>", ">=", "<<", "<=", "&", "&&", "^", + self.SPECIAL_TOKENS = ['%', '+', '~', '!', '++', '-', '--', '->', '.', "*", "/", "=", "==", "!=", ",", ";", "(", ")", "{", "}", "|", "||", ">>", ">=", "<<", "<=", "&", "&&", "^", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", "&=", "^=", "|=" , "[", "]"] # INVALID rule indicator @@ -430,9 +430,9 @@ class LL1Parser: self.TerminalSet.add("$") - self.NonTerminalList = list(self.NonTerminalSet) + self.NonTerminalList = sorted(self.NonTerminalSet) - self.TerminalList = list(self.TerminalSet) + self.TerminalList = sorted(self.TerminalSet) def WriteSemanticMaps(self): @@ -453,11 +453,23 @@ class LL1Parser: "convert_float" } aggregate_keywords = {"struct", "typedef"} - legacy_semantics = [x for x in self.SemantiRulesList if x not in aggregate_semantics] + append_only_semantics = [ + "cast_scalar", + "add_typed", "sub_typed", "mul_typed", "div_typed", "mod_typed", + "bitwise_and_typed", "bitwise_or_typed", "bitwise_xor_typed", + "shift_left_typed", "shift_right_typed", + "gt_typed", "lt_typed", "egt_typed", "elt_typed", "equal_typed", "neq_typed", + "neg_typed", "bitwise_not_typed", "logical_not_typed", "pointer_diff" + ] + compiler_only_semantics = { + "type_name_begin", "sizeof_begin", "sizeof_type", "sizeof_expression", + "logical_or_begin", "logical_or_end", "logical_and_begin", "logical_and_end" + } + legacy_semantics = [x for x in self.SemantiRulesList if x not in aggregate_semantics and x not in append_only_semantics and x not in compiler_only_semantics] new_semantics = [x for x in self.SemantiRulesList if x in aggregate_semantics] legacy_keywords = [x for x in self.keywordList if x not in aggregate_keywords] new_keywords = [x for x in self.keywordList if x in aggregate_keywords] - numbered_semantics = legacy_semantics + legacy_keywords + new_semantics + new_keywords + numbered_semantics = legacy_semantics + legacy_keywords + new_semantics + new_keywords + append_only_semantics self.CommonHeaderFileScala.write("object ScriptEvalFunc {\n object ScriptOperators extends ChiselEnum {\n val ") @@ -506,7 +518,10 @@ class LL1Parser: self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n") for X in self.SemantiRulesList: - self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n") + if X in compiler_only_semantics: + self.SourceFile.write("{\"@" + X.upper() + "\", FUNC_UNDEFINED},\n") + else: + self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n") for X in self.keywordList: self.SourceFile.write("{\"@" + X.upper() + "\", "+ "FUNC_" + X.upper() + "},\n") @@ -872,8 +887,9 @@ class LL1Parser: self.ParseTable[i][j] = RuleId else: - - print("Error! Input grammar is not LL1.") + print("Error! Input grammar is not LL1: " + Lhs + + " on " + Terminal + " conflicts between rules " + + str(self.ParseTable[i][j]) + " and " + str(RuleId) + ".") exit() j += 1 diff --git a/hyperdbg/script-eval/code/ScriptEngineEval.c b/hyperdbg/script-eval/code/ScriptEngineEval.c index 43a7566d..fced03b0 100644 --- a/hyperdbg/script-eval/code/ScriptEngineEval.c +++ b/hyperdbg/script-eval/code/ScriptEngineEval.c @@ -114,6 +114,16 @@ typedef struct _SCRIPT_ENGINE_SOFT_FLOAT SCRIPT_ENGINE_UINT128 Significand; } SCRIPT_ENGINE_SOFT_FLOAT; +static BOOLEAN +ScriptEngineSoftFloatUnpack(UINT64 ValueKind, UINT64 RawBits, SCRIPT_ENGINE_SOFT_FLOAT * Value); + +static BOOLEAN +ScriptEngineSoftFloatPack(UINT64 ValueKind, + BOOLEAN Negative, + INT32 Exponent, + const SCRIPT_ENGINE_UINT128 * InputSignificand, + PUINT64 RawBits); + static BOOLEAN ScriptEngineIntegerSymbolIsWritable(PSCRIPT_ENGINE_GENERAL_REGISTERS Registers, PSYMBOL Symbol) { @@ -123,6 +133,259 @@ ScriptEngineIntegerSymbolIsWritable(PSCRIPT_ENGINE_GENERAL_REGISTERS Registers, Symbol->Value < MAX_STACK_BUFFER_COUNT - Registers->StackBaseIndx; } +static BOOLEAN +ScriptEngineHasOperands(PSYMBOL_BUFFER CodeBuffer, UINT64 Index, UINT32 Count) +{ + return Index <= CodeBuffer->Pointer && Count <= CodeBuffer->Pointer - Index; +} + +static BOOLEAN +ScriptEngineScalarTypeIsInteger(UINT64 TypeId) +{ + return TypeId >= SCRIPT_SCALAR_TYPE_BOOL && TypeId <= SCRIPT_SCALAR_TYPE_U64; +} + +static BOOLEAN +ScriptEngineScalarTypeIsFloating(UINT64 TypeId) +{ + return TypeId == SCRIPT_SCALAR_TYPE_F32 || TypeId == SCRIPT_SCALAR_TYPE_F64; +} + +static UINT32 +ScriptEngineScalarTypeWidth(UINT64 TypeId) +{ + switch (TypeId) + { + case SCRIPT_SCALAR_TYPE_BOOL: + case SCRIPT_SCALAR_TYPE_I8: + case SCRIPT_SCALAR_TYPE_U8: + return 8; + case SCRIPT_SCALAR_TYPE_I16: + case SCRIPT_SCALAR_TYPE_U16: + return 16; + case SCRIPT_SCALAR_TYPE_I32: + case SCRIPT_SCALAR_TYPE_U32: + case SCRIPT_SCALAR_TYPE_F32: + return 32; + case SCRIPT_SCALAR_TYPE_I64: + case SCRIPT_SCALAR_TYPE_U64: + case SCRIPT_SCALAR_TYPE_F64: + case SCRIPT_SCALAR_TYPE_POINTER: + return 64; + default: + return 0; + } +} + +static BOOLEAN +ScriptEngineScalarTypeIsSigned(UINT64 TypeId) +{ + return TypeId == SCRIPT_SCALAR_TYPE_I8 || TypeId == SCRIPT_SCALAR_TYPE_I16 || + TypeId == SCRIPT_SCALAR_TYPE_I32 || TypeId == SCRIPT_SCALAR_TYPE_I64; +} + +static UINT64 +ScriptEngineNormalizeInteger(UINT64 Value, UINT64 TypeId) +{ + UINT32 Width = ScriptEngineScalarTypeWidth(TypeId); + UINT64 Mask; + + if (TypeId == SCRIPT_SCALAR_TYPE_BOOL) + return Value != 0; + if (Width == 64) + return Value; + Mask = (1ULL << Width) - 1; + Value &= Mask; + if (ScriptEngineScalarTypeIsSigned(TypeId) && (Value & (1ULL << (Width - 1)))) + Value |= ~Mask; + return Value; +} + +static BOOLEAN +ScriptEngineIntegerToFloat(UINT64 Value, UINT64 SourceType, UINT64 DestinationType, PUINT64 Result) +{ + SCRIPT_ENGINE_UINT128 Significand = {0, 0}; + BOOLEAN Negative = FALSE; + UINT64 Magnitude; + INT32 Exponent = 0; + + Value = ScriptEngineNormalizeInteger(Value, SourceType); + if (ScriptEngineScalarTypeIsSigned(SourceType) && (Value & 0x8000000000000000ULL)) + { + Negative = TRUE; + Magnitude = 0ULL - Value; + } + else + { + Magnitude = Value; + } + + if (Magnitude) + { + UINT64 Scan = Magnitude; + while (Scan >>= 1) Exponent++; + Significand.High = Magnitude << (63 - Exponent); + } + + return ScriptEngineSoftFloatPack(DestinationType == SCRIPT_SCALAR_TYPE_F32 ? + SYMBOL_VALUE_KIND_FLOAT32 : SYMBOL_VALUE_KIND_FLOAT64, + Negative, + Exponent, + &Significand, + Result); +} + +static BOOLEAN +ScriptEngineFloatToInteger(UINT64 Value, UINT64 SourceType, UINT64 DestinationType, PUINT64 Result) +{ + SCRIPT_ENGINE_SOFT_FLOAT FloatValue; + UINT64 Magnitude; + UINT64 Maximum; + UINT32 Width = ScriptEngineScalarTypeWidth(DestinationType); + + if (!ScriptEngineSoftFloatUnpack(SourceType == SCRIPT_SCALAR_TYPE_F32 ? + SYMBOL_VALUE_KIND_FLOAT32 : SYMBOL_VALUE_KIND_FLOAT64, + Value, + &FloatValue)) + return FALSE; + if (FloatValue.IsZero || FloatValue.Exponent < 0) + { + *Result = 0; + return TRUE; + } + if (FloatValue.Exponent > 63) + return FALSE; + + Magnitude = FloatValue.Significand.High >> (63 - FloatValue.Exponent); + if (ScriptEngineScalarTypeIsSigned(DestinationType)) + { + Maximum = Width == 64 ? 0x7fffffffffffffffULL : (1ULL << (Width - 1)) - 1; + if ((!FloatValue.Negative && Magnitude > Maximum) || + (FloatValue.Negative && Magnitude > Maximum + 1)) + return FALSE; + *Result = FloatValue.Negative ? 0ULL - Magnitude : Magnitude; + } + else + { + Maximum = Width == 64 ? ~0ULL : (1ULL << Width) - 1; + if (FloatValue.Negative || Magnitude > Maximum) + return FALSE; + *Result = Magnitude; + } + *Result = ScriptEngineNormalizeInteger(*Result, DestinationType); + return TRUE; +} + +static BOOLEAN +ScriptEngineCastScalar(UINT64 Value, UINT64 SourceType, UINT64 DestinationType, PUINT64 Result) +{ + if (SourceType == SCRIPT_SCALAR_TYPE_F80 || DestinationType == SCRIPT_SCALAR_TYPE_F80 || + SourceType == SCRIPT_SCALAR_TYPE_INVALID || DestinationType == SCRIPT_SCALAR_TYPE_INVALID) + return FALSE; + + if ((ScriptEngineScalarTypeIsInteger(SourceType) || SourceType == SCRIPT_SCALAR_TYPE_POINTER) && + (ScriptEngineScalarTypeIsInteger(DestinationType) || DestinationType == SCRIPT_SCALAR_TYPE_POINTER)) + { + *Result = DestinationType == SCRIPT_SCALAR_TYPE_POINTER ? + Value : ScriptEngineNormalizeInteger(Value, DestinationType); + return TRUE; + } + if (ScriptEngineScalarTypeIsFloating(SourceType) && ScriptEngineScalarTypeIsFloating(DestinationType)) + { + SCRIPT_ENGINE_SOFT_FLOAT Converted; + if (!ScriptEngineSoftFloatUnpack(SourceType == SCRIPT_SCALAR_TYPE_F32 ? + SYMBOL_VALUE_KIND_FLOAT32 : SYMBOL_VALUE_KIND_FLOAT64, + Value, + &Converted)) + return FALSE; + return ScriptEngineSoftFloatPack(DestinationType == SCRIPT_SCALAR_TYPE_F32 ? + SYMBOL_VALUE_KIND_FLOAT32 : SYMBOL_VALUE_KIND_FLOAT64, + Converted.Negative, + Converted.Exponent, + &Converted.Significand, + Result); + } + if (ScriptEngineScalarTypeIsInteger(SourceType) && ScriptEngineScalarTypeIsFloating(DestinationType)) + return ScriptEngineIntegerToFloat(Value, SourceType, DestinationType, Result); + if (ScriptEngineScalarTypeIsFloating(SourceType) && ScriptEngineScalarTypeIsInteger(DestinationType)) + return ScriptEngineFloatToInteger(Value, SourceType, DestinationType, Result); + return FALSE; +} + +static BOOLEAN +ScriptEngineExecuteTypedBinary(UINT64 Opcode, + UINT64 Right, + UINT64 Left, + UINT64 TypeId, + PUINT64 Result) +{ + UINT32 Width; + UINT64 SignedMinimum; + + if (TypeId == SCRIPT_SCALAR_TYPE_POINTER) + { + if (Opcode == FUNC_GT_TYPED) *Result = Left > Right; + else if (Opcode == FUNC_LT_TYPED) *Result = Left < Right; + else if (Opcode == FUNC_EGT_TYPED) *Result = Left >= Right; + else if (Opcode == FUNC_ELT_TYPED) *Result = Left <= Right; + else if (Opcode == FUNC_EQUAL_TYPED) *Result = Left == Right; + else if (Opcode == FUNC_NEQ_TYPED) *Result = Left != Right; + else return FALSE; + return TRUE; + } + if (!ScriptEngineScalarTypeIsInteger(TypeId)) + return FALSE; + Width = ScriptEngineScalarTypeWidth(TypeId); + Left = ScriptEngineNormalizeInteger(Left, TypeId); + Right = ScriptEngineNormalizeInteger(Right, TypeId); + + switch (Opcode) + { + case FUNC_ADD_TYPED: *Result = Left + Right; break; + case FUNC_SUB_TYPED: *Result = Left - Right; break; + case FUNC_MUL_TYPED: *Result = Left * Right; break; + case FUNC_DIV_TYPED: + case FUNC_MOD_TYPED: + if (!Right) return FALSE; + if (ScriptEngineScalarTypeIsSigned(TypeId)) + { + SignedMinimum = Width == 64 ? 0x8000000000000000ULL : (1ULL << (Width - 1)); + SignedMinimum = ScriptEngineNormalizeInteger(SignedMinimum, TypeId); + if (Left == SignedMinimum && Right == ~0ULL) return FALSE; + *Result = Opcode == FUNC_DIV_TYPED ? + (UINT64)((INT64)Left / (INT64)Right) : + (UINT64)((INT64)Left % (INT64)Right); + } + else + { + *Result = Opcode == FUNC_DIV_TYPED ? Left / Right : Left % Right; + } + break; + case FUNC_BITWISE_AND_TYPED: *Result = Left & Right; break; + case FUNC_BITWISE_OR_TYPED: *Result = Left | Right; break; + case FUNC_BITWISE_XOR_TYPED: *Result = Left ^ Right; break; + case FUNC_SHIFT_LEFT_TYPED: + if (Right >= Width) return FALSE; + *Result = Left << Right; + break; + case FUNC_SHIFT_RIGHT_TYPED: + if (Right >= Width) return FALSE; + *Result = ScriptEngineScalarTypeIsSigned(TypeId) ? + (UINT64)((INT64)Left >> Right) : Left >> Right; + break; + case FUNC_GT_TYPED: *Result = ScriptEngineScalarTypeIsSigned(TypeId) ? (INT64)Left > (INT64)Right : Left > Right; return TRUE; + case FUNC_LT_TYPED: *Result = ScriptEngineScalarTypeIsSigned(TypeId) ? (INT64)Left < (INT64)Right : Left < Right; return TRUE; + case FUNC_EGT_TYPED: *Result = ScriptEngineScalarTypeIsSigned(TypeId) ? (INT64)Left >= (INT64)Right : Left >= Right; return TRUE; + case FUNC_ELT_TYPED: *Result = ScriptEngineScalarTypeIsSigned(TypeId) ? (INT64)Left <= (INT64)Right : Left <= Right; return TRUE; + case FUNC_EQUAL_TYPED: *Result = Left == Right; return TRUE; + case FUNC_NEQ_TYPED: *Result = Left != Right; return TRUE; + default: return FALSE; + } + + *Result = ScriptEngineNormalizeInteger(*Result, TypeId); + return TRUE; +} + static BOOLEAN ScriptEngineIsFloatingComparisonOpcode(UINT64 Opcode) { @@ -901,6 +1164,11 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, { case FUNC_TYPED_LOAD: { + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 4)) + { + HasError = TRUE; + break; + } Src0 = CodeBuffer->Head + (*Indx)++; Src1 = CodeBuffer->Head + (*Indx)++; Src2 = CodeBuffer->Head + (*Indx)++; @@ -919,6 +1187,11 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, case FUNC_TYPED_STORE: { + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 4)) + { + HasError = TRUE; + break; + } Src0 = CodeBuffer->Head + (*Indx)++; Src1 = CodeBuffer->Head + (*Indx)++; Src2 = CodeBuffer->Head + (*Indx)++; @@ -937,6 +1210,11 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, { BYTE ZeroBuffer[64] = {0}; UINT64 Done = 0; + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 3)) + { + HasError = TRUE; + break; + } Src0 = CodeBuffer->Head + (*Indx)++; Src1 = CodeBuffer->Head + (*Indx)++; Src2 = CodeBuffer->Head + (*Indx)++; @@ -958,6 +1236,11 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, BYTE MovingBuffer[64]; UINT64 Done = 0; BOOLEAN Backward; + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 5)) + { + HasError = TRUE; + break; + } Src0 = CodeBuffer->Head + (*Indx)++; Src1 = CodeBuffer->Head + (*Indx)++; Src2 = CodeBuffer->Head + (*Indx)++; @@ -1282,6 +1565,12 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, case FUNC_MEMCPY: + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 3)) + { + HasError = TRUE; + break; + } + Src0 = (PSYMBOL)((unsigned long long)CodeBuffer->Head + (unsigned long long)(*Indx * sizeof(SYMBOL))); @@ -1305,7 +1594,21 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, SrcVal2 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src2, FALSE); - ScriptEngineFunctionMemcpy(SrcVal2, SrcVal1, (UINT32)SrcVal0, &HasError); + if (SrcVal0 == 0 || SrcVal0 > 0xffffffffULL) + { + HasError = TRUE; + break; + } + + if (ScriptEngineTypedLocalRangeIsValid(ScriptGeneralRegisters, SrcVal2, (UINT32)SrcVal0) && + ScriptEngineTypedLocalRangeIsValid(ScriptGeneralRegisters, SrcVal1, (UINT32)SrcVal0)) + { + memmove((PVOID)SrcVal2, (PVOID)SrcVal1, (SIZE_T)SrcVal0); + } + else + { + ScriptEngineFunctionMemcpy(SrcVal2, SrcVal1, (UINT32)SrcVal0, &HasError); + } break; @@ -2569,6 +2872,173 @@ ScriptEngineExecute(PGUEST_REGS GuestRegs, break; } + case FUNC_CAST_SCALAR: + { + UINT64 SourceType; + UINT64 DestinationType; + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 4)) + { + HasError = TRUE; + break; + } + Src0 = CodeBuffer->Head + (*Indx)++; + Des = CodeBuffer->Head + (*Indx)++; + Src1 = CodeBuffer->Head + (*Indx)++; + Src2 = CodeBuffer->Head + (*Indx)++; + SourceType = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src1, FALSE); + DestinationType = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src2, FALSE); + + if ((ScriptEngineScalarTypeIsFloating(SourceType) ? + !ScriptEngineFloatingSymbolIsReadable(ScriptGeneralRegisters, Src0) : + Src0->Len != SYMBOL_VALUE_KIND_INTEGER) || + (ScriptEngineScalarTypeIsFloating(DestinationType) ? + !ScriptEngineFloatingSymbolIsWritable(ScriptGeneralRegisters, Des) : + !ScriptEngineIntegerSymbolIsWritable(ScriptGeneralRegisters, Des))) + { + HasError = TRUE; + break; + } + + SrcVal0 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src0, FALSE); + if (!ScriptEngineCastScalar(SrcVal0, SourceType, DestinationType, &DesVal)) + { + HasError = TRUE; + break; + } + SetValue(GuestRegs, ScriptGeneralRegisters, Des, DesVal); + break; + } + + case FUNC_ADD_TYPED: + case FUNC_SUB_TYPED: + case FUNC_MUL_TYPED: + case FUNC_DIV_TYPED: + case FUNC_MOD_TYPED: + case FUNC_BITWISE_AND_TYPED: + case FUNC_BITWISE_OR_TYPED: + case FUNC_BITWISE_XOR_TYPED: + case FUNC_SHIFT_LEFT_TYPED: + case FUNC_SHIFT_RIGHT_TYPED: + case FUNC_GT_TYPED: + case FUNC_LT_TYPED: + case FUNC_EGT_TYPED: + case FUNC_ELT_TYPED: + case FUNC_EQUAL_TYPED: + case FUNC_NEQ_TYPED: + { + UINT64 OperationType; + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 4)) + { + HasError = TRUE; + break; + } + Src0 = CodeBuffer->Head + (*Indx)++; + Src1 = CodeBuffer->Head + (*Indx)++; + Des = CodeBuffer->Head + (*Indx)++; + Src2 = CodeBuffer->Head + (*Indx)++; + OperationType = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src2, FALSE); + if (Src0->Len != SYMBOL_VALUE_KIND_INTEGER || Src1->Len != SYMBOL_VALUE_KIND_INTEGER || + !ScriptEngineIntegerSymbolIsWritable(ScriptGeneralRegisters, Des)) + { + HasError = TRUE; + break; + } + SrcVal0 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src0, FALSE); + SrcVal1 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src1, FALSE); + if (!ScriptEngineExecuteTypedBinary(Operator->Value, SrcVal0, SrcVal1, OperationType, &DesVal)) + { + HasError = TRUE; + break; + } + SetValue(GuestRegs, ScriptGeneralRegisters, Des, DesVal); + break; + } + + case FUNC_NEG_TYPED: + case FUNC_BITWISE_NOT_TYPED: + case FUNC_LOGICAL_NOT_TYPED: + { + UINT64 OperationType; + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 3)) + { + HasError = TRUE; + break; + } + Src0 = CodeBuffer->Head + (*Indx)++; + Des = CodeBuffer->Head + (*Indx)++; + Src1 = CodeBuffer->Head + (*Indx)++; + OperationType = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src1, FALSE); + if ((!ScriptEngineScalarTypeIsInteger(OperationType) && OperationType != SCRIPT_SCALAR_TYPE_POINTER && + !(Operator->Value == FUNC_LOGICAL_NOT_TYPED && ScriptEngineScalarTypeIsFloating(OperationType))) || + (ScriptEngineScalarTypeIsFloating(OperationType) ? + !ScriptEngineFloatingSymbolIsReadable(ScriptGeneralRegisters, Src0) : + Src0->Len != SYMBOL_VALUE_KIND_INTEGER) || + !ScriptEngineIntegerSymbolIsWritable(ScriptGeneralRegisters, Des)) + { + HasError = TRUE; + break; + } + SrcVal0 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src0, FALSE); + if (Operator->Value == FUNC_LOGICAL_NOT_TYPED) + { + if (OperationType == SCRIPT_SCALAR_TYPE_F32) + DesVal = (SrcVal0 & 0x7fffffffULL) == 0; + else if (OperationType == SCRIPT_SCALAR_TYPE_F64) + DesVal = (SrcVal0 & 0x7fffffffffffffffULL) == 0; + else + DesVal = SrcVal0 == 0; + } + else if (Operator->Value == FUNC_NEG_TYPED) + DesVal = ScriptEngineNormalizeInteger(0ULL - SrcVal0, OperationType); + else + DesVal = ScriptEngineNormalizeInteger(~SrcVal0, OperationType); + SetValue(GuestRegs, ScriptGeneralRegisters, Des, DesVal); + break; + } + + case FUNC_POINTER_DIFF: + { + UINT64 ElementSize; + UINT64 Magnitude; + BOOLEAN Negative; + if (!ScriptEngineHasOperands(CodeBuffer, *Indx, 4)) + { + HasError = TRUE; + break; + } + Src0 = CodeBuffer->Head + (*Indx)++; + Src1 = CodeBuffer->Head + (*Indx)++; + Des = CodeBuffer->Head + (*Indx)++; + Src2 = CodeBuffer->Head + (*Indx)++; + ElementSize = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src2, FALSE); + if (!ElementSize || Src0->Len != SYMBOL_VALUE_KIND_INTEGER || + Src1->Len != SYMBOL_VALUE_KIND_INTEGER || + !ScriptEngineIntegerSymbolIsWritable(ScriptGeneralRegisters, Des)) + { + HasError = TRUE; + break; + } + SrcVal0 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src0, FALSE); + SrcVal1 = GetValue(GuestRegs, ActionDetail, ScriptGeneralRegisters, Src1, FALSE); + Negative = SrcVal1 < SrcVal0; + Magnitude = Negative ? SrcVal0 - SrcVal1 : SrcVal1 - SrcVal0; + if (Magnitude % ElementSize) + { + HasError = TRUE; + break; + } + Magnitude /= ElementSize; + if ((!Negative && Magnitude > 0x7fffffffffffffffULL) || + (Negative && Magnitude > 0x8000000000000000ULL)) + { + HasError = TRUE; + break; + } + DesVal = Negative ? 0ULL - Magnitude : Magnitude; + SetValue(GuestRegs, ScriptGeneralRegisters, Des, DesVal); + break; + } + case FUNC_NEG_FLOAT: if (*Indx > CodeBuffer->Pointer || CodeBuffer->Pointer - *Indx < 2) { diff --git a/hyperdbg/tests/script-engine-test b/hyperdbg/tests/script-engine-test index a8f8b923..3fbd5954 160000 --- a/hyperdbg/tests/script-engine-test +++ b/hyperdbg/tests/script-engine-test @@ -1 +1 @@ -Subproject commit a8f8b9231e04a47fa5426b89641db810ca90a88d +Subproject commit 3fbd59540fd90cda22ad1d00c18129539202070b From 39c4b2f12713b8e486bbb4da7f9a2e42cc91b86c Mon Sep 17 00:00:00 2001 From: sina Date: Tue, 21 Jul 2026 15:12:04 +0200 Subject: [PATCH 13/50] update and cleanup CPUID --- hyperdbg/hyperdbg.sln | 1 - hyperdbg/hyperevade/hyperevade.vcxproj | 2 +- hyperdbg/hyperhv/hyperhv.vcxproj | 2 +- hyperdbg/hyperkd/hyperkd.vcxproj | 2 +- hyperdbg/hyperlog/hyperlog.vcxproj | 2 +- hyperdbg/hyperperf/hyperperf.vcxproj | 2 +- hyperdbg/hypertrace/hypertrace.vcxproj | 2 +- hyperdbg/kdserial/kdserial.vcxproj | 2 +- hyperdbg/libhyperdbg/code/common/common.cpp | 46 ++--- .../code/debugger/core/interpreter.cpp | 1 + hyperdbg/libhyperdbg/ucpuid.cpp | 157 +++++++++--------- 11 files changed, 95 insertions(+), 124 deletions(-) diff --git a/hyperdbg/hyperdbg.sln b/hyperdbg/hyperdbg.sln index e0b3b689..90b129a9 100644 --- a/hyperdbg/hyperdbg.sln +++ b/hyperdbg/hyperdbg.sln @@ -2,7 +2,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 VisualStudioVersion = 18.7.11911.148 -VisualStudioVersion = 18.5.11801.241 oobstable MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hyperdbg-cli", "hyperdbg-cli\hyperdbg-cli.vcxproj", "{FBCBBBAD-4EAE-469E-827F-F59FE9E7375B}" ProjectSection(ProjectDependencies) = postProject diff --git a/hyperdbg/hyperevade/hyperevade.vcxproj b/hyperdbg/hyperevade/hyperevade.vcxproj index 95b4c9d4..ea3a07dc 100644 --- a/hyperdbg/hyperevade/hyperevade.vcxproj +++ b/hyperdbg/hyperevade/hyperevade.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperevade - 10.0.28000.0 + $(LatestTargetPlatformVersion) diff --git a/hyperdbg/hyperhv/hyperhv.vcxproj b/hyperdbg/hyperhv/hyperhv.vcxproj index 9ea51534..53c55a14 100644 --- a/hyperdbg/hyperhv/hyperhv.vcxproj +++ b/hyperdbg/hyperhv/hyperhv.vcxproj @@ -21,7 +21,7 @@ Debug Win32 hyperhv - 10.0.28000.0 + $(LatestTargetPlatformVersion) hyperhv diff --git a/hyperdbg/hyperkd/hyperkd.vcxproj b/hyperdbg/hyperkd/hyperkd.vcxproj index 5d95adb3..b165f75d 100644 --- a/hyperdbg/hyperkd/hyperkd.vcxproj +++ b/hyperdbg/hyperkd/hyperkd.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperkd - 10.0.28000.0 + $(LatestTargetPlatformVersion) diff --git a/hyperdbg/hyperlog/hyperlog.vcxproj b/hyperdbg/hyperlog/hyperlog.vcxproj index 13df5df3..5e0ba787 100644 --- a/hyperdbg/hyperlog/hyperlog.vcxproj +++ b/hyperdbg/hyperlog/hyperlog.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperlog - 10.0.28000.0 + $(LatestTargetPlatformVersion) diff --git a/hyperdbg/hyperperf/hyperperf.vcxproj b/hyperdbg/hyperperf/hyperperf.vcxproj index 98bc40f6..20624659 100644 --- a/hyperdbg/hyperperf/hyperperf.vcxproj +++ b/hyperdbg/hyperperf/hyperperf.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperperf - 10.0.28000.0 + $(LatestTargetPlatformVersion) diff --git a/hyperdbg/hypertrace/hypertrace.vcxproj b/hyperdbg/hypertrace/hypertrace.vcxproj index b96425c7..1b0d38f2 100644 --- a/hyperdbg/hypertrace/hypertrace.vcxproj +++ b/hyperdbg/hypertrace/hypertrace.vcxproj @@ -21,7 +21,7 @@ Debug x64 hypertrace - 10.0.28000.0 + $(LatestTargetPlatformVersion) diff --git a/hyperdbg/kdserial/kdserial.vcxproj b/hyperdbg/kdserial/kdserial.vcxproj index 2109552d..22ed068a 100644 --- a/hyperdbg/kdserial/kdserial.vcxproj +++ b/hyperdbg/kdserial/kdserial.vcxproj @@ -51,7 +51,7 @@ kdserial Desktop 10.0.10135.0 - 10.0.28000.0 + $(LatestTargetPlatformVersion) diff --git a/hyperdbg/libhyperdbg/code/common/common.cpp b/hyperdbg/libhyperdbg/code/common/common.cpp index 1ad44a3a..0333087d 100644 --- a/hyperdbg/libhyperdbg/code/common/common.cpp +++ b/hyperdbg/libhyperdbg/code/common/common.cpp @@ -12,7 +12,7 @@ #include "pch.h" #ifdef __linux__ -# include // struct stat / stat() for IsFileExistA +# include // struct stat / stat() for IsFileExistA # include // Intel TSX RTM intrinsics (_xbegin/_xend); requires -mrtm #endif @@ -391,7 +391,7 @@ ConvertStringToUInt32(string TextToConvert, PUINT32 Result) { try { - UINT32 I = std::stoul(TextToConvert); + INT I = std::stoi(TextToConvert); *Result = I; return TRUE; } @@ -424,41 +424,19 @@ ConvertStringToUInt32(string TextToConvert, PUINT32 Result) } else { - try - { - // - // It's hex number - // - UINT64 TempResult; - TempResult = stoul(TextToConvert, nullptr, 16); - - // - // in order to prevent buffer overflow, compare the user's value to 0xFFFFFFFF - // - if (TempResult > 0xFFFFFFFF) - { - return FALSE; - } - // - // Apply the results - // - *Result = (UINT32)TempResult; + // + // It's hex number + // + UINT32 TempResult; + TempResult = stoi(TextToConvert, nullptr, 16); - return TRUE; - } - catch (std::invalid_argument const&) - { - return FALSE; - } - catch (std::out_of_range const&) - { - return FALSE; - } - - return FALSE; + // + // Apply the results + // + *Result = TempResult; + return TRUE; } - } } diff --git a/hyperdbg/libhyperdbg/code/debugger/core/interpreter.cpp b/hyperdbg/libhyperdbg/code/debugger/core/interpreter.cpp index b6e44ff5..f06d6dbb 100644 --- a/hyperdbg/libhyperdbg/code/debugger/core/interpreter.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/core/interpreter.cpp @@ -1421,6 +1421,7 @@ InitializeCommandsDictionary() g_CommandsList["flush"] = {&CommandFlush, &CommandFlushHelp, DEBUGGER_COMMAND_FLUSH_ATTRIBUTES}; g_CommandsList["ucpuid"] = {&CommandUserCpuid, &CommandUserCpuidHelp, DEBUGGER_COMMAND_USER_CPUID_ATTRIBUTES}; + g_CommandsList["cpuid"] = {&CommandUserCpuid, &CommandUserCpuidHelp, DEBUGGER_COMMAND_USER_CPUID_ATTRIBUTES}; g_CommandsList["pause"] = {&CommandPause, &CommandPauseHelp, DEBUGGER_COMMAND_PAUSE_ATTRIBUTES}; g_CommandsList[".pause"] = {&CommandPause, &CommandPauseHelp, DEBUGGER_COMMAND_PAUSE_ATTRIBUTES}; diff --git a/hyperdbg/libhyperdbg/ucpuid.cpp b/hyperdbg/libhyperdbg/ucpuid.cpp index a8ffe97e..1cf34a7d 100644 --- a/hyperdbg/libhyperdbg/ucpuid.cpp +++ b/hyperdbg/libhyperdbg/ucpuid.cpp @@ -1,10 +1,9 @@ /** * @file ucpuid.cpp - * @author Sina Karvandi (sina@hyperdbg.org) * @author Nikzad (Hossein Shirdel) * @brief ucpuid command - reads and decodes USER specified CPUID information * @details - * @version 0.1 + * @version 0.23 * @date 2026-06-18 * * @copyright This project is released under the GNU Public License v3. @@ -57,7 +56,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) DEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest = {0}; CpuidRequest.FunctionId = FunctionId; CpuidRequest.SubFunctionId = SubFunctionId; - + if (g_IsSerialConnectedToRemoteDebuggee) { // @@ -72,8 +71,6 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) // It's on a local debugging mode // AssertShowMessageReturnStmt(g_IsKdModuleLoaded, g_DeviceHandle, ASSERT_MESSAGE_KD_NOT_LOADED, ASSERT_MESSAGE_DRIVER_NOT_LOADED, AssertReturn); - - // // By the way, we don't need to send an input buffer @@ -92,7 +89,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) &ReturnedLength, // Bytes placed in buffer. NULL // synchronous call ); - + CONST CHAR * TypeName = NULL; CONST CHAR * AssocName; @@ -137,31 +134,31 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) " *******************************************************\n\n"); ShowMessages("-- EAX: Version Information --\n\n"); - ShowMessages(" SteppingId = %u\n", + ShowMessages(" SteppingId = %u\n", CPUID_VERSION_INFORMATION_STEPPING_ID(CpuidRequest.EAX)); - ShowMessages(" Model = %u\n", + ShowMessages(" Model = %u\n", CPUID_VERSION_INFORMATION_MODEL(CpuidRequest.EAX)); - ShowMessages(" FamilyId = %u\n", + ShowMessages(" FamilyId = %u\n", CPUID_VERSION_INFORMATION_FAMILY_ID(CpuidRequest.EAX)); - ShowMessages(" ProcessorType = %u\n", + ShowMessages(" ProcessorType = %u\n", CPUID_VERSION_INFORMATION_PROCESSOR_TYPE(CpuidRequest.EAX)); - ShowMessages(" ExtendedModelId = %u\n", + ShowMessages(" ExtendedModelId = %u\n", CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID(CpuidRequest.EAX)); - ShowMessages(" ExtendedFamilyId = %u\n\n", + ShowMessages(" ExtendedFamilyId = %u\n\n", CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID(CpuidRequest.EAX)); // // EBX: additional information // ShowMessages("-- EBX: Additional Information --\n\n"); - ShowMessages(" BrandIndex = %u\n", + ShowMessages(" BrandIndex = %u\n", CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX(CpuidRequest.EBX)); - ShowMessages(" ClflushLineSize = %u (cache line = %u bytes)\n", + ShowMessages(" ClflushLineSize = %u (cache line = %u bytes)\n", CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidRequest.EBX), CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidRequest.EBX) * 8); - ShowMessages(" MaxAddressableIds = %u\n", + ShowMessages(" MaxAddressableIds = %u\n", CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS(CpuidRequest.EBX)); - ShowMessages(" InitialApicId = %u\n\n", + ShowMessages(" InitialApicId = %u\n\n", CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID(CpuidRequest.EBX)); // @@ -318,14 +315,14 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) case 0x4: { - UINT32 LineSize = CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE(CpuidRequest.EBX); - UINT32 Partitions = CPUID_EBX_PHYSICAL_LINE_PARTITIONS(CpuidRequest.EBX); - UINT32 Ways = CPUID_EBX_WAYS_OF_ASSOCIATIVITY(CpuidRequest.EBX); - UINT32 Sets = CPUID_ECX_NUMBER_OF_SETS(CpuidRequest.ECX); + UINT32 LineSize = CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE(CpuidRequest.EBX); + UINT32 Partitions = CPUID_EBX_PHYSICAL_LINE_PARTITIONS(CpuidRequest.EBX); + UINT32 Ways = CPUID_EBX_WAYS_OF_ASSOCIATIVITY(CpuidRequest.EBX); + UINT32 Sets = CPUID_ECX_NUMBER_OF_SETS(CpuidRequest.ECX); UINT64 CacheSizeBytes = (UINT64)(Ways + 1) * - (UINT64)(Partitions + 1) * - (UINT64)(LineSize + 1) * - (UINT64)(Sets + 1); + (UINT64)(Partitions + 1) * + (UINT64)(LineSize + 1) * + (UINT64)(Sets + 1); ShowMessages("==== CPUID.(EAX=04H) Deterministic Cache Parameters ====\n\n"); ShowMessages(" *******************************************************\n" @@ -491,43 +488,43 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) // EAX // ShowMessages("-- EAX --\n\n"); - ShowMessages(" TemperatureSensorSupported = %s\n", + ShowMessages(" TemperatureSensorSupported = %s\n", CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" IntelTurboBoostTechnologyAvailable = %s\n", + ShowMessages(" IntelTurboBoostTechnologyAvailable = %s\n", CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ARAT (ApicTimerAlwaysRunning) = %s\n", + ShowMessages(" ARAT (ApicTimerAlwaysRunning) = %s\n", CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" PLN (PowerLimitNotification) = %s\n", + ShowMessages(" PLN (PowerLimitNotification) = %s\n", CPUID_EAX_POWER_LIMIT_NOTIFICATION(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ECMD (ClockModulationDuty) = %s\n", + ShowMessages(" ECMD (ClockModulationDuty) = %s\n", CPUID_EAX_CLOCK_MODULATION_DUTY(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" PTM (PackageThermalManagement) = %s\n", + ShowMessages(" PTM (PackageThermalManagement) = %s\n", CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP Base Registers = %s\n", + ShowMessages(" HWP Base Registers = %s\n", CPUID_EAX_HWP_BASE_REGISTERS(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Notification = %s\n", + ShowMessages(" HWP_Notification = %s\n", CPUID_EAX_HWP_NOTIFICATION(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Activity_Window = %s\n", + ShowMessages(" HWP_Activity_Window = %s\n", CPUID_EAX_HWP_ACTIVITY_WINDOW(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Energy_Performance_Preference = %s\n", + ShowMessages(" HWP_Energy_Performance_Preference = %s\n", CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Package_Level_Request = %s\n", + ShowMessages(" HWP_Package_Level_Request = %s\n", CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HDC = %s\n", + ShowMessages(" HDC = %s\n", CPUID_EAX_HDC(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Intel Turbo Boost Max Technology 3.0 = %s\n", + ShowMessages(" Intel Turbo Boost Max Technology 3.0 = %s\n", CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP Capabilities = %s\n", + ShowMessages(" HWP Capabilities = %s\n", CPUID_EAX_HWP_CAPABILITIES(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP PECI Override = %s\n", + ShowMessages(" HWP PECI Override = %s\n", CPUID_EAX_HWP_PECI_OVERRIDE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Flexible HWP = %s\n", + ShowMessages(" Flexible HWP = %s\n", CPUID_EAX_FLEXIBLE_HWP(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Fast Access Mode for HWP Request MSR = %s\n", + ShowMessages(" Fast Access Mode for HWP Request MSR = %s\n", CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Ignoring Idle Logical Proc HWP Request = %s\n", + ShowMessages(" Ignoring Idle Logical Proc HWP Request = %s\n", CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Intel Thread Director = %s\n\n", + ShowMessages(" Intel Thread Director = %s\n\n", CPUID_EAX_INTEL_THREAD_DIRECTOR(CpuidRequest.EAX) ? "TRUE" : "FALSE"); // @@ -735,7 +732,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) // ShowMessages(" VersionId = 0 -> architectural performance monitoring not supported;\n" " remaining fields in this leaf are not architecturally defined.\n\n"); - + break; } @@ -743,13 +740,13 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) // EAX // ShowMessages("-- EAX --\n\n"); - ShowMessages(" VersionId = %u\n", + ShowMessages(" VersionId = %u\n", CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX)); ShowMessages(" NumberOfCountersPerLogicalProcessor = %u\n", CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR(CpuidRequest.EAX)); ShowMessages(" BitWidthOfPerformanceMonitoringCounter = %u\n", CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER(CpuidRequest.EAX)); - ShowMessages(" EbxBitVectorLength = %u\n\n", + ShowMessages(" EbxBitVectorLength = %u\n\n", CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest.EAX)); // @@ -782,7 +779,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) // ECX // ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); // @@ -870,7 +867,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) ShowMessages("-- EBX --\n\n"); ShowMessages(" NumberOfLogicalProcessorsAtThisLevelType = %u (DIAGNOSTIC ONLY - do not use for topology enumeration)\n\n", CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE(CpuidRequest.EBX)); - + // // EDX: x2APIC ID (constant across all sub-leaves) // @@ -1126,7 +1123,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX), CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX) + 1); } - + else { ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); @@ -1136,7 +1133,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) CpuidRequest.ECX, CpuidRequest.EDX); } - + break; case 0x11: @@ -1307,8 +1304,8 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) // // Unknown subleaf type (reserved) // - ShowMessages("-- Raw Data for Sub-leaf %u (Type %u) --\n\n", - SubFunctionId, + ShowMessages("-- Raw Data for Sub-leaf %u (Type %u) --\n\n", + SubFunctionId, CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX)); ShowMessages(" EAX = 0x%08X\n", CpuidRequest.EAX); @@ -1320,7 +1317,6 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) } break; - } case 0x13: @@ -1413,7 +1409,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); } - + else { // @@ -1485,7 +1481,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) { ShowMessages(" TSC ratio not enumerated (denominator or numerator is 0)\n\n"); } - + else { ShowMessages(" TSC / Core Crystal Clock ratio = %u / %u\n", @@ -1700,7 +1696,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 16) & 0xFF, (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 24) & 0xFF); } - + else { // @@ -1801,7 +1797,6 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX), CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX) + 1); - } else @@ -1829,8 +1824,8 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) // EAX: Reserved for sub-leaves >= 1 // ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); - + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); + // // EBX: Page size support and associativity // @@ -1894,15 +1889,15 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) case 0x80000000: ShowMessages("==== CPUID.(EAX=80000000H) Extended Function Information ====\n\n"); ShowMessages(" *******************************************************\n" - " * LEAF 0x80000000 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); + " * LEAF 0x80000000 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); ShowMessages("-- EAX --\n\n"); ShowMessages(" MaxExtendedFunctions = 0x%08X (%u)\n\n", - CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest.EAX), - CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest.EAX)); + CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest.EAX), + CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest.EAX)); ShowMessages("-- EBX --\n\n"); ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); @@ -1912,16 +1907,16 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) ShowMessages("-- EDX --\n\n"); ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); - + break; case 0x80000001: ShowMessages("==== CPUID.(EAX=80000001H) Extended CPU Signature ====\n\n"); ShowMessages(" *******************************************************\n" - " * LEAF 0x80000001 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); + " * LEAF 0x80000001 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); ShowMessages("-- EAX --\n\n"); ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); @@ -1931,23 +1926,23 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) ShowMessages("-- ECX --\n\n"); ShowMessages(" LAHF/SAHF Available in 64-bit Mode = %s\n", - CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE(CpuidRequest.ECX) ? "True" : "False"); + CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE(CpuidRequest.ECX) ? "True" : "False"); ShowMessages(" LZCNT = %s\n", - CPUID_ECX_LZCNT(CpuidRequest.ECX) ? "True" : "False"); + CPUID_ECX_LZCNT(CpuidRequest.ECX) ? "True" : "False"); ShowMessages(" PREFETCHW = %s\n\n", - CPUID_ECX_PREFETCHW(CpuidRequest.ECX) ? "True" : "False"); + CPUID_ECX_PREFETCHW(CpuidRequest.ECX) ? "True" : "False"); ShowMessages("-- EDX --\n\n"); ShowMessages(" SYSCALL/SYSRET Available in 64-bit Mode = %s\n", - CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE(CpuidRequest.EDX) ? "True" : "False"); + CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE(CpuidRequest.EDX) ? "True" : "False"); ShowMessages(" Execute Disable Bit Available = %s\n", - CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); + CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); ShowMessages(" 1-GByte Pages Available = %s\n", - CPUID_EDX_PAGES_1GB_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); + CPUID_EDX_PAGES_1GB_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); ShowMessages(" RDTSCP Available = %s\n", - CPUID_EDX_RDTSCP_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); + CPUID_EDX_RDTSCP_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); ShowMessages(" Intel 64 Architecture Available = %s\n\n", - CPUID_EDX_IA64_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); + CPUID_EDX_IA64_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); break; // @@ -1966,7 +1961,6 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) ShowMessages(" Brand String = \"%s\"\n\n", CpuidRequest.BrandString); break; - } case 0x80000005: ShowMessages("EAX = 0x80000005: not implemented.\n"); @@ -2033,9 +2027,8 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); break; - } - + case 0x80000007: ShowMessages("==== CPUID.(EAX=80000007H) Extended Time Stamp Counter ====\n\n"); ShowMessages(" *******************************************************\n" @@ -2104,7 +2097,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); } } - + else { ShowMessages("Receiving CPUID result was not successful :(\n"); @@ -2184,4 +2177,4 @@ CommandUserCpuid(vector CommandTokens, string Command) // Call CPUID with user-provided inputs // CommandCpuidRequestCpuid(FunctionId, SubFunctionId); -} \ No newline at end of file +} From f4c77abb7550d27f80f0e7317171723972b8b531 Mon Sep 17 00:00:00 2001 From: sina Date: Tue, 21 Jul 2026 15:27:22 +0200 Subject: [PATCH 14/50] update and cleanup CPUID 2 plus fixing build error --- .../hyperdbg_driver/hyperdbg_driver.vcxproj | 2 +- .../code/debugger/commands/DebuggerCommands.c | 41 +++++++++---------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj b/examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj index 61dc0502..fd70d5dc 100644 --- a/examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj +++ b/examples/kernel/hyperdbg_driver/hyperdbg_driver.vcxproj @@ -21,7 +21,7 @@ Debug x64 hyperdbg_driver - 10.0.28000.0 + $(LatestTargetPlatformVersion) diff --git a/hyperdbg/hyperkd/code/debugger/commands/DebuggerCommands.c b/hyperdbg/hyperkd/code/debugger/commands/DebuggerCommands.c index b725e6b0..2f530a49 100644 --- a/hyperdbg/hyperkd/code/debugger/commands/DebuggerCommands.c +++ b/hyperdbg/hyperkd/code/debugger/commands/DebuggerCommands.c @@ -14,13 +14,13 @@ /** * @brief read registers - * @param CpuidRegs + * @param Regs * @param ReadRegisterRequest * * @return BOOLEAN */ BOOLEAN -DebuggerCommandReadRegisters(GUEST_REGS * CpuidRegs, +DebuggerCommandReadRegisters(GUEST_REGS * Regs, PDEBUGGEE_REGISTER_READ_DESCRIPTION ReadRegisterRequest) { GUEST_EXTRA_REGISTERS ERegs = {0}; @@ -42,7 +42,7 @@ DebuggerCommandReadRegisters(GUEST_REGS * CpuidRegs, // Add General purpose registers // memcpy((PVOID)((CHAR *)ReadRegisterRequest + sizeof(DEBUGGEE_REGISTER_READ_DESCRIPTION)), - CpuidRegs, + Regs, sizeof(GUEST_REGS)); // @@ -66,7 +66,7 @@ DebuggerCommandReadRegisters(GUEST_REGS * CpuidRegs, } else { - ReadRegisterRequest->Value = DebuggerGetRegValueWrapper(CpuidRegs, ReadRegisterRequest->RegisterId); + ReadRegisterRequest->Value = DebuggerGetRegValueWrapper(Regs, ReadRegisterRequest->RegisterId); } return TRUE; @@ -1164,7 +1164,7 @@ SearchAddressWrapper(PUINT64 AddressToSaveResults, SearchMemRequest->Address = PhysicalAddressToVirtualAddressByProcessId((PVOID)StartAddress, SearchMemRequest->ProcessId); EndAddress = PhysicalAddressToVirtualAddressByProcessId((PVOID)EndAddress, - SearchMemRequest->ProcessId); + SearchMemRequest->ProcessId); } // @@ -1321,12 +1321,12 @@ DebuggerCommandFlush(PDEBUGGER_FLUSH_LOGGING_BUFFERS DebuggerFlushBuffersRequest NTSTATUS DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest) { - BOOLEAN RunCpuid = TRUE; - UINT32 CpuidRegs[4] = {0}; - UINT32 FunctionId = DebuggerCpuidRequest->FunctionId; - UINT32 SubFunctionId = DebuggerCpuidRequest->SubFunctionId; - UINT32 CacheIndex; - + BOOLEAN RunCpuid = TRUE; + UINT32 CpuidRegs[4] = {0}; + UINT32 FunctionId = DebuggerCpuidRequest->FunctionId; + UINT32 SubFunctionId = DebuggerCpuidRequest->SubFunctionId; + UINT32 CacheIndex; + // // Zero out memory buffer // @@ -1351,10 +1351,8 @@ DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest) } } - - break; - + // // EAX = 0Bh // @@ -1381,7 +1379,7 @@ DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest) // // iteration for determining max subleaf supported by this leaf // - for (CacheIndex = 0; ;CacheIndex++) + for (CacheIndex = 0;; CacheIndex++) { CommonCpuidInstruction(FunctionId, CacheIndex, (INT32 *)CpuidRegs); if (CPUID_ECX_LEVEL_TYPE(CpuidRegs[2]) == 0) @@ -1437,10 +1435,10 @@ DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest) // find max subleaf // subleaves 0 and 1 are always valid if SGX is supported, so we start iteration from 2 // - for (CacheIndex = 2; ; CacheIndex++) + for (CacheIndex = 2;; CacheIndex++) { CommonCpuidInstruction(FunctionId, CacheIndex, (INT32 *)CpuidRegs); - + // // type 0 means invalid - stop enumeration // @@ -1461,7 +1459,7 @@ DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest) } break; - + // // Leaves with same method to receive max subleaf: 7h, 14h, 18h (respectively) // @@ -1503,11 +1501,10 @@ DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest) // because we already EXCLUSIVELY called CPUID for these leaves, we are not going to call it again, // as a result the RunCpuid flag is FALSE // - RunCpuid = FALSE; + RunCpuid = FALSE; break; - } - + // // Call CPUID function // @@ -1524,7 +1521,7 @@ DebuggerCommandCpuid(PDEBUGGER_CPUID_REQUEST_RESPONSE DebuggerCpuidRequest) // Ensure the response contains the correct FunctionId and SubFunctionId // (they should already be set, but this makes it explicit) // - DebuggerCpuidRequest->FunctionId = FunctionId; + DebuggerCpuidRequest->FunctionId = FunctionId; DebuggerCpuidRequest->SubFunctionId = SubFunctionId; DebuggerCpuidRequest->KernelStatus = DEBUGGER_OPERATION_WAS_SUCCESSFUL; From 926070135d44b7459409e1cce1d4595426062daa Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Tue, 21 Jul 2026 15:53:34 +0200 Subject: [PATCH 15/50] Sweeps and extra guards and some new platform functionsd --- .../platform/user/code/platform-lib-calls.c | 21 +++++++++++ .../platform/user/header/platform-lib-calls.h | 12 +++++++ .../commands/debugging-commands/lm.cpp | 35 +++++++++++++++++++ .../commands/debugging-commands/output.cpp | 5 +-- .../commands/debugging-commands/rdmsr.cpp | 1 + hyperdbg/linux/PORTING_STATUS.md | 10 ++++++ hyperdbg/script-engine/code/script-engine.c | 4 +-- hyperdbg/script-engine/header/pch.h | 10 ++++++ 8 files changed, 94 insertions(+), 4 deletions(-) diff --git a/hyperdbg/include/platform/user/code/platform-lib-calls.c b/hyperdbg/include/platform/user/code/platform-lib-calls.c index c29d3c44..53736733 100644 --- a/hyperdbg/include/platform/user/code/platform-lib-calls.c +++ b/hyperdbg/include/platform/user/code/platform-lib-calls.c @@ -323,6 +323,27 @@ PlatformGetCurrentProcessorNumber(VOID) #endif } +/** + * @brief Platform independent count of online logical processors + * + * @return SIZE_T number of logical processors online, or 0 if unknown + */ +SIZE_T +PlatformGetActiveProcessorCount(VOID) +{ +#if defined(_WIN32) + SYSTEM_INFO SysInfo; + GetSystemInfo(&SysInfo); + return (SIZE_T)SysInfo.dwNumberOfProcessors; +#elif defined(__linux__) +// Not yet tested!! + long Count = sysconf(_SC_NPROCESSORS_ONLN); + return Count > 0 ? (SIZE_T)Count : 0; +#else +# error "Unsupported platform" +#endif +} + /** * @brief Platform independent wrapper for GetCurrentProcessId / getpid * diff --git a/hyperdbg/include/platform/user/header/platform-lib-calls.h b/hyperdbg/include/platform/user/header/platform-lib-calls.h index 22ad3e50..d9451ad3 100644 --- a/hyperdbg/include/platform/user/header/platform-lib-calls.h +++ b/hyperdbg/include/platform/user/header/platform-lib-calls.h @@ -188,6 +188,18 @@ PlatformGetCurrentThreadId(VOID); UINT32 PlatformGetCurrentProcessorNumber(VOID); +// +// Number of logical processors currently online. Windows uses the classic +// GetSystemInfo count; Linux uses sysconf(_SC_NPROCESSORS_ONLN). Returns 0 if +// the count cannot be determined. +// +// NOTE: rdmsr.cpp keeps its own NUMA-aware GetLogicalProcessorInformationEx +// chain on Windows and only falls back to this wrapper on Linux, so the +// Windows core count there is unchanged. +// +SIZE_T +PlatformGetActiveProcessorCount(VOID); + UINT32 PlatformGetCurrentProcessId(VOID); diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/lm.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/lm.cpp index ec0593c0..f05050b4 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/lm.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/lm.cpp @@ -48,6 +48,7 @@ CommandLmHelp() * * @return wstring */ +#ifdef _WIN32 std::wstring CommandLmConvertWow64CompatibilityPaths(const WCHAR * LocalFilePath) { @@ -72,6 +73,12 @@ CommandLmConvertWow64CompatibilityPaths(const WCHAR * LocalFilePath) return filePath; } +#endif // _WIN32 +// +// TODO(Linux): no Linux counterpart — the WoW64 system32/SysWOW64 and +// "Program Files (x86)" redirections are NT-specific, and the only caller is +// the user-mode module listing below, which is itself Windows-only for now. +// /** * @brief show modules for specified user mode process @@ -83,6 +90,20 @@ CommandLmConvertWow64CompatibilityPaths(const WCHAR * LocalFilePath) BOOLEAN CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) { +#ifndef _WIN32 + // + // TODO(Linux): the module-name filter converts the search string with + // mbstowcs into a buffer sized for 2-byte WCHAR, which native 4-byte + // wchar_t would overrun, and the listing formats 2-byte WCHAR paths as + // std::wstring. Both need the wide-char item resolved. Stubbed rather than + // cast so no bogus reinterpretation (or heap overrun) can be reached. + // + UNREFERENCED_PARAMETER(ProcessId); + UNREFERENCED_PARAMETER(SearchModule); + + ShowMessages("err, listing user-mode modules is not supported on Linux yet\n"); + return FALSE; +#else BOOLEAN Status; ULONG ReturnedLength; UINT32 ModuleDetailsSize = 0; @@ -263,6 +284,7 @@ CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) ShowErrorMessage(ModuleCountRequest.Result); return FALSE; } +#endif // _WIN32 } /** @@ -274,6 +296,18 @@ CommandLmShowUserModeModule(UINT32 ProcessId, const CHAR * SearchModule) BOOLEAN CommandLmShowKernelModeModule(const CHAR * SearchModule) { +#ifndef _WIN32 + // + // TODO(Linux): NT-style system module enumeration (PRTL_PROCESS_MODULES via + // NtQuerySystemInformation) has no Linux analog — same reason + // DebuggerGetNtoskrnlBase is stubbed. Needs a Linux mechanism + // (/proc/modules) once the kernel side exists. + // + UNREFERENCED_PARAMETER(SearchModule); + + ShowMessages("err, listing kernel-mode modules is not supported on Linux yet\n"); + return FALSE; +#else PRTL_PROCESS_MODULES ModulesInfo = NULL; string SearchModuleString; @@ -344,6 +378,7 @@ CommandLmShowKernelModeModule(const CHAR * SearchModule) free(ModulesInfo); return TRUE; +#endif // _WIN32 } /** diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/output.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/output.cpp index 228e1d39..58219d3b 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/output.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/output.cpp @@ -318,8 +318,9 @@ CommandOutput(vector CommandTokens, string Command) // // Move the name of the output source to the buffer // - strcpy_s(EventForwardingObject->Name, - GetCaseSensitiveStringFromCommandToken(CommandTokens.at(2)).c_str()); + PlatformStrCpy(EventForwardingObject->Name, + sizeof(EventForwardingObject->Name), + GetCaseSensitiveStringFromCommandToken(CommandTokens.at(2)).c_str()); // // Check if list is initialized or not diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp index b05933d7..f0b43586 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp @@ -33,6 +33,7 @@ CommandRdmsrHelp() ShowMessages("\t\te.g : rdmsr c0000082 core 2\n"); } +#ifdef _WIN32 /// defines the GetLogicalProcessorInformationEx function typedef BOOL(WINAPI * glpie_t)( LOGICAL_PROCESSOR_RELATIONSHIP, diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index 23143b31..f6bdbe2c 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -113,6 +113,16 @@ equivalent, behavior-preserving. script-engine builds as a Linux `.so`. - SDK import/interface headers (`include/SDK/HyperDbgSdk.h`, `include/SDK/imports/user/HyperDbg*Imports.h`) adjusted for the Linux build. +- Upstream `d44c726d` ("add float type in script engine") re-broke the Linux + build; fixed with two mechanical swaps: + - `pch.h` — define `_GNU_SOURCE` on Linux ahead of every libc header. The + float-literal parser's `#else` branch calls `strtof_l`/`strtod_l`, which + glibc declares in `` only under `__USE_GNU`. `newlocale`/ + `freelocale` in the same branch are plain POSIX-2008 and already resolved. + - `script-engine.c:1381,1400` — 2× `_snprintf_s(Buf, sizeof(Buf), _TRUNCATE, + "%d", …)` → `PlatformSprintf(Buf, sizeof(Buf), "%d", …)`. Both buffers are + `CHAR[32]` formatting a single `%d`, so the dropped `_TRUNCATE` truncation + semantics are unreachable. ### Kernel-level debugger (remote protocol) - `kd.cpp` — largest sweep (~46 `Platform*`): serial open/configure/close via diff --git a/hyperdbg/script-engine/code/script-engine.c b/hyperdbg/script-engine/code/script-engine.c index 331f737d..cce6446a 100644 --- a/hyperdbg/script-engine/code/script-engine.c +++ b/hyperdbg/script-engine/code/script-engine.c @@ -1378,7 +1378,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI *Error = SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE; break; } - _snprintf_s(SizeText, sizeof(SizeText), _TRUNCATE, "%d", OperandType->Size); + PlatformSprintf(SizeText, sizeof(SizeText), "%d", OperandType->Size); SizeToken = NewToken(DECIMAL, SizeText); SizeToken->VariableType = VARIABLE_TYPE_ULLONG; RemoveToken(&Op0); @@ -1397,7 +1397,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI *Error = SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE; break; } - _snprintf_s(SizeText, sizeof(SizeText), _TRUNCATE, "%d", ResolvedType->Size); + PlatformSprintf(SizeText, sizeof(SizeText), "%d", ResolvedType->Size); SizeToken = NewToken(DECIMAL, SizeText); SizeToken->VariableType = VARIABLE_TYPE_ULLONG; Push(MatchedStack, SizeToken); diff --git a/hyperdbg/script-engine/header/pch.h b/hyperdbg/script-engine/header/pch.h index e51ebe45..c1e2a10c 100644 --- a/hyperdbg/script-engine/header/pch.h +++ b/hyperdbg/script-engine/header/pch.h @@ -11,6 +11,16 @@ */ #pragma once +// +// Required (before any libc header) for the GNU locale-aware conversion +// functions (strtof_l/strtod_l) used by the floating-point literal parser +// +#ifdef __linux__ +# ifndef _GNU_SOURCE +# define _GNU_SOURCE +# endif +#endif + // // Scope definitions // From a4da625e05790c8559025b9424d31482e78e7928 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Tue, 21 Jul 2026 15:57:23 +0200 Subject: [PATCH 16/50] fix build --- .../code/debugger/commands/debugging-commands/rdmsr.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp index f0b43586..5183f7b9 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp @@ -108,6 +108,7 @@ GetWindowsNumaNumberOfCores() free(Buffer); return NumCores; } +#endif // _WIN32 /** * @brief rdmsr command handler From d4132ee7db092140b526d4cd31e445114aa470ec Mon Sep 17 00:00:00 2001 From: sina Date: Tue, 21 Jul 2026 16:57:26 +0200 Subject: [PATCH 17/50] fix UInt32 convesion for negative (signed) values --- hyperdbg/libhyperdbg/code/common/common.cpp | 75 ++++++++++----------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/hyperdbg/libhyperdbg/code/common/common.cpp b/hyperdbg/libhyperdbg/code/common/common.cpp index 0333087d..09556ded 100644 --- a/hyperdbg/libhyperdbg/code/common/common.cpp +++ b/hyperdbg/libhyperdbg/code/common/common.cpp @@ -381,62 +381,55 @@ ConvertStringToUInt32(string TextToConvert, PUINT32 Result) TextToConvert.erase(remove(TextToConvert.begin(), TextToConvert.end(), '`'), TextToConvert.end()); + int Base = IsDecimal ? 10 : 16; + if (IsDecimal) { if (!IsDecimalNotation(TextToConvert)) { return FALSE; } - else - { - try - { - INT I = std::stoi(TextToConvert); - *Result = I; - return TRUE; - } - catch (std::invalid_argument const &) - { - // - // Bad input: std::invalid_argument thrown - // - return FALSE; - } - catch (std::out_of_range const &) - { - // - // Integer overflow: std::out_of_range thrown - // - return FALSE; - } - - return FALSE; - } } else { - // - // It's not decimal - // if (!IsHexNotation(TextToConvert)) { return FALSE; } - else + } + + try + { + size_t Pos = 0; + unsigned long long ULL = std::stoull(TextToConvert, &Pos, Base); + + // + // Make sure the whole string was consumed and the value + // actually fits into 32 bits (stoull works in 64-bit space, + // so this catches overflow that stoi's signed 32-bit check + // would incorrectly flag or silently mishandle) + // + if (Pos != TextToConvert.size() || ULL > (std::numeric_limits::max)()) { - // - // It's hex number - // - UINT32 TempResult; - TempResult = stoi(TextToConvert, nullptr, 16); - - // - // Apply the results - // - *Result = TempResult; - - return TRUE; + return FALSE; } + + *Result = static_cast(ULL); + return TRUE; + } + catch (std::invalid_argument const &) + { + // + // Bad input: std::invalid_argument thrown + // + return FALSE; + } + catch (std::out_of_range const &) + { + // + // Integer overflow: std::out_of_range thrown + // + return FALSE; } } From 5fdd2e7738e6f68ed5ff516467fbc5bfdaec9759 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Wed, 22 Jul 2026 10:02:29 +0200 Subject: [PATCH 18/50] rdmsr file and updates status --- .../commands/debugging-commands/rdmsr.cpp | 4 ++++ hyperdbg/linux/PORTING_STATUS.md | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp index 5183f7b9..a1d47ca1 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/rdmsr.cpp @@ -199,8 +199,12 @@ CommandRdmsr(vector CommandTokens, string Command) // // Find logical cores count // +#ifdef _WIN32 SIZE_T NumCores = GetWindowsNumaNumberOfCores(); NumCPU = NumCores > 0 ? NumCores : GetWindowsCompatibleNumberOfCores(); +#else + NumCPU = PlatformGetActiveProcessorCount(); +#endif // // allocate buffer for transferring messages diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index f6bdbe2c..b129864c 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -269,6 +269,24 @@ reasons (`RTL_PROCESS_MODULES` / `RTL_PROCESS_MODULE_INFORMATION` undeclared, an `WCHAR *` vs `wchar_t *` — the wide-char item below); none of those are on lines this sweep touched. +### rdmsr.cpp core-count — DONE (2026-07-22) + +Follow-up to the bucket-1 sweep of `rdmsr.cpp` above (this is a separate bucket-2 +change, not part of the mechanical batch). The command needs the online logical-CPU +count to size its per-core transfer buffer; on Windows that came from two static +helpers (`GetWindowsCompatibleNumberOfCores` via `GetSystemInfo`, and +`GetWindowsNumaNumberOfCores` via `GetLogicalProcessorInformationEx` — the latter +`GetProcAddress`-loaded from `kernel32.dll`, so entirely Win32). + +- Both static helpers + their `glpie_t` typedef guarded `#ifdef _WIN32` (rdmsr.cpp + lines 36–111). Windows bodies untouched. +- Call site (`CommandRdmsr`, ~line 199): Windows path keeps the NUMA-then-fallback + logic; Linux `#else` calls the new `PlatformGetActiveProcessorCount()`. +- **Pure addition:** `PlatformGetActiveProcessorCount(VOID)` in + `platform-lib-calls.{h,c}` — Windows `GetSystemInfo`→`dwNumberOfProcessors`; + Linux `sysconf(_SC_NPROCESSORS_ONLN)` (returns 0 if unknown). ⚠️ Linux branch + marked "Not yet tested!!" in the source — verify before relying on it. + --- ## TODO ledger — revisit before Linux is functional From 6f7bc287fe03806e9ac0bb2ac947ce656b120ef3 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Wed, 22 Jul 2026 10:16:22 +0200 Subject: [PATCH 19/50] Guards and Documentation --- .../platform/general/header/Environment.h | 20 +++++++++++ .../commands/debugging-commands/settings.cpp | 23 +++++++++++++ .../debugger/commands/meta-commands/debug.cpp | 8 ++--- hyperdbg/linux/PORTING_STATUS.md | 33 +++++++++++++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/hyperdbg/include/platform/general/header/Environment.h b/hyperdbg/include/platform/general/header/Environment.h index 9a9d05f4..82c3c7fa 100644 --- a/hyperdbg/include/platform/general/header/Environment.h +++ b/hyperdbg/include/platform/general/header/Environment.h @@ -106,4 +106,24 @@ typedef void * HMODULE; # define ERROR_ACCESS_DENIED 5 # define ERROR_GEN_FAILURE 31 +// Win32 serial baud-rate constants (winbase.h CBR_*), kept at their Windows +// values so the shared serial-config / baud-rate-validation code compiles +// unchanged. Each constant equals its baud rate; actual Linux serial I/O is +// handled by the platform-serial layer (termios impl still TODO). +# define CBR_110 110 +# define CBR_300 300 +# define CBR_600 600 +# define CBR_1200 1200 +# define CBR_2400 2400 +# define CBR_4800 4800 +# define CBR_9600 9600 +# define CBR_14400 14400 +# define CBR_19200 19200 +# define CBR_38400 38400 +# define CBR_56000 56000 +# define CBR_57600 57600 +# define CBR_115200 115200 +# define CBR_128000 128000 +# define CBR_256000 256000 + #endif // HYPERDBG_ENV_LINUX diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/settings.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/settings.cpp index c54c63d4..51cc53b6 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/settings.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/debugging-commands/settings.cpp @@ -59,6 +59,7 @@ CommandSettingsHelp() BOOLEAN CommandSettingsGetValueFromConfigFile(std::string OptionName, std::string & OptionValue) { +#ifdef _WIN32 inipp::Ini Ini; WCHAR ConfigPath[MAX_PATH] = {0}; std::string OptionValueFromFile; @@ -101,6 +102,17 @@ CommandSettingsGetValueFromConfigFile(std::string OptionName, std::string & Opti { return FALSE; } +#else + // + // TODO(Linux): the config file is addressed by a wide-char (WCHAR) path and + // read through std::ifstream, which libstdc++ cannot construct from a 2-byte + // WCHAR buffer. GetConfigFilePath() already empties the path on Linux, so this + // always fails. Blocked on the wide-char (2-byte WCHAR) work. + // + UNREFERENCED_PARAMETER(OptionName); + UNREFERENCED_PARAMETER(OptionValue); + return FALSE; +#endif } /** @@ -114,6 +126,7 @@ CommandSettingsGetValueFromConfigFile(std::string OptionName, std::string & Opti VOID CommandSettingsSetValueFromConfigFile(std::string OptionName, std::string OptionValue) { +#ifdef _WIN32 inipp::Ini Ini; WCHAR ConfigPath[MAX_PATH] = {0}; @@ -150,6 +163,16 @@ CommandSettingsSetValueFromConfigFile(std::string OptionName, std::string Option Ini.generate(Os); Os.close(); +#else + // + // TODO(Linux): the config file is addressed by a wide-char (WCHAR) path and + // written through std::ofstream, which libstdc++ cannot construct from a + // 2-byte WCHAR buffer. GetConfigFilePath() already empties the path on Linux, + // so nothing can be persisted. Blocked on the wide-char (2-byte WCHAR) work. + // + UNREFERENCED_PARAMETER(OptionName); + UNREFERENCED_PARAMETER(OptionValue); +#endif } /** diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/debug.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/debug.cpp index 42e9fb4e..bc511911 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/debug.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/meta-commands/debug.cpp @@ -58,22 +58,22 @@ CommandDebugHelp() BOOLEAN CommandDebugCheckComPort(const CHAR * ComPort, UINT32 * Port) { - if (_stricmp(ComPort, "com1") == 0) + if (PlatformStrCaseCmp(ComPort, "com1") == 0) { *Port = COM1_PORT; return TRUE; } - else if (_stricmp(ComPort, "com2") == 0) + else if (PlatformStrCaseCmp(ComPort, "com2") == 0) { *Port = COM2_PORT; return TRUE; } - else if (_stricmp(ComPort, "com3") == 0) + else if (PlatformStrCaseCmp(ComPort, "com3") == 0) { *Port = COM3_PORT; return TRUE; } - else if (_stricmp(ComPort, "com4") == 0) + else if (PlatformStrCaseCmp(ComPort, "com4") == 0) { *Port = COM4_PORT; return TRUE; diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index b129864c..f180542d 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -287,6 +287,39 @@ helpers (`GetWindowsCompatibleNumberOfCores` via `GetSystemInfo`, and Linux `sysconf(_SC_NPROCESSORS_ONLN)` (returns 0 if unknown). ⚠️ Linux branch marked "Not yet tested!!" in the source — verify before relying on it. +### settings.cpp config-file I/O — DONE (2026-07-22) + +`debugging-commands/settings.cpp` reads/writes the settings INI via a wide-char +(`WCHAR[MAX_PATH]`) path and `std::ifstream`/`std::ofstream`. Two Linux-only +blockers, both the deferred wide-char item: (1) `GetConfigFilePath(PWCHAR)` — on +Linux `WCHAR` is `unsigned short` but `PWCHAR` is `short *` (signedness mismatch, +`-fpermissive`); (2) libstdc++ has **no** `basic_ifstream`/`basic_ofstream` +constructor taking a 2-byte `WCHAR*`, and no cast can bridge wide→`char*`. + +Both `CommandSettingsGetValueFromConfigFile` and `CommandSettingsSetValueFromConfigFile` +are already dead on Linux (`GetConfigFilePath` empties the path, +`IsFileExistW` returns FALSE), so their whole bodies were guarded `#ifdef _WIN32` +(Windows verbatim) with a Linux `#else` stub (`return FALSE` / no-op + +`UNREFERENCED_PARAMETER` + TODO(Linux)). Same pattern-1 convention already used +for `GetConfigFilePath`/`IsFileExistW`/`ListDirectory` in common.cpp. This also +moves the `GetConfigFilePath` call sites into the Windows branch, resolving the +`PWCHAR` signedness error without touching the shared typedef. +`CommandSettingsLoadDefaultValuesFromConfigFile` only calls the guarded getter — +no wide-char of its own, left as-is. + +### debug.cpp serial connect — DONE (2026-07-22) + +`meta-commands/debug.cpp` (the `.debug` command — connect to a remote debuggee +over serial/namedpipe). Two mechanical fixes: +- `_stricmp`×4 (COM-port name compare in `CommandDebugCheckComPort`) → + `PlatformStrCaseCmp` (the existing common.cpp wrapper; Windows `_stricmp`, + Linux `strcasecmp`). +- `CBR_*` baud-rate constants (`CommandDebugCheckBaudrate` validation) — **pure + addition** to `Environment.h` Linux block: the 15 winbase.h `CBR_110`…`CBR_256000` + `#define`s kept at their canonical Windows values (each equals its baud rate). + Matches the CTRL_*/PROCESS_*/ERROR_* constant blocks already there. Actual Linux + serial I/O is still the platform-serial termios TODO. + --- ## TODO ledger — revisit before Linux is functional From 1abac35edc6c75b41a08a255bdad1ff68eae1922 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Wed, 22 Jul 2026 11:05:07 +0200 Subject: [PATCH 20/50] new email and some changes --- hyperdbg/CMakeLists.txt | 2 +- .../platform/general/header/Environment.h | 4 + .../include/platform/general/header/nt-list.h | 2 +- .../platform/user/code/platform-ioctl.c | 2 +- .../platform/user/code/platform-lib-calls.c | 105 +++++++++++++++++- .../platform/user/code/platform-serial.c | 2 +- .../platform/user/code/platform-signal.c | 2 +- .../platform/user/header/platform-ioctl.h | 2 +- .../platform/user/header/platform-lib-calls.h | 29 ++++- .../platform/user/header/platform-serial.h | 2 +- .../platform/user/header/platform-signal.h | 2 +- hyperdbg/libhyperdbg/CMakeLists.txt | 2 + .../debugger/communication/forwarding.cpp | 18 ++- .../debugger/driver-loader/install-linux.cpp | 2 +- .../debugger/script-engine/symbol-linux.cpp | 2 +- .../debugger/user-level/pe-parser-linux.cpp | 2 +- hyperdbg/linux/PORTING_STATUS.md | 55 ++++++++- 17 files changed, 210 insertions(+), 25 deletions(-) diff --git a/hyperdbg/CMakeLists.txt b/hyperdbg/CMakeLists.txt index ba5b3855..389ba4e4 100644 --- a/hyperdbg/CMakeLists.txt +++ b/hyperdbg/CMakeLists.txt @@ -75,7 +75,7 @@ add_subdirectory(script-engine) link_directories(libraries/zydis/user libraries/keystone/release-lib) add_subdirectory(libhyperdbg) find_package(Threads REQUIRED) -target_link_libraries(libhyperdbg Zycore Zydis script-engine keystone Threads::Threads) +target_link_libraries(libhyperdbg Zycore Zydis script-engine keystone Threads::Threads ${CMAKE_DL_LIBS}) add_subdirectory(hyperdbg-cli) target_link_libraries(hyperdbg-cli libhyperdbg) diff --git a/hyperdbg/include/platform/general/header/Environment.h b/hyperdbg/include/platform/general/header/Environment.h index 82c3c7fa..237ce6f9 100644 --- a/hyperdbg/include/platform/general/header/Environment.h +++ b/hyperdbg/include/platform/general/header/Environment.h @@ -50,6 +50,10 @@ // POSIX sleep primitives (usleep) backing the Win32 Sleep() shim below # include +// DECIMAL_DIG and the FLT/DBL limits (ISO C99 ); MSVC exposes these +// transitively through its CRT/pch, glibc needs the explicit include +# include + // Windows string/char types typedef char TCHAR; typedef char * LPTSTR; diff --git a/hyperdbg/include/platform/general/header/nt-list.h b/hyperdbg/include/platform/general/header/nt-list.h index 0dc4dd2b..a62a2c34 100644 --- a/hyperdbg/include/platform/general/header/nt-list.h +++ b/hyperdbg/include/platform/general/header/nt-list.h @@ -1,6 +1,6 @@ /** * @file nt-list.h - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief Cross-platform NT-style intrusive doubly-linked list helpers + CONTAINING_RECORD * @details The shared debugger code uses the NT LIST_ENTRY API (InitializeListHead, * InsertHeadList, RemoveEntryList, CONTAINING_RECORD, ...). On Windows these diff --git a/hyperdbg/include/platform/user/code/platform-ioctl.c b/hyperdbg/include/platform/user/code/platform-ioctl.c index 086bff76..a1de6159 100644 --- a/hyperdbg/include/platform/user/code/platform-ioctl.c +++ b/hyperdbg/include/platform/user/code/platform-ioctl.c @@ -1,6 +1,6 @@ /** * @file platform-ioctl.c - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief User mode cross-platform implementation of the local kernel-driver IOCTL transport * @details See platform-ioctl.h. The Windows branch forwards directly to Win32 * DeviceIoControl / CreateFileA. The Linux branch is currently stubbed and is diff --git a/hyperdbg/include/platform/user/code/platform-lib-calls.c b/hyperdbg/include/platform/user/code/platform-lib-calls.c index 53736733..617cf23b 100644 --- a/hyperdbg/include/platform/user/code/platform-lib-calls.c +++ b/hyperdbg/include/platform/user/code/platform-lib-calls.c @@ -1,6 +1,6 @@ /** * @file platform-lib-calls.c - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief User mode Cross platform APIs for platofrm dependend library calls * @details * @version 0.19 @@ -21,6 +21,7 @@ # include # include # include +# include #endif // defined(__linux__) /** @@ -643,6 +644,46 @@ PlatformOpenFileForWriting(const WCHAR * Path) #endif } +/** + * @brief Platform independent wrapper to open a file for writing with + * OPEN_ALWAYS semantics (open existing without truncating, else create), + * taking a narrow (char*) path + * + * @details Unlike PlatformOpenFileForWriting (wide path, CREATE_ALWAYS/truncate) + * this keeps any existing file content. The Linux handle is a FILE* so + * it works with PlatformWriteFile / PlatformCloseFile. + * + * @param Path narrow path of the file to open or create + * @return HANDLE to the opened file, or INVALID_HANDLE_VALUE on failure + */ +HANDLE +PlatformOpenFileForWritingNarrow(const CHAR * Path) +{ +#if defined(_WIN32) + return CreateFileA(Path, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); +#elif defined(__linux__) + // + // NOT YET TESTED!! + // "r+b" opens an existing file at offset 0 without truncating (matching + // OPEN_ALWAYS on an existing file); if it does not exist, create it with + // "w+b". Return the FILE* as the HANDLE (PlatformWriteFile/PlatformCloseFile + // treat the Linux handle as a FILE*). + // + FILE * File = fopen(Path, "r+b"); + if (File == NULL) + { + File = fopen(Path, "w+b"); + } + if (File == NULL) + { + return INVALID_HANDLE_VALUE; + } + return (HANDLE)File; +#else +# error "Unsupported platform" +#endif +} + /** * @brief Platform independent wrapper to write a buffer to an open file * @@ -990,3 +1031,65 @@ PlatformGetExitCodeProcess(HANDLE Process, LPDWORD ExitCode) # error "Unsupported platform" #endif } + +/** + * @brief Platform independent wrapper for LoadLibrary + * + * @param ModulePath narrow path of the shared module to load + * @return HMODULE handle to the loaded module, or NULL on failure + */ +HMODULE +PlatformLoadLibrary(const CHAR * ModulePath) +{ +#if defined(_WIN32) + return LoadLibraryA(ModulePath); +#elif defined(__linux__) + // NOT YET TESTED!! + return (HMODULE)dlopen(ModulePath, RTLD_NOW | RTLD_LOCAL); +#else +# error "Unsupported platform" +#endif +} + +/** + * @brief Platform independent wrapper for GetProcAddress + * + * @param Module module handle returned by PlatformLoadLibrary + * @param ProcName name of the exported symbol to resolve + * @return PVOID address of the symbol, or NULL if not found + */ +PVOID +PlatformGetProcAddress(HMODULE Module, const CHAR * ProcName) +{ +#if defined(_WIN32) + return (PVOID)GetProcAddress(Module, ProcName); +#elif defined(__linux__) + // NOT YET TESTED!! + return dlsym((void *)Module, ProcName); +#else +# error "Unsupported platform" +#endif +} + +/** + * @brief Platform independent wrapper for FreeLibrary + * + * @param Module module handle returned by PlatformLoadLibrary + * @return BOOL non-zero on success, zero on failure + */ +BOOL +PlatformFreeLibrary(HMODULE Module) +{ +#if defined(_WIN32) + return FreeLibrary(Module); +#elif defined(__linux__) + // + // NOT YET TESTED!! + // dlclose returns 0 on success (opposite of FreeLibrary), so invert it to + // preserve the "non-zero == success" contract. + // + return (BOOL)(dlclose((void *)Module) == 0); +#else +# error "Unsupported platform" +#endif +} diff --git a/hyperdbg/include/platform/user/code/platform-serial.c b/hyperdbg/include/platform/user/code/platform-serial.c index 6266c0a8..f1c01050 100644 --- a/hyperdbg/include/platform/user/code/platform-serial.c +++ b/hyperdbg/include/platform/user/code/platform-serial.c @@ -1,6 +1,6 @@ /** * @file platform-serial.c - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief User mode cross-platform implementation of the kernel-debugger serial transport * @details See platform-serial.h. The Windows branch wraps the Win32 serial primitives * (CreateFile / Comm* / overlapped ReadFile/WriteFile) and owns the per-direction diff --git a/hyperdbg/include/platform/user/code/platform-signal.c b/hyperdbg/include/platform/user/code/platform-signal.c index b0f83071..d6751b0f 100644 --- a/hyperdbg/include/platform/user/code/platform-signal.c +++ b/hyperdbg/include/platform/user/code/platform-signal.c @@ -1,6 +1,6 @@ /** * @file platform-signal.c - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief User mode cross-platform implementation of the console-control handler * @details See platform-signal.h. The Windows branch forwards to SetConsoleCtrlHandler. * The Linux branch blocks the handled signals and dispatches them from a diff --git a/hyperdbg/include/platform/user/header/platform-ioctl.h b/hyperdbg/include/platform/user/header/platform-ioctl.h index 203a7459..336d3811 100644 --- a/hyperdbg/include/platform/user/header/platform-ioctl.h +++ b/hyperdbg/include/platform/user/header/platform-ioctl.h @@ -1,6 +1,6 @@ /** * @file platform-ioctl.h - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief User mode cross-platform interface for the local kernel-driver IOCTL transport * @details Distinct from the serial transport (platform-serial), which talks to a remote * debuggee. This interface is the LOCAL control channel: the userspace library diff --git a/hyperdbg/include/platform/user/header/platform-lib-calls.h b/hyperdbg/include/platform/user/header/platform-lib-calls.h index d9451ad3..d5dcaf29 100644 --- a/hyperdbg/include/platform/user/header/platform-lib-calls.h +++ b/hyperdbg/include/platform/user/header/platform-lib-calls.h @@ -1,6 +1,6 @@ /** * @file platform-lib-calls.h - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief User mode Cross platform APIs for platofrm dependend library calls * @details * @version 0.19 @@ -157,6 +157,16 @@ PlatformWriteConsole(const VOID * Buffer, DWORD NumberOfBytes); HANDLE PlatformOpenFileForWriting(const WCHAR * Path); +// +// Narrow (char*) variant with OPEN_ALWAYS semantics (open existing, else +// create; no truncate), as opposed to the wide PlatformOpenFileForWriting above +// which truncates (CREATE_ALWAYS). Used by the event-forwarding file sink, whose +// path is already a narrow std::string, so it sidesteps the wide-char issue and +// works on Linux. +// +HANDLE +PlatformOpenFileForWritingNarrow(const CHAR * Path); + BOOLEAN PlatformWriteFile(HANDLE FileHandle, const VOID * Buffer, DWORD NumberOfBytes); @@ -228,3 +238,20 @@ PlatformResumeThread(HANDLE Thread); BOOL PlatformGetExitCodeProcess(HANDLE Process, LPDWORD ExitCode); + +// +// DYNAMIC LIBRARY LOADING +// +// Thin wrappers over LoadLibrary/GetProcAddress/FreeLibrary, used by the +// event-forwarding "module" sink (loads a plugin exporting +// hyperdbg_event_forwarding). Windows = the Win32 calls; Linux = dlopen/dlsym/ +// dlclose (exact 1:1 semantic map). +// +HMODULE +PlatformLoadLibrary(const CHAR * ModulePath); + +PVOID +PlatformGetProcAddress(HMODULE Module, const CHAR * ProcName); + +BOOL +PlatformFreeLibrary(HMODULE Module); diff --git a/hyperdbg/include/platform/user/header/platform-serial.h b/hyperdbg/include/platform/user/header/platform-serial.h index f33b48ec..40cf5756 100644 --- a/hyperdbg/include/platform/user/header/platform-serial.h +++ b/hyperdbg/include/platform/user/header/platform-serial.h @@ -1,6 +1,6 @@ /** * @file platform-serial.h - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief User mode cross-platform interface for the kernel-debugger serial transport * @details The kernel-debugging *protocol* in kd.cpp is platform independent; only * the byte transport underneath it (serial COM port / named pipe) is OS diff --git a/hyperdbg/include/platform/user/header/platform-signal.h b/hyperdbg/include/platform/user/header/platform-signal.h index 9a3f73db..635baad4 100644 --- a/hyperdbg/include/platform/user/header/platform-signal.h +++ b/hyperdbg/include/platform/user/header/platform-signal.h @@ -1,6 +1,6 @@ /** * @file platform-signal.h - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief User mode cross-platform interface for the console-control (CTRL+C / CTRL+BREAK) handler * @details HyperDbg installs a single handler (BreakController) that pauses the * debuggee when the user hits CTRL+C / CTRL+BREAK. The handler body is diff --git a/hyperdbg/libhyperdbg/CMakeLists.txt b/hyperdbg/libhyperdbg/CMakeLists.txt index 26bbc5ff..67096b76 100644 --- a/hyperdbg/libhyperdbg/CMakeLists.txt +++ b/hyperdbg/libhyperdbg/CMakeLists.txt @@ -193,6 +193,8 @@ if(UNIX) list(APPEND SourceFiles "code/debugger/user-level/pe-parser-linux.cpp") list(REMOVE_ITEM SourceFiles "code/debugger/driver-loader/install.cpp") list(APPEND SourceFiles "code/debugger/driver-loader/install-linux.cpp") + list(REMOVE_ITEM SourceFiles "code/debugger/communication/namedpipe.cpp") + list(APPEND SourceFiles "code/debugger/communication/namedpipe-linux.cpp") endif() add_library(libhyperdbg SHARED ${SourceFiles}) diff --git a/hyperdbg/libhyperdbg/code/debugger/communication/forwarding.cpp b/hyperdbg/libhyperdbg/code/debugger/communication/forwarding.cpp index b6d3d940..b147d2d8 100644 --- a/hyperdbg/libhyperdbg/code/debugger/communication/forwarding.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/communication/forwarding.cpp @@ -142,7 +142,7 @@ ForwardingCloseOutputSource(PDEBUGGER_EVENT_FORWARDING SourceDescriptor) // // Close the handle // - CloseHandle(SourceDescriptor->Handle); + PlatformCloseFile(SourceDescriptor->Handle); // // Return the status @@ -183,7 +183,7 @@ ForwardingCloseOutputSource(PDEBUGGER_EVENT_FORWARDING SourceDescriptor) // // Free the library // - FreeLibrary(SourceDescriptor->Module); + PlatformFreeLibrary(SourceDescriptor->Module); // // Return the status @@ -226,7 +226,7 @@ ForwardingCreateOutputSource(DEBUGGER_EVENT_FORWARDING_TYPE SourceType, // // Create a new file // - HANDLE FileHandle = CreateFileA(Description.c_str(), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + HANDLE FileHandle = PlatformOpenFileForWritingNarrow(Description.c_str()); // // The handle might be INVALID_HANDLE_VALUE which will be @@ -236,7 +236,7 @@ ForwardingCreateOutputSource(DEBUGGER_EVENT_FORWARDING_TYPE SourceType, } else if (SourceType == EVENT_FORWARDING_MODULE) { - HMODULE ModuleHandle = LoadLibraryA(Description.c_str()); + HMODULE ModuleHandle = PlatformLoadLibrary(Description.c_str()); if (ModuleHandle == NULL) { @@ -244,7 +244,7 @@ ForwardingCreateOutputSource(DEBUGGER_EVENT_FORWARDING_TYPE SourceType, return INVALID_HANDLE_VALUE; } - hyperdbg_event_forwarding_t hyperdbg_event_forwarding = (hyperdbg_event_forwarding_t)GetProcAddress(ModuleHandle, "hyperdbg_event_forwarding"); + hyperdbg_event_forwarding_t hyperdbg_event_forwarding = (hyperdbg_event_forwarding_t)PlatformGetProcAddress(ModuleHandle, "hyperdbg_event_forwarding"); if (hyperdbg_event_forwarding == NULL) { @@ -503,11 +503,9 @@ ForwardingWriteToFile(HANDLE FileHandle, CHAR * Message, UINT32 MessageLength) DWORD BytesWritten = 0; BOOL ErrorFlag = FALSE; - ErrorFlag = WriteFile(FileHandle, // open file handle - Message, // start of data to write - MessageLength, // number of bytes to write - &BytesWritten, // number of bytes that were written - NULL); // no overlapped structure + ErrorFlag = PlatformWriteFile(FileHandle, // open file handle + Message, // start of data to write + MessageLength); // number of bytes to write return TRUE; diff --git a/hyperdbg/libhyperdbg/code/debugger/driver-loader/install-linux.cpp b/hyperdbg/libhyperdbg/code/debugger/driver-loader/install-linux.cpp index cd6c4eab..d21a64df 100644 --- a/hyperdbg/libhyperdbg/code/debugger/driver-loader/install-linux.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/driver-loader/install-linux.cpp @@ -1,6 +1,6 @@ /** * @file install-linux.cpp - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief Linux stub implementations of the driver-loader (install.cpp) * @details The Windows implementation (install.cpp) loads/unloads the HyperDbg * kernel-mode driver (the .sys file that contains the actual debugging diff --git a/hyperdbg/libhyperdbg/code/debugger/script-engine/symbol-linux.cpp b/hyperdbg/libhyperdbg/code/debugger/script-engine/symbol-linux.cpp index 2f7f65a4..6a8f558d 100644 --- a/hyperdbg/libhyperdbg/code/debugger/script-engine/symbol-linux.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/script-engine/symbol-linux.cpp @@ -1,6 +1,6 @@ /** * @file symbol-linux.cpp - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief Linux stub implementations of the symbol subsystem * @details The Windows implementation uses DbgHelp + PDB files (symbol-parser/). * Linux uses ELF/DWARF which requires a separate implementation. diff --git a/hyperdbg/libhyperdbg/code/debugger/user-level/pe-parser-linux.cpp b/hyperdbg/libhyperdbg/code/debugger/user-level/pe-parser-linux.cpp index 6edaa478..9c56e32e 100644 --- a/hyperdbg/libhyperdbg/code/debugger/user-level/pe-parser-linux.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/user-level/pe-parser-linux.cpp @@ -1,6 +1,6 @@ /** * @file pe-parser-linux.cpp - * @author Max Raulea (max.raulea@gmail.com) + * @author Max Raulea (max.raulea@hyperdbg.org) * @brief Linux stub implementations of the PE (Portable Executable) parser * @details The Windows implementation (pe-parser.cpp) parses the full PE image * format and depends on the complete set of Windows IMAGE_* headers, diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index f180542d..9a918723 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -77,9 +77,11 @@ Shared, OS-neutral headers: | `.../script-engine/symbol-linux.cpp` | `symbol.cpp` (DbgHelp + PDB) | All `Symbol*` functions. Only `SymbolConvertNameOrExprToAddress` does real work: parses a plain hex/decimal literal so numeric addresses work. | Real ELF/DWARF symbol parser (libdw / libelf / libbfd). | | `.../user-level/pe-parser-linux.cpp` | `pe-parser.cpp` (Windows PE format) | The 3 public fns: `PeShowSectionInformationAndDump`, `PeIsPE32BitOr64Bit` (→ FALSE), `PeGetSyscallNumber` (→ 0). | Recreate the Windows `IMAGE_*` headers for Linux, then port `pe-parser.cpp`. Only needed for Windows-target debugging on Linux. | | `.../driver-loader/install-linux.cpp` | `install.cpp` (SCM driver loader) | The 2 Linux-visible public fns: `ManageDriver` (→ FALSE) and `SetupPathForFileName` (→ FALSE). The 4 `SC_HANDLE` helpers (`InstallDriver`/`RemoveDriver`/`StartDriver`/`StopDriver`) are guarded out of `install.h` on Linux (never referenced there). | `ManageDriver`: load/unload a future HyperDbg Linux kernel module via `finit_module`/`delete_module` (needs CAP_SYS_MODULE). `SetupPathForFileName`: `readlink("/proc/self/exe")` + strip + append + `access()` (generic "find a file beside my binary"; also used by hwdbg). | +| `.../communication/namedpipe-linux.cpp` | `namedpipe.cpp` (Win32 named-pipe IPC) | All 10 public `NamedPipeServer*`/`NamedPipeClient*` fns. `Create*` → `INVALID_HANDLE_VALUE` (print); send/read → 0/FALSE; close → no-op (quiet, unreachable once Create fails). The two internal `*Example()` demos are not in the Linux TU. | Back with a filesystem FIFO (`mkfifo`) or, better for framed bidirectional messages, an `AF_UNIX` socket derived from the `\\.\pipe\NAME` string; overlapped/event I/O collapses to blocking `read`/`write`. | -All three self-guard with `#ifdef __linux__` and print -`"... is not supported on Linux yet"` at runtime. +All four self-guard with `#ifdef __linux__` and print +`"... is not supported on Linux yet"` at runtime (named-pipe: only in the +`Create*` entry points, to avoid per-loop spam). --- @@ -320,6 +322,55 @@ over serial/namedpipe). Two mechanical fixes: Matches the CTRL_*/PROCESS_*/ERROR_* constant blocks already there. Actual Linux serial I/O is still the platform-serial termios TODO. +### formats.cpp DECIMAL_DIG — DONE (2026-07-22) + +`meta-commands/formats.cpp:94` uses `DECIMAL_DIG` (the ISO C99 `` macro, +widest-float round-trip digit count) in a `.formats` output format string. MSVC +exposes it transitively via its CRT/pch; glibc needs the explicit include. +**Pure addition:** `#include ` in the `Environment.h` Linux block +(next to ``/``). Standard header, cross-platform-safe. + +### forwarding.cpp output-event forwarding — DONE (2026-07-22) + +`communication/forwarding.cpp` is the debug-output forwarding subsystem (sinks: +file / TCP / named-pipe / loadable module). Bucket-2, multi-category. User chose +**new Platform\* wrappers** for both non-trivial subsystems (not guards). + +- **Clean swap:** `WriteFile`→`PlatformWriteFile` (exact match; the original + assigns the result then unconditionally `return TRUE`, so the error-check below + was already dead code — `BytesWritten` out-param dropped, still referenced by + that dead code so no unused-var). `CloseHandle` (FILE source)→`PlatformCloseFile` + (fclose on Linux — matches the FILE\* the new open returns). +- **File sink** (`CreateFileA`, narrow path + `OPEN_ALWAYS`): existing + `PlatformOpenFileForWriting` did NOT fit (it is wide + `CREATE_ALWAYS`/truncate), + so **pure addition** `PlatformOpenFileForWritingNarrow(const CHAR *)` — Windows + `CreateFileA(...OPEN_ALWAYS...)`; Linux `fopen("r+b")` then `fopen("w+b")` + (open-existing-no-truncate, else create) returning the `FILE*` as the HANDLE. + Named `...Narrow` (user preference) to flag the char-width difference vs the + wide variant. Because the path is already a narrow `std::string`, this sink + actually works on Linux — no wide-char blocker. +- **Module/plugin sink** (`LoadLibraryA`/`GetProcAddress`/`FreeLibrary`): **pure + additions** `PlatformLoadLibrary`/`PlatformGetProcAddress`/`PlatformFreeLibrary` + in platform-lib-calls — Windows real; Linux `dlopen(RTLD_NOW|RTLD_LOCAL)`/ + `dlsym`/`dlclose` (dlclose return inverted to keep "non-zero == success"). + `PlatformGetProcAddress` returns `PVOID` (no `FARPROC` on Linux); caller casts. +- **Build:** added `#include ` to the platform-lib-calls Linux includes; + added `${CMAKE_DL_LIBS}` to the `libhyperdbg` link (top-level CMakeLists) — the + portable dl link (empty where dl is in libc). Only libhyperdbg compiles + platform-lib-calls.c on Linux, so no other target needed it. +- ⚠️ All four new Linux branches marked `NOT YET TESTED!!` in source. + +### namedpipe.cpp — DONE via namedpipe-linux.cpp + CMake swap (2026-07-22) + +`communication/namedpipe.cpp` is a whole Windows-only TU (Win32 named-pipe IPC: +server `CreateNamedPipe`/`ConnectNamedPipe`, client `CreateFileA` on `\\.\pipe\` ++ overlapped `ReadFile`/`WriteFile` via `g_OverlappedIoStructureFor*Debugger`). +Followed pattern-2 (like symbol/pe-parser/install): new `namedpipe-linux.cpp` +`#ifdef __linux__` stubs of the 10 public `NamedPipe{Server,Client}*` fns; +`namedpipe.cpp` left 100% untouched; CMake `if(UNIX)` REMOVE_ITEM + APPEND swap. +6 callers link the stubs transparently (forwarding/kd/debug/export/tests/test). +See the Linux-replacement-files table above for the FIFO/AF_UNIX TODO. + --- ## TODO ledger — revisit before Linux is functional From 6683c2dc3db640e8b75786570759daf4e630c7f0 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Wed, 22 Jul 2026 11:32:39 +0200 Subject: [PATCH 21/50] New socket platform API and named-pipe linux file --- .../platform/user/code/platform-socket.c | 83 ++++++++ .../platform/user/header/platform-socket.h | 78 ++++++++ hyperdbg/libhyperdbg/CMakeLists.txt | 2 + .../communication/namedpipe-linux.cpp | 179 ++++++++++++++++++ .../communication/remote-connection.cpp | 21 +- .../code/debugger/communication/tcpclient.cpp | 35 ++-- .../code/debugger/communication/tcpserver.cpp | 61 +++--- hyperdbg/libhyperdbg/libhyperdbg.vcxproj | 2 + .../libhyperdbg/libhyperdbg.vcxproj.filters | 6 + hyperdbg/libhyperdbg/pch.h | 5 + hyperdbg/linux/PORTING_STATUS.md | 40 ++++ 11 files changed, 450 insertions(+), 62 deletions(-) create mode 100644 hyperdbg/include/platform/user/code/platform-socket.c create mode 100644 hyperdbg/include/platform/user/header/platform-socket.h create mode 100644 hyperdbg/libhyperdbg/code/debugger/communication/namedpipe-linux.cpp diff --git a/hyperdbg/include/platform/user/code/platform-socket.c b/hyperdbg/include/platform/user/code/platform-socket.c new file mode 100644 index 00000000..f769daa7 --- /dev/null +++ b/hyperdbg/include/platform/user/code/platform-socket.c @@ -0,0 +1,83 @@ +/** + * @file platform-socket.c + * @author Max Raulea (max.raulea@hyperdbg.org) + * @brief User mode cross-platform implementation of the TCP remote-debugging transport + * @details See platform-socket.h. The few Winsock/POSIX primitives that diverge + * (close, shutdown flag, last-error) are mapped onto a common spelling + * by the macros below so each wrapper body is written once; only the + * startup/cleanup lifecycle, whose structure genuinely differs, keeps a + * small in-body guard. The portable socket calls themselves stay at the + * tcpclient/tcpserver call sites unchanged. + * + * @version 0.21 + * @date 2026-07-22 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#include "pch.h" + +#if defined(__linux__) +# include "../header/platform-socket.h" +# include +#endif // defined(__linux__) + +// +// Map the Winsock/POSIX primitives that diverge onto a common spelling. +// +#if defined(_WIN32) +# define PLATFORM_CLOSE_SOCKET(Socket) closesocket(Socket) +# define PLATFORM_SHUTDOWN_SEND_FLAG SD_SEND +# define PLATFORM_LAST_SOCKET_ERROR WSAGetLastError() +#elif defined(__linux__) +# define PLATFORM_CLOSE_SOCKET(Socket) close(Socket) +# define PLATFORM_SHUTDOWN_SEND_FLAG SHUT_WR +# define PLATFORM_LAST_SOCKET_ERROR errno +#endif + +INT +PlatformSocketInitialize(VOID) +{ +#if defined(_WIN32) + WSADATA WsaData; + + // + // Request Winsock 2.2; the WSADATA is not needed by the caller. + // + return WSAStartup(MAKEWORD(2, 2), &WsaData); +#else + // + // No global socket-library initialization is needed on Linux. + // + return 0; +#endif +} + +VOID +PlatformSocketCleanup(VOID) +{ +#if defined(_WIN32) + WSACleanup(); +#endif + // + // Nothing to tear down on Linux. + // +} + +INT +PlatformCloseSocket(SOCKET Socket) +{ + return PLATFORM_CLOSE_SOCKET(Socket); +} + +INT +PlatformShutdownSocketSend(SOCKET Socket) +{ + return shutdown(Socket, PLATFORM_SHUTDOWN_SEND_FLAG); +} + +INT +PlatformGetSocketError(VOID) +{ + return PLATFORM_LAST_SOCKET_ERROR; +} diff --git a/hyperdbg/include/platform/user/header/platform-socket.h b/hyperdbg/include/platform/user/header/platform-socket.h new file mode 100644 index 00000000..77bd08b1 --- /dev/null +++ b/hyperdbg/include/platform/user/header/platform-socket.h @@ -0,0 +1,78 @@ +/** + * @file platform-socket.h + * @author Max Raulea (max.raulea@hyperdbg.org) + * @brief User mode cross-platform interface for the TCP remote-debugging transport + * @details The remote-debugging command/result exchange in tcpclient.cpp / + * tcpserver.cpp is written against the BSD-socket API, which Winsock and + * POSIX share almost verbatim (socket / connect / bind / listen / accept / + * send / recv / shutdown / getaddrinfo). Only a handful of things diverge: + * Winsock's startup/cleanup lifecycle, closesocket vs close(2), the + * SD_SEND vs SHUT_WR shutdown flag, WSAGetLastError vs errno, and the + * address-length out-parameter type of accept() (int vs socklen_t). Those + * are isolated behind the Platform* wrappers / typedef below so the socket + * call sites stay shared. On Linux this header also pulls in the POSIX + * socket headers that back the portable calls; on Windows they come from + * / (included by pch.h). + * + * @version 0.21 + * @date 2026-07-22 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#pragma once + +#if defined(__linux__) +# include "../../../../include/SDK/HyperDbgSdk.h" +# include +# include +# include +# include +# include +#endif // defined(__linux__) + +// +// Length type for the address-size out-parameter of accept() (and friends). +// Winsock uses int; POSIX uses socklen_t. Kept as a platform typedef so the +// call sites declare the right type without an inline #ifdef. +// +#if defined(_WIN32) +typedef int PLATFORM_SOCKLEN; +#elif defined(__linux__) +typedef socklen_t PLATFORM_SOCKLEN; +#endif + +// +// INITIALIZE the socket subsystem before any socket call. Mirrors WSAStartup: +// returns 0 on success and non-zero on failure. The Winsock version request is +// kept internal. No-op on Linux (always returns 0). +// +INT +PlatformSocketInitialize(VOID); + +// +// CLEAN UP the socket subsystem (Winsock WSACleanup; no-op on Linux). +// +VOID +PlatformSocketCleanup(VOID); + +// +// CLOSE a socket (Winsock closesocket; POSIX close(2)). +// +INT +PlatformCloseSocket(SOCKET Socket); + +// +// SHUT DOWN the sending side of a socket (Winsock shutdown(.., SD_SEND); +// POSIX shutdown(.., SHUT_WR)). Returns 0 on success, SOCKET_ERROR on failure. +// +INT +PlatformShutdownSocketSend(SOCKET Socket); + +// +// LAST socket error for the calling thread (Winsock WSAGetLastError; POSIX +// errno). See the last-error caveat in platform-lib-calls.h: the numeric code +// spaces still differ; callers that only log or check non-zero are fine. +// +INT +PlatformGetSocketError(VOID); diff --git a/hyperdbg/libhyperdbg/CMakeLists.txt b/hyperdbg/libhyperdbg/CMakeLists.txt index 67096b76..1b7333e1 100644 --- a/hyperdbg/libhyperdbg/CMakeLists.txt +++ b/hyperdbg/libhyperdbg/CMakeLists.txt @@ -32,6 +32,7 @@ set(SourceFiles "../include/platform/user/code/platform-serial.c" "../include/platform/user/code/platform-ioctl.c" "../include/platform/user/code/platform-signal.c" + "../include/platform/user/code/platform-socket.c" "../include/platform/user/code/windows-only/windows-privilege.c" "../script-eval/code/Functions.c" "../script-eval/code/Keywords.c" @@ -177,6 +178,7 @@ set_source_files_properties( "../include/platform/user/code/platform-serial.c" "../include/platform/user/code/platform-ioctl.c" "../include/platform/user/code/platform-signal.c" + "../include/platform/user/code/platform-socket.c" "../include/platform/user/code/windows-only/windows-privilege.c" "../script-eval/code/Functions.c" "../script-eval/code/Keywords.c" diff --git a/hyperdbg/libhyperdbg/code/debugger/communication/namedpipe-linux.cpp b/hyperdbg/libhyperdbg/code/debugger/communication/namedpipe-linux.cpp new file mode 100644 index 00000000..c0630e70 --- /dev/null +++ b/hyperdbg/libhyperdbg/code/debugger/communication/namedpipe-linux.cpp @@ -0,0 +1,179 @@ +/** + * @file namedpipe-linux.cpp + * @author Max Raulea (max.raulea@hyperdbg.org) + * @brief Linux stub implementations of the named-pipe transport (namedpipe.cpp) + * @details The Windows implementation (namedpipe.cpp) is a thin wrapper over the + * Win32 named-pipe IPC API: the server side uses + * CreateNamedPipe/ConnectNamedPipe/ReadFile/WriteFile, and the client + * side uses CreateFileA against the "\\.\pipe\..." name plus overlapped + * ReadFile/WriteFile with the g_OverlappedIoStructureFor*Debugger + * events. None of that maps 1:1 onto Linux, so the whole translation + * unit is swapped out on Linux (CMake `if(UNIX)` REMOVE_ITEM + * namedpipe.cpp + APPEND namedpipe-linux.cpp), mirroring the + * symbol.cpp -> symbol-linux.cpp / pe-parser.cpp -> pe-parser-linux.cpp + * / install.cpp -> install-linux.cpp pattern. namedpipe.cpp itself is + * left 100% untouched for the Windows build. Only the 10 public + * functions declared in namedpipe.h are provided here; the two internal + * *Example() demo functions are not part of the interface and simply do + * not exist in the Linux TU. + * + * The Create* entry points return INVALID_HANDLE_VALUE, so every caller + * bails before reaching the send/read/close paths — those stay silent to + * avoid spamming a message on each loop iteration; only the Create* + * functions emit the "not supported" note. + * + * TODO(Linux) to make these real: back the transport with either a + * filesystem FIFO (mkfifo(3), matching the "named pipe" naming most + * closely) or, more usefully for bidirectional message framing, a Unix + * domain socket (AF_UNIX, socket/bind/listen/accept on the server side, + * socket/connect on the client side) whose path is derived from the + * "\\.\pipe\NAME" string. The overlapped/event machinery collapses to + * plain blocking read()/write() (or poll()) since a dedicated thread + * already owns each direction. + * + * @version 0.1 + * @date 2026-07-22 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#include "pch.h" + +#ifdef __linux__ + +//////////////////////////////////////////////////////////////////////////// +// Server Side // +//////////////////////////////////////////////////////////////////////////// + +/** + * @brief Create a named-pipe server endpoint. + * @return HANDLE INVALID_HANDLE_VALUE — named pipes are not supported on Linux + * yet (see file header for the FIFO / AF_UNIX plan). + */ +HANDLE +NamedPipeServerCreatePipe(LPCSTR PipeName, UINT32 OutputBufferSize, UINT32 InputBufferSize) +{ + UNREFERENCED_PARAMETER(PipeName); + UNREFERENCED_PARAMETER(OutputBufferSize); + UNREFERENCED_PARAMETER(InputBufferSize); + + ShowMessages("err, named-pipe communication is not supported on Linux yet\n"); + return INVALID_HANDLE_VALUE; +} + +/** + * @brief Wait for a client to connect to the server pipe. + * @return BOOLEAN FALSE — not supported on Linux yet. + */ +BOOLEAN +NamedPipeServerWaitForClientConntection(HANDLE PipeHandle) +{ + UNREFERENCED_PARAMETER(PipeHandle); + return FALSE; +} + +/** + * @brief Read a message sent by the connected client. + * @return UINT32 0 — not supported on Linux yet. + */ +UINT32 +NamedPipeServerReadClientMessage(HANDLE PipeHandle, CHAR * BufferToSave, INT MaximumReadBufferLength) +{ + UNREFERENCED_PARAMETER(PipeHandle); + UNREFERENCED_PARAMETER(BufferToSave); + UNREFERENCED_PARAMETER(MaximumReadBufferLength); + return 0; +} + +/** + * @brief Send a message to the connected client. + * @return BOOLEAN FALSE — not supported on Linux yet. + */ +BOOLEAN +NamedPipeServerSendMessageToClient(HANDLE PipeHandle, + CHAR * BufferToSend, + INT BufferSize) +{ + UNREFERENCED_PARAMETER(PipeHandle); + UNREFERENCED_PARAMETER(BufferToSend); + UNREFERENCED_PARAMETER(BufferSize); + return FALSE; +} + +/** + * @brief Close the server pipe handle. + * @return VOID no-op — not supported on Linux yet. + */ +VOID +NamedPipeServerCloseHandle(HANDLE PipeHandle) +{ + UNREFERENCED_PARAMETER(PipeHandle); +} + +//////////////////////////////////////////////////////////////////////////// +// Client Side // +//////////////////////////////////////////////////////////////////////////// + +/** + * @brief Connect to a named-pipe server endpoint. + * @return HANDLE INVALID_HANDLE_VALUE — not supported on Linux yet. + */ +HANDLE +NamedPipeClientCreatePipe(LPCSTR PipeName) +{ + UNREFERENCED_PARAMETER(PipeName); + + ShowMessages("err, named-pipe communication is not supported on Linux yet\n"); + return INVALID_HANDLE_VALUE; +} + +/** + * @brief Connect to a named-pipe server endpoint using overlapped I/O. + * @return HANDLE INVALID_HANDLE_VALUE — not supported on Linux yet. + */ +HANDLE +NamedPipeClientCreatePipeOverlappedIo(LPCSTR PipeName) +{ + UNREFERENCED_PARAMETER(PipeName); + + ShowMessages("err, named-pipe communication is not supported on Linux yet\n"); + return INVALID_HANDLE_VALUE; +} + +/** + * @brief Send a message to the server over the client pipe. + * @return BOOLEAN FALSE — not supported on Linux yet. + */ +BOOLEAN +NamedPipeClientSendMessage(HANDLE PipeHandle, CHAR * BufferToSend, INT BufferSize) +{ + UNREFERENCED_PARAMETER(PipeHandle); + UNREFERENCED_PARAMETER(BufferToSend); + UNREFERENCED_PARAMETER(BufferSize); + return FALSE; +} + +/** + * @brief Read a message from the server over the client pipe. + * @return UINT32 0 — not supported on Linux yet. + */ +UINT32 +NamedPipeClientReadMessage(HANDLE PipeHandle, CHAR * BufferToRead, INT MaximumSizeOfBuffer) +{ + UNREFERENCED_PARAMETER(PipeHandle); + UNREFERENCED_PARAMETER(BufferToRead); + UNREFERENCED_PARAMETER(MaximumSizeOfBuffer); + return 0; +} + +/** + * @brief Close the client pipe handle. + * @return VOID no-op — not supported on Linux yet. + */ +VOID +NamedPipeClientClosePipe(HANDLE PipeHandle) +{ + UNREFERENCED_PARAMETER(PipeHandle); +} + +#endif // __linux__ diff --git a/hyperdbg/libhyperdbg/code/debugger/communication/remote-connection.cpp b/hyperdbg/libhyperdbg/code/debugger/communication/remote-connection.cpp index 75198438..cde0edfc 100644 --- a/hyperdbg/libhyperdbg/code/debugger/communication/remote-connection.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/communication/remote-connection.cpp @@ -134,7 +134,7 @@ RemoteConnectionListen(PCSTR Port) // // Zero the buffer for next command // - RtlZeroMemory(recvbuf, COMMUNICATION_BUFFER_SIZE); + PlatformZeroMemory(recvbuf, COMMUNICATION_BUFFER_SIZE); while (true) { @@ -175,7 +175,7 @@ RemoteConnectionListen(PCSTR Port) // // Zero the buffer for next command // - RtlZeroMemory(recvbuf, COMMUNICATION_BUFFER_SIZE); + PlatformZeroMemory(recvbuf, COMMUNICATION_BUFFER_SIZE); } // @@ -271,13 +271,13 @@ RemoteConnectionThreadListeningToDebuggee(LPVOID lpParam) // // Trigger the event // - SetEvent(g_EndOfMessageReceivedEvent); + PlatformSetEvent(g_EndOfMessageReceivedEvent); } // // Clear the buffer // - RtlZeroMemory(RecvBuf, COMMUNICATION_BUFFER_SIZE); + PlatformZeroMemory(RecvBuf, COMMUNICATION_BUFFER_SIZE); } // @@ -314,7 +314,6 @@ RemoteConnectionThreadListeningToDebuggee(LPVOID lpParam) VOID RemoteConnectionConnect(PCSTR Ip, PCSTR Port) { - DWORD ThreadId; CHAR Recv[3] = {0}; UINT32 BuffRecv = 0; @@ -412,7 +411,7 @@ RemoteConnectionConnect(PCSTR Ip, PCSTR Port) // if (g_EndOfMessageReceivedEvent == NULL) { - g_EndOfMessageReceivedEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + g_EndOfMessageReceivedEvent = PlatformCreateEvent(FALSE, FALSE); } // @@ -420,13 +419,9 @@ RemoteConnectionConnect(PCSTR Ip, PCSTR Port) // the remote debuggee for new messages // Listen for upcoming messages // - g_RemoteDebuggeeListeningThread = CreateThread( - NULL, - 0, + g_RemoteDebuggeeListeningThread = PlatformCreateThread( RemoteConnectionThreadListeningToDebuggee, - NULL, - 0, - &ThreadId); + NULL); ShowMessages("connected to %s:%s\n", Ip, Port); } @@ -458,7 +453,7 @@ RemoteConnectionSendCommand(const CHAR * sendbuf, INT len) // // We wait for the debuggee to send the message // - WaitForSingleObject( + PlatformWaitForSingleObject( g_EndOfMessageReceivedEvent, INFINITE); diff --git a/hyperdbg/libhyperdbg/code/debugger/communication/tcpclient.cpp b/hyperdbg/libhyperdbg/code/debugger/communication/tcpclient.cpp index 831b361c..239d94ee 100644 --- a/hyperdbg/libhyperdbg/code/debugger/communication/tcpclient.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/communication/tcpclient.cpp @@ -22,7 +22,6 @@ INT CommunicationClientConnectToServer(PCSTR Ip, PCSTR Port, SOCKET * ConnectSocketArg) { - WSADATA wsaData; SOCKET ConnectSocket = INVALID_SOCKET; struct addrinfo *result = NULL, *ptr = NULL, hints; INT IResult; @@ -30,14 +29,14 @@ CommunicationClientConnectToServer(PCSTR Ip, PCSTR Port, SOCKET * ConnectSocketA // // Initialize Winsock // - IResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + IResult = PlatformSocketInitialize(); if (IResult != 0) { ShowMessages("err, WSAStartup failed (%x)\n", IResult); return 1; } - ZeroMemory(&hints, sizeof(hints)); + PlatformZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; @@ -49,7 +48,7 @@ CommunicationClientConnectToServer(PCSTR Ip, PCSTR Port, SOCKET * ConnectSocketA if (IResult != 0) { ShowMessages("getaddrinfo failed (%x)\n", IResult); - WSACleanup(); + PlatformSocketCleanup(); return 1; } @@ -64,8 +63,8 @@ CommunicationClientConnectToServer(PCSTR Ip, PCSTR Port, SOCKET * ConnectSocketA ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (ConnectSocket == INVALID_SOCKET) { - ShowMessages("socket failed with error: %ld\n", WSAGetLastError()); - WSACleanup(); + ShowMessages("socket failed with error: %ld\n", PlatformGetSocketError()); + PlatformSocketCleanup(); return 1; } @@ -75,7 +74,7 @@ CommunicationClientConnectToServer(PCSTR Ip, PCSTR Port, SOCKET * ConnectSocketA IResult = connect(ConnectSocket, ptr->ai_addr, (INT)ptr->ai_addrlen); if (IResult == SOCKET_ERROR) { - closesocket(ConnectSocket); + PlatformCloseSocket(ConnectSocket); ConnectSocket = INVALID_SOCKET; continue; } @@ -87,7 +86,7 @@ CommunicationClientConnectToServer(PCSTR Ip, PCSTR Port, SOCKET * ConnectSocketA if (ConnectSocket == INVALID_SOCKET) { ShowMessages("unable to connect to the server\n"); - WSACleanup(); + PlatformSocketCleanup(); return 1; } @@ -118,9 +117,9 @@ CommunicationClientSendMessage(SOCKET ConnectSocket, const CHAR * sendbuf, INT b IResult = send(ConnectSocket, sendbuf, buflen, 0); if (IResult == SOCKET_ERROR) { - ShowMessages("err, send failed (%x)\n", WSAGetLastError()); - closesocket(ConnectSocket); - WSACleanup(); + ShowMessages("err, send failed (%x)\n", PlatformGetSocketError()); + PlatformCloseSocket(ConnectSocket); + PlatformSocketCleanup(); return 1; } @@ -141,7 +140,7 @@ CommunicationClientShutdownConnection(SOCKET ConnectSocket) // // shutdown the connection since no more data will be sent // - IResult = shutdown(ConnectSocket, SD_SEND); + IResult = PlatformShutdownSocketSend(ConnectSocket); if (IResult == SOCKET_ERROR) { // @@ -150,11 +149,11 @@ CommunicationClientShutdownConnection(SOCKET ConnectSocket) // /* - ShowMessages("err, shutdown failed (%x)\n", WSAGetLastError()); + ShowMessages("err, shutdown failed (%x)\n", PlatformGetSocketError()); */ - closesocket(ConnectSocket); - WSACleanup(); + PlatformCloseSocket(ConnectSocket); + PlatformSocketCleanup(); return 1; } return 0; @@ -197,7 +196,7 @@ CommunicationClientReceiveMessage(SOCKET ConnectSocket, CHAR * RecvBuf, UINT32 M } else { - ShowMessages("\nrecv failed with error: %d\n", WSAGetLastError()); + ShowMessages("\nrecv failed with error: %d\n", PlatformGetSocketError()); ShowMessages("the remote system closes the connection.\n\n"); return 1; @@ -218,8 +217,8 @@ CommunicationClientCleanup(SOCKET ConnectSocket) // // cleanup // - closesocket(ConnectSocket); - WSACleanup(); + PlatformCloseSocket(ConnectSocket); + PlatformSocketCleanup(); return 0; } diff --git a/hyperdbg/libhyperdbg/code/debugger/communication/tcpserver.cpp b/hyperdbg/libhyperdbg/code/debugger/communication/tcpserver.cpp index 19129e29..75765b85 100644 --- a/hyperdbg/libhyperdbg/code/debugger/communication/tcpserver.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/communication/tcpserver.cpp @@ -32,8 +32,7 @@ CommunicationServerCreateServerAndWaitForClient(PCSTR Port, SOCKET * ClientSocketArg, SOCKET * ListenSocketArg) { - WSADATA wsaData; - INT IResult; + INT IResult; SOCKET ListenSocket = INVALID_SOCKET; SOCKET ClientSocket = INVALID_SOCKET; @@ -44,14 +43,14 @@ CommunicationServerCreateServerAndWaitForClient(PCSTR Port, // // Initialize Winsock // - IResult = WSAStartup(MAKEWORD(2, 2), &wsaData); + IResult = PlatformSocketInitialize(); if (IResult != 0) { ShowMessages("err, WSAStartup failed (%x)\n", IResult); return 1; } - ZeroMemory(&hints, sizeof(hints)); + PlatformZeroMemory(&hints, sizeof(hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; @@ -64,7 +63,7 @@ CommunicationServerCreateServerAndWaitForClient(PCSTR Port, if (IResult != 0) { ShowMessages("err, getaddrinfo failed (%x)\n", IResult); - WSACleanup(); + PlatformSocketCleanup(); return 1; } @@ -75,9 +74,9 @@ CommunicationServerCreateServerAndWaitForClient(PCSTR Port, socket(result->ai_family, result->ai_socktype, result->ai_protocol); if (ListenSocket == INVALID_SOCKET) { - ShowMessages("socket failed with error: %ld\n", WSAGetLastError()); + ShowMessages("socket failed with error: %ld\n", PlatformGetSocketError()); freeaddrinfo(result); - WSACleanup(); + PlatformSocketCleanup(); return 1; } @@ -87,10 +86,10 @@ CommunicationServerCreateServerAndWaitForClient(PCSTR Port, IResult = ::bind(ListenSocket, result->ai_addr, (INT)result->ai_addrlen); if (IResult == SOCKET_ERROR) { - ShowMessages("err, bind failed (%x)\n", WSAGetLastError()); + ShowMessages("err, bind failed (%x)\n", PlatformGetSocketError()); freeaddrinfo(result); - closesocket(ListenSocket); - WSACleanup(); + PlatformCloseSocket(ListenSocket); + PlatformSocketCleanup(); return 1; } @@ -99,25 +98,25 @@ CommunicationServerCreateServerAndWaitForClient(PCSTR Port, IResult = listen(ListenSocket, SOMAXCONN); if (IResult == SOCKET_ERROR) { - ShowMessages("err, listen failed (%x)\n", WSAGetLastError()); - closesocket(ListenSocket); - WSACleanup(); + ShowMessages("err, listen failed (%x)\n", PlatformGetSocketError()); + PlatformCloseSocket(ListenSocket); + PlatformSocketCleanup(); return 1; } // // Accept a client socket // - sockaddr_in name = {0}; - INT AddrLen = sizeof(name); + sockaddr_in name = {0}; + PLATFORM_SOCKLEN AddrLen = sizeof(name); ClientSocket = accept(ListenSocket, (struct sockaddr *)&name, &AddrLen); if (ClientSocket == INVALID_SOCKET) { - ShowMessages("err, accept failed (%x)\n", WSAGetLastError()); - closesocket(ListenSocket); - WSACleanup(); + ShowMessages("err, accept failed (%x)\n", PlatformGetSocketError()); + PlatformCloseSocket(ListenSocket); + PlatformSocketCleanup(); return 1; } @@ -166,9 +165,9 @@ CommunicationServerReceiveMessage(SOCKET ClientSocket, CHAR * recvbuf, INT recvb } else { - ShowMessages("err, recv failed (%x)\n", WSAGetLastError()); - closesocket(ClientSocket); - WSACleanup(); + ShowMessages("err, recv failed (%x)\n", PlatformGetSocketError()); + PlatformCloseSocket(ClientSocket); + PlatformSocketCleanup(); return 1; } @@ -196,9 +195,9 @@ CommunicationServerSendMessage(SOCKET ClientSocket, const CHAR * sendbuf, INT le if (ISendResult == SOCKET_ERROR) { /* - ShowMessages("err, send failed (%x)\n", WSAGetLastError()); - closesocket(ClientSocket); - WSACleanup(); + ShowMessages("err, send failed (%x)\n", PlatformGetSocketError()); + PlatformCloseSocket(ClientSocket); + PlatformSocketCleanup(); */ return 1; } @@ -221,12 +220,12 @@ CommunicationServerShutdownAndCleanupConnection(SOCKET ClientSocket, // // No longer need server socket // - closesocket(ListenSocket); + PlatformCloseSocket(ListenSocket); // // shutdown the connection since we're done // - IResult = shutdown(ClientSocket, SD_SEND); + IResult = PlatformShutdownSocketSend(ClientSocket); if (IResult == SOCKET_ERROR) { // @@ -235,19 +234,19 @@ CommunicationServerShutdownAndCleanupConnection(SOCKET ClientSocket, // /* - ShowMessages("err, shutdown failed (%x)\n", WSAGetLastError()); + ShowMessages("err, shutdown failed (%x)\n", PlatformGetSocketError()); */ - closesocket(ClientSocket); - WSACleanup(); + PlatformCloseSocket(ClientSocket); + PlatformSocketCleanup(); return 1; } // // cleanup // - closesocket(ClientSocket); - WSACleanup(); + PlatformCloseSocket(ClientSocket); + PlatformSocketCleanup(); return 0; } diff --git a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj index cd1d0655..9e61cf25 100644 --- a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj +++ b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj @@ -137,6 +137,7 @@ msbuild "$(SolutionDir)dependencies\zydis\msvc\Zydis.sln" /m /p:Configuration="R + @@ -179,6 +180,7 @@ msbuild "$(SolutionDir)dependencies\zydis\msvc\Zydis.sln" /m /p:Configuration="R + diff --git a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters index 492c7f91..fdf67988 100644 --- a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters +++ b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters @@ -179,6 +179,9 @@ header\platform + + header\platform + header\platform @@ -721,6 +724,9 @@ code\platform + + code\platform + code\app diff --git a/hyperdbg/libhyperdbg/pch.h b/hyperdbg/libhyperdbg/pch.h index c6077152..dab49afe 100644 --- a/hyperdbg/libhyperdbg/pch.h +++ b/hyperdbg/libhyperdbg/pch.h @@ -173,6 +173,11 @@ typedef const wchar_t *LPCWCHAR, *PCWCHAR; // #include "platform/user/header/platform-signal.h" +// +// Platform socket transport (cross-platform TCP remote-debugging I/O) +// +#include "platform/user/header/platform-socket.h" + // // NT-style intrusive linked-list helpers + CONTAINING_RECORD (self-guards to // non-Windows; Windows gets these from / the native-SDK shim) diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index 9a918723..05839ac3 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -52,6 +52,7 @@ User-mode abstractions in `include/platform/user/` (`header/` = interface, | `platform-serial.{h,c}` | Serial byte transport for remote kernel debugging | **Stub** — Linux branch returns false; termios impl TODO | | `platform-ioctl.{h,c}` | Local kernel-driver IOCTL interface (`PlatformDeviceIoControl`) + device open (`PlatformOpenDevice`) | **Stub** — no Linux kernel module yet; `PlatformOpenDevice` returns `INVALID_HANDLE_VALUE` | | `platform-signal.{h,c}` | Console control handler (Ctrl-C / Ctrl-Break) | Implemented (blocks signals + `sigwait` thread) | +| `platform-socket.{h,c}` | TCP remote-debugging transport: the few Winsock ops that diverge from POSIX (`WSAStartup`/`WSACleanup` lifecycle, `closesocket`, `SD_SEND` shutdown, `WSAGetLastError`) + the `accept()` length-type (`PLATFORM_SOCKLEN`). Also owns the Linux POSIX socket-header includes | Implemented (BSD sockets) — the portable socket calls stay at the tcpclient/tcpserver call sites | Kernel-mode equivalents live in `include/platform/kernel/`. Two were extended for the port because the shared `script-eval/` code compiles in both user and kernel @@ -371,6 +372,45 @@ Followed pattern-2 (like symbol/pe-parser/install): new `namedpipe-linux.cpp` 6 callers link the stubs transparently (forwarding/kd/debug/export/tests/test). See the Linux-replacement-files table above for the FIFO/AF_UNIX TODO. +### TCP transport (tcpclient/tcpserver/remote-connection) — DONE (2026-07-22) + +The TCP remote-debugging path. Unlike namedpipe, the socket code is genuinely +cross-platform — Winsock and POSIX share the BSD-socket API almost verbatim — so +it stays as shared `.cpp` (no `-linux.cpp` fork). A new **`platform-socket.{h,c}` +module** (sibling to platform-serial/-signal; wired into pch.h, top-level + +libhyperdbg CMake, and the Windows `.vcxproj`/`.filters`) isolates the handful of +things that actually diverge. User chose the platform-API route over Winsock-name +shims in `Environment.h`. + +- **`communication/tcpclient.cpp` / `tcpserver.cpp`** — the portable calls + (`socket`/`connect`/`bind`/`listen`/`accept`/`send`/`recv`/`shutdown`/ + `getaddrinfo`) stay at the call sites unchanged. Swapped only the divergent + ones to `Platform*`: `WSAStartup(MAKEWORD(2,2),&wsaData)`→`PlatformSocketInitialize()` + (WSADATA local + MAKEWORD dropped; keeps the `IResult != 0` shape — wrapper + returns 0 on success), `WSACleanup()`→`PlatformSocketCleanup()`, + `closesocket`→`PlatformCloseSocket`, `shutdown(...,SD_SEND)`→`PlatformShutdownSocketSend`, + `WSAGetLastError()`→`PlatformGetSocketError()`, plus the bucket-1 + `ZeroMemory`→`PlatformZeroMemory`. tcpserver's `accept()` length out-param + `INT AddrLen`→`PLATFORM_SOCKLEN AddrLen` — the one genuine type incompatibility + (Winsock `int*` vs POSIX `socklen_t*`). +- **`communication/remote-connection.cpp`** — bucket-1 sweep (`.listen`/`.connect` + command layer over the sockets): `RtlZeroMemory`×3→`PlatformZeroMemory`, + `SetEvent`→`PlatformSetEvent`, `CreateEvent(NULL,FALSE,FALSE,NULL)`→`PlatformCreateEvent(FALSE,FALSE)`, + `CreateThread(...)`→`PlatformCreateThread(fn,NULL)` (unused `DWORD ThreadId` local + dropped), `WaitForSingleObject`→`PlatformWaitForSingleObject`. +- **`platform-socket.{h,c}`** (pure addition): `PlatformSocketInitialize`/ + `PlatformSocketCleanup`/`PlatformCloseSocket`/`PlatformShutdownSocketSend`/ + `PlatformGetSocketError` + the `PLATFORM_SOCKLEN` typedef. The `.c` maps the + divergent primitives (close / shutdown-flag / last-error) via small per-OS + macros so each wrapper body is written once; only the WSAStartup vs no-op + lifecycle keeps a small in-body guard. The `.h` also owns the Linux POSIX + socket-header includes (``/``/``/ + ``/``), so any TU using sockets gets them via pch. + ⚠️ Linux branches not yet exercised at runtime (compile-verified only). + +Note the pre-existing latent teardown-ordering issue is unchanged; see the +`PlatformTerminateThread` TODO below (remote-connection's listening thread). + --- ## TODO ledger — revisit before Linux is functional From f1a923406c61ba6a7f89ba457e3e3eda6568e3ad Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Wed, 22 Jul 2026 11:46:23 +0200 Subject: [PATCH 22/50] new linux guards --- .../libhyperdbg/code/debugger/tests/tests.cpp | 36 +++++++++++++++++++ .../debugger/transparency/gaussian-rng.cpp | 7 ++++ 2 files changed, 43 insertions(+) diff --git a/hyperdbg/libhyperdbg/code/debugger/tests/tests.cpp b/hyperdbg/libhyperdbg/code/debugger/tests/tests.cpp index 2516858d..846880a4 100644 --- a/hyperdbg/libhyperdbg/code/debugger/tests/tests.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/tests/tests.cpp @@ -22,6 +22,7 @@ extern TCHAR g_TestLocation[MAX_PATH]; * @param BufferLength Setup test process name * @return BOOLEAN */ +#ifdef _WIN32 BOOLEAN SetupTestName(_Inout_updates_bytes_all_(BufferLength) PCHAR TestLocation, ULONG BufferLength) @@ -98,6 +99,7 @@ SetupTestName(_Inout_updates_bytes_all_(BufferLength) PCHAR TestLocation, // return TRUE; } +#endif // _WIN32 /** * @brief Create a Process And Open Pipe Connection object @@ -112,6 +114,7 @@ CreateProcessAndOpenPipeConnection(PHANDLE ConnectionPipeHandle, PHANDLE ThreadHandle, PHANDLE ProcessHandle) { +#ifdef _WIN32 HANDLE PipeHandle; BOOLEAN SentMessageResult; UINT32 ReadBytes; @@ -297,6 +300,18 @@ CreateProcessAndOpenPipeConnection(PHANDLE ConnectionPipeHandle, free(BufferToSend); return FALSE; +#else + // + // TODO(Linux): the test harness spawns a Windows test executable + // (hyperdbg-test.exe) and handshakes with it over a named pipe. There is no + // Linux backend yet — both the process spawn (CreateProcess / STARTUPINFO) + // and the named pipe are stubbed — so this returns failure for now. + // + UNREFERENCED_PARAMETER(ConnectionPipeHandle); + UNREFERENCED_PARAMETER(ThreadHandle); + UNREFERENCED_PARAMETER(ProcessHandle); + return FALSE; +#endif // _WIN32 } /** @@ -313,6 +328,7 @@ OpenHyperDbgTestProcess(PHANDLE ThreadHandle, PHANDLE ProcessHandle, CHAR * Args) { +#ifdef _WIN32 PROCESS_INFORMATION ProcessInfo = {0}; STARTUPINFO StartupInfo = {0}; CHAR CmdArgs[MAX_PATH] = {0}; @@ -354,6 +370,16 @@ OpenHyperDbgTestProcess(PHANDLE ThreadHandle, } return FALSE; +#else + // + // TODO(Linux): no Linux process-spawn backend yet (the future home is a + // narrow variant of PlatformCreateProcess). STARTUPINFO is Windows-only. + // + UNREFERENCED_PARAMETER(ThreadHandle); + UNREFERENCED_PARAMETER(ProcessHandle); + UNREFERENCED_PARAMETER(Args); + return FALSE; +#endif // _WIN32 } /** @@ -369,10 +395,20 @@ CloseProcessAndClosePipeConnection(HANDLE ConnectionPipeHandle, HANDLE ThreadHandle, HANDLE ProcessHandle) { +#ifdef _WIN32 // // Close the connection and handles // NamedPipeServerCloseHandle(ConnectionPipeHandle); CloseHandle(ThreadHandle); CloseHandle(ProcessHandle); +#else + // + // TODO(Linux): counterpart of the stubbed test-process spawn above; the + // handles are never created on Linux, so there is nothing to close yet. + // + UNREFERENCED_PARAMETER(ConnectionPipeHandle); + UNREFERENCED_PARAMETER(ThreadHandle); + UNREFERENCED_PARAMETER(ProcessHandle); +#endif // _WIN32 } diff --git a/hyperdbg/libhyperdbg/code/debugger/transparency/gaussian-rng.cpp b/hyperdbg/libhyperdbg/code/debugger/transparency/gaussian-rng.cpp index dff25845..06581f01 100644 --- a/hyperdbg/libhyperdbg/code/debugger/transparency/gaussian-rng.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/transparency/gaussian-rng.cpp @@ -12,6 +12,13 @@ */ #include "pch.h" +// +// std::sqrt / pow / log / sqrt: MSVC exposes these transitively through its +// CRT/pch, libstdc++ needs the explicit (which also declares the +// unqualified ::pow/::log/::sqrt used below). Standard header, cross-platform-safe. +// +#include + /** * @brief get the median of a vector * From b1b9680ce63484c7fadfbccf7e9b25e59700a458 Mon Sep 17 00:00:00 2001 From: Nikzad Date: Wed, 22 Jul 2026 21:21:17 +0330 Subject: [PATCH 23/50] cpuid: some changes for improvement --- .../SDK/imports/user/HyperDbgLibImports.h | 7 + .../kernel-level/kernel-listening.cpp | 2000 +------- hyperdbg/libhyperdbg/code/export/export.cpp | 20 + .../header/debugger/core/debugger.h | 5 + hyperdbg/libhyperdbg/ucpuid.cpp | 4046 +++++++++-------- 5 files changed, 2070 insertions(+), 4008 deletions(-) diff --git a/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h b/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h index 8b7ee904..c3ebdaae 100644 --- a/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h +++ b/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h @@ -329,6 +329,13 @@ hyperdbg_u_pt_operation(HYPERTRACE_PT_OPERATION_PACKETS * PtRequest); IMPORT_EXPORT_LIBHYPERDBG BOOLEAN hyperdbg_u_pt_mmap(HYPERTRACE_PT_MMAP_PACKETS * MmapRequest); +// +// CPUID related command +// Exported functionality of the 'ucpuid', and 'cpuid' commands +// +IMPORT_EXPORT_LIBHYPERDBG BOOLEAN +hyperdbg_u_user_cpuid(UINT32 FunctionId, UINT32 SubFunctionId); + // // Transparent mode related command // Exported functionality of the '!hide', and '!unhide' commands diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp index 8b682d23..d25f5d8f 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp @@ -585,2005 +585,9 @@ StartAgain: if (CpuidPacket->KernelStatus == DEBUGGER_OPERATION_WAS_SUCCESSFUL) { UINT32 FunctionId = CpuidPacket->FunctionId; - UINT32 SubFunctionId = CpuidPacket->SubFunctionId; - CONST CHAR * TypeName = NULL; - CONST CHAR * AssocName; - - switch (FunctionId) - { - case 0x0: - { - CHAR Vendor[13] = {0}; - memcpy(&Vendor[0], &CpuidPacket->EBX, 4); - memcpy(&Vendor[4], &CpuidPacket->EDX, 4); - memcpy(&Vendor[8], &CpuidPacket->ECX, 4); - Vendor[12] = '\0'; + UINT32 SubFunctionId = CpuidPacket->SubFunctionId; - ShowMessages(" *******************************************************\n" - " * LEAF 0 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages(" Vendor : %s\n", Vendor); - ShowMessages(" Maximum supported basic leaf : %u\n", CpuidPacket->EAX); - - break; - } - case 0x1: - // - // EAX - // - ShowMessages("==== CPUID.(EAX=01H) Version / Additional / Feature Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 1 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX: Version Information --\n\n"); - ShowMessages(" SteppingId = %u\n", - CPUID_VERSION_INFORMATION_STEPPING_ID(CpuidPacket->EAX)); - ShowMessages(" Model = %u\n", - CPUID_VERSION_INFORMATION_MODEL(CpuidPacket->EAX)); - ShowMessages(" FamilyId = %u\n", - CPUID_VERSION_INFORMATION_FAMILY_ID(CpuidPacket->EAX)); - ShowMessages(" ProcessorType = %u\n", - CPUID_VERSION_INFORMATION_PROCESSOR_TYPE(CpuidPacket->EAX)); - ShowMessages(" ExtendedModelId = %u\n", - CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID(CpuidPacket->EAX)); - ShowMessages(" ExtendedFamilyId = %u\n\n", - CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID(CpuidPacket->EAX)); - - // - // EBX: additional information - // - ShowMessages("-- EBX: Additional Information --\n\n"); - ShowMessages(" BrandIndex = %u\n", - CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX(CpuidPacket->EBX)); - ShowMessages(" ClflushLineSize = %u (cache line = %u bytes)\n", - CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidPacket->EBX), - CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidPacket->EBX) * 8); - ShowMessages(" MaxAddressableIds = %u\n", - CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS(CpuidPacket->EBX)); - ShowMessages(" InitialApicId = %u\n\n", - CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID(CpuidPacket->EBX)); - - // - // ECX: feature information - // - ShowMessages("-- ECX: Feature Information --\n\n"); - ShowMessages(" SSE3 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PCLMULQDQ = %s\n", - CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" DTES64 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MONITOR/MWAIT = %s\n", - CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CPL Qualified DS = %s\n", - CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" VMX = %s\n", - CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SMX = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" EIST (SpeedStep) = %s\n", - CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" TM2 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SSSE3 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" L1 Context ID = %s\n", - CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" Silicon Debug = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" FMA = %s\n", - CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CMPXCHG16B = %s\n", - CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" xTPR Update Control = %s\n", - CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PDCM = %s\n", - CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PCID = %s\n", - CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" DCA = %s\n", - CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SSE4.1 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SSE4.2 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" x2APIC = %s\n", - CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MOVBE = %s\n", - CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" POPCNT = %s\n", - CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" TSC-Deadline = %s\n", - CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AESNI = %s\n", - CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" XSAVE/XRSTOR = %s\n", - CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" OSXSAVE = %s\n", - CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX = %s\n", - CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" F16C = %s\n", - CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" RDRAND = %s\n\n", - CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - - // - // EDX: feature information - // - ShowMessages("-- EDX: Feature Information --\n\n"); - ShowMessages(" FPU = %s\n", - CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" VME = %s\n", - CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" DE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PSE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" TSC = %s\n", - CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MSR (RDMSR/WRMSR) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PAE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MCE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CX8 (CMPXCHG8B) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" APIC On-Chip = %s\n", - CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SEP (SYSENTER/EXIT) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MTRR = %s\n", - CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PGE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MCA = %s\n", - CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CMOV = %s\n", - CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PAT = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PSE-36 = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PSN = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CLFSH = %s\n", - CPUID_FEATURE_INFORMATION_EDX_CLFLUSH(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" DS (Debug Store) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" ACPI (Thermal/Clock) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MMX = %s\n", - CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" FXSR (FXSAVE/FXRSTOR) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SSE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SSE2 = %s\n", - CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SS (Self Snoop) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" HTT = %s\n", - CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" TM (Thermal Monitor) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PBE = %s\n\n", - CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - - break; - - case 0x2: - ShowMessages("==== CPUID.(EAX=02H) Legacy Cache Descriptor ====\n\n"); - ShowMessages(" This leaf is deprecated and returns legacy cache information.\n"); - ShowMessages(" Use CPUID.(EAX=04H) for deterministic cache parameters instead.\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); - break; - - case 0x3: - ShowMessages("==== CPUID.(EAX=03H) ====\n\n"); - ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); - ShowMessages(" (Was previously used for Processor Serial Number on older CPUs)\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); - break; - - case 0x4: - { - UINT32 LineSize = CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE(CpuidPacket->EBX); - UINT32 Partitions = CPUID_EBX_PHYSICAL_LINE_PARTITIONS(CpuidPacket->EBX); - UINT32 Ways = CPUID_EBX_WAYS_OF_ASSOCIATIVITY(CpuidPacket->EBX); - UINT32 Sets = CPUID_ECX_NUMBER_OF_SETS(CpuidPacket->ECX); - UINT64 CacheSizeBytes = (UINT64)(Ways + 1) * - (UINT64)(Partitions + 1) * - (UINT64)(LineSize + 1) * - (UINT64)(Sets + 1); - ShowMessages("==== CPUID.(EAX=04H) Deterministic Cache Parameters ====\n\n"); - - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidPacket->Leaf4MaxSubLeaf); - - ShowMessages("---- CPUID.(EAX=04H, ECX=%u) ----\n\n", SubFunctionId); - - // - // EAX - // - switch (CPUID_EAX_CACHE_TYPE_FIELD(CpuidPacket->EAX)) - { - case 0: - TypeName = "Null (no more caches)"; - break; - case 1: - TypeName = "Data Cache"; - break; - case 2: - TypeName = "Instruction Cache"; - break; - case 3: - TypeName = "Unified Cache"; - break; - default: - TypeName = "Reserved"; - break; - } - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" CacheTypeField = %u (%s)\n", - CPUID_EAX_CACHE_TYPE_FIELD(CpuidPacket->EAX), - TypeName); - - if (CPUID_EAX_CACHE_TYPE_FIELD(CpuidPacket->EAX) == 0) - { - ShowMessages(" (no more caches; stopping enumeration)\n\n"); - break; - } - - ShowMessages(" CacheLevel = %u\n", - CPUID_EAX_CACHE_LEVEL(CpuidPacket->EAX)); - ShowMessages(" SelfInitializingCacheLevel = %s\n", - CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" FullyAssociativeCache = %s%s\n", - CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidPacket->EAX) ? "TRUE" : "FALSE", - CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidPacket->EAX) ? " (fully associative)" : ""); - - ShowMessages(" MaxAddressableIds(LogicalProcs) (raw) = %u -> actual = %u (raw + 1)\n", - CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidPacket->EAX), - CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidPacket->EAX) + 1); - ShowMessages(" MaxAddressableIds(Cores) (raw) = %u -> actual = %u (raw + 1)\n\n", - CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidPacket->EAX), - CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidPacket->EAX) + 1); - - // - // EBX - // - ShowMessages("-- EBX --\n\n"); - - ShowMessages(" SystemCoherencyLineSize (raw) = %u -> actual = %u bytes (raw + 1)\n", - LineSize, - LineSize + 1); - ShowMessages(" PhysicalLinePartitions (raw) = %u -> actual = %u (raw + 1)\n", - Partitions, - Partitions + 1); - ShowMessages(" WaysOfAssociativity (raw) = %u -> actual = %u (raw + 1)\n\n", - Ways, - Ways + 1); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - - ShowMessages(" NumberOfSets (raw) = %u -> actual = %u (raw + 1)\n\n", - Sets, - Sets + 1); - - // - // EDX - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" WriteBackInvalidate = %s\n", - CPUID_EDX_WRITE_BACK_INVALIDATE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CacheInclusiveness = %s%s\n", - CPUID_EDX_CACHE_INCLUSIVENESS(CpuidPacket->EDX) ? "TRUE" : "FALSE", - CPUID_EDX_CACHE_INCLUSIVENESS(CpuidPacket->EDX) ? " (inclusive of lower levels)" : ""); - ShowMessages(" ComplexCacheIndexing = %s%s\n\n", - CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidPacket->EDX) ? "TRUE" : "FALSE", - CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidPacket->EDX) ? " (complex/hashed indexing)" : " (direct mapped)"); - - // - // Cache Size Calculation (from spec formula) - // - ShowMessages("-- Cache Size --\n\n"); - ShowMessages(" Cache Size (per spec formula) = %llu bytes (%llu KB, %llu MB)\n\n", - (ULONG64)CacheSizeBytes, - (ULONG64)(CacheSizeBytes / 1024), - (ULONG64)(CacheSizeBytes / (1024 * 1024))); - - break; - } - case 0x5: - ShowMessages("==== CPUID.(EAX=05H) MONITOR/MWAIT Leaf ====\n\n"); - - ShowMessages(" *******************************************************\n" - " * LEAF 5 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - // - // EAX - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SmallestMonitorLineSize = %u bytes\n\n", - CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE(CpuidPacket->EAX)); - - // - // EBX - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" LargestMonitorLineSize = %u bytes\n\n", - CPUID_EBX_LARGEST_MONITOR_LINE_SIZE(CpuidPacket->EBX)); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" EnumerationOfMonitorMwaitExtensions = %s\n", - CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SupportsTreatingInterruptsAsBreakEventForMwait = %s\n\n", - CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - - // - // EDX - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" NumberOfC0SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES(CpuidPacket->EDX)); - ShowMessages(" NumberOfC1SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES(CpuidPacket->EDX)); - ShowMessages(" NumberOfC2SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES(CpuidPacket->EDX)); - ShowMessages(" NumberOfC3SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES(CpuidPacket->EDX)); - ShowMessages(" NumberOfC4SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES(CpuidPacket->EDX)); - ShowMessages(" NumberOfC5SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES(CpuidPacket->EDX)); - ShowMessages(" NumberOfC6SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES(CpuidPacket->EDX)); - ShowMessages(" NumberOfC7SubCStates = %u\n\n", CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES(CpuidPacket->EDX)); - - break; - - case 0x6: - ShowMessages("==== CPUID.(EAX=06H) Thermal and Power Management Leaf ====\n\n"); - - ShowMessages(" *******************************************************\n" - " * LEAF 6 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - // - // EAX - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" TemperatureSensorSupported = %s\n", - CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" IntelTurboBoostTechnologyAvailable = %s\n", - CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ARAT (ApicTimerAlwaysRunning) = %s\n", - CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" PLN (PowerLimitNotification) = %s\n", - CPUID_EAX_POWER_LIMIT_NOTIFICATION(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ECMD (ClockModulationDuty) = %s\n", - CPUID_EAX_CLOCK_MODULATION_DUTY(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" PTM (PackageThermalManagement) = %s\n", - CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP Base Registers = %s\n", - CPUID_EAX_HWP_BASE_REGISTERS(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Notification = %s\n", - CPUID_EAX_HWP_NOTIFICATION(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Activity_Window = %s\n", - CPUID_EAX_HWP_ACTIVITY_WINDOW(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Energy_Performance_Preference = %s\n", - CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Package_Level_Request = %s\n", - CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HDC = %s\n", - CPUID_EAX_HDC(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Intel Turbo Boost Max Technology 3.0 = %s\n", - CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP Capabilities = %s\n", - CPUID_EAX_HWP_CAPABILITIES(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP PECI Override = %s\n", - CPUID_EAX_HWP_PECI_OVERRIDE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Flexible HWP = %s\n", - CPUID_EAX_FLEXIBLE_HWP(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Fast Access Mode for HWP Request MSR = %s\n", - CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Ignoring Idle Logical Proc HWP Request = %s\n", - CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Intel Thread Director = %s\n\n", - CPUID_EAX_INTEL_THREAD_DIRECTOR(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - - // - // EBX - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" NumberOfInterruptThresholdsInThermalSensor = %u\n\n", - CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR(CpuidPacket->EBX)); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" HardwareCoordinationFeedbackCapability = %s\n", - CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" NumberOfIntelThreadDirectorClasses (bit) = %s\n", - CPUID_ECX_NUMBER_OF_INTEL_THREAD_DIRECTOR_CLASSES(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PerformanceEnergyBiasPreference = %u\n\n", - CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE(CpuidPacket->ECX)); - - // - // EDX - // EDX is fully reserved for this leaf; still routed through its macro for consistency. - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); - - break; - - case 0x7: - ShowMessages("==== CPUID.(EAX=07H) Structured Extended Feature Flags ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidPacket->LeafEaxMaxSubleaf); - - if (SubFunctionId == 0) - { - ShowMessages("---- CPUID.(EAX=07H, ECX=%u) ----\n\n", SubFunctionId); - - // - // EAX - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" NumberOfSubLeaves (max ECX input) = %u\n\n", CPUID_EAX_NUMBER_OF_SUB_LEAVES(CpuidPacket->EAX)); - - // - // EBX - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" FSGSBASE = %s\n", CPUID_EBX_FSGSBASE(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" IA32_TSC_ADJUST MSR = %s\n", CPUID_EBX_IA32_TSC_ADJUST_MSR(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" SGX = %s\n", CPUID_EBX_SGX(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" BMI1 = %s\n", CPUID_EBX_BMI1(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" HLE = %s\n", CPUID_EBX_HLE(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX2 = %s\n", CPUID_EBX_AVX2(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" FDP_EXCPTN_ONLY = %s\n", CPUID_EBX_FDP_EXCPTN_ONLY(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" SMEP = %s\n", CPUID_EBX_SMEP(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" BMI2 = %s\n", CPUID_EBX_BMI2(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Enhanced REP MOVSB/STOSB = %s\n", CPUID_EBX_ENHANCED_REP_MOVSB_STOSB(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" INVPCID = %s\n", CPUID_EBX_INVPCID(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" RTM = %s\n", CPUID_EBX_RTM(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" RDT-M (Monitoring) = %s\n", CPUID_EBX_RDT_M(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Deprecates FPU CS/DS = %s\n", CPUID_EBX_DEPRECATES(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" MPX = %s\n", CPUID_EBX_MPX(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" RDT-A (Allocation) = %s\n", CPUID_EBX_RDT(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512F = %s\n", CPUID_EBX_AVX512F(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512DQ = %s\n", CPUID_EBX_AVX512DQ(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" RDSEED = %s\n", CPUID_EBX_RDSEED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" ADX = %s\n", CPUID_EBX_ADX(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" SMAP = %s\n", CPUID_EBX_SMAP(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_IFMA = %s\n", CPUID_EBX_AVX512_IFMA(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" CLFLUSHOPT = %s\n", CPUID_EBX_CLFLUSHOPT(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" CLWB = %s\n", CPUID_EBX_CLWB(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Intel Processor Trace = %s\n", CPUID_EBX_INTEL(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512PF (Xeon Phi only) = %s\n", CPUID_EBX_AVX512PF(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512ER (Xeon Phi only) = %s\n", CPUID_EBX_AVX512ER(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512CD = %s\n", CPUID_EBX_AVX512CD(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" SHA = %s\n", CPUID_EBX_SHA(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512BW = %s\n", CPUID_EBX_AVX512BW(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512VL = %s\n\n", CPUID_EBX_AVX512VL(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" PREFETCHWT1 (Xeon Phi only) = %s\n", CPUID_ECX_PREFETCHWT1(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VBMI = %s\n", CPUID_ECX_AVX512_VBMI(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" UMIP = %s\n", CPUID_ECX_UMIP(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PKU = %s\n", CPUID_ECX_PKU(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" OSPKE = %s\n", CPUID_ECX_OSPKE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" WAITPKG = %s\n", CPUID_ECX_WAITPKG(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VBMI2 = %s\n", CPUID_ECX_AVX512_VBMI2(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CET_SS (shadow stack) = %s\n", CPUID_ECX_CET_SS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" GFNI = %s\n", CPUID_ECX_GFNI(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" VAES = %s\n", CPUID_ECX_VAES(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" VPCLMULQDQ = %s\n", CPUID_ECX_VPCLMULQDQ(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VNNI = %s\n", CPUID_ECX_AVX512_VNNI(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_BITALG = %s\n", CPUID_ECX_AVX512_BITALG(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" TME_EN = %s\n", CPUID_ECX_TME_EN(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VPOPCNTDQ = %s\n", CPUID_ECX_AVX512_VPOPCNTDQ(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" LA57 (5-level paging) = %s\n", CPUID_ECX_LA57(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MAWAU (BNDLDX/BNDSTX) = %u (NOT BOOLEAN)\n", CPUID_ECX_MAWAU(CpuidPacket->ECX)); - ShowMessages(" RDPID = %s\n", CPUID_ECX_RDPID(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" KL (Key Locker) = %s\n", CPUID_ECX_KL(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CLDEMOTE = %s\n", CPUID_ECX_CLDEMOTE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MOVDIRI = %s\n", CPUID_ECX_MOVDIRI(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MOVDIR64B = %s\n", CPUID_ECX_MOVDIR64B(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SGX_LC (Launch Config) = %s\n", CPUID_ECX_SGX_LC(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PKS = %s\n\n", CPUID_ECX_PKS(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - - // - // EDX - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" AVX512_4VNNIW (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4VNNIW(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_4FMAPS (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4FMAPS(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" Fast Short REP MOV = %s\n", CPUID_EDX_FAST_SHORT_REP_MOV(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VP2INTERSECT = %s\n", CPUID_EDX_AVX512_VP2INTERSECT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MD_CLEAR = %s\n", CPUID_EDX_MD_CLEAR(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SERIALIZE = %s\n", CPUID_EDX_SERIALIZE(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" Hybrid part = %s\n", CPUID_EDX_HYBRID(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PCONFIG = %s\n", CPUID_EDX_PCONFIG(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CET_IBT (branch tracking) = %s\n", CPUID_EDX_CET_IBT(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" IBRS/IBPB = %s\n", CPUID_EDX_IBRS_IBPB(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" STIBP = %s\n", CPUID_EDX_STIBP(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" L1D_FLUSH = %s\n", CPUID_EDX_L1D_FLUSH(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" IA32_ARCH_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_ARCH_CAPABILITIES(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" IA32_CORE_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_CORE_CAPABILITIES(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SSBD = %s\n\n", CPUID_EDX_SSBD(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - } - else - { - // - // This header only defines the EBX/ECX/EDX bitfield layout for sub-leaf - // (ECX) = 0. If the processor reports further sub-leaves, decoding them - // with the sub-leaf-0 struct would silently misinterpret the bits, so - // instead their raw dwords are printed undecoded - consistent with this - // file's rule of only reading a field through a macro that's actually - // defined for it. - // - ShowMessages(" No bitfield macros are defined for these in ia32.h, so their\n"); - ShowMessages(" raw dwords are shown without decoding:\n"); - ShowMessages(" ECX=%u: EAX=0x%08X EBX=0x%08X ECX=0x%08X EDX=0x%08X\n\n", - SubFunctionId, - CpuidPacket->EAX, - CpuidPacket->EBX, - CpuidPacket->ECX, - CpuidPacket->EDX); - } - - break; - - case 0x8: - ShowMessages("==== CPUID.(EAX=08H) ====\n\n"); - ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); - ShowMessages(" (Was previously used for Processor Serial Number on some CPUs)\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n", CpuidPacket->EDX); - break; - - case 0x9: - ShowMessages("==== CPUID.(EAX=09H) Direct Cache Access Information ====\n\n"); - - ShowMessages(" *******************************************************\n" - " * LEAF 9 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - // - // EAX mirrors IA32_PLATFORM_DCA_CAP[31:0] verbatim. ia32.h doesn't split - // it into sub-fields here (those bit meanings live in the MSR's own - // spec, not in this CPUID leaf), so it's read through its single - // whole-dword macro and shown as raw hex rather than decoded further. - // - ShowMessages(" IA32_PLATFORM_DCA_CAP (EAX, mirrors MSR 1F8H) = 0x%08X\n", - CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidPacket->EAX)); - - // - // EBX/ECX/EDX are fully reserved for this leaf. - // - ShowMessages(" Reserved (EBX) = 0x%08X\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); - ShowMessages(" Reserved (ECX) = 0x%08X\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); - ShowMessages(" Reserved (EDX) = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); - - break; - - case 0xA: - ShowMessages("==== CPUID.(EAX=0AH) Architectural Performance Monitoring Leaf ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 10 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidPacket->EAX) == 0) - { - // - // Per the spec: architectural perfmon is only supported if VersionId > 0. - // At version 0 the rest of this leaf isn't architecturally meaningful, so stop here - // - ShowMessages(" VersionId = 0 -> architectural performance monitoring not supported;\n" - " remaining fields in this leaf are not architecturally defined.\n\n"); - - break; - } - - // - // EAX - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" VersionId = %u\n", - CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidPacket->EAX)); - ShowMessages(" NumberOfCountersPerLogicalProcessor = %u\n", - CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR(CpuidPacket->EAX)); - ShowMessages(" BitWidthOfPerformanceMonitoringCounter = %u\n", - CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER(CpuidPacket->EAX)); - ShowMessages(" EbxBitVectorLength = %u\n\n", - CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidPacket->EAX)); - - // - // EBX - // - ShowMessages("-- EBX (bit = 1 means the event is NOT available) --\n\n"); - ShowMessages(" CoreCycleEventNotAvailable = %u\n", - CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); - ShowMessages(" InstructionRetiredEventNotAvailable = %u\n", - CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); - ShowMessages(" ReferenceCyclesEventNotAvailable = %u\n", - CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); - ShowMessages(" LastLevelCacheReferenceEventNotAvailable = %u\n", - CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); - ShowMessages(" LastLevelCacheMissesEventNotAvailable = %u\n", - CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); - ShowMessages(" BranchInstructionRetiredEventNotAvailable = %u\n", - CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); - ShowMessages(" BranchMispredictRetiredEventNotAvailable = %u\n\n", - CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE(CpuidPacket->EBX)); - - if (CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidPacket->EAX) < 7) - { - ShowMessages(" NOTE: EbxBitVectorLength=%u (<7): bits at/after this length are not\n" - " architecturally defined on this CPU; treat them as unreliable.\n", - CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidPacket->EAX)); - } - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - // - // EDX: fixed-function counter fields only defined if VersionId > 1 - // - ShowMessages("-- EDX --\n\n"); - if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidPacket->EAX) > 1) - { - ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u\n", - CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidPacket->EDX)); - ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u\n\n", - CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidPacket->EDX)); - } - else - { - ShowMessages(" NOTE: VersionId=%u (<=1): fixed-function counter fields are not\n", - CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidPacket->EAX)); - ShowMessages(" architecturally defined; showing raw macro output anyway:\n"); - ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u (undefined)\n", - CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidPacket->EDX)); - ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u (undefined)\n", - CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidPacket->EDX)); - } - - ShowMessages(" AnyThreadDeprecation = %s\n\n", - CPUID_EDX_ANY_THREAD_DEPRECATION(CpuidPacket->EDX) ? "TRUE" : "FALSE"); - - break; - - case 0xB: - - // - // Check if this leaf is supported or not - // - if (!CpuidPacket->LeafBSupported) - { - ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n"); - ShowMessages(" Leaf presence check failed: CPUID.0BH:EBX[15:0] == 0 at sub-leaf 0.\n" - " This processor does not implement leaf 0BH (consider leaf 1FH instead).\n\n"); - break; - } - ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidPacket->LeafBMaxSubleaf); - - switch (CPUID_ECX_LEVEL_TYPE(CpuidPacket->ECX)) - { - case 0: - TypeName = "Invalid"; - break; - case 1: - TypeName = "SMT (Hyper-Threading)"; - break; - case 2: - TypeName = "Core"; - break; - default: - TypeName = "Reserved"; - break; - } - - ShowMessages("---- CPUID.(EAX=0BH, ECX=%u) ----\n\n", SubFunctionId); - - // - // ECX: Level number and type - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" LevelNumber (echoes ECX input) = %u\n", - CPUID_ECX_LEVEL_NUMBER(CpuidPacket->ECX)); - ShowMessages(" LevelType = %u (%s)\n\n", - CPUID_ECX_LEVEL_TYPE(CpuidPacket->ECX), - TypeName); - // - // EAX: Shift count - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" X2ApicIdToUniqueTopologyIdShift = %u\n\n", - CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT(CpuidPacket->EAX)); - - // - // EBX: Number of logical processors (diagnostic only) - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" NumberOfLogicalProcessorsAtThisLevelType = %u (DIAGNOSTIC ONLY - do not use for topology enumeration)\n\n", - CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE(CpuidPacket->EBX)); - - // - // EDX: x2APIC ID (constant across all sub-leaves) - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" X2ApicId (current logical processor) = %u\n\n", - CPUID_EDX_X2APIC_ID(CpuidPacket->EDX)); - - break; - - case 0xC: - ShowMessages("==== CPUID.(EAX=0CH) ====\n\n"); - ShowMessages(" This leaf is reserved (not implemented).\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); - break; - - case 0xD: - ShowMessages("==== CPUID.(EAX=0DH) Processor Extended State Enumeration ====\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = 62 *\n" - " *******************************************************\n\n"); - - if (SubFunctionId == 0) - { - ShowMessages("-- EAX (XCR0 lower 32 bits) --\n\n"); - ShowMessages(" X87State (bit 0) = %s\n", CPUID_EAX_X87_STATE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" SSEState (bit 1) = %s\n", CPUID_EAX_SSE_STATE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" AVXState (bit 2) = %s\n", CPUID_EAX_AVX_STATE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" MPXState (bits 4:3) = %u\n", CPUID_EAX_MPX_STATE(CpuidPacket->EAX)); - ShowMessages(" AVX512State (bits 7:5) = %u\n", CPUID_EAX_AVX_512_STATE(CpuidPacket->EAX)); - ShowMessages(" UsedForIa32Xss1 (bit 8) = %s\n", CPUID_EAX_USED_FOR_IA32_XSS_1(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" PKRUState (bit 9) = %s\n", CPUID_EAX_PKRU_STATE(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" UsedForIa32Xss2 (bit 13) = %s\n\n", CPUID_EAX_USED_FOR_IA32_XSS_2(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" MaxSizeRequiredByEnabledFeaturesInXcr0 = %u bytes\n\n", - CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" MaxSizeOfXsaveXrstorSaveArea = %u bytes\n\n", - CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA(CpuidPacket->ECX)); - ShowMessages("-- EDX (XCR0 upper 32 bits) --\n\n"); - ShowMessages(" Xcr0SupportedBits (bits 63:32 of XCR0) = 0x%08X\n\n", - CPUID_EDX_XCR0_SUPPORTED_BITS(CpuidPacket->EDX)); - } - - else if (SubFunctionId == 1) - { - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SupportsXsavecAndCompactedXrstor (XSAVEC) = %s\n", - CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" SupportsXgetbvWithEcx1 = %s\n", - CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" SupportsXsaveXrstorAndIa32Xss (XSAVES) = %s\n\n", - CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" SizeOfXsaveArea (XCR0 | IA32_XSS enabled) = %u bytes\n", - CPUID_EBX_SIZE_OF_XSAVE_AREAD(CpuidPacket->EBX)); - - ShowMessages("-- ECX (IA32_XSS lower 32 bits) --\n\n"); - ShowMessages(" UsedForXcr01 (bits 7:0) = 0x%02X\n", - CPUID_ECX_USED_FOR_XCR0_1(CpuidPacket->ECX)); - ShowMessages(" PtState (bit 8) = %s\n", - CPUID_ECX_PT_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" UsedForXcr02 (bit 9) = %s\n", - CPUID_ECX_USED_FOR_XCR0_2(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CetUserState (bit 11) = %s\n", - CPUID_ECX_CET_USER_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CetSupervisorState (bit 12) = %s\n", - CPUID_ECX_CET_SUPERVISOR_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" HdcState (bit 13) = %s\n", - CPUID_ECX_HDC_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" LbrState (bit 15) = %s\n", - CPUID_ECX_LBR_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" HwpState (bit 16) = %s\n\n", - CPUID_ECX_HWP_STATE(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EDX (IA32_XSS upper 32 bits) --\n\n"); - ShowMessages(" SupportedUpperIa32XssBits (bits 63:32) = 0x%08X\n\n", - CPUID_EDX_SUPPORTED_UPPER_IA32_XSS_BITS(CpuidPacket->EDX)); - } - - else if (SubFunctionId >= 2) - { - // - // Check if the user input is valid - // Need to check both XCR0 and IA32_XSS vectors - // - UINT64 ValidBits = CpuidPacket->XCR0Vector | CpuidPacket->IA32_XSS_Vector; - - // - // Validate if this sub-leaf is supported - // - if (((ValidBits >> SubFunctionId) & (UINT64)1) == 0) - { - ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); - ShowMessages(" Valid sub-leaves are those with bits set in:\n"); - ShowMessages(" XCR0 vector: 0x%016llX\n", (ULONG64)CpuidPacket->XCR0Vector); - ShowMessages(" IA32_XSS vector: 0x%016llX\n", (ULONG64)CpuidPacket->IA32_XSS_Vector); - ShowMessages(" Combined vector: 0x%016llX\n\n", (ULONG64)ValidBits); - - break; - } - - ShowMessages("-- State Component Information --\n\n"); - ShowMessages(" SaveAreaSize (EAX) = %u bytes\n", - CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidPacket->EAX)); - ShowMessages(" SaveAreaOffset (EBX) = %u bytes\n", - CPUID_EBX_RESERVED(CpuidPacket->EBX)); - ShowMessages(" ManagedViaIa32Xss (ECX bit 0) = %u (%s)\n", - CPUID_ECX_ECX_2(CpuidPacket->ECX), - CPUID_ECX_ECX_2(CpuidPacket->ECX) ? "IA32_XSS" : "XCR0"); - ShowMessages(" Aligned64ByteBoundary (ECX bit 1) = %u%s\n", - CPUID_ECX_ECX_1(CpuidPacket->ECX), - CPUID_ECX_ECX_1(CpuidPacket->ECX) ? " (next 64-byte boundary)" : " (immediately following)"); - ShowMessages(" Reserved (EDX) = 0x%08X\n\n", - CPUID_EDX_RESERVED(CpuidPacket->EDX)); - } - - break; - - case 0xE: - ShowMessages("==== CPUID.(EAX=0EH) ====\n\n"); - ShowMessages(" This leaf is reserved (not implemented).\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); - break; - - case 0xF: // 0xF = 15 (decimal); CPUID_INTEL_RESOURCE_DIRECTOR_TECHNOLOGY_MONITORING_INFORMATION - ShowMessages("==== CPUID.(EAX=0FH) Intel RDT Monitoring ====\n\n"); - ShowMessages(" This leaf is not yet implemented in HyperDbg.\n"); - ShowMessages(" (Intel Resource Director Technology - Monitoring)\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); - break; - - case 0x10: - ShowMessages("==== CPUID.(EAX=10H, ECX=%u) Intel RDT Allocation Information ====\n\n", SubFunctionId); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = 3 *\n" - " *******************************************************\n\n"); - - if (SubFunctionId == 0) - { - // - // Resource type enumeration - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Ia32PlatformDcaCap = 0x%08X\n\n", - CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidPacket->EAX)); - - // - // EBX - // - ShowMessages("-- EBX (Supported Allocation Types) --\n\n"); - ShowMessages(" Raw value = 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" L3 Cache Allocation (bit 1) = %s\n", - CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" L2 Cache Allocation (bit 2) = %s\n", - CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Memory Bandwidth Allocation (bit 3) = %s\n\n", - CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - // - // EDX - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); - } - - else if (SubFunctionId == 1) - { - // - // L3 cache allocation - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", - CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidPacket->EAX), - CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidPacket->EAX) + 1); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" CodeAndDataPriorizationTechnologySupported = %s%s\n\n", - CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidPacket->ECX) ? "TRUE" : "FALSE", - CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidPacket->ECX) ? " (CDP supported)" : ""); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX), - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX) + 1); - } - - else if (SubFunctionId == 2) - { - // - // Sub-leaf 2 (L2 Cache Allocation) - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", - CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidPacket->EAX), - CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidPacket->EAX) + 1); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX), - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX) + 1); - } - - else if (SubFunctionId == 3) - { - // - // Sub-leaf 3 (Memory Bandwidth Allocation) - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxMbaThrottlingValue (minus-one) = %u (actual = %u)\n\n", - CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidPacket->EAX), - CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidPacket->EAX) + 1); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" ResponseOfDelayIsLinear = %s%s\n", - CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidPacket->ECX) ? "TRUE" : "FALSE", - CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidPacket->ECX) ? " (linear response)" : " (non-linear)\n\n"); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX), - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidPacket->EDX) + 1); - } - - else - { - ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); - ShowMessages(" raw bytes: EAX = %u\n EBX = %u\n ECX = %u\n EDX = %u\n\n", - CpuidPacket->EAX, - CpuidPacket->EBX, - CpuidPacket->ECX, - CpuidPacket->EDX); - } - - break; - - case 0x11: - ShowMessages("==== CPUID.(EAX=11H) ====\n\n"); - ShowMessages(" This leaf is reserved (not implemented).\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); - break; - - case 0x12: - { - // - // SGX, not DAT. 0x12 = 18 (decimal) - // - ShowMessages("==== CPUID.(EAX=12H) Intel SGX Information ====\n\n"); - - if (!CpuidPacket->Leaf12Supported) - { - ShowMessages(" SGX is not supported on this CPU (CPUID.7H:EBX[2] = 0).\n\n"); - break; - } - - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidPacket->Leaf12MaxSubLeaf); - - if (SubFunctionId == 0) - { - // - // SGX capabilities - // - ShowMessages("-- EAX (SGX Capabilities) --\n\n"); - ShowMessages(" SGX1 Support (bit 0) = %s\n", - CPUID_EAX_SGX1(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" SGX2 Support (bit 1) = %s\n", - CPUID_EAX_SGX2(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ENCLV Advanced (bit 5) = %s\n", - CPUID_EAX_SGX_ENCLV_ADVANCED(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ENCLS Advanced (bit 6) = %s\n\n", - CPUID_EAX_SGX_ENCLS_ADVANCED(CpuidPacket->EAX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EBX (MISCSELECT - Extended SGX Features) --\n\n"); - ShowMessages(" Miscselect = 0x%08X\n\n", - CPUID_EBX_MISCSELECT(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - ShowMessages("-- EDX (Maximum Enclave Sizes) --\n\n"); - ShowMessages(" MaxEnclaveSizeNot64 = %u (2^%u = %llu bytes)\n", - CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidPacket->EDX), - CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidPacket->EDX), - (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidPacket->EDX))); - ShowMessages(" MaxEnclaveSize64 = %u (2^%u = %llu bytes)\n\n", - CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidPacket->EDX), - CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidPacket->EDX), - (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidPacket->EDX))); - } - - else if (SubFunctionId == 1) - { - // - // SGX attributes - // - ShowMessages("-- EAX (SECS.ATTRIBUTES[31:0]) --\n\n"); - ShowMessages(" ValidSecsAttributes0 = 0x%08X\n\n", - CPUID_EAX_VALID_SECS_ATTRIBUTES_0(CpuidPacket->EAX)); - - ShowMessages("-- EBX (SECS.ATTRIBUTES[63:32]) --\n\n"); - ShowMessages(" ValidSecsAttributes1 = 0x%08X\n\n", - CPUID_EBX_VALID_SECS_ATTRIBUTES_1(CpuidPacket->EBX)); - - ShowMessages("-- ECX (SECS.ATTRIBUTES[95:64]) --\n\n"); - ShowMessages(" ValidSecsAttributes2 = 0x%08X\n\n", - CPUID_ECX_VALID_SECS_ATTRIBUTES_2(CpuidPacket->ECX)); - - ShowMessages("-- EDX (SECS.ATTRIBUTES[127:96]) --\n\n"); - ShowMessages(" ValidSecsAttributes3 = 0x%08X\n\n", - CPUID_EDX_VALID_SECS_ATTRIBUTES_3(CpuidPacket->EDX)); - } - - else - { - // - // Subleaf 2+ (EPC sections) - // - if (CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX) == 0) - { - // - // Type 0: invalid subleaf - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SubLeafType = %u (Invalid - no EPC section)\n", - CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX)); - - ShowMessages("\n-- EBX --\n"); - ShowMessages(" Zero = 0x%08X\n", CPUID_EBX_ZERO(CpuidPacket->EBX)); - - ShowMessages("\n-- ECX --\n"); - ShowMessages(" Zero = 0x%08X\n", CPUID_ECX_ZERO(CpuidPacket->ECX)); - - ShowMessages("\n-- EDX --\n"); - ShowMessages(" Zero = 0x%08X\n", CPUID_EDX_ZERO(CpuidPacket->EDX)); - } - - else if (CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX) == 1) - { - // - // Reconstruct base address from EAX and EBX - // - UINT64 BaseLow = (UINT64)CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidPacket->EAX); - UINT64 BaseHigh = (UINT64)CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidPacket->EBX); - UINT64 BaseAddress = (BaseHigh << 32) | (BaseLow << 12); - - // - // Reconstruct size from ECX and EDX - // - UINT64 SizeLow = (UINT64)CPUID_ECX_EPC_SIZE_1(CpuidPacket->ECX); - UINT64 SizeHigh = (UINT64)CPUID_EDX_EPC_SIZE_2(CpuidPacket->EDX); - UINT64 SizeBytes = (SizeHigh << 32) | (SizeLow << 12); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SubLeafType = %u (EPC Section)\n", - CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX)); - ShowMessages(" EpcBasePhysicalAddress1 (bits 31:12) = 0x%05X\n\n", - CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidPacket->EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" EpcBasePhysicalAddress2 (bits 51:32) = 0x%05X\n\n", - CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" EpcSectionProperty = %u", - CPUID_ECX_EPC_SECTION_PROPERTY(CpuidPacket->ECX)); - switch (CPUID_ECX_EPC_SECTION_PROPERTY(CpuidPacket->ECX)) - { - case 0: - ShowMessages(" (No confidentiality/integrity)\n\n"); - break; - case 1: - ShowMessages(" (Confidentiality and integrity protection)\n\n"); - break; - default: - ShowMessages(" (Reserved)\n\n"); - break; - } - ShowMessages(" EpcSize1 (bits 31:12) = 0x%05X\n\n", - CPUID_ECX_EPC_SIZE_1(CpuidPacket->ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" EpcSize2 (bits 51:32) = 0x%05X\n\n", - CPUID_EDX_EPC_SIZE_2(CpuidPacket->EDX)); - - ShowMessages("-- EPC Section Information --\n\n"); - ShowMessages(" Base Address = 0x%016llX\n", (ULONG64)BaseAddress); - ShowMessages(" Size = 0x%016llX bytes (%llu MB)\n\n", - (ULONG64)SizeBytes, - (ULONG64)(SizeBytes / (1024 * 1024))); - } - - else - { - // - // Unknown subleaf type (reserved) - // - ShowMessages("-- Raw Data for Sub-leaf %u (Type %u) --\n\n", - SubFunctionId, - CPUID_EAX_SUB_LEAF_TYPE(CpuidPacket->EAX)); - - ShowMessages(" EAX = 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX = 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX = 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX = 0x%08X\n\n", CpuidPacket->EDX); - ShowMessages(" Note: Reserved sub-leaf type. Please refer to the latest Intel SDM.\n\n"); - } - } - - break; - } - - case 0x13: - ShowMessages("==== CPUID.(EAX=13H) ====\n\n"); - ShowMessages(" This leaf is reserved (not implemented).\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); - break; - - case 0x14: - ShowMessages("==== CPUID.(EAX=14H) Intel Processor Trace Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidPacket->LeafEaxMaxSubleaf); - - ShowMessages("==== CPUID.(EAX=14H, ECX=%u) Intel Processor Trace Information ====\n\n", SubFunctionId); - - if (SubFunctionId == 0) - { - // - // main leaf - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxSubLeaf = %u\n\n", - CPUID_EAX_MAX_SUB_LEAF(CpuidPacket->EAX)); - - ShowMessages("-- EBX (Supported Features) --\n\n"); - ShowMessages(" CR3Filter support (bit 0) = %s\n", - CPUID_EBX_FLAG0(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Configurable PSB & Cycle-Accurate (bit 1) = %s\n", - CPUID_EBX_FLAG1(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" IP Filtering & TraceStop (bit 2) = %s\n", - CPUID_EBX_FLAG2(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" MTC & COFI suppression (bit 3) = %s\n", - CPUID_EBX_FLAG3(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PTWRITE support (bit 4) = %s\n", - CPUID_EBX_FLAG4(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Power Event Trace (bit 5) = %s\n", - CPUID_EBX_FLAG5(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PSB/PMI preservation (bit 6) = %s\n", - CPUID_EBX_FLAG6(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Event Trace (bit 7) = %s\n", - CPUID_EBX_FLAG7(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Disable TNT (bit 8) = %s\n\n", - CPUID_EBX_FLAG8(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - - ShowMessages("-- ECX (Output Schemes) --\n\n"); - ShowMessages(" ToPA output scheme (bit 0) = %s\n", - CPUID_ECX_FLAG0(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" ToPA tables with any entries (bit 1) = %s\n", - CPUID_ECX_FLAG1(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" Single-Range Output scheme (bit 2) = %s\n", - CPUID_ECX_FLAG2(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" Trace Transport subsystem (bit 3) = %s\n", - CPUID_ECX_FLAG3(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - ShowMessages(" LIP values include CS base (bit 31) = %s\n\n", - CPUID_ECX_FLAG31(CpuidPacket->ECX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_EDX_RESERVED(CpuidPacket->EDX)); - } - - else if (SubFunctionId == 1) - { - // - // Packet generation - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" NumberOfConfigurableAddressRangesForFiltering = %u\n", - CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING(CpuidPacket->EAX)); - ShowMessages(" BitmapOfSupportedMtcPeriodEncodings = 0x%04X\n\n", - CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS(CpuidPacket->EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" BitmapOfSupportedCycleThresholdValueEncodings = 0x%04X\n", - CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS(CpuidPacket->EBX)); - ShowMessages(" BitmapOfSupportedConfigurablePsbFrequencyEncodings = 0x%04X\n\n", - CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_EDX_RESERVED(CpuidPacket->EDX)); - } - - else - { - // - // Subleaves > 1 (if they exist) - // - ShowMessages("-- Raw Data for Sub-leaf %u --\n\n", SubFunctionId); - ShowMessages(" EAX = 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX = 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX = 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX = 0x%08X\n\n", CpuidPacket->EDX); - ShowMessages(" Note: This sub-leaf may be for future Intel PT features.\n"); - ShowMessages(" Please refer to the latest Intel SDM for interpretation.\n\n"); - } - - break; - - case 0x15: - { - ShowMessages("==== CPUID.(EAX=15H) TSC and Core Crystal Clock Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 15h HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - // - // EAX: Denominator - // - UINT32 Denominator = CPUID_EAX_DENOMINATOR(CpuidPacket->EAX); - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Denominator = %u\n\n", Denominator); - - // - // EBX: Numerator - // - UINT32 Numerator = CPUID_EBX_NUMERATOR(CpuidPacket->EBX); - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Numerator = %u\n\n", Numerator); - - // - // ECX: Nominal frequency (if available) - // - UINT32 NominalFreq = CPUID_ECX_NOMINAL_FREQUENCY(CpuidPacket->ECX); - ShowMessages("-- ECX --\n\n"); - ShowMessages(" NominalFrequency = %u Hz", NominalFreq); - if (NominalFreq > 0) - { - ShowMessages(" (%u MHz, %u GHz)\n", - NominalFreq / 1000000, - NominalFreq / 1000000000); - } - else - { - ShowMessages(" (not enumerated)\n\n"); - } - - // - // EDX: reserved - // - ShowMessages("\n-- EDX --\n"); - ShowMessages(" Reserved = 0x%08X\n", - CPUID_EDX_RESERVED(CpuidPacket->EDX)); - - // - // Calculate and display TSC frequency if possible - // - ShowMessages("-- TSC Frequency Information --\n\n"); - - if (Denominator == 0 || Numerator == 0) - { - ShowMessages(" TSC ratio not enumerated (denominator or numerator is 0)\n\n"); - } - - else - { - ShowMessages(" TSC / Core Crystal Clock ratio = %u / %u\n", - Numerator, - Denominator); - ShowMessages(" TSC frequency = Core Crystal Clock * (%u/%u)\n", - Numerator, - Denominator); - if (NominalFreq > 0) - { - UINT64 TSCFreqHz = (UINT64)NominalFreq * Numerator / Denominator; - ShowMessages(" TSC frequency = %llu Hz (%llu MHz, %llu GHz)\n\n", - (ULONG64)TSCFreqHz, - (ULONG64)(TSCFreqHz / 1000000), - (ULONG64)(TSCFreqHz / 1000000000)); - } - else - { - ShowMessages(" TSC frequency cannot be calculated (nominal frequency not enumerated)\n\n"); - } - } - - break; - } - - case 0x16: - { - ShowMessages("==== CPUID.(EAX=16H) Processor Frequency Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 16h HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - // - // EAX: Processor base frequency - // - UINT32 BaseFreq = CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ(CpuidPacket->EAX); - ShowMessages("-- EAX --\n\n"); - if (BaseFreq == 0) - { - ShowMessages(" ProcessorBaseFrequencyMhz = 0 (not supported)\n\n"); - } - else - { - ShowMessages(" ProcessorBaseFrequencyMhz = %u MHz\n", BaseFreq); - } - - // - // EBX: Maximum frequency - // - UINT32 MaxFreq = CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ(CpuidPacket->EBX); - ShowMessages("-- EBX --\n\n"); - if (MaxFreq == 0) - { - ShowMessages(" ProcessorMaximumFrequencyMhz = 0 (not supported)\n\n"); - } - else - { - ShowMessages(" ProcessorMaximumFrequencyMhz = %u MHz\n", MaxFreq); - } - - // - // ECX: Bus (reference) frequency - // - UINT32 BusFreq = CPUID_ECX_BUS_FREQUENCY_MHZ(CpuidPacket->ECX); - ShowMessages("-- ECX --\n\n"); - if (BusFreq == 0) - { - ShowMessages(" BusFrequencyMhz = 0 (not supported)\n\n"); - } - else - { - ShowMessages(" BusFrequencyMhz = %u MHz\n\n", BusFreq); - } - - // - // EDX: reserved - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_EDX_RESERVED(CpuidPacket->EDX)); - - // - // Display summary - // - ShowMessages("-- Frequency Summary --\n\n"); - ShowMessages(" Base Frequency: "); - if (BaseFreq == 0) - { - ShowMessages("Not Supported\n"); - } - else - { - ShowMessages("%u MHz\n", BaseFreq); - } - - // - // Maximum frequency - // - ShowMessages(" Maximum Frequency: "); - if (MaxFreq == 0) - { - ShowMessages("Not Supported\n"); - } - else - { - ShowMessages("%u MHz\n", MaxFreq); - } - - // - // Bus frequency - // - ShowMessages(" Bus Frequency: "); - if (BusFreq == 0) - { - ShowMessages("Not Supported\n"); - } - else - { - ShowMessages("%u MHz\n\n", BusFreq); - } - - // - // Show turbo boost if both base and max are supported and max > base - // - if (BaseFreq > 0 && MaxFreq > 0 && MaxFreq > BaseFreq) - { - UINT32 TurboBoost = MaxFreq - BaseFreq; - FLOAT TurboPercent = ((FLOAT)TurboBoost / BaseFreq) * 100.0f; - ShowMessages(" Turbo Boost: %u MHz above base (%.1f%% increase)\n\n", - TurboBoost, - TurboPercent); - } - - ShowMessages(" *******************************************************\n"); - ShowMessages(" * NOTE: These values are for display purposes only *\n"); - ShowMessages(" * They do not reflect actual running frequencies *\n"); - ShowMessages(" * Actual frequencies depend on workload, power, etc. *\n"); - ShowMessages(" *******************************************************\n\n"); - - break; - } - - case 0x17: - { - ShowMessages("==== CPUID.(EAX=17H) SoC Vendor Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CPUID_EAX_MAX_SOC_ID_INDEX(CpuidPacket->EAX)); - - ShowMessages("==== CPUID.(EAX=17H, ECX=%u) SoC Vendor Information ====\n\n", SubFunctionId); - - if (SubFunctionId == 0) - { - // - // Main - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxSocIdIndex = %u\n\n", CPUID_EAX_MAX_SOC_ID_INDEX(CpuidPacket->EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" SocVendorId = 0x%04X\n", - CPUID_EBX_SOC_VENDOR_ID(CpuidPacket->EBX)); - ShowMessages(" IsVendorScheme = %s\n\n", - CPUID_EBX_IS_VENDOR_SCHEME(CpuidPacket->EBX) ? "TRUE (Industry Standard)" : "FALSE (Intel Assigned)"); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" ProjectId = 0x%08X\n\n", - CPUID_ECX_PROJECT_ID(CpuidPacket->ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" SteppingId = 0x%08X\n\n", - CPUID_EDX_STEPPING_ID(CpuidPacket->EDX)); - } - - else if (SubFunctionId >= 1 && SubFunctionId <= 3) - { - // - // subleaves 1-3 (brand string) - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SocVendorBrandString[0..3] = 0x%08X (%c%c%c%c)\n\n", - CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX), - (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX) >> 0) & 0xFF, - (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX) >> 8) & 0xFF, - (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX) >> 16) & 0xFF, - (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EAX) >> 24) & 0xFF); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" SocVendorBrandString[4..7] = 0x%08X (%c%c%c%c)\n\n", - CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX), - (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX) >> 0) & 0xFF, - (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX) >> 8) & 0xFF, - (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX) >> 16) & 0xFF, - (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EBX) >> 24) & 0xFF); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" SocVendorBrandString[8..11] = 0x%08X (%c%c%c%c)\n\n", - CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX), - (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX) >> 0) & 0xFF, - (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX) >> 8) & 0xFF, - (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX) >> 16) & 0xFF, - (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidPacket->ECX) >> 24) & 0xFF); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" SocVendorBrandString[12..15] = 0x%08X (%c%c%c%c)\n\n", - CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX), - (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX) >> 0) & 0xFF, - (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX) >> 8) & 0xFF, - (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX) >> 16) & 0xFF, - (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidPacket->EDX) >> 24) & 0xFF); - } - - else - { - // - // Sub-leaves > MaxSOCID_Index (Reserved, should return all zeros) - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); - } - break; - } - - case 0x18: - // - // DAT, 0x18 = 24 (decimal) - // - ShowMessages("==== CPUID.(EAX=18H) Deterministic Address Translation Parameters ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidPacket->LeafEaxMaxSubleaf); - - ShowMessages("==== CPUID.(EAX=18H, ECX=%u) Deterministic Address Translation Parameters ====\n\n", SubFunctionId); - - if (SubFunctionId == 0) - { - // - // main - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxSubLeaf = %u\n\n", CPUID_EAX_MAX_SUB_LEAF(CpuidPacket->EAX)); - - // - // EBX: Page size support and associativity - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" PageEntries4KbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries2MbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries4MbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries1GbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Partitioning = %u%s\n", - CPUID_EBX_PARTITIONING(CpuidPacket->EBX), - CPUID_EBX_PARTITIONING(CpuidPacket->EBX) == 0 ? " (soft partitioning)" : ""); - ShowMessages(" WaysOfAssociativity (W) = %u\n\n", - CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00(CpuidPacket->EBX)); - - // - // ECX: Number of Sets - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" NumberOfSets = %u\n\n", - CPUID_ECX_NUMBER_OF_SETS(CpuidPacket->ECX)); - - // - // EDX: Translation cache type and properties - // - ShowMessages("-- EDX --\n\n"); - - switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX)) - { - case 0: - TypeName = "Null (sub-leaf not valid)"; - break; - case 1: - TypeName = "Data TLB"; - break; - case 2: - TypeName = "Instruction TLB"; - break; - case 3: - TypeName = "Unified TLB"; - break; - default: - TypeName = "Reserved"; - break; - } - ShowMessages(" TranslationCacheTypeField = %u (%s)\n", - CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX), - TypeName); - ShowMessages(" TranslationCacheLevel = %u\n", - CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidPacket->EDX)); - ShowMessages(" FullyAssociativeStructure = %s%s\n", - CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidPacket->EDX) ? "TRUE" : "FALSE", - CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidPacket->EDX) ? " (fully associative)" : ""); - - ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", - CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidPacket->EDX), - CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidPacket->EDX) + 1); - } - - else - { - // - // subleaves >= 1 (Translation Structure Information) - // - - // - // Check if this sub-leaf is valid (EDX[4:0] != 0) - // - if (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX) == 0) - { - ShowMessages(" Sub-leaf %u is invalid (TranslationCacheTypeField = 0)\n", SubFunctionId); - ShowMessages(" All registers should be zero according to spec:\n"); - ShowMessages(" EAX = 0x%08X\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); - ShowMessages(" EBX = 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX = 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX = 0x%08X\n", CpuidPacket->EDX); - } - - else - { - // - // EAX: Reserved for sub-leaves >= 1 - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); - - // - // EBX: Page size support and associativity - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" PageEntries4KbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries2MbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries4MbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries1GbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidPacket->EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Partitioning = %u%s\n", - CPUID_EBX_PARTITIONING(CpuidPacket->EBX), - CPUID_EBX_PARTITIONING(CpuidPacket->EBX) == 0 ? " (soft partitioning)" : ""); - ShowMessages(" WaysOfAssociativity (W) = %u\n\n", - CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01(CpuidPacket->EBX)); - - // ECX: Number of Sets - ShowMessages("-- ECX --\n\n"); - ShowMessages(" NumberOfSets = %u\n\n", - CPUID_ECX_NUMBER_OF_SETS(CpuidPacket->ECX)); - - // EDX: Translation cache type and properties - ShowMessages("-- EDX --\n\n"); - switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX)) - { - case 0: - TypeName = "Null (sub-leaf not valid)"; - break; - case 1: - TypeName = "Data TLB"; - break; - case 2: - TypeName = "Instruction TLB"; - break; - case 3: - TypeName = "Unified TLB"; - break; - default: - TypeName = "Reserved"; - break; - } - ShowMessages(" TranslationCacheTypeField = %u (%s)\n", - CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidPacket->EDX), - TypeName); - ShowMessages(" TranslationCacheLevel = %u\n", - CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidPacket->EDX)); - ShowMessages(" FullyAssociativeStructure = %s%s\n", - CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidPacket->EDX) ? "TRUE" : "FALSE", - CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidPacket->EDX) ? " (fully associative)" : ""); - - ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", - CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidPacket->EDX), - CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidPacket->EDX) + 1); - } - } - - break; - - case 0x80000000: - ShowMessages("==== CPUID.(EAX=80000000H) Extended Function Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000000 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxExtendedFunctions = 0x%08X (%u)\n\n", - CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidPacket->EAX), - CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidPacket->EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); - - break; - - case 0x80000001: - ShowMessages("==== CPUID.(EAX=80000001H) Extended CPU Signature ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000001 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" LAHF/SAHF Available in 64-bit Mode = %s\n", - CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE(CpuidPacket->ECX) ? "True" : "False"); - ShowMessages(" LZCNT = %s\n", - CPUID_ECX_LZCNT(CpuidPacket->ECX) ? "True" : "False"); - ShowMessages(" PREFETCHW = %s\n\n", - CPUID_ECX_PREFETCHW(CpuidPacket->ECX) ? "True" : "False"); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" SYSCALL/SYSRET Available in 64-bit Mode = %s\n", - CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE(CpuidPacket->EDX) ? "True" : "False"); - ShowMessages(" Execute Disable Bit Available = %s\n", - CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE(CpuidPacket->EDX) ? "True" : "False"); - ShowMessages(" 1-GByte Pages Available = %s\n", - CPUID_EDX_PAGES_1GB_AVAILABLE(CpuidPacket->EDX) ? "True" : "False"); - ShowMessages(" RDTSCP Available = %s\n", - CPUID_EDX_RDTSCP_AVAILABLE(CpuidPacket->EDX) ? "True" : "False"); - ShowMessages(" Intel 64 Architecture Available = %s\n\n", - CPUID_EDX_IA64_AVAILABLE(CpuidPacket->EDX) ? "True" : "False"); - - break; - // - // 0x80000002-0x80000004 - Processor brand string - // - case 0x80000002: - case 0x80000003: - case 0x80000004: - { - ShowMessages("==== CPUID.(EAX=80000002H-80000004H) Processor Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000002-4 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - ShowMessages(" Brand String = \"%s\"\n\n", CpuidPacket->BrandString); - - break; - } - case 0x80000005: - ShowMessages("EAX = 0x80000005: not implemented.\n"); - break; - - case 0x80000006: - { - ShowMessages("==== CPUID.(EAX=80000006H) Extended Cache Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000006 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); - - ShowMessages("-- ECX (L2 Cache Information) --\n"); - - UINT32 LineSize = CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES(CpuidPacket->ECX); - UINT32 Assoc = CPUID_ECX_L2_ASSOCIATIVITY_FIELD(CpuidPacket->ECX); - UINT32 CacheSize = CPUID_ECX_CACHE_SIZE_IN_1K_UNITS(CpuidPacket->ECX); - - // - // decode associativity - // - switch (Assoc) - { - case 0x00: - AssocName = "Disabled"; - break; - case 0x01: - AssocName = "Direct mapped"; - break; - case 0x02: - AssocName = "2-way"; - break; - case 0x04: - AssocName = "4-way"; - break; - case 0x06: - AssocName = "8-way"; - break; - case 0x08: - AssocName = "16-way"; - break; - case 0x0F: - AssocName = "Fully associative"; - break; - default: - AssocName = "Reserved"; - break; - } - ShowMessages(" CacheLineSizeInBytes = %u bytes\n", LineSize); - ShowMessages(" L2AssociativityField = 0x%02X (%s)\n", Assoc, AssocName); - ShowMessages(" CacheSizeIn1KUnits = %u KB (%u MB)\n", - CacheSize, - CacheSize / 1024); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); - - break; - } - - case 0x80000007: - ShowMessages("==== CPUID.(EAX=80000007H) Extended Time Stamp Counter ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000007 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidPacket->EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" InvariantTscAvailable = %u%s\n\n", - CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidPacket->EDX), - CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidPacket->EDX) ? " (TSC runs at constant rate)" : ""); - - break; - - case 0x80000008: - { - ShowMessages("==== CPUID.(EAX=80000008H) Virtual & Physical Address Sizes ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000008 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - UINT32 PhysicalBits = CPUID_EAX_NUMBER_OF_PHYSICAL_ADDRESS_BITS(CpuidPacket->EAX); - UINT32 LinearBits = CPUID_EAX_NUMBER_OF_LINEAR_ADDRESS_BITS(CpuidPacket->EAX); - - ShowMessages(" NumberOfPhysicalAddressBits = %u (max physical address = 2^%u = %llu bytes)\n", - PhysicalBits, - PhysicalBits, - (ULONG64)(1ULL << PhysicalBits)); - ShowMessages(" NumberOfLinearAddressBits = %u (max linear address = 2^%u = %llu bytes)\n", - LinearBits, - LinearBits, - (ULONG64)(1ULL << LinearBits)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidPacket->EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidPacket->ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidPacket->EDX)); - - break; - } - - default: - ShowMessages("==== CPUID.(EAX=%08XH) ====\n\n", FunctionId); - ShowMessages(" CPUID leaf 0x%08X is not implemented in HyperDbg.\n", FunctionId); - ShowMessages(" You can decode the raw values yourself:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidPacket->EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidPacket->EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidPacket->ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidPacket->EDX); - } + CommandShowUserCpuidMessage(FunctionId, SubFunctionId, CpuidPacket); } else { diff --git a/hyperdbg/libhyperdbg/code/export/export.cpp b/hyperdbg/libhyperdbg/code/export/export.cpp index 49d65b2b..bfd933f6 100644 --- a/hyperdbg/libhyperdbg/code/export/export.cpp +++ b/hyperdbg/libhyperdbg/code/export/export.cpp @@ -1025,3 +1025,23 @@ hyperdbg_u_pt_mmap(HYPERTRACE_PT_MMAP_PACKETS * MmapRequest) { return HyperDbgPtMmapSendRequest(MmapRequest); } + +/** + * @brief Get CPUID information from the target system + * + * @param FunctionId The CPUID leaf (EAX value) + * @param SubFunctionId The CPUID sub-leaf (ECX value) + * + * @return BOOLEAN TRUE if successful, FALSE otherwise + */ +BOOLEAN +hyperdbg_u_user_cpuid(UINT32 FunctionId, UINT32 SubFunctionId) +{ + // + // Call the existing CPUID command handler + // This handles both local and remote modes automatically + // + CommandCpuidRequestCpuid(FunctionId, SubFunctionId); + + return TRUE; +} \ No newline at end of file diff --git a/hyperdbg/libhyperdbg/header/debugger/core/debugger.h b/hyperdbg/libhyperdbg/header/debugger/core/debugger.h index f26bd711..92ed80b3 100644 --- a/hyperdbg/libhyperdbg/header/debugger/core/debugger.h +++ b/hyperdbg/libhyperdbg/header/debugger/core/debugger.h @@ -224,6 +224,11 @@ CommandFlushRequestFlush(); VOID CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId); +VOID +CommandShowUserCpuidMessage(UINT32 FunctionId, + UINT32 SubFunctionId, + PDEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest); + UINT64 GetCommandAttributes(const string & FirstCommand); diff --git a/hyperdbg/libhyperdbg/ucpuid.cpp b/hyperdbg/libhyperdbg/ucpuid.cpp index 1cf34a7d..caf84da4 100644 --- a/hyperdbg/libhyperdbg/ucpuid.cpp +++ b/hyperdbg/libhyperdbg/ucpuid.cpp @@ -18,7 +18,7 @@ extern BOOLEAN g_IsKdModuleLoaded; extern BOOLEAN g_IsSerialConnectedToRemoteDebuggee; /** - * @brief help of the cpuid command + * @brief help of the ucpuid command * * @return VOID */ @@ -44,19 +44,2042 @@ CommandUserCpuidHelp() } /** - * @brief cpuid command handler + * @brief ucpuid command show messages + * + * @return VOID + */ +VOID +CommandShowUserCpuidMessage(UINT32 FunctionId, + UINT32 SubFunctionId, + PDEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest) +{ + CONST CHAR * TypeName = NULL; + CONST CHAR * AssocName; + + // + // validate the pointer before using it + // + if (CpuidRequest == NULL) + { + ShowMessages(" NULL value!\n"); + return; + } + + // + // display result + // + switch (FunctionId) + { + case 0x0: + { + CHAR Vendor[13] = {0}; + memcpy(&Vendor[0], &CpuidRequest->EBX, 4); + memcpy(&Vendor[4], &CpuidRequest->EDX, 4); + memcpy(&Vendor[8], &CpuidRequest->ECX, 4); + Vendor[12] = '\0'; + + ShowMessages(" *******************************************************\n" + " * LEAF 0 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages(" Vendor : %s\n", Vendor); + ShowMessages(" Maximum supported basic leaf : %u\n", CpuidRequest->EAX); + + break; + } + case 0x1: + // + // EAX + // + ShowMessages("==== CPUID.(EAX=01H) Version / Additional / Feature Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 1 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX: Version Information --\n\n"); + ShowMessages(" SteppingId = %u\n", + CPUID_VERSION_INFORMATION_STEPPING_ID(CpuidRequest->EAX)); + ShowMessages(" Model = %u\n", + CPUID_VERSION_INFORMATION_MODEL(CpuidRequest->EAX)); + ShowMessages(" FamilyId = %u\n", + CPUID_VERSION_INFORMATION_FAMILY_ID(CpuidRequest->EAX)); + ShowMessages(" ProcessorType = %u\n", + CPUID_VERSION_INFORMATION_PROCESSOR_TYPE(CpuidRequest->EAX)); + ShowMessages(" ExtendedModelId = %u\n", + CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID(CpuidRequest->EAX)); + ShowMessages(" ExtendedFamilyId = %u\n\n", + CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID(CpuidRequest->EAX)); + + // + // EBX: additional information + // + ShowMessages("-- EBX: Additional Information --\n\n"); + ShowMessages(" BrandIndex = %u\n", + CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX(CpuidRequest->EBX)); + ShowMessages(" ClflushLineSize = %u (cache line = %u bytes)\n", + CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidRequest->EBX), + CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidRequest->EBX) * 8); + ShowMessages(" MaxAddressableIds = %u\n", + CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS(CpuidRequest->EBX)); + ShowMessages(" InitialApicId = %u\n\n", + CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID(CpuidRequest->EBX)); + + // + // ECX: feature information + // + ShowMessages("-- ECX: Feature Information --\n\n"); + ShowMessages(" SSE3 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PCLMULQDQ = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" DTES64 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MONITOR/MWAIT = %s\n", + CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CPL Qualified DS = %s\n", + CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VMX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SMX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" EIST (SpeedStep) = %s\n", + CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TM2 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSSE3 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" L1 Context ID = %s\n", + CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Silicon Debug = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" FMA = %s\n", + CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CMPXCHG16B = %s\n", + CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" xTPR Update Control = %s\n", + CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PDCM = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PCID = %s\n", + CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" DCA = %s\n", + CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE4.1 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE4.2 = %s\n", + CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" x2APIC = %s\n", + CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVBE = %s\n", + CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" POPCNT = %s\n", + CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TSC-Deadline = %s\n", + CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AESNI = %s\n", + CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" XSAVE/XRSTOR = %s\n", + CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" OSXSAVE = %s\n", + CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX = %s\n", + CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" F16C = %s\n", + CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" RDRAND = %s\n\n", + CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + + // + // EDX: feature information + // + ShowMessages("-- EDX: Feature Information --\n\n"); + ShowMessages(" FPU = %s\n", + CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" VME = %s\n", + CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" DE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" TSC = %s\n", + CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MSR (RDMSR/WRMSR) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PAE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MCE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CX8 (CMPXCHG8B) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" APIC On-Chip = %s\n", + CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SEP (SYSENTER/EXIT) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MTRR = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PGE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MCA = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CMOV = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PAT = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSE-36 = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PSN = %s\n", + CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CLFSH = %s\n", + CPUID_FEATURE_INFORMATION_EDX_CLFLUSH(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" DS (Debug Store) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" ACPI (Thermal/Clock) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MMX = %s\n", + CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" FXSR (FXSAVE/FXRSTOR) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSE2 = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SS (Self Snoop) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" HTT = %s\n", + CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" TM (Thermal Monitor) = %s\n", + CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PBE = %s\n\n", + CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + + break; + + case 0x2: + ShowMessages("==== CPUID.(EAX=02H) Legacy Cache Descriptor ====\n\n"); + ShowMessages(" This leaf is deprecated and returns legacy cache information.\n"); + ShowMessages(" Use CPUID.(EAX=04H) for deterministic cache parameters instead.\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest->EDX); + break; + + case 0x3: + ShowMessages("==== CPUID.(EAX=03H) ====\n\n"); + ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); + ShowMessages(" (Was previously used for Processor Serial Number on older CPUs)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest->EDX); + break; + + case 0x4: + { + UINT32 LineSize = CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE(CpuidRequest->EBX); + UINT32 Partitions = CPUID_EBX_PHYSICAL_LINE_PARTITIONS(CpuidRequest->EBX); + UINT32 Ways = CPUID_EBX_WAYS_OF_ASSOCIATIVITY(CpuidRequest->EBX); + UINT32 Sets = CPUID_ECX_NUMBER_OF_SETS(CpuidRequest->ECX); + UINT64 CacheSizeBytes = (UINT64)(Ways + 1) * + (UINT64)(Partitions + 1) * + (UINT64)(LineSize + 1) * + (UINT64)(Sets + 1); + ShowMessages("==== CPUID.(EAX=04H) Deterministic Cache Parameters ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest->Leaf4MaxSubLeaf); + + ShowMessages("---- CPUID.(EAX=04H, ECX=%u) ----\n\n", SubFunctionId); + + // + // EAX + // + switch (CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest->EAX)) + { + case 0: + TypeName = "Null (no more caches)"; + break; + case 1: + TypeName = "Data Cache"; + break; + case 2: + TypeName = "Instruction Cache"; + break; + case 3: + TypeName = "Unified Cache"; + break; + default: + TypeName = "Reserved"; + break; + } + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" CacheTypeField = %u (%s)\n", + CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest->EAX), + TypeName); + + if (CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest->EAX) == 0) + { + ShowMessages(" (no more caches; stopping enumeration)\n\n"); + break; + } + + ShowMessages(" CacheLevel = %u\n", + CPUID_EAX_CACHE_LEVEL(CpuidRequest->EAX)); + ShowMessages(" SelfInitializingCacheLevel = %s\n", + CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" FullyAssociativeCache = %s%s\n", + CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidRequest->EAX) ? "TRUE" : "FALSE", + CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidRequest->EAX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIds(LogicalProcs) (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidRequest->EAX), + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidRequest->EAX) + 1); + ShowMessages(" MaxAddressableIds(Cores) (raw) = %u -> actual = %u (raw + 1)\n\n", + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidRequest->EAX), + CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidRequest->EAX) + 1); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + + ShowMessages(" SystemCoherencyLineSize (raw) = %u -> actual = %u bytes (raw + 1)\n", + LineSize, + LineSize + 1); + ShowMessages(" PhysicalLinePartitions (raw) = %u -> actual = %u (raw + 1)\n", + Partitions, + Partitions + 1); + ShowMessages(" WaysOfAssociativity (raw) = %u -> actual = %u (raw + 1)\n\n", + Ways, + Ways + 1); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + + ShowMessages(" NumberOfSets (raw) = %u -> actual = %u (raw + 1)\n\n", + Sets, + Sets + 1); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" WriteBackInvalidate = %s\n", + CPUID_EDX_WRITE_BACK_INVALIDATE(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CacheInclusiveness = %s%s\n", + CPUID_EDX_CACHE_INCLUSIVENESS(CpuidRequest->EDX) ? "TRUE" : "FALSE", + CPUID_EDX_CACHE_INCLUSIVENESS(CpuidRequest->EDX) ? " (inclusive of lower levels)" : ""); + ShowMessages(" ComplexCacheIndexing = %s%s\n\n", + CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidRequest->EDX) ? "TRUE" : "FALSE", + CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidRequest->EDX) ? " (complex/hashed indexing)" : " (direct mapped)"); + + // + // Cache Size Calculation (from spec formula) + // + ShowMessages("-- Cache Size --\n\n"); + ShowMessages(" Cache Size (per spec formula) = %llu bytes (%llu KB, %llu MB)\n\n", + (ULONG64)CacheSizeBytes, + (ULONG64)(CacheSizeBytes / 1024), + (ULONG64)(CacheSizeBytes / (1024 * 1024))); + + break; + } + case 0x5: + ShowMessages("==== CPUID.(EAX=05H) MONITOR/MWAIT Leaf ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 5 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SmallestMonitorLineSize = %u bytes\n\n", + CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE(CpuidRequest->EAX)); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" LargestMonitorLineSize = %u bytes\n\n", + CPUID_EBX_LARGEST_MONITOR_LINE_SIZE(CpuidRequest->EBX)); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" EnumerationOfMonitorMwaitExtensions = %s\n", + CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsTreatingInterruptsAsBreakEventForMwait = %s\n\n", + CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" NumberOfC0SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES(CpuidRequest->EDX)); + ShowMessages(" NumberOfC1SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES(CpuidRequest->EDX)); + ShowMessages(" NumberOfC2SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES(CpuidRequest->EDX)); + ShowMessages(" NumberOfC3SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES(CpuidRequest->EDX)); + ShowMessages(" NumberOfC4SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES(CpuidRequest->EDX)); + ShowMessages(" NumberOfC5SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES(CpuidRequest->EDX)); + ShowMessages(" NumberOfC6SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES(CpuidRequest->EDX)); + ShowMessages(" NumberOfC7SubCStates = %u\n\n", CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES(CpuidRequest->EDX)); + + break; + + case 0x6: + ShowMessages("==== CPUID.(EAX=06H) Thermal and Power Management Leaf ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 6 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" TemperatureSensorSupported = %s\n", + CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" IntelTurboBoostTechnologyAvailable = %s\n", + CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ARAT (ApicTimerAlwaysRunning) = %s\n", + CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PLN (PowerLimitNotification) = %s\n", + CPUID_EAX_POWER_LIMIT_NOTIFICATION(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ECMD (ClockModulationDuty) = %s\n", + CPUID_EAX_CLOCK_MODULATION_DUTY(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PTM (PackageThermalManagement) = %s\n", + CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP Base Registers = %s\n", + CPUID_EAX_HWP_BASE_REGISTERS(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Notification = %s\n", + CPUID_EAX_HWP_NOTIFICATION(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Activity_Window = %s\n", + CPUID_EAX_HWP_ACTIVITY_WINDOW(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Energy_Performance_Preference = %s\n", + CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP_Package_Level_Request = %s\n", + CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HDC = %s\n", + CPUID_EAX_HDC(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Turbo Boost Max Technology 3.0 = %s\n", + CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP Capabilities = %s\n", + CPUID_EAX_HWP_CAPABILITIES(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" HWP PECI Override = %s\n", + CPUID_EAX_HWP_PECI_OVERRIDE(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Flexible HWP = %s\n", + CPUID_EAX_FLEXIBLE_HWP(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Fast Access Mode for HWP Request MSR = %s\n", + CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Ignoring Idle Logical Proc HWP Request = %s\n", + CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Thread Director = %s\n\n", + CPUID_EAX_INTEL_THREAD_DIRECTOR(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" NumberOfInterruptThresholdsInThermalSensor = %u\n\n", + CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR(CpuidRequest->EBX)); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" HardwareCoordinationFeedbackCapability = %s\n", + CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" NumberOfIntelThreadDirectorClasses (bit) = %s\n", + CPUID_ECX_NUMBER_OF_INTEL_THREAD_DIRECTOR_CLASSES(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PerformanceEnergyBiasPreference = %u\n\n", + CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE(CpuidRequest->ECX)); + + // + // EDX + // EDX is fully reserved for this leaf; still routed through its macro for consistency. + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest->EDX)); + + break; + + case 0x7: + ShowMessages("==== CPUID.(EAX=07H) Structured Extended Feature Flags ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest->LeafEaxMaxSubleaf); + + if (SubFunctionId == 0) + { + ShowMessages("---- CPUID.(EAX=07H, ECX=%u) ----\n\n", SubFunctionId); + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" NumberOfSubLeaves (max ECX input) = %u\n\n", CPUID_EAX_NUMBER_OF_SUB_LEAVES(CpuidRequest->EAX)); + + // + // EBX + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" FSGSBASE = %s\n", CPUID_EBX_FSGSBASE(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_TSC_ADJUST MSR = %s\n", CPUID_EBX_IA32_TSC_ADJUST_MSR(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX = %s\n", CPUID_EBX_SGX(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" BMI1 = %s\n", CPUID_EBX_BMI1(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" HLE = %s\n", CPUID_EBX_HLE(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX2 = %s\n", CPUID_EBX_AVX2(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" FDP_EXCPTN_ONLY = %s\n", CPUID_EBX_FDP_EXCPTN_ONLY(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SMEP = %s\n", CPUID_EBX_SMEP(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" BMI2 = %s\n", CPUID_EBX_BMI2(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Enhanced REP MOVSB/STOSB = %s\n", CPUID_EBX_ENHANCED_REP_MOVSB_STOSB(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" INVPCID = %s\n", CPUID_EBX_INVPCID(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RTM = %s\n", CPUID_EBX_RTM(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDT-M (Monitoring) = %s\n", CPUID_EBX_RDT_M(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Deprecates FPU CS/DS = %s\n", CPUID_EBX_DEPRECATES(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" MPX = %s\n", CPUID_EBX_MPX(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDT-A (Allocation) = %s\n", CPUID_EBX_RDT(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512F = %s\n", CPUID_EBX_AVX512F(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512DQ = %s\n", CPUID_EBX_AVX512DQ(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" RDSEED = %s\n", CPUID_EBX_RDSEED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" ADX = %s\n", CPUID_EBX_ADX(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SMAP = %s\n", CPUID_EBX_SMAP(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_IFMA = %s\n", CPUID_EBX_AVX512_IFMA(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" CLFLUSHOPT = %s\n", CPUID_EBX_CLFLUSHOPT(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" CLWB = %s\n", CPUID_EBX_CLWB(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Intel Processor Trace = %s\n", CPUID_EBX_INTEL(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512PF (Xeon Phi only) = %s\n", CPUID_EBX_AVX512PF(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512ER (Xeon Phi only) = %s\n", CPUID_EBX_AVX512ER(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512CD = %s\n", CPUID_EBX_AVX512CD(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" SHA = %s\n", CPUID_EBX_SHA(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512BW = %s\n", CPUID_EBX_AVX512BW(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512VL = %s\n\n", CPUID_EBX_AVX512VL(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" PREFETCHWT1 (Xeon Phi only) = %s\n", CPUID_ECX_PREFETCHWT1(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VBMI = %s\n", CPUID_ECX_AVX512_VBMI(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" UMIP = %s\n", CPUID_ECX_UMIP(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PKU = %s\n", CPUID_ECX_PKU(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" OSPKE = %s\n", CPUID_ECX_OSPKE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" WAITPKG = %s\n", CPUID_ECX_WAITPKG(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VBMI2 = %s\n", CPUID_ECX_AVX512_VBMI2(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CET_SS (shadow stack) = %s\n", CPUID_ECX_CET_SS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" GFNI = %s\n", CPUID_ECX_GFNI(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VAES = %s\n", CPUID_ECX_VAES(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" VPCLMULQDQ = %s\n", CPUID_ECX_VPCLMULQDQ(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VNNI = %s\n", CPUID_ECX_AVX512_VNNI(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_BITALG = %s\n", CPUID_ECX_AVX512_BITALG(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" TME_EN = %s\n", CPUID_ECX_TME_EN(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VPOPCNTDQ = %s\n", CPUID_ECX_AVX512_VPOPCNTDQ(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LA57 (5-level paging) = %s\n", CPUID_ECX_LA57(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MAWAU (BNDLDX/BNDSTX) = %u (NOT BOOLEAN)\n", CPUID_ECX_MAWAU(CpuidRequest->ECX)); + ShowMessages(" RDPID = %s\n", CPUID_ECX_RDPID(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" KL (Key Locker) = %s\n", CPUID_ECX_KL(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CLDEMOTE = %s\n", CPUID_ECX_CLDEMOTE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVDIRI = %s\n", CPUID_ECX_MOVDIRI(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" MOVDIR64B = %s\n", CPUID_ECX_MOVDIR64B(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX_LC (Launch Config) = %s\n", CPUID_ECX_SGX_LC(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" PKS = %s\n\n", CPUID_ECX_PKS(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" AVX512_4VNNIW (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4VNNIW(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_4FMAPS (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4FMAPS(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" Fast Short REP MOV = %s\n", CPUID_EDX_FAST_SHORT_REP_MOV(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" AVX512_VP2INTERSECT = %s\n", CPUID_EDX_AVX512_VP2INTERSECT(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" MD_CLEAR = %s\n", CPUID_EDX_MD_CLEAR(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SERIALIZE = %s\n", CPUID_EDX_SERIALIZE(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" Hybrid part = %s\n", CPUID_EDX_HYBRID(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" PCONFIG = %s\n", CPUID_EDX_PCONFIG(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" CET_IBT (branch tracking) = %s\n", CPUID_EDX_CET_IBT(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IBRS/IBPB = %s\n", CPUID_EDX_IBRS_IBPB(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" STIBP = %s\n", CPUID_EDX_STIBP(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" L1D_FLUSH = %s\n", CPUID_EDX_L1D_FLUSH(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_ARCH_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_ARCH_CAPABILITIES(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" IA32_CORE_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_CORE_CAPABILITIES(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + ShowMessages(" SSBD = %s\n\n", CPUID_EDX_SSBD(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + } + else + { + // + // This header only defines the EBX/ECX/EDX bitfield layout for sub-leaf + // (ECX) = 0. If the processor reports further sub-leaves, decoding them + // with the sub-leaf-0 struct would silently misinterpret the bits, so + // instead their raw dwords are printed undecoded - consistent with this + // file's rule of only reading a field through a macro that's actually + // defined for it. + // + ShowMessages(" No bitfield macros are defined for these in ia32.h, so their\n"); + ShowMessages(" raw dwords are shown without decoding:\n"); + ShowMessages(" ECX=%u: EAX=0x%08X EBX=0x%08X ECX=0x%08X EDX=0x%08X\n\n", + SubFunctionId, + CpuidRequest->EAX, + CpuidRequest->EBX, + CpuidRequest->ECX, + CpuidRequest->EDX); + } + + break; + + case 0x8: + ShowMessages("==== CPUID.(EAX=08H) ====\n\n"); + ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); + ShowMessages(" (Was previously used for Processor Serial Number on some CPUs)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n", CpuidRequest->EDX); + break; + + case 0x9: + ShowMessages("==== CPUID.(EAX=09H) Direct Cache Access Information ====\n\n"); + + ShowMessages(" *******************************************************\n" + " * LEAF 9 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX mirrors IA32_PLATFORM_DCA_CAP[31:0] verbatim. ia32.h doesn't split + // it into sub-fields here (those bit meanings live in the MSR's own + // spec, not in this CPUID leaf), so it's read through its single + // whole-dword macro and shown as raw hex rather than decoded further. + // + ShowMessages(" IA32_PLATFORM_DCA_CAP (EAX, mirrors MSR 1F8H) = 0x%08X\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest->EAX)); + + // + // EBX/ECX/EDX are fully reserved for this leaf. + // + ShowMessages(" Reserved (EBX) = 0x%08X\n", CPUID_EBX_RESERVED(CpuidRequest->EBX)); + ShowMessages(" Reserved (ECX) = 0x%08X\n", CPUID_ECX_RESERVED(CpuidRequest->ECX)); + ShowMessages(" Reserved (EDX) = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest->EDX)); + + break; + + case 0xA: + ShowMessages("==== CPUID.(EAX=0AH) Architectural Performance Monitoring Leaf ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 10 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest->EAX) == 0) + { + // + // Per the spec: architectural perfmon is only supported if VersionId > 0. + // At version 0 the rest of this leaf isn't architecturally meaningful, so stop here + // + ShowMessages(" VersionId = 0 -> architectural performance monitoring not supported;\n" + " remaining fields in this leaf are not architecturally defined.\n\n"); + + break; + } + + // + // EAX + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" VersionId = %u\n", + CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest->EAX)); + ShowMessages(" NumberOfCountersPerLogicalProcessor = %u\n", + CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR(CpuidRequest->EAX)); + ShowMessages(" BitWidthOfPerformanceMonitoringCounter = %u\n", + CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER(CpuidRequest->EAX)); + ShowMessages(" EbxBitVectorLength = %u\n\n", + CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest->EAX)); + + // + // EBX + // + ShowMessages("-- EBX (bit = 1 means the event is NOT available) --\n\n"); + ShowMessages(" CoreCycleEventNotAvailable = %u\n", + CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE(CpuidRequest->EBX)); + ShowMessages(" InstructionRetiredEventNotAvailable = %u\n", + CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest->EBX)); + ShowMessages(" ReferenceCyclesEventNotAvailable = %u\n", + CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE(CpuidRequest->EBX)); + ShowMessages(" LastLevelCacheReferenceEventNotAvailable = %u\n", + CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE(CpuidRequest->EBX)); + ShowMessages(" LastLevelCacheMissesEventNotAvailable = %u\n", + CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE(CpuidRequest->EBX)); + ShowMessages(" BranchInstructionRetiredEventNotAvailable = %u\n", + CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest->EBX)); + ShowMessages(" BranchMispredictRetiredEventNotAvailable = %u\n\n", + CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest->EBX)); + + if (CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest->EAX) < 7) + { + ShowMessages(" NOTE: EbxBitVectorLength=%u (<7): bits at/after this length are not\n" + " architecturally defined on this CPU; treat them as unreliable.\n", + CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest->EAX)); + } + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + // + // EDX: fixed-function counter fields only defined if VersionId > 1 + // + ShowMessages("-- EDX --\n\n"); + if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest->EAX) > 1) + { + ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u\n", + CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest->EDX)); + ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u\n\n", + CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest->EDX)); + } + else + { + ShowMessages(" NOTE: VersionId=%u (<=1): fixed-function counter fields are not\n", + CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest->EAX)); + ShowMessages(" architecturally defined; showing raw macro output anyway:\n"); + ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u (undefined)\n", + CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest->EDX)); + ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u (undefined)\n", + CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest->EDX)); + } + + ShowMessages(" AnyThreadDeprecation = %s\n\n", + CPUID_EDX_ANY_THREAD_DEPRECATION(CpuidRequest->EDX) ? "TRUE" : "FALSE"); + + break; + + case 0xB: + + // + // Check if this leaf is supported or not + // + if (!CpuidRequest->LeafBSupported) + { + ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n"); + ShowMessages(" Leaf presence check failed: CPUID.0BH:EBX[15:0] == 0 at sub-leaf 0.\n" + " This processor does not implement leaf 0BH (consider leaf 1FH instead).\n\n"); + break; + } + ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest->LeafBMaxSubleaf); + + switch (CPUID_ECX_LEVEL_TYPE(CpuidRequest->ECX)) + { + case 0: + TypeName = "Invalid"; + break; + case 1: + TypeName = "SMT (Hyper-Threading)"; + break; + case 2: + TypeName = "Core"; + break; + default: + TypeName = "Reserved"; + break; + } + + ShowMessages("---- CPUID.(EAX=0BH, ECX=%u) ----\n\n", SubFunctionId); + + // + // ECX: Level number and type + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" LevelNumber (echoes ECX input) = %u\n", + CPUID_ECX_LEVEL_NUMBER(CpuidRequest->ECX)); + ShowMessages(" LevelType = %u (%s)\n\n", + CPUID_ECX_LEVEL_TYPE(CpuidRequest->ECX), + TypeName); + // + // EAX: Shift count + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" X2ApicIdToUniqueTopologyIdShift = %u\n\n", + CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT(CpuidRequest->EAX)); + + // + // EBX: Number of logical processors (diagnostic only) + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" NumberOfLogicalProcessorsAtThisLevelType = %u (DIAGNOSTIC ONLY - do not use for topology enumeration)\n\n", + CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE(CpuidRequest->EBX)); + + // + // EDX: x2APIC ID (constant across all sub-leaves) + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" X2ApicId (current logical processor) = %u\n\n", + CPUID_EDX_X2APIC_ID(CpuidRequest->EDX)); + + break; + + case 0xC: + ShowMessages("==== CPUID.(EAX=0CH) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest->EDX); + break; + + case 0xD: + ShowMessages("==== CPUID.(EAX=0DH) Processor Extended State Enumeration ====\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = 62 *\n" + " *******************************************************\n\n"); + + if (SubFunctionId == 0) + { + ShowMessages("-- EAX (XCR0 lower 32 bits) --\n\n"); + ShowMessages(" X87State (bit 0) = %s\n", CPUID_EAX_X87_STATE(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SSEState (bit 1) = %s\n", CPUID_EAX_SSE_STATE(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" AVXState (bit 2) = %s\n", CPUID_EAX_AVX_STATE(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" MPXState (bits 4:3) = %u\n", CPUID_EAX_MPX_STATE(CpuidRequest->EAX)); + ShowMessages(" AVX512State (bits 7:5) = %u\n", CPUID_EAX_AVX_512_STATE(CpuidRequest->EAX)); + ShowMessages(" UsedForIa32Xss1 (bit 8) = %s\n", CPUID_EAX_USED_FOR_IA32_XSS_1(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" PKRUState (bit 9) = %s\n", CPUID_EAX_PKRU_STATE(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" UsedForIa32Xss2 (bit 13) = %s\n\n", CPUID_EAX_USED_FOR_IA32_XSS_2(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" MaxSizeRequiredByEnabledFeaturesInXcr0 = %u bytes\n\n", + CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" MaxSizeOfXsaveXrstorSaveArea = %u bytes\n\n", + CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA(CpuidRequest->ECX)); + ShowMessages("-- EDX (XCR0 upper 32 bits) --\n\n"); + ShowMessages(" Xcr0SupportedBits (bits 63:32 of XCR0) = 0x%08X\n\n", + CPUID_EDX_XCR0_SUPPORTED_BITS(CpuidRequest->EDX)); + } + + else if (SubFunctionId == 1) + { + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SupportsXsavecAndCompactedXrstor (XSAVEC) = %s\n", + CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsXgetbvWithEcx1 = %s\n", + CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SupportsXsaveXrstorAndIa32Xss (XSAVES) = %s\n\n", + CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SizeOfXsaveArea (XCR0 | IA32_XSS enabled) = %u bytes\n", + CPUID_EBX_SIZE_OF_XSAVE_AREAD(CpuidRequest->EBX)); + + ShowMessages("-- ECX (IA32_XSS lower 32 bits) --\n\n"); + ShowMessages(" UsedForXcr01 (bits 7:0) = 0x%02X\n", + CPUID_ECX_USED_FOR_XCR0_1(CpuidRequest->ECX)); + ShowMessages(" PtState (bit 8) = %s\n", + CPUID_ECX_PT_STATE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" UsedForXcr02 (bit 9) = %s\n", + CPUID_ECX_USED_FOR_XCR0_2(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CetUserState (bit 11) = %s\n", + CPUID_ECX_CET_USER_STATE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" CetSupervisorState (bit 12) = %s\n", + CPUID_ECX_CET_SUPERVISOR_STATE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" HdcState (bit 13) = %s\n", + CPUID_ECX_HDC_STATE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LbrState (bit 15) = %s\n", + CPUID_ECX_LBR_STATE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" HwpState (bit 16) = %s\n\n", + CPUID_ECX_HWP_STATE(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EDX (IA32_XSS upper 32 bits) --\n\n"); + ShowMessages(" SupportedUpperIa32XssBits (bits 63:32) = 0x%08X\n\n", + CPUID_EDX_SUPPORTED_UPPER_IA32_XSS_BITS(CpuidRequest->EDX)); + } + + else if (SubFunctionId >= 2) + { + // + // Check if the user input is valid + // Need to check both XCR0 and IA32_XSS vectors + // + UINT64 ValidBits = CpuidRequest->XCR0Vector | CpuidRequest->IA32_XSS_Vector; + + // + // Validate if this sub-leaf is supported + // + if (((ValidBits >> SubFunctionId) & (UINT64)1) == 0) + { + ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); + ShowMessages(" Valid sub-leaves are those with bits set in:\n"); + ShowMessages(" XCR0 vector: 0x%016llX\n", (ULONG64)CpuidRequest->XCR0Vector); + ShowMessages(" IA32_XSS vector: 0x%016llX\n", (ULONG64)CpuidRequest->IA32_XSS_Vector); + ShowMessages(" Combined vector: 0x%016llX\n\n", (ULONG64)ValidBits); + + break; + } + + ShowMessages("-- State Component Information --\n\n"); + ShowMessages(" SaveAreaSize (EAX) = %u bytes\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest->EAX)); + ShowMessages(" SaveAreaOffset (EBX) = %u bytes\n", + CPUID_EBX_RESERVED(CpuidRequest->EBX)); + ShowMessages(" ManagedViaIa32Xss (ECX bit 0) = %u (%s)\n", + CPUID_ECX_ECX_2(CpuidRequest->ECX), + CPUID_ECX_ECX_2(CpuidRequest->ECX) ? "IA32_XSS" : "XCR0"); + ShowMessages(" Aligned64ByteBoundary (ECX bit 1) = %u%s\n", + CPUID_ECX_ECX_1(CpuidRequest->ECX), + CPUID_ECX_ECX_1(CpuidRequest->ECX) ? " (next 64-byte boundary)" : " (immediately following)"); + ShowMessages(" Reserved (EDX) = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidRequest->EDX)); + } + + break; + + case 0xE: + ShowMessages("==== CPUID.(EAX=0EH) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest->EDX); + break; + + case 0xF: // 0xF = 15 (decimal); CPUID_INTEL_RESOURCE_DIRECTOR_TECHNOLOGY_MONITORING_INFORMATION + ShowMessages("==== CPUID.(EAX=0FH) Intel RDT Monitoring ====\n\n"); + ShowMessages(" This leaf is not yet implemented in HyperDbg.\n"); + ShowMessages(" (Intel Resource Director Technology - Monitoring)\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest->EDX); + break; + + case 0x10: + ShowMessages("==== CPUID.(EAX=10H, ECX=%u) Intel RDT Allocation Information ====\n\n", SubFunctionId); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = 3 *\n" + " *******************************************************\n\n"); + + if (SubFunctionId == 0) + { + // + // Resource type enumeration + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Ia32PlatformDcaCap = 0x%08X\n\n", + CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest->EAX)); + + // + // EBX + // + ShowMessages("-- EBX (Supported Allocation Types) --\n\n"); + ShowMessages(" Raw value = 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" L3 Cache Allocation (bit 1) = %s\n", + CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" L2 Cache Allocation (bit 2) = %s\n", + CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Memory Bandwidth Allocation (bit 3) = %s\n\n", + CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + + // + // ECX + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + // + // EDX + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest->EDX)); + } + + else if (SubFunctionId == 1) + { + // + // L3 cache allocation + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest->EAX), + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest->EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" CodeAndDataPriorizationTechnologySupported = %s%s\n\n", + CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidRequest->ECX) ? "TRUE" : "FALSE", + CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidRequest->ECX) ? " (CDP supported)" : ""); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest->EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest->EDX) + 1); + } + + else if (SubFunctionId == 2) + { + // + // Sub-leaf 2 (L2 Cache Allocation) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest->EAX), + CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest->EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest->EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest->EDX) + 1); + } + + else if (SubFunctionId == 3) + { + // + // Sub-leaf 3 (Memory Bandwidth Allocation) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxMbaThrottlingValue (minus-one) = %u (actual = %u)\n\n", + CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidRequest->EAX), + CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidRequest->EAX) + 1); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" ResponseOfDelayIsLinear = %s%s\n", + CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidRequest->ECX) ? "TRUE" : "FALSE", + CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidRequest->ECX) ? " (linear response)" : " (non-linear)\n\n"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest->EDX), + CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest->EDX) + 1); + } + + else + { + ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); + ShowMessages(" raw bytes: EAX = %u\n EBX = %u\n ECX = %u\n EDX = %u\n\n", + CpuidRequest->EAX, + CpuidRequest->EBX, + CpuidRequest->ECX, + CpuidRequest->EDX); + } + + break; + + case 0x11: + ShowMessages("==== CPUID.(EAX=11H) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest->EDX); + break; + + case 0x12: + { + // + // SGX, not DAT. 0x12 = 18 (decimal) + // + ShowMessages("==== CPUID.(EAX=12H) Intel SGX Information ====\n\n"); + + if (!CpuidRequest->Leaf12Supported) + { + ShowMessages(" SGX is not supported on this CPU (CPUID.7H:EBX[2] = 0).\n\n"); + break; + } + + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest->Leaf12MaxSubLeaf); + + if (SubFunctionId == 0) + { + // + // SGX capabilities + // + ShowMessages("-- EAX (SGX Capabilities) --\n\n"); + ShowMessages(" SGX1 Support (bit 0) = %s\n", + CPUID_EAX_SGX1(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" SGX2 Support (bit 1) = %s\n", + CPUID_EAX_SGX2(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ENCLV Advanced (bit 5) = %s\n", + CPUID_EAX_SGX_ENCLV_ADVANCED(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + ShowMessages(" ENCLS Advanced (bit 6) = %s\n\n", + CPUID_EAX_SGX_ENCLS_ADVANCED(CpuidRequest->EAX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EBX (MISCSELECT - Extended SGX Features) --\n\n"); + ShowMessages(" Miscselect = 0x%08X\n\n", + CPUID_EBX_MISCSELECT(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + ShowMessages("-- EDX (Maximum Enclave Sizes) --\n\n"); + ShowMessages(" MaxEnclaveSizeNot64 = %u (2^%u = %llu bytes)\n", + CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest->EDX), + CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest->EDX), + (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest->EDX))); + ShowMessages(" MaxEnclaveSize64 = %u (2^%u = %llu bytes)\n\n", + CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest->EDX), + CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest->EDX), + (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest->EDX))); + } + + else if (SubFunctionId == 1) + { + // + // SGX attributes + // + ShowMessages("-- EAX (SECS.ATTRIBUTES[31:0]) --\n\n"); + ShowMessages(" ValidSecsAttributes0 = 0x%08X\n\n", + CPUID_EAX_VALID_SECS_ATTRIBUTES_0(CpuidRequest->EAX)); + + ShowMessages("-- EBX (SECS.ATTRIBUTES[63:32]) --\n\n"); + ShowMessages(" ValidSecsAttributes1 = 0x%08X\n\n", + CPUID_EBX_VALID_SECS_ATTRIBUTES_1(CpuidRequest->EBX)); + + ShowMessages("-- ECX (SECS.ATTRIBUTES[95:64]) --\n\n"); + ShowMessages(" ValidSecsAttributes2 = 0x%08X\n\n", + CPUID_ECX_VALID_SECS_ATTRIBUTES_2(CpuidRequest->ECX)); + + ShowMessages("-- EDX (SECS.ATTRIBUTES[127:96]) --\n\n"); + ShowMessages(" ValidSecsAttributes3 = 0x%08X\n\n", + CPUID_EDX_VALID_SECS_ATTRIBUTES_3(CpuidRequest->EDX)); + } + + else + { + // + // Subleaf 2+ (EPC sections) + // + if (CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest->EAX) == 0) + { + // + // Type 0: invalid subleaf + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SubLeafType = %u (Invalid - no EPC section)\n", + CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest->EAX)); + + ShowMessages("\n-- EBX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_EBX_ZERO(CpuidRequest->EBX)); + + ShowMessages("\n-- ECX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_ECX_ZERO(CpuidRequest->ECX)); + + ShowMessages("\n-- EDX --\n"); + ShowMessages(" Zero = 0x%08X\n", CPUID_EDX_ZERO(CpuidRequest->EDX)); + } + + else if (CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest->EAX) == 1) + { + // + // Reconstruct base address from EAX and EBX + // + UINT64 BaseLow = (UINT64)CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidRequest->EAX); + UINT64 BaseHigh = (UINT64)CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidRequest->EBX); + UINT64 BaseAddress = (BaseHigh << 32) | (BaseLow << 12); + + // + // Reconstruct size from ECX and EDX + // + UINT64 SizeLow = (UINT64)CPUID_ECX_EPC_SIZE_1(CpuidRequest->ECX); + UINT64 SizeHigh = (UINT64)CPUID_EDX_EPC_SIZE_2(CpuidRequest->EDX); + UINT64 SizeBytes = (SizeHigh << 32) | (SizeLow << 12); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SubLeafType = %u (EPC Section)\n", + CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest->EAX)); + ShowMessages(" EpcBasePhysicalAddress1 (bits 31:12) = 0x%05X\n\n", + CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidRequest->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" EpcBasePhysicalAddress2 (bits 51:32) = 0x%05X\n\n", + CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" EpcSectionProperty = %u", + CPUID_ECX_EPC_SECTION_PROPERTY(CpuidRequest->ECX)); + switch (CPUID_ECX_EPC_SECTION_PROPERTY(CpuidRequest->ECX)) + { + case 0: + ShowMessages(" (No confidentiality/integrity)\n\n"); + break; + case 1: + ShowMessages(" (Confidentiality and integrity protection)\n\n"); + break; + default: + ShowMessages(" (Reserved)\n\n"); + break; + } + ShowMessages(" EpcSize1 (bits 31:12) = 0x%05X\n\n", + CPUID_ECX_EPC_SIZE_1(CpuidRequest->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" EpcSize2 (bits 51:32) = 0x%05X\n\n", + CPUID_EDX_EPC_SIZE_2(CpuidRequest->EDX)); + + ShowMessages("-- EPC Section Information --\n\n"); + ShowMessages(" Base Address = 0x%016llX\n", (ULONG64)BaseAddress); + ShowMessages(" Size = 0x%016llX bytes (%llu MB)\n\n", + (ULONG64)SizeBytes, + (ULONG64)(SizeBytes / (1024 * 1024))); + } + + else + { + // + // Unknown subleaf type (reserved) + // + ShowMessages("-- Raw Data for Sub-leaf %u (Type %u) --\n\n", + SubFunctionId, + CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest->EAX)); + + ShowMessages(" EAX = 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX = 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX = 0x%08X\n\n", CpuidRequest->EDX); + ShowMessages(" Note: Reserved sub-leaf type. Please refer to the latest Intel SDM.\n\n"); + } + } + + break; + } + + case 0x13: + ShowMessages("==== CPUID.(EAX=13H) ====\n\n"); + ShowMessages(" This leaf is reserved (not implemented).\n\n"); + ShowMessages(" Raw data:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest->EDX); + break; + + case 0x14: + ShowMessages("==== CPUID.(EAX=14H) Intel Processor Trace Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest->LeafEaxMaxSubleaf); + + ShowMessages("==== CPUID.(EAX=14H, ECX=%u) Intel Processor Trace Information ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // main leaf + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSubLeaf = %u\n\n", + CPUID_EAX_MAX_SUB_LEAF(CpuidRequest->EAX)); + + ShowMessages("-- EBX (Supported Features) --\n\n"); + ShowMessages(" CR3Filter support (bit 0) = %s\n", + CPUID_EBX_FLAG0(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Configurable PSB & Cycle-Accurate (bit 1) = %s\n", + CPUID_EBX_FLAG1(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" IP Filtering & TraceStop (bit 2) = %s\n", + CPUID_EBX_FLAG2(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" MTC & COFI suppression (bit 3) = %s\n", + CPUID_EBX_FLAG3(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PTWRITE support (bit 4) = %s\n", + CPUID_EBX_FLAG4(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Power Event Trace (bit 5) = %s\n", + CPUID_EBX_FLAG5(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PSB/PMI preservation (bit 6) = %s\n", + CPUID_EBX_FLAG6(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Event Trace (bit 7) = %s\n", + CPUID_EBX_FLAG7(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Disable TNT (bit 8) = %s\n\n", + CPUID_EBX_FLAG8(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + + ShowMessages("-- ECX (Output Schemes) --\n\n"); + ShowMessages(" ToPA output scheme (bit 0) = %s\n", + CPUID_ECX_FLAG0(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" ToPA tables with any entries (bit 1) = %s\n", + CPUID_ECX_FLAG1(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Single-Range Output scheme (bit 2) = %s\n", + CPUID_ECX_FLAG2(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" Trace Transport subsystem (bit 3) = %s\n", + CPUID_ECX_FLAG3(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + ShowMessages(" LIP values include CS base (bit 31) = %s\n\n", + CPUID_ECX_FLAG31(CpuidRequest->ECX) ? "TRUE" : "FALSE"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidRequest->EDX)); + } + + else if (SubFunctionId == 1) + { + // + // Packet generation + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" NumberOfConfigurableAddressRangesForFiltering = %u\n", + CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING(CpuidRequest->EAX)); + ShowMessages(" BitmapOfSupportedMtcPeriodEncodings = 0x%04X\n\n", + CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS(CpuidRequest->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" BitmapOfSupportedCycleThresholdValueEncodings = 0x%04X\n", + CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS(CpuidRequest->EBX)); + ShowMessages(" BitmapOfSupportedConfigurablePsbFrequencyEncodings = 0x%04X\n\n", + CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidRequest->EDX)); + } + + else + { + // + // Subleaves > 1 (if they exist) + // + ShowMessages("-- Raw Data for Sub-leaf %u --\n\n", SubFunctionId); + ShowMessages(" EAX = 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX = 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX = 0x%08X\n\n", CpuidRequest->EDX); + ShowMessages(" Note: This sub-leaf may be for future Intel PT features.\n"); + ShowMessages(" Please refer to the latest Intel SDM for interpretation.\n\n"); + } + + break; + + case 0x15: + { + ShowMessages("==== CPUID.(EAX=15H) TSC and Core Crystal Clock Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 15h HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + // + // EAX: Denominator + // + UINT32 Denominator = CPUID_EAX_DENOMINATOR(CpuidRequest->EAX); + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Denominator = %u\n\n", Denominator); + + // + // EBX: Numerator + // + UINT32 Numerator = CPUID_EBX_NUMERATOR(CpuidRequest->EBX); + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Numerator = %u\n\n", Numerator); + + // + // ECX: Nominal frequency (if available) + // + UINT32 NominalFreq = CPUID_ECX_NOMINAL_FREQUENCY(CpuidRequest->ECX); + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NominalFrequency = %u Hz", NominalFreq); + if (NominalFreq > 0) + { + ShowMessages(" (%u MHz, %u GHz)\n", + NominalFreq / 1000000, + NominalFreq / 1000000000); + } + else + { + ShowMessages(" (not enumerated)\n\n"); + } + + // + // EDX: reserved + // + ShowMessages("\n-- EDX --\n"); + ShowMessages(" Reserved = 0x%08X\n", + CPUID_EDX_RESERVED(CpuidRequest->EDX)); + + // + // Calculate and display TSC frequency if possible + // + ShowMessages("-- TSC Frequency Information --\n\n"); + + if (Denominator == 0 || Numerator == 0) + { + ShowMessages(" TSC ratio not enumerated (denominator or numerator is 0)\n\n"); + } + + else + { + ShowMessages(" TSC / Core Crystal Clock ratio = %u / %u\n", + Numerator, + Denominator); + ShowMessages(" TSC frequency = Core Crystal Clock * (%u/%u)\n", + Numerator, + Denominator); + if (NominalFreq > 0) + { + UINT64 TSCFreqHz = (UINT64)NominalFreq * Numerator / Denominator; + ShowMessages(" TSC frequency = %llu Hz (%llu MHz, %llu GHz)\n\n", + (ULONG64)TSCFreqHz, + (ULONG64)(TSCFreqHz / 1000000), + (ULONG64)(TSCFreqHz / 1000000000)); + } + else + { + ShowMessages(" TSC frequency cannot be calculated (nominal frequency not enumerated)\n\n"); + } + } + + break; + } + + case 0x16: + { + ShowMessages("==== CPUID.(EAX=16H) Processor Frequency Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 16h HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + // + // EAX: Processor base frequency + // + UINT32 BaseFreq = CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ(CpuidRequest->EAX); + ShowMessages("-- EAX --\n\n"); + if (BaseFreq == 0) + { + ShowMessages(" ProcessorBaseFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" ProcessorBaseFrequencyMhz = %u MHz\n", BaseFreq); + } + + // + // EBX: Maximum frequency + // + UINT32 MaxFreq = CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ(CpuidRequest->EBX); + ShowMessages("-- EBX --\n\n"); + if (MaxFreq == 0) + { + ShowMessages(" ProcessorMaximumFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" ProcessorMaximumFrequencyMhz = %u MHz\n", MaxFreq); + } + + // + // ECX: Bus (reference) frequency + // + UINT32 BusFreq = CPUID_ECX_BUS_FREQUENCY_MHZ(CpuidRequest->ECX); + ShowMessages("-- ECX --\n\n"); + if (BusFreq == 0) + { + ShowMessages(" BusFrequencyMhz = 0 (not supported)\n\n"); + } + else + { + ShowMessages(" BusFrequencyMhz = %u MHz\n\n", BusFreq); + } + + // + // EDX: reserved + // + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", + CPUID_EDX_RESERVED(CpuidRequest->EDX)); + + // + // Display summary + // + ShowMessages("-- Frequency Summary --\n\n"); + ShowMessages(" Base Frequency: "); + if (BaseFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n", BaseFreq); + } + + // + // Maximum frequency + // + ShowMessages(" Maximum Frequency: "); + if (MaxFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n", MaxFreq); + } + + // + // Bus frequency + // + ShowMessages(" Bus Frequency: "); + if (BusFreq == 0) + { + ShowMessages("Not Supported\n"); + } + else + { + ShowMessages("%u MHz\n\n", BusFreq); + } + + // + // Show turbo boost if both base and max are supported and max > base + // + if (BaseFreq > 0 && MaxFreq > 0 && MaxFreq > BaseFreq) + { + UINT32 TurboBoost = MaxFreq - BaseFreq; + FLOAT TurboPercent = ((FLOAT)TurboBoost / BaseFreq) * 100.0f; + ShowMessages(" Turbo Boost: %u MHz above base (%.1f%% increase)\n\n", + TurboBoost, + TurboPercent); + } + + ShowMessages(" *******************************************************\n"); + ShowMessages(" * NOTE: These values are for display purposes only *\n"); + ShowMessages(" * They do not reflect actual running frequencies *\n"); + ShowMessages(" * Actual frequencies depend on workload, power, etc. *\n"); + ShowMessages(" *******************************************************\n\n"); + + break; + } + + case 0x17: + { + ShowMessages("==== CPUID.(EAX=17H) SoC Vendor Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CPUID_EAX_MAX_SOC_ID_INDEX(CpuidRequest->EAX)); + + ShowMessages("==== CPUID.(EAX=17H, ECX=%u) SoC Vendor Information ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // Main + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSocIdIndex = %u\n\n", CPUID_EAX_MAX_SOC_ID_INDEX(CpuidRequest->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SocVendorId = 0x%04X\n", + CPUID_EBX_SOC_VENDOR_ID(CpuidRequest->EBX)); + ShowMessages(" IsVendorScheme = %s\n\n", + CPUID_EBX_IS_VENDOR_SCHEME(CpuidRequest->EBX) ? "TRUE (Industry Standard)" : "FALSE (Intel Assigned)"); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" ProjectId = 0x%08X\n\n", + CPUID_ECX_PROJECT_ID(CpuidRequest->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SteppingId = 0x%08X\n\n", + CPUID_EDX_STEPPING_ID(CpuidRequest->EDX)); + } + + else if (SubFunctionId >= 1 && SubFunctionId <= 3) + { + // + // subleaves 1-3 (brand string) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" SocVendorBrandString[0..3] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EAX), + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EAX) >> 0) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EAX) >> 8) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EAX) >> 16) & 0xFF, + (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EAX) >> 24) & 0xFF); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" SocVendorBrandString[4..7] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EBX), + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EBX) >> 0) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EBX) >> 8) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EBX) >> 16) & 0xFF, + (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EBX) >> 24) & 0xFF); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" SocVendorBrandString[8..11] = 0x%08X (%c%c%c%c)\n\n", + CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest->ECX), + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest->ECX) >> 0) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest->ECX) >> 8) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest->ECX) >> 16) & 0xFF, + (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest->ECX) >> 24) & 0xFF); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SocVendorBrandString[12..15] = 0x%08X (%c%c%c%c)\n\n", + CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EDX), + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EDX) >> 0) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EDX) >> 8) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EDX) >> 16) & 0xFF, + (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest->EDX) >> 24) & 0xFF); + } + + else + { + // + // Sub-leaves > MaxSOCID_Index (Reserved, should return all zeros) + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest->EDX)); + } + break; + } + + case 0x18: + // + // DAT, 0x18 = 24 (decimal) + // + ShowMessages("==== CPUID.(EAX=18H) Deterministic Address Translation Parameters ====\n\n"); + ShowMessages(" *******************************************************\n" + " * Max NumberOfSubLeaves = %u *\n" + " *******************************************************\n\n", + CpuidRequest->LeafEaxMaxSubleaf); + + ShowMessages("==== CPUID.(EAX=18H, ECX=%u) Deterministic Address Translation Parameters ====\n\n", SubFunctionId); + + if (SubFunctionId == 0) + { + // + // main + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxSubLeaf = %u\n\n", CPUID_EAX_MAX_SUB_LEAF(CpuidRequest->EAX)); + + // + // EBX: Page size support and associativity + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" PageEntries4KbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries2MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries4MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries1GbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Partitioning = %u%s\n", + CPUID_EBX_PARTITIONING(CpuidRequest->EBX), + CPUID_EBX_PARTITIONING(CpuidRequest->EBX) == 0 ? " (soft partitioning)" : ""); + ShowMessages(" WaysOfAssociativity (W) = %u\n\n", + CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00(CpuidRequest->EBX)); + + // + // ECX: Number of Sets + // + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NumberOfSets = %u\n\n", + CPUID_ECX_NUMBER_OF_SETS(CpuidRequest->ECX)); + + // + // EDX: Translation cache type and properties + // + ShowMessages("-- EDX --\n\n"); + + switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest->EDX)) + { + case 0: + TypeName = "Null (sub-leaf not valid)"; + break; + case 1: + TypeName = "Data TLB"; + break; + case 2: + TypeName = "Instruction TLB"; + break; + case 3: + TypeName = "Unified TLB"; + break; + default: + TypeName = "Reserved"; + break; + } + ShowMessages(" TranslationCacheTypeField = %u (%s)\n", + CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest->EDX), + TypeName); + ShowMessages(" TranslationCacheLevel = %u\n", + CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidRequest->EDX)); + ShowMessages(" FullyAssociativeStructure = %s%s\n", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest->EDX) ? "TRUE" : "FALSE", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest->EDX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest->EDX), + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest->EDX) + 1); + } + + else + { + // + // subleaves >= 1 (Translation Structure Information) + // + + // + // Check if this sub-leaf is valid (EDX[4:0] != 0) + // + if (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest->EDX) == 0) + { + ShowMessages(" Sub-leaf %u is invalid (TranslationCacheTypeField = 0)\n", SubFunctionId); + ShowMessages(" All registers should be zero according to spec:\n"); + ShowMessages(" EAX = 0x%08X\n", CPUID_EAX_RESERVED(CpuidRequest->EAX)); + ShowMessages(" EBX = 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX = 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX = 0x%08X\n", CpuidRequest->EDX); + } + + else + { + // + // EAX: Reserved for sub-leaves >= 1 + // + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest->EAX)); + + // + // EBX: Page size support and associativity + // + ShowMessages("-- EBX --\n\n"); + ShowMessages(" PageEntries4KbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries2MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries4MbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" PageEntries1GbSupported = %s\n", + CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidRequest->EBX) ? "TRUE" : "FALSE"); + ShowMessages(" Partitioning = %u%s\n", + CPUID_EBX_PARTITIONING(CpuidRequest->EBX), + CPUID_EBX_PARTITIONING(CpuidRequest->EBX) == 0 ? " (soft partitioning)" : ""); + ShowMessages(" WaysOfAssociativity (W) = %u\n\n", + CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01(CpuidRequest->EBX)); + + // ECX: Number of Sets + ShowMessages("-- ECX --\n\n"); + ShowMessages(" NumberOfSets = %u\n\n", + CPUID_ECX_NUMBER_OF_SETS(CpuidRequest->ECX)); + + // EDX: Translation cache type and properties + ShowMessages("-- EDX --\n\n"); + switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest->EDX)) + { + case 0: + TypeName = "Null (sub-leaf not valid)"; + break; + case 1: + TypeName = "Data TLB"; + break; + case 2: + TypeName = "Instruction TLB"; + break; + case 3: + TypeName = "Unified TLB"; + break; + default: + TypeName = "Reserved"; + break; + } + ShowMessages(" TranslationCacheTypeField = %u (%s)\n", + CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest->EDX), + TypeName); + ShowMessages(" TranslationCacheLevel = %u\n", + CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidRequest->EDX)); + ShowMessages(" FullyAssociativeStructure = %s%s\n", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest->EDX) ? "TRUE" : "FALSE", + CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest->EDX) ? " (fully associative)" : ""); + + ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest->EDX), + CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest->EDX) + 1); + } + } + + break; + + case 0x80000000: + ShowMessages("==== CPUID.(EAX=80000000H) Extended Function Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000000 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" MaxExtendedFunctions = 0x%08X (%u)\n\n", + CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest->EAX), + CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest->EDX)); + + break; + + case 0x80000001: + ShowMessages("==== CPUID.(EAX=80000001H) Extended CPU Signature ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000001 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" LAHF/SAHF Available in 64-bit Mode = %s\n", + CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE(CpuidRequest->ECX) ? "True" : "False"); + ShowMessages(" LZCNT = %s\n", + CPUID_ECX_LZCNT(CpuidRequest->ECX) ? "True" : "False"); + ShowMessages(" PREFETCHW = %s\n\n", + CPUID_ECX_PREFETCHW(CpuidRequest->ECX) ? "True" : "False"); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" SYSCALL/SYSRET Available in 64-bit Mode = %s\n", + CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE(CpuidRequest->EDX) ? "True" : "False"); + ShowMessages(" Execute Disable Bit Available = %s\n", + CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE(CpuidRequest->EDX) ? "True" : "False"); + ShowMessages(" 1-GByte Pages Available = %s\n", + CPUID_EDX_PAGES_1GB_AVAILABLE(CpuidRequest->EDX) ? "True" : "False"); + ShowMessages(" RDTSCP Available = %s\n", + CPUID_EDX_RDTSCP_AVAILABLE(CpuidRequest->EDX) ? "True" : "False"); + ShowMessages(" Intel 64 Architecture Available = %s\n\n", + CPUID_EDX_IA64_AVAILABLE(CpuidRequest->EDX) ? "True" : "False"); + + break; + // + // 0x80000002-0x80000004 - Processor brand string + // + case 0x80000002: + case 0x80000003: + case 0x80000004: + { + ShowMessages("==== CPUID.(EAX=80000002H-80000004H) Processor Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000002-4 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + ShowMessages(" Brand String = \"%s\"\n\n", CpuidRequest->BrandString); + + break; + } + case 0x80000005: + ShowMessages("EAX = 0x80000005: not implemented.\n"); + break; + + case 0x80000006: + { + ShowMessages("==== CPUID.(EAX=80000006H) Extended Cache Information ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000006 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest->EBX)); + + ShowMessages("-- ECX (L2 Cache Information) --\n"); + + UINT32 LineSize = CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES(CpuidRequest->ECX); + UINT32 Assoc = CPUID_ECX_L2_ASSOCIATIVITY_FIELD(CpuidRequest->ECX); + UINT32 CacheSize = CPUID_ECX_CACHE_SIZE_IN_1K_UNITS(CpuidRequest->ECX); + + // + // decode associativity + // + switch (Assoc) + { + case 0x00: + AssocName = "Disabled"; + break; + case 0x01: + AssocName = "Direct mapped"; + break; + case 0x02: + AssocName = "2-way"; + break; + case 0x04: + AssocName = "4-way"; + break; + case 0x06: + AssocName = "8-way"; + break; + case 0x08: + AssocName = "16-way"; + break; + case 0x0F: + AssocName = "Fully associative"; + break; + default: + AssocName = "Reserved"; + break; + } + ShowMessages(" CacheLineSizeInBytes = %u bytes\n", LineSize); + ShowMessages(" L2AssociativityField = 0x%02X (%s)\n", Assoc, AssocName); + ShowMessages(" CacheSizeIn1KUnits = %u KB (%u MB)\n", + CacheSize, + CacheSize / 1024); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest->EDX)); + + break; + } + + case 0x80000007: + ShowMessages("==== CPUID.(EAX=80000007H) Extended Time Stamp Counter ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000007 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest->EAX)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" InvariantTscAvailable = %u%s\n\n", + CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidRequest->EDX), + CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidRequest->EDX) ? " (TSC runs at constant rate)" : ""); + + break; + + case 0x80000008: + { + ShowMessages("==== CPUID.(EAX=80000008H) Virtual & Physical Address Sizes ====\n\n"); + ShowMessages(" *******************************************************\n" + " * LEAF 0x80000008 HAS NO SUBLEAVES *\n" + " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" + " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" + " *******************************************************\n\n"); + + ShowMessages("-- EAX --\n\n"); + UINT32 PhysicalBits = CPUID_EAX_NUMBER_OF_PHYSICAL_ADDRESS_BITS(CpuidRequest->EAX); + UINT32 LinearBits = CPUID_EAX_NUMBER_OF_LINEAR_ADDRESS_BITS(CpuidRequest->EAX); + + ShowMessages(" NumberOfPhysicalAddressBits = %u (max physical address = 2^%u = %llu bytes)\n", + PhysicalBits, + PhysicalBits, + (ULONG64)(1ULL << PhysicalBits)); + ShowMessages(" NumberOfLinearAddressBits = %u (max linear address = 2^%u = %llu bytes)\n", + LinearBits, + LinearBits, + (ULONG64)(1ULL << LinearBits)); + + ShowMessages("-- EBX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest->EBX)); + + ShowMessages("-- ECX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest->ECX)); + + ShowMessages("-- EDX --\n\n"); + ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest->EDX)); + + break; + } + + default: + ShowMessages("==== CPUID.(EAX=%08XH) ====\n\n", FunctionId); + ShowMessages(" CPUID leaf 0x%08X is not implemented in HyperDbg.\n", FunctionId); + ShowMessages(" You can decode the raw values yourself:\n"); + ShowMessages(" EAX: 0x%08X\n", CpuidRequest->EAX); + ShowMessages(" EBX: 0x%08X\n", CpuidRequest->EBX); + ShowMessages(" ECX: 0x%08X\n", CpuidRequest->ECX); + ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest->EDX); + } +} + +/** + * @brief ucpuid command handler * * @return VOID */ VOID CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) { - BOOL Status; - ULONG ReturnedLength; - DEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest = {0}; - CpuidRequest.FunctionId = FunctionId; - CpuidRequest.SubFunctionId = SubFunctionId; - + BOOL Status; + ULONG ReturnedLength; + DEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequestBuffer = {0}; + PDEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest = &CpuidRequestBuffer; + CpuidRequest->FunctionId = FunctionId; + CpuidRequest->SubFunctionId = SubFunctionId; + if (g_IsSerialConnectedToRemoteDebuggee) { // @@ -81,2021 +2104,24 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) Status = DeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_CPUID, // IO Control Code (IOCTL) - &CpuidRequest, // Input Buffer to driver. + CpuidRequest, // Input Buffer to driver. SIZEOF_DEBUGGER_CPUID_REQUEST_RESPONSE, // Input buffer length - &CpuidRequest, // Output Buffer from driver. + CpuidRequest, // Output Buffer from driver. SIZEOF_DEBUGGER_CPUID_REQUEST_RESPONSE, // Length of output buffer in // bytes. &ReturnedLength, // Bytes placed in buffer. NULL // synchronous call ); - CONST CHAR * TypeName = NULL; - CONST CHAR * AssocName; - if (!Status) { ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); return; } - if (CpuidRequest.KernelStatus == DEBUGGER_OPERATION_WAS_SUCCESSFUL) + if (CpuidRequest->KernelStatus == DEBUGGER_OPERATION_WAS_SUCCESSFUL) { - switch (FunctionId) - { - case 0x0: - { - CHAR Vendor[13] = {0}; - memcpy(&Vendor[0], &CpuidRequest.EBX, 4); - memcpy(&Vendor[4], &CpuidRequest.EDX, 4); - memcpy(&Vendor[8], &CpuidRequest.ECX, 4); - Vendor[12] = '\0'; - - ShowMessages(" *******************************************************\n" - " * LEAF 0 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages(" Vendor : %s\n", Vendor); - ShowMessages(" Maximum supported basic leaf : %u\n", CpuidRequest.EAX); - - break; - } - case 0x1: - // - // EAX - // - ShowMessages("==== CPUID.(EAX=01H) Version / Additional / Feature Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 1 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX: Version Information --\n\n"); - ShowMessages(" SteppingId = %u\n", - CPUID_VERSION_INFORMATION_STEPPING_ID(CpuidRequest.EAX)); - ShowMessages(" Model = %u\n", - CPUID_VERSION_INFORMATION_MODEL(CpuidRequest.EAX)); - ShowMessages(" FamilyId = %u\n", - CPUID_VERSION_INFORMATION_FAMILY_ID(CpuidRequest.EAX)); - ShowMessages(" ProcessorType = %u\n", - CPUID_VERSION_INFORMATION_PROCESSOR_TYPE(CpuidRequest.EAX)); - ShowMessages(" ExtendedModelId = %u\n", - CPUID_VERSION_INFORMATION_EXTENDED_MODEL_ID(CpuidRequest.EAX)); - ShowMessages(" ExtendedFamilyId = %u\n\n", - CPUID_VERSION_INFORMATION_EXTENDED_FAMILY_ID(CpuidRequest.EAX)); - - // - // EBX: additional information - // - ShowMessages("-- EBX: Additional Information --\n\n"); - ShowMessages(" BrandIndex = %u\n", - CPUID_ADDITIONAL_INFORMATION_BRAND_INDEX(CpuidRequest.EBX)); - ShowMessages(" ClflushLineSize = %u (cache line = %u bytes)\n", - CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidRequest.EBX), - CPUID_ADDITIONAL_INFORMATION_CLFLUSH_LINE_SIZE(CpuidRequest.EBX) * 8); - ShowMessages(" MaxAddressableIds = %u\n", - CPUID_ADDITIONAL_INFORMATION_MAX_ADDRESSABLE_IDS(CpuidRequest.EBX)); - ShowMessages(" InitialApicId = %u\n\n", - CPUID_ADDITIONAL_INFORMATION_INITIAL_APIC_ID(CpuidRequest.EBX)); - - // - // ECX: feature information - // - ShowMessages("-- ECX: Feature Information --\n\n"); - ShowMessages(" SSE3 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_STREAMING_SIMD_EXTENSIONS_3(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PCLMULQDQ = %s\n", - CPUID_FEATURE_INFORMATION_ECX_PCLMULQDQ_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" DTES64 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_DS_AREA_64BIT_LAYOUT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MONITOR/MWAIT = %s\n", - CPUID_FEATURE_INFORMATION_ECX_MONITOR_MWAIT_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CPL Qualified DS = %s\n", - CPUID_FEATURE_INFORMATION_ECX_CPL_QUALIFIED_DEBUG_STORE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" VMX = %s\n", - CPUID_FEATURE_INFORMATION_ECX_VIRTUAL_MACHINE_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SMX = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SAFER_MODE_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" EIST (SpeedStep) = %s\n", - CPUID_FEATURE_INFORMATION_ECX_ENHANCED_INTEL_SPEEDSTEP_TECHNOLOGY(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" TM2 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_THERMAL_MONITOR_2(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SSSE3 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SUPPLEMENTAL_STREAMING_SIMD_EXTENSIONS_3(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" L1 Context ID = %s\n", - CPUID_FEATURE_INFORMATION_ECX_L1_CONTEXT_ID(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" Silicon Debug = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SILICON_DEBUG(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" FMA = %s\n", - CPUID_FEATURE_INFORMATION_ECX_FMA_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CMPXCHG16B = %s\n", - CPUID_FEATURE_INFORMATION_ECX_CMPXCHG16B_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" xTPR Update Control = %s\n", - CPUID_FEATURE_INFORMATION_ECX_XTPR_UPDATE_CONTROL(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PDCM = %s\n", - CPUID_FEATURE_INFORMATION_ECX_PERFMON_AND_DEBUG_CAPABILITY(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PCID = %s\n", - CPUID_FEATURE_INFORMATION_ECX_PROCESS_CONTEXT_IDENTIFIERS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" DCA = %s\n", - CPUID_FEATURE_INFORMATION_ECX_DIRECT_CACHE_ACCESS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SSE4.1 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SSE41_SUPPORT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SSE4.2 = %s\n", - CPUID_FEATURE_INFORMATION_ECX_SSE42_SUPPORT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" x2APIC = %s\n", - CPUID_FEATURE_INFORMATION_ECX_X2APIC_SUPPORT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MOVBE = %s\n", - CPUID_FEATURE_INFORMATION_ECX_MOVBE_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" POPCNT = %s\n", - CPUID_FEATURE_INFORMATION_ECX_POPCNT_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" TSC-Deadline = %s\n", - CPUID_FEATURE_INFORMATION_ECX_TSC_DEADLINE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AESNI = %s\n", - CPUID_FEATURE_INFORMATION_ECX_AESNI_INSTRUCTION_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" XSAVE/XRSTOR = %s\n", - CPUID_FEATURE_INFORMATION_ECX_XSAVE_XRSTOR_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" OSXSAVE = %s\n", - CPUID_FEATURE_INFORMATION_ECX_OSX_SAVE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX = %s\n", - CPUID_FEATURE_INFORMATION_ECX_AVX_SUPPORT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" F16C = %s\n", - CPUID_FEATURE_INFORMATION_ECX_HALF_PRECISION_CONVERSION_INSTRUCTIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" RDRAND = %s\n\n", - CPUID_FEATURE_INFORMATION_ECX_RDRAND_INSTRUCTION(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - - // - // EDX: feature information - // - ShowMessages("-- EDX: Feature Information --\n\n"); - ShowMessages(" FPU = %s\n", - CPUID_FEATURE_INFORMATION_EDX_FLOATING_POINT_UNIT_ON_CHIP(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" VME = %s\n", - CPUID_FEATURE_INFORMATION_EDX_VIRTUAL_8086_MODE_ENHANCEMENTS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" DE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_DEBUGGING_EXTENSIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PSE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" TSC = %s\n", - CPUID_FEATURE_INFORMATION_EDX_TIMESTAMP_COUNTER(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MSR (RDMSR/WRMSR) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_RDMSR_WRMSR_INSTRUCTIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PAE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PHYSICAL_ADDRESS_EXTENSION(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MCE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_EXCEPTION(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CX8 (CMPXCHG8B) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_CMPXCHG8B(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" APIC On-Chip = %s\n", - CPUID_FEATURE_INFORMATION_EDX_APIC_ON_CHIP(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SEP (SYSENTER/EXIT) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_SYSENTER_SYSEXIT_INSTRUCTIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MTRR = %s\n", - CPUID_FEATURE_INFORMATION_EDX_MEMORY_TYPE_RANGE_REGISTERS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PGE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PAGE_GLOBAL_BIT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MCA = %s\n", - CPUID_FEATURE_INFORMATION_EDX_MACHINE_CHECK_ARCHITECTURE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CMOV = %s\n", - CPUID_FEATURE_INFORMATION_EDX_CONDITIONAL_MOVE_INSTRUCTIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PAT = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PAGE_ATTRIBUTE_TABLE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PSE-36 = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PAGE_SIZE_EXTENSION_36BIT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PSN = %s\n", - CPUID_FEATURE_INFORMATION_EDX_PROCESSOR_SERIAL_NUMBER(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CLFSH = %s\n", - CPUID_FEATURE_INFORMATION_EDX_CLFLUSH(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" DS (Debug Store) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_DEBUG_STORE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" ACPI (Thermal/Clock) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_THERMAL_CONTROL_MSRS_FOR_ACPI(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MMX = %s\n", - CPUID_FEATURE_INFORMATION_EDX_MMX_SUPPORT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" FXSR (FXSAVE/FXRSTOR) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_FXSAVE_FXRSTOR_INSTRUCTIONS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SSE = %s\n", - CPUID_FEATURE_INFORMATION_EDX_SSE_SUPPORT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SSE2 = %s\n", - CPUID_FEATURE_INFORMATION_EDX_SSE2_SUPPORT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SS (Self Snoop) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_SELF_SNOOP(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" HTT = %s\n", - CPUID_FEATURE_INFORMATION_EDX_HYPER_THREADING_TECHNOLOGY(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" TM (Thermal Monitor) = %s\n", - CPUID_FEATURE_INFORMATION_EDX_THERMAL_MONITOR(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PBE = %s\n\n", - CPUID_FEATURE_INFORMATION_EDX_PENDING_BREAK_ENABLE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - - break; - - case 0x2: - ShowMessages("==== CPUID.(EAX=02H) Legacy Cache Descriptor ====\n\n"); - ShowMessages(" This leaf is deprecated and returns legacy cache information.\n"); - ShowMessages(" Use CPUID.(EAX=04H) for deterministic cache parameters instead.\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); - break; - - case 0x3: - ShowMessages("==== CPUID.(EAX=03H) ====\n\n"); - ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); - ShowMessages(" (Was previously used for Processor Serial Number on older CPUs)\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); - break; - - case 0x4: - { - UINT32 LineSize = CPUID_EBX_SYSTEM_COHERENCY_LINE_SIZE(CpuidRequest.EBX); - UINT32 Partitions = CPUID_EBX_PHYSICAL_LINE_PARTITIONS(CpuidRequest.EBX); - UINT32 Ways = CPUID_EBX_WAYS_OF_ASSOCIATIVITY(CpuidRequest.EBX); - UINT32 Sets = CPUID_ECX_NUMBER_OF_SETS(CpuidRequest.ECX); - UINT64 CacheSizeBytes = (UINT64)(Ways + 1) * - (UINT64)(Partitions + 1) * - (UINT64)(LineSize + 1) * - (UINT64)(Sets + 1); - ShowMessages("==== CPUID.(EAX=04H) Deterministic Cache Parameters ====\n\n"); - - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidRequest.Leaf4MaxSubLeaf); - - ShowMessages("---- CPUID.(EAX=04H, ECX=%u) ----\n\n", SubFunctionId); - - // - // EAX - // - switch (CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest.EAX)) - { - case 0: - TypeName = "Null (no more caches)"; - break; - case 1: - TypeName = "Data Cache"; - break; - case 2: - TypeName = "Instruction Cache"; - break; - case 3: - TypeName = "Unified Cache"; - break; - default: - TypeName = "Reserved"; - break; - } - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" CacheTypeField = %u (%s)\n", - CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest.EAX), - TypeName); - - if (CPUID_EAX_CACHE_TYPE_FIELD(CpuidRequest.EAX) == 0) - { - ShowMessages(" (no more caches; stopping enumeration)\n\n"); - break; - } - - ShowMessages(" CacheLevel = %u\n", - CPUID_EAX_CACHE_LEVEL(CpuidRequest.EAX)); - ShowMessages(" SelfInitializingCacheLevel = %s\n", - CPUID_EAX_SELF_INITIALIZING_CACHE_LEVEL(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" FullyAssociativeCache = %s%s\n", - CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidRequest.EAX) ? "TRUE" : "FALSE", - CPUID_EAX_FULLY_ASSOCIATIVE_CACHE(CpuidRequest.EAX) ? " (fully associative)" : ""); - - ShowMessages(" MaxAddressableIds(LogicalProcs) (raw) = %u -> actual = %u (raw + 1)\n", - CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidRequest.EAX), - CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS_SHARING_THIS_CACHE(CpuidRequest.EAX) + 1); - ShowMessages(" MaxAddressableIds(Cores) (raw) = %u -> actual = %u (raw + 1)\n\n", - CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidRequest.EAX), - CPUID_EAX_MAX_ADDRESSABLE_IDS_FOR_PROCESSOR_CORES_IN_PHYSICAL_PACKAGE(CpuidRequest.EAX) + 1); - - // - // EBX - // - ShowMessages("-- EBX --\n\n"); - - ShowMessages(" SystemCoherencyLineSize (raw) = %u -> actual = %u bytes (raw + 1)\n", - LineSize, - LineSize + 1); - ShowMessages(" PhysicalLinePartitions (raw) = %u -> actual = %u (raw + 1)\n", - Partitions, - Partitions + 1); - ShowMessages(" WaysOfAssociativity (raw) = %u -> actual = %u (raw + 1)\n\n", - Ways, - Ways + 1); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - - ShowMessages(" NumberOfSets (raw) = %u -> actual = %u (raw + 1)\n\n", - Sets, - Sets + 1); - - // - // EDX - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" WriteBackInvalidate = %s\n", - CPUID_EDX_WRITE_BACK_INVALIDATE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CacheInclusiveness = %s%s\n", - CPUID_EDX_CACHE_INCLUSIVENESS(CpuidRequest.EDX) ? "TRUE" : "FALSE", - CPUID_EDX_CACHE_INCLUSIVENESS(CpuidRequest.EDX) ? " (inclusive of lower levels)" : ""); - ShowMessages(" ComplexCacheIndexing = %s%s\n\n", - CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidRequest.EDX) ? "TRUE" : "FALSE", - CPUID_EDX_COMPLEX_CACHE_INDEXING(CpuidRequest.EDX) ? " (complex/hashed indexing)" : " (direct mapped)"); - - // - // Cache Size Calculation (from spec formula) - // - ShowMessages("-- Cache Size --\n\n"); - ShowMessages(" Cache Size (per spec formula) = %llu bytes (%llu KB, %llu MB)\n\n", - (ULONG64)CacheSizeBytes, - (ULONG64)(CacheSizeBytes / 1024), - (ULONG64)(CacheSizeBytes / (1024 * 1024))); - - break; - } - case 0x5: - ShowMessages("==== CPUID.(EAX=05H) MONITOR/MWAIT Leaf ====\n\n"); - - ShowMessages(" *******************************************************\n" - " * LEAF 5 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - // - // EAX - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SmallestMonitorLineSize = %u bytes\n\n", - CPUID_EAX_SMALLEST_MONITOR_LINE_SIZE(CpuidRequest.EAX)); - - // - // EBX - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" LargestMonitorLineSize = %u bytes\n\n", - CPUID_EBX_LARGEST_MONITOR_LINE_SIZE(CpuidRequest.EBX)); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" EnumerationOfMonitorMwaitExtensions = %s\n", - CPUID_ECX_ENUMERATION_OF_MONITOR_MWAIT_EXTENSIONS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SupportsTreatingInterruptsAsBreakEventForMwait = %s\n\n", - CPUID_ECX_SUPPORTS_TREATING_INTERRUPTS_AS_BREAK_EVENT_FOR_MWAIT(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - - // - // EDX - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" NumberOfC0SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C0_SUB_C_STATES(CpuidRequest.EDX)); - ShowMessages(" NumberOfC1SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C1_SUB_C_STATES(CpuidRequest.EDX)); - ShowMessages(" NumberOfC2SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C2_SUB_C_STATES(CpuidRequest.EDX)); - ShowMessages(" NumberOfC3SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C3_SUB_C_STATES(CpuidRequest.EDX)); - ShowMessages(" NumberOfC4SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C4_SUB_C_STATES(CpuidRequest.EDX)); - ShowMessages(" NumberOfC5SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C5_SUB_C_STATES(CpuidRequest.EDX)); - ShowMessages(" NumberOfC6SubCStates = %u\n", CPUID_EDX_NUMBER_OF_C6_SUB_C_STATES(CpuidRequest.EDX)); - ShowMessages(" NumberOfC7SubCStates = %u\n\n", CPUID_EDX_NUMBER_OF_C7_SUB_C_STATES(CpuidRequest.EDX)); - - break; - - case 0x6: - ShowMessages("==== CPUID.(EAX=06H) Thermal and Power Management Leaf ====\n\n"); - - ShowMessages(" *******************************************************\n" - " * LEAF 6 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - // - // EAX - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" TemperatureSensorSupported = %s\n", - CPUID_EAX_TEMPERATURE_SENSOR_SUPPORTED(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" IntelTurboBoostTechnologyAvailable = %s\n", - CPUID_EAX_INTEL_TURBO_BOOST_TECHNOLOGY_AVAILABLE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ARAT (ApicTimerAlwaysRunning) = %s\n", - CPUID_EAX_APIC_TIMER_ALWAYS_RUNNING(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" PLN (PowerLimitNotification) = %s\n", - CPUID_EAX_POWER_LIMIT_NOTIFICATION(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ECMD (ClockModulationDuty) = %s\n", - CPUID_EAX_CLOCK_MODULATION_DUTY(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" PTM (PackageThermalManagement) = %s\n", - CPUID_EAX_PACKAGE_THERMAL_MANAGEMENT(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP Base Registers = %s\n", - CPUID_EAX_HWP_BASE_REGISTERS(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Notification = %s\n", - CPUID_EAX_HWP_NOTIFICATION(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Activity_Window = %s\n", - CPUID_EAX_HWP_ACTIVITY_WINDOW(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Energy_Performance_Preference = %s\n", - CPUID_EAX_HWP_ENERGY_PERFORMANCE_PREFERENCE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP_Package_Level_Request = %s\n", - CPUID_EAX_HWP_PACKAGE_LEVEL_REQUEST(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HDC = %s\n", - CPUID_EAX_HDC(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Intel Turbo Boost Max Technology 3.0 = %s\n", - CPUID_EAX_INTEL_TURBO_BOOST_MAX_TECHNOLOGY_3_AVAILABLE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP Capabilities = %s\n", - CPUID_EAX_HWP_CAPABILITIES(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" HWP PECI Override = %s\n", - CPUID_EAX_HWP_PECI_OVERRIDE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Flexible HWP = %s\n", - CPUID_EAX_FLEXIBLE_HWP(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Fast Access Mode for HWP Request MSR = %s\n", - CPUID_EAX_FAST_ACCESS_MODE_FOR_HWP_REQUEST_MSR(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Ignoring Idle Logical Proc HWP Request = %s\n", - CPUID_EAX_IGNORING_IDLE_LOGICAL_PROCESSOR_HWP_REQUEST(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" Intel Thread Director = %s\n\n", - CPUID_EAX_INTEL_THREAD_DIRECTOR(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - - // - // EBX - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" NumberOfInterruptThresholdsInThermalSensor = %u\n\n", - CPUID_EBX_NUMBER_OF_INTERRUPT_THRESHOLDS_IN_THERMAL_SENSOR(CpuidRequest.EBX)); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" HardwareCoordinationFeedbackCapability = %s\n", - CPUID_ECX_HARDWARE_COORDINATION_FEEDBACK_CAPABILITY(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" NumberOfIntelThreadDirectorClasses (bit) = %s\n", - CPUID_ECX_NUMBER_OF_INTEL_THREAD_DIRECTOR_CLASSES(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PerformanceEnergyBiasPreference = %u\n\n", - CPUID_ECX_PERFORMANCE_ENERGY_BIAS_PREFERENCE(CpuidRequest.ECX)); - - // - // EDX - // EDX is fully reserved for this leaf; still routed through its macro for consistency. - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); - - break; - - case 0x7: - ShowMessages("==== CPUID.(EAX=07H) Structured Extended Feature Flags ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidRequest.LeafEaxMaxSubleaf); - - if (SubFunctionId == 0) - { - ShowMessages("---- CPUID.(EAX=07H, ECX=%u) ----\n\n", SubFunctionId); - - // - // EAX - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" NumberOfSubLeaves (max ECX input) = %u\n\n", CPUID_EAX_NUMBER_OF_SUB_LEAVES(CpuidRequest.EAX)); - - // - // EBX - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" FSGSBASE = %s\n", CPUID_EBX_FSGSBASE(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" IA32_TSC_ADJUST MSR = %s\n", CPUID_EBX_IA32_TSC_ADJUST_MSR(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" SGX = %s\n", CPUID_EBX_SGX(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" BMI1 = %s\n", CPUID_EBX_BMI1(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" HLE = %s\n", CPUID_EBX_HLE(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX2 = %s\n", CPUID_EBX_AVX2(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" FDP_EXCPTN_ONLY = %s\n", CPUID_EBX_FDP_EXCPTN_ONLY(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" SMEP = %s\n", CPUID_EBX_SMEP(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" BMI2 = %s\n", CPUID_EBX_BMI2(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Enhanced REP MOVSB/STOSB = %s\n", CPUID_EBX_ENHANCED_REP_MOVSB_STOSB(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" INVPCID = %s\n", CPUID_EBX_INVPCID(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" RTM = %s\n", CPUID_EBX_RTM(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" RDT-M (Monitoring) = %s\n", CPUID_EBX_RDT_M(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Deprecates FPU CS/DS = %s\n", CPUID_EBX_DEPRECATES(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" MPX = %s\n", CPUID_EBX_MPX(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" RDT-A (Allocation) = %s\n", CPUID_EBX_RDT(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512F = %s\n", CPUID_EBX_AVX512F(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512DQ = %s\n", CPUID_EBX_AVX512DQ(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" RDSEED = %s\n", CPUID_EBX_RDSEED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" ADX = %s\n", CPUID_EBX_ADX(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" SMAP = %s\n", CPUID_EBX_SMAP(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_IFMA = %s\n", CPUID_EBX_AVX512_IFMA(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" CLFLUSHOPT = %s\n", CPUID_EBX_CLFLUSHOPT(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" CLWB = %s\n", CPUID_EBX_CLWB(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Intel Processor Trace = %s\n", CPUID_EBX_INTEL(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512PF (Xeon Phi only) = %s\n", CPUID_EBX_AVX512PF(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512ER (Xeon Phi only) = %s\n", CPUID_EBX_AVX512ER(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512CD = %s\n", CPUID_EBX_AVX512CD(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" SHA = %s\n", CPUID_EBX_SHA(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512BW = %s\n", CPUID_EBX_AVX512BW(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512VL = %s\n\n", CPUID_EBX_AVX512VL(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" PREFETCHWT1 (Xeon Phi only) = %s\n", CPUID_ECX_PREFETCHWT1(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VBMI = %s\n", CPUID_ECX_AVX512_VBMI(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" UMIP = %s\n", CPUID_ECX_UMIP(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PKU = %s\n", CPUID_ECX_PKU(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" OSPKE = %s\n", CPUID_ECX_OSPKE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" WAITPKG = %s\n", CPUID_ECX_WAITPKG(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VBMI2 = %s\n", CPUID_ECX_AVX512_VBMI2(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CET_SS (shadow stack) = %s\n", CPUID_ECX_CET_SS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" GFNI = %s\n", CPUID_ECX_GFNI(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" VAES = %s\n", CPUID_ECX_VAES(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" VPCLMULQDQ = %s\n", CPUID_ECX_VPCLMULQDQ(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VNNI = %s\n", CPUID_ECX_AVX512_VNNI(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_BITALG = %s\n", CPUID_ECX_AVX512_BITALG(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" TME_EN = %s\n", CPUID_ECX_TME_EN(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VPOPCNTDQ = %s\n", CPUID_ECX_AVX512_VPOPCNTDQ(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" LA57 (5-level paging) = %s\n", CPUID_ECX_LA57(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MAWAU (BNDLDX/BNDSTX) = %u (NOT BOOLEAN)\n", CPUID_ECX_MAWAU(CpuidRequest.ECX)); - ShowMessages(" RDPID = %s\n", CPUID_ECX_RDPID(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" KL (Key Locker) = %s\n", CPUID_ECX_KL(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CLDEMOTE = %s\n", CPUID_ECX_CLDEMOTE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MOVDIRI = %s\n", CPUID_ECX_MOVDIRI(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" MOVDIR64B = %s\n", CPUID_ECX_MOVDIR64B(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" SGX_LC (Launch Config) = %s\n", CPUID_ECX_SGX_LC(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" PKS = %s\n\n", CPUID_ECX_PKS(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - - // - // EDX - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" AVX512_4VNNIW (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4VNNIW(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_4FMAPS (Xeon Phi only) = %s\n", CPUID_EDX_AVX512_4FMAPS(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" Fast Short REP MOV = %s\n", CPUID_EDX_FAST_SHORT_REP_MOV(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" AVX512_VP2INTERSECT = %s\n", CPUID_EDX_AVX512_VP2INTERSECT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" MD_CLEAR = %s\n", CPUID_EDX_MD_CLEAR(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SERIALIZE = %s\n", CPUID_EDX_SERIALIZE(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" Hybrid part = %s\n", CPUID_EDX_HYBRID(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" PCONFIG = %s\n", CPUID_EDX_PCONFIG(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" CET_IBT (branch tracking) = %s\n", CPUID_EDX_CET_IBT(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" IBRS/IBPB = %s\n", CPUID_EDX_IBRS_IBPB(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" STIBP = %s\n", CPUID_EDX_STIBP(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" L1D_FLUSH = %s\n", CPUID_EDX_L1D_FLUSH(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" IA32_ARCH_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_ARCH_CAPABILITIES(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" IA32_CORE_CAPABILITIES MSR = %s\n", CPUID_EDX_IA32_CORE_CAPABILITIES(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - ShowMessages(" SSBD = %s\n\n", CPUID_EDX_SSBD(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - } - else - { - // - // This header only defines the EBX/ECX/EDX bitfield layout for sub-leaf - // (ECX) = 0. If the processor reports further sub-leaves, decoding them - // with the sub-leaf-0 struct would silently misinterpret the bits, so - // instead their raw dwords are printed undecoded - consistent with this - // file's rule of only reading a field through a macro that's actually - // defined for it. - // - ShowMessages(" No bitfield macros are defined for these in ia32.h, so their\n"); - ShowMessages(" raw dwords are shown without decoding:\n"); - ShowMessages(" ECX=%u: EAX=0x%08X EBX=0x%08X ECX=0x%08X EDX=0x%08X\n\n", - SubFunctionId, - CpuidRequest.EAX, - CpuidRequest.EBX, - CpuidRequest.ECX, - CpuidRequest.EDX); - } - - break; - - case 0x8: - ShowMessages("==== CPUID.(EAX=08H) ====\n\n"); - ShowMessages(" This leaf is reserved/not implemented on modern processors.\n"); - ShowMessages(" (Was previously used for Processor Serial Number on some CPUs)\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n", CpuidRequest.EDX); - break; - - case 0x9: - ShowMessages("==== CPUID.(EAX=09H) Direct Cache Access Information ====\n\n"); - - ShowMessages(" *******************************************************\n" - " * LEAF 9 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - // - // EAX mirrors IA32_PLATFORM_DCA_CAP[31:0] verbatim. ia32.h doesn't split - // it into sub-fields here (those bit meanings live in the MSR's own - // spec, not in this CPUID leaf), so it's read through its single - // whole-dword macro and shown as raw hex rather than decoded further. - // - ShowMessages(" IA32_PLATFORM_DCA_CAP (EAX, mirrors MSR 1F8H) = 0x%08X\n", - CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest.EAX)); - - // - // EBX/ECX/EDX are fully reserved for this leaf. - // - ShowMessages(" Reserved (EBX) = 0x%08X\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); - ShowMessages(" Reserved (ECX) = 0x%08X\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); - ShowMessages(" Reserved (EDX) = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); - - break; - - case 0xA: - ShowMessages("==== CPUID.(EAX=0AH) Architectural Performance Monitoring Leaf ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 10 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX) == 0) - { - // - // Per the spec: architectural perfmon is only supported if VersionId > 0. - // At version 0 the rest of this leaf isn't architecturally meaningful, so stop here - // - ShowMessages(" VersionId = 0 -> architectural performance monitoring not supported;\n" - " remaining fields in this leaf are not architecturally defined.\n\n"); - - break; - } - - // - // EAX - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" VersionId = %u\n", - CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX)); - ShowMessages(" NumberOfCountersPerLogicalProcessor = %u\n", - CPUID_EAX_NUMBER_OF_PERFORMANCE_MONITORING_COUNTER_PER_LOGICAL_PROCESSOR(CpuidRequest.EAX)); - ShowMessages(" BitWidthOfPerformanceMonitoringCounter = %u\n", - CPUID_EAX_BIT_WIDTH_OF_PERFORMANCE_MONITORING_COUNTER(CpuidRequest.EAX)); - ShowMessages(" EbxBitVectorLength = %u\n\n", - CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest.EAX)); - - // - // EBX - // - ShowMessages("-- EBX (bit = 1 means the event is NOT available) --\n\n"); - ShowMessages(" CoreCycleEventNotAvailable = %u\n", - CPUID_EBX_CORE_CYCLE_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); - ShowMessages(" InstructionRetiredEventNotAvailable = %u\n", - CPUID_EBX_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); - ShowMessages(" ReferenceCyclesEventNotAvailable = %u\n", - CPUID_EBX_REFERENCE_CYCLES_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); - ShowMessages(" LastLevelCacheReferenceEventNotAvailable = %u\n", - CPUID_EBX_LAST_LEVEL_CACHE_REFERENCE_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); - ShowMessages(" LastLevelCacheMissesEventNotAvailable = %u\n", - CPUID_EBX_LAST_LEVEL_CACHE_MISSES_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); - ShowMessages(" BranchInstructionRetiredEventNotAvailable = %u\n", - CPUID_EBX_BRANCH_INSTRUCTION_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); - ShowMessages(" BranchMispredictRetiredEventNotAvailable = %u\n\n", - CPUID_EBX_BRANCH_MISPREDICT_RETIRED_EVENT_NOT_AVAILABLE(CpuidRequest.EBX)); - - if (CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest.EAX) < 7) - { - ShowMessages(" NOTE: EbxBitVectorLength=%u (<7): bits at/after this length are not\n" - " architecturally defined on this CPU; treat them as unreliable.\n", - CPUID_EAX_EBX_BIT_VECTOR_LENGTH(CpuidRequest.EAX)); - } - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - // - // EDX: fixed-function counter fields only defined if VersionId > 1 - // - ShowMessages("-- EDX --\n\n"); - if (CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX) > 1) - { - ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u\n", - CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest.EDX)); - ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u\n\n", - CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest.EDX)); - } - else - { - ShowMessages(" NOTE: VersionId=%u (<=1): fixed-function counter fields are not\n", - CPUID_EAX_VERSION_ID_OF_ARCHITECTURAL_PERFORMANCE_MONITORING(CpuidRequest.EAX)); - ShowMessages(" architecturally defined; showing raw macro output anyway:\n"); - ShowMessages(" NumberOfFixedFunctionPerformanceCounters = %u (undefined)\n", - CPUID_EDX_NUMBER_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest.EDX)); - ShowMessages(" BitWidthOfFixedFunctionPerformanceCounters = %u (undefined)\n", - CPUID_EDX_BIT_WIDTH_OF_FIXED_FUNCTION_PERFORMANCE_COUNTERS(CpuidRequest.EDX)); - } - - ShowMessages(" AnyThreadDeprecation = %s\n\n", - CPUID_EDX_ANY_THREAD_DEPRECATION(CpuidRequest.EDX) ? "TRUE" : "FALSE"); - - break; - - case 0xB: - - // - // Check if this leaf is supported or not - // - if (!CpuidRequest.LeafBSupported) - { - ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n"); - ShowMessages(" Leaf presence check failed: CPUID.0BH:EBX[15:0] == 0 at sub-leaf 0.\n" - " This processor does not implement leaf 0BH (consider leaf 1FH instead).\n\n"); - break; - } - ShowMessages("==== CPUID.(EAX=0BH) Extended Topology Enumeration ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidRequest.LeafBMaxSubleaf); - - switch (CPUID_ECX_LEVEL_TYPE(CpuidRequest.ECX)) - { - case 0: - TypeName = "Invalid"; - break; - case 1: - TypeName = "SMT (Hyper-Threading)"; - break; - case 2: - TypeName = "Core"; - break; - default: - TypeName = "Reserved"; - break; - } - - ShowMessages("---- CPUID.(EAX=0BH, ECX=%u) ----\n\n", SubFunctionId); - - // - // ECX: Level number and type - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" LevelNumber (echoes ECX input) = %u\n", - CPUID_ECX_LEVEL_NUMBER(CpuidRequest.ECX)); - ShowMessages(" LevelType = %u (%s)\n\n", - CPUID_ECX_LEVEL_TYPE(CpuidRequest.ECX), - TypeName); - // - // EAX: Shift count - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" X2ApicIdToUniqueTopologyIdShift = %u\n\n", - CPUID_EAX_X2APIC_ID_TO_UNIQUE_TOPOLOGY_ID_SHIFT(CpuidRequest.EAX)); - - // - // EBX: Number of logical processors (diagnostic only) - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" NumberOfLogicalProcessorsAtThisLevelType = %u (DIAGNOSTIC ONLY - do not use for topology enumeration)\n\n", - CPUID_EBX_NUMBER_OF_LOGICAL_PROCESSORS_AT_THIS_LEVEL_TYPE(CpuidRequest.EBX)); - - // - // EDX: x2APIC ID (constant across all sub-leaves) - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" X2ApicId (current logical processor) = %u\n\n", - CPUID_EDX_X2APIC_ID(CpuidRequest.EDX)); - - break; - - case 0xC: - ShowMessages("==== CPUID.(EAX=0CH) ====\n\n"); - ShowMessages(" This leaf is reserved (not implemented).\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); - break; - - case 0xD: - ShowMessages("==== CPUID.(EAX=0DH) Processor Extended State Enumeration ====\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = 62 *\n" - " *******************************************************\n\n"); - - if (SubFunctionId == 0) - { - ShowMessages("-- EAX (XCR0 lower 32 bits) --\n\n"); - ShowMessages(" X87State (bit 0) = %s\n", CPUID_EAX_X87_STATE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" SSEState (bit 1) = %s\n", CPUID_EAX_SSE_STATE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" AVXState (bit 2) = %s\n", CPUID_EAX_AVX_STATE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" MPXState (bits 4:3) = %u\n", CPUID_EAX_MPX_STATE(CpuidRequest.EAX)); - ShowMessages(" AVX512State (bits 7:5) = %u\n", CPUID_EAX_AVX_512_STATE(CpuidRequest.EAX)); - ShowMessages(" UsedForIa32Xss1 (bit 8) = %s\n", CPUID_EAX_USED_FOR_IA32_XSS_1(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" PKRUState (bit 9) = %s\n", CPUID_EAX_PKRU_STATE(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" UsedForIa32Xss2 (bit 13) = %s\n\n", CPUID_EAX_USED_FOR_IA32_XSS_2(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" MaxSizeRequiredByEnabledFeaturesInXcr0 = %u bytes\n\n", - CPUID_EBX_MAX_SIZE_REQUIRED_BY_ENABLED_FEATURES_IN_XCR0(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" MaxSizeOfXsaveXrstorSaveArea = %u bytes\n\n", - CPUID_ECX_MAX_SIZE_OF_XSAVE_XRSTOR_SAVE_AREA(CpuidRequest.ECX)); - ShowMessages("-- EDX (XCR0 upper 32 bits) --\n\n"); - ShowMessages(" Xcr0SupportedBits (bits 63:32 of XCR0) = 0x%08X\n\n", - CPUID_EDX_XCR0_SUPPORTED_BITS(CpuidRequest.EDX)); - } - - else if (SubFunctionId == 1) - { - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SupportsXsavecAndCompactedXrstor (XSAVEC) = %s\n", - CPUID_EAX_SUPPORTS_XSAVEC_AND_COMPACTED_XRSTOR(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" SupportsXgetbvWithEcx1 = %s\n", - CPUID_EAX_SUPPORTS_XGETBV_WITH_ECX_1(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" SupportsXsaveXrstorAndIa32Xss (XSAVES) = %s\n\n", - CPUID_EAX_SUPPORTS_XSAVE_XRSTOR_AND_IA32_XSS(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" SizeOfXsaveArea (XCR0 | IA32_XSS enabled) = %u bytes\n", - CPUID_EBX_SIZE_OF_XSAVE_AREAD(CpuidRequest.EBX)); - - ShowMessages("-- ECX (IA32_XSS lower 32 bits) --\n\n"); - ShowMessages(" UsedForXcr01 (bits 7:0) = 0x%02X\n", - CPUID_ECX_USED_FOR_XCR0_1(CpuidRequest.ECX)); - ShowMessages(" PtState (bit 8) = %s\n", - CPUID_ECX_PT_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" UsedForXcr02 (bit 9) = %s\n", - CPUID_ECX_USED_FOR_XCR0_2(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CetUserState (bit 11) = %s\n", - CPUID_ECX_CET_USER_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" CetSupervisorState (bit 12) = %s\n", - CPUID_ECX_CET_SUPERVISOR_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" HdcState (bit 13) = %s\n", - CPUID_ECX_HDC_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" LbrState (bit 15) = %s\n", - CPUID_ECX_LBR_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" HwpState (bit 16) = %s\n\n", - CPUID_ECX_HWP_STATE(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EDX (IA32_XSS upper 32 bits) --\n\n"); - ShowMessages(" SupportedUpperIa32XssBits (bits 63:32) = 0x%08X\n\n", - CPUID_EDX_SUPPORTED_UPPER_IA32_XSS_BITS(CpuidRequest.EDX)); - } - - else if (SubFunctionId >= 2) - { - // - // Check if the user input is valid - // Need to check both XCR0 and IA32_XSS vectors - // - UINT64 ValidBits = CpuidRequest.XCR0Vector | CpuidRequest.IA32_XSS_Vector; - - // - // Validate if this sub-leaf is supported - // - if (((ValidBits >> SubFunctionId) & (UINT64)1) == 0) - { - ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); - ShowMessages(" Valid sub-leaves are those with bits set in:\n"); - ShowMessages(" XCR0 vector: 0x%016llX\n", (ULONG64)CpuidRequest.XCR0Vector); - ShowMessages(" IA32_XSS vector: 0x%016llX\n", (ULONG64)CpuidRequest.IA32_XSS_Vector); - ShowMessages(" Combined vector: 0x%016llX\n\n", (ULONG64)ValidBits); - - break; - } - - ShowMessages("-- State Component Information --\n\n"); - ShowMessages(" SaveAreaSize (EAX) = %u bytes\n", - CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest.EAX)); - ShowMessages(" SaveAreaOffset (EBX) = %u bytes\n", - CPUID_EBX_RESERVED(CpuidRequest.EBX)); - ShowMessages(" ManagedViaIa32Xss (ECX bit 0) = %u (%s)\n", - CPUID_ECX_ECX_2(CpuidRequest.ECX), - CPUID_ECX_ECX_2(CpuidRequest.ECX) ? "IA32_XSS" : "XCR0"); - ShowMessages(" Aligned64ByteBoundary (ECX bit 1) = %u%s\n", - CPUID_ECX_ECX_1(CpuidRequest.ECX), - CPUID_ECX_ECX_1(CpuidRequest.ECX) ? " (next 64-byte boundary)" : " (immediately following)"); - ShowMessages(" Reserved (EDX) = 0x%08X\n\n", - CPUID_EDX_RESERVED(CpuidRequest.EDX)); - } - - break; - - case 0xE: - ShowMessages("==== CPUID.(EAX=0EH) ====\n\n"); - ShowMessages(" This leaf is reserved (not implemented).\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); - break; - - case 0xF: // 0xF = 15 (decimal); CPUID_INTEL_RESOURCE_DIRECTOR_TECHNOLOGY_MONITORING_INFORMATION - ShowMessages("==== CPUID.(EAX=0FH) Intel RDT Monitoring ====\n\n"); - ShowMessages(" This leaf is not yet implemented in HyperDbg.\n"); - ShowMessages(" (Intel Resource Director Technology - Monitoring)\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); - break; - - case 0x10: - ShowMessages("==== CPUID.(EAX=10H, ECX=%u) Intel RDT Allocation Information ====\n\n", SubFunctionId); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = 3 *\n" - " *******************************************************\n\n"); - - if (SubFunctionId == 0) - { - // - // Resource type enumeration - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Ia32PlatformDcaCap = 0x%08X\n\n", - CPUID_EAX_IA32_PLATFORM_DCA_CAP(CpuidRequest.EAX)); - - // - // EBX - // - ShowMessages("-- EBX (Supported Allocation Types) --\n\n"); - ShowMessages(" Raw value = 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" L3 Cache Allocation (bit 1) = %s\n", - CPUID_EBX_SUPPORTS_L3_CACHE_ALLOCATION_TECHNOLOGY(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" L2 Cache Allocation (bit 2) = %s\n", - CPUID_EBX_SUPPORTS_L2_CACHE_ALLOCATION_TECHNOLOGY(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Memory Bandwidth Allocation (bit 3) = %s\n\n", - CPUID_EBX_SUPPORTS_MEMORY_BANDWIDTH_ALLOCATION(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - - // - // ECX - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - // - // EDX - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); - } - - else if (SubFunctionId == 1) - { - // - // L3 cache allocation - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", - CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest.EAX), - CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest.EAX) + 1); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" CodeAndDataPriorizationTechnologySupported = %s%s\n\n", - CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidRequest.ECX) ? "TRUE" : "FALSE", - CPUID_ECX_CODE_AND_DATA_PRIORIZATION_TECHNOLOGY_SUPPORTED(CpuidRequest.ECX) ? " (CDP supported)" : ""); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX), - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX) + 1); - } - - else if (SubFunctionId == 2) - { - // - // Sub-leaf 2 (L2 Cache Allocation) - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" LengthOfCapacityBitMask (minus-one) = %u (actual = %u bits)\n\n", - CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest.EAX), - CPUID_EAX_LENGTH_OF_CAPACITY_BIT_MASK(CpuidRequest.EAX) + 1); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Bit-granular map = 0x%08X\n\n", CPUID_EBX_EBX_0(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX), - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX) + 1); - } - - else if (SubFunctionId == 3) - { - // - // Sub-leaf 3 (Memory Bandwidth Allocation) - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxMbaThrottlingValue (minus-one) = %u (actual = %u)\n\n", - CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidRequest.EAX), - CPUID_EAX_MAX_MBA_THROTTLING_VALUE(CpuidRequest.EAX) + 1); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" ResponseOfDelayIsLinear = %s%s\n", - CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidRequest.ECX) ? "TRUE" : "FALSE", - CPUID_ECX_RESPONSE_OF_DELAY_IS_LINEAR(CpuidRequest.ECX) ? " (linear response)" : " (non-linear)\n\n"); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" HighestCosNumberSupported = %u (actual = %u COS)\n\n", - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX), - CPUID_EDX_HIGHEST_COS_NUMBER_SUPPORTED(CpuidRequest.EDX) + 1); - } - - else - { - ShowMessages(" Sub-leaf %u is NOT supported on this CPU\n", SubFunctionId); - ShowMessages(" raw bytes: EAX = %u\n EBX = %u\n ECX = %u\n EDX = %u\n\n", - CpuidRequest.EAX, - CpuidRequest.EBX, - CpuidRequest.ECX, - CpuidRequest.EDX); - } - - break; - - case 0x11: - ShowMessages("==== CPUID.(EAX=11H) ====\n\n"); - ShowMessages(" This leaf is reserved (not implemented).\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); - break; - - case 0x12: - { - // - // SGX, not DAT. 0x12 = 18 (decimal) - // - ShowMessages("==== CPUID.(EAX=12H) Intel SGX Information ====\n\n"); - - if (!CpuidRequest.Leaf12Supported) - { - ShowMessages(" SGX is not supported on this CPU (CPUID.7H:EBX[2] = 0).\n\n"); - break; - } - - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidRequest.Leaf12MaxSubLeaf); - - if (SubFunctionId == 0) - { - // - // SGX capabilities - // - ShowMessages("-- EAX (SGX Capabilities) --\n\n"); - ShowMessages(" SGX1 Support (bit 0) = %s\n", - CPUID_EAX_SGX1(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" SGX2 Support (bit 1) = %s\n", - CPUID_EAX_SGX2(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ENCLV Advanced (bit 5) = %s\n", - CPUID_EAX_SGX_ENCLV_ADVANCED(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - ShowMessages(" ENCLS Advanced (bit 6) = %s\n\n", - CPUID_EAX_SGX_ENCLS_ADVANCED(CpuidRequest.EAX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EBX (MISCSELECT - Extended SGX Features) --\n\n"); - ShowMessages(" Miscselect = 0x%08X\n\n", - CPUID_EBX_MISCSELECT(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - ShowMessages("-- EDX (Maximum Enclave Sizes) --\n\n"); - ShowMessages(" MaxEnclaveSizeNot64 = %u (2^%u = %llu bytes)\n", - CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest.EDX), - CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest.EDX), - (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_NOT64(CpuidRequest.EDX))); - ShowMessages(" MaxEnclaveSize64 = %u (2^%u = %llu bytes)\n\n", - CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest.EDX), - CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest.EDX), - (ULONG64)(1ULL << CPUID_EDX_MAX_ENCLAVE_SIZE_64(CpuidRequest.EDX))); - } - - else if (SubFunctionId == 1) - { - // - // SGX attributes - // - ShowMessages("-- EAX (SECS.ATTRIBUTES[31:0]) --\n\n"); - ShowMessages(" ValidSecsAttributes0 = 0x%08X\n\n", - CPUID_EAX_VALID_SECS_ATTRIBUTES_0(CpuidRequest.EAX)); - - ShowMessages("-- EBX (SECS.ATTRIBUTES[63:32]) --\n\n"); - ShowMessages(" ValidSecsAttributes1 = 0x%08X\n\n", - CPUID_EBX_VALID_SECS_ATTRIBUTES_1(CpuidRequest.EBX)); - - ShowMessages("-- ECX (SECS.ATTRIBUTES[95:64]) --\n\n"); - ShowMessages(" ValidSecsAttributes2 = 0x%08X\n\n", - CPUID_ECX_VALID_SECS_ATTRIBUTES_2(CpuidRequest.ECX)); - - ShowMessages("-- EDX (SECS.ATTRIBUTES[127:96]) --\n\n"); - ShowMessages(" ValidSecsAttributes3 = 0x%08X\n\n", - CPUID_EDX_VALID_SECS_ATTRIBUTES_3(CpuidRequest.EDX)); - } - - else - { - // - // Subleaf 2+ (EPC sections) - // - if (CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX) == 0) - { - // - // Type 0: invalid subleaf - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SubLeafType = %u (Invalid - no EPC section)\n", - CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX)); - - ShowMessages("\n-- EBX --\n"); - ShowMessages(" Zero = 0x%08X\n", CPUID_EBX_ZERO(CpuidRequest.EBX)); - - ShowMessages("\n-- ECX --\n"); - ShowMessages(" Zero = 0x%08X\n", CPUID_ECX_ZERO(CpuidRequest.ECX)); - - ShowMessages("\n-- EDX --\n"); - ShowMessages(" Zero = 0x%08X\n", CPUID_EDX_ZERO(CpuidRequest.EDX)); - } - - else if (CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX) == 1) - { - // - // Reconstruct base address from EAX and EBX - // - UINT64 BaseLow = (UINT64)CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidRequest.EAX); - UINT64 BaseHigh = (UINT64)CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidRequest.EBX); - UINT64 BaseAddress = (BaseHigh << 32) | (BaseLow << 12); - - // - // Reconstruct size from ECX and EDX - // - UINT64 SizeLow = (UINT64)CPUID_ECX_EPC_SIZE_1(CpuidRequest.ECX); - UINT64 SizeHigh = (UINT64)CPUID_EDX_EPC_SIZE_2(CpuidRequest.EDX); - UINT64 SizeBytes = (SizeHigh << 32) | (SizeLow << 12); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SubLeafType = %u (EPC Section)\n", - CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX)); - ShowMessages(" EpcBasePhysicalAddress1 (bits 31:12) = 0x%05X\n\n", - CPUID_EAX_EPC_BASE_PHYSICAL_ADDRESS_1(CpuidRequest.EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" EpcBasePhysicalAddress2 (bits 51:32) = 0x%05X\n\n", - CPUID_EBX_EPC_BASE_PHYSICAL_ADDRESS_2(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" EpcSectionProperty = %u", - CPUID_ECX_EPC_SECTION_PROPERTY(CpuidRequest.ECX)); - switch (CPUID_ECX_EPC_SECTION_PROPERTY(CpuidRequest.ECX)) - { - case 0: - ShowMessages(" (No confidentiality/integrity)\n\n"); - break; - case 1: - ShowMessages(" (Confidentiality and integrity protection)\n\n"); - break; - default: - ShowMessages(" (Reserved)\n\n"); - break; - } - ShowMessages(" EpcSize1 (bits 31:12) = 0x%05X\n\n", - CPUID_ECX_EPC_SIZE_1(CpuidRequest.ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" EpcSize2 (bits 51:32) = 0x%05X\n\n", - CPUID_EDX_EPC_SIZE_2(CpuidRequest.EDX)); - - ShowMessages("-- EPC Section Information --\n\n"); - ShowMessages(" Base Address = 0x%016llX\n", (ULONG64)BaseAddress); - ShowMessages(" Size = 0x%016llX bytes (%llu MB)\n\n", - (ULONG64)SizeBytes, - (ULONG64)(SizeBytes / (1024 * 1024))); - } - - else - { - // - // Unknown subleaf type (reserved) - // - ShowMessages("-- Raw Data for Sub-leaf %u (Type %u) --\n\n", - SubFunctionId, - CPUID_EAX_SUB_LEAF_TYPE(CpuidRequest.EAX)); - - ShowMessages(" EAX = 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX = 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX = 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX = 0x%08X\n\n", CpuidRequest.EDX); - ShowMessages(" Note: Reserved sub-leaf type. Please refer to the latest Intel SDM.\n\n"); - } - } - - break; - } - - case 0x13: - ShowMessages("==== CPUID.(EAX=13H) ====\n\n"); - ShowMessages(" This leaf is reserved (not implemented).\n\n"); - ShowMessages(" Raw data:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); - break; - - case 0x14: - ShowMessages("==== CPUID.(EAX=14H) Intel Processor Trace Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidRequest.LeafEaxMaxSubleaf); - - ShowMessages("==== CPUID.(EAX=14H, ECX=%u) Intel Processor Trace Information ====\n\n", SubFunctionId); - - if (SubFunctionId == 0) - { - // - // main leaf - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxSubLeaf = %u\n\n", - CPUID_EAX_MAX_SUB_LEAF(CpuidRequest.EAX)); - - ShowMessages("-- EBX (Supported Features) --\n\n"); - ShowMessages(" CR3Filter support (bit 0) = %s\n", - CPUID_EBX_FLAG0(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Configurable PSB & Cycle-Accurate (bit 1) = %s\n", - CPUID_EBX_FLAG1(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" IP Filtering & TraceStop (bit 2) = %s\n", - CPUID_EBX_FLAG2(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" MTC & COFI suppression (bit 3) = %s\n", - CPUID_EBX_FLAG3(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PTWRITE support (bit 4) = %s\n", - CPUID_EBX_FLAG4(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Power Event Trace (bit 5) = %s\n", - CPUID_EBX_FLAG5(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PSB/PMI preservation (bit 6) = %s\n", - CPUID_EBX_FLAG6(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Event Trace (bit 7) = %s\n", - CPUID_EBX_FLAG7(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Disable TNT (bit 8) = %s\n\n", - CPUID_EBX_FLAG8(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - - ShowMessages("-- ECX (Output Schemes) --\n\n"); - ShowMessages(" ToPA output scheme (bit 0) = %s\n", - CPUID_ECX_FLAG0(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" ToPA tables with any entries (bit 1) = %s\n", - CPUID_ECX_FLAG1(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" Single-Range Output scheme (bit 2) = %s\n", - CPUID_ECX_FLAG2(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" Trace Transport subsystem (bit 3) = %s\n", - CPUID_ECX_FLAG3(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - ShowMessages(" LIP values include CS base (bit 31) = %s\n\n", - CPUID_ECX_FLAG31(CpuidRequest.ECX) ? "TRUE" : "FALSE"); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_EDX_RESERVED(CpuidRequest.EDX)); - } - - else if (SubFunctionId == 1) - { - // - // Packet generation - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" NumberOfConfigurableAddressRangesForFiltering = %u\n", - CPUID_EAX_NUMBER_OF_CONFIGURABLE_ADDRESS_RANGES_FOR_FILTERING(CpuidRequest.EAX)); - ShowMessages(" BitmapOfSupportedMtcPeriodEncodings = 0x%04X\n\n", - CPUID_EAX_BITMAP_OF_SUPPORTED_MTC_PERIOD_ENCODINGS(CpuidRequest.EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" BitmapOfSupportedCycleThresholdValueEncodings = 0x%04X\n", - CPUID_EBX_BITMAP_OF_SUPPORTED_CYCLE_THRESHOLD_VALUE_ENCODINGS(CpuidRequest.EBX)); - ShowMessages(" BitmapOfSupportedConfigurablePsbFrequencyEncodings = 0x%04X\n\n", - CPUID_EBX_BITMAP_OF_SUPPORTED_CONFIGURABLE_PSB_FREQUENCY_ENCODINGS(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_EDX_RESERVED(CpuidRequest.EDX)); - } - - else - { - // - // Subleaves > 1 (if they exist) - // - ShowMessages("-- Raw Data for Sub-leaf %u --\n\n", SubFunctionId); - ShowMessages(" EAX = 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX = 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX = 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX = 0x%08X\n\n", CpuidRequest.EDX); - ShowMessages(" Note: This sub-leaf may be for future Intel PT features.\n"); - ShowMessages(" Please refer to the latest Intel SDM for interpretation.\n\n"); - } - - break; - - case 0x15: - { - ShowMessages("==== CPUID.(EAX=15H) TSC and Core Crystal Clock Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 15h HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - // - // EAX: Denominator - // - UINT32 Denominator = CPUID_EAX_DENOMINATOR(CpuidRequest.EAX); - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Denominator = %u\n\n", Denominator); - - // - // EBX: Numerator - // - UINT32 Numerator = CPUID_EBX_NUMERATOR(CpuidRequest.EBX); - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Numerator = %u\n\n", Numerator); - - // - // ECX: Nominal frequency (if available) - // - UINT32 NominalFreq = CPUID_ECX_NOMINAL_FREQUENCY(CpuidRequest.ECX); - ShowMessages("-- ECX --\n\n"); - ShowMessages(" NominalFrequency = %u Hz", NominalFreq); - if (NominalFreq > 0) - { - ShowMessages(" (%u MHz, %u GHz)\n", - NominalFreq / 1000000, - NominalFreq / 1000000000); - } - else - { - ShowMessages(" (not enumerated)\n\n"); - } - - // - // EDX: reserved - // - ShowMessages("\n-- EDX --\n"); - ShowMessages(" Reserved = 0x%08X\n", - CPUID_EDX_RESERVED(CpuidRequest.EDX)); - - // - // Calculate and display TSC frequency if possible - // - ShowMessages("-- TSC Frequency Information --\n\n"); - - if (Denominator == 0 || Numerator == 0) - { - ShowMessages(" TSC ratio not enumerated (denominator or numerator is 0)\n\n"); - } - - else - { - ShowMessages(" TSC / Core Crystal Clock ratio = %u / %u\n", - Numerator, - Denominator); - ShowMessages(" TSC frequency = Core Crystal Clock * (%u/%u)\n", - Numerator, - Denominator); - if (NominalFreq > 0) - { - UINT64 TSCFreqHz = (UINT64)NominalFreq * Numerator / Denominator; - ShowMessages(" TSC frequency = %llu Hz (%llu MHz, %llu GHz)\n\n", - (ULONG64)TSCFreqHz, - (ULONG64)(TSCFreqHz / 1000000), - (ULONG64)(TSCFreqHz / 1000000000)); - } - else - { - ShowMessages(" TSC frequency cannot be calculated (nominal frequency not enumerated)\n\n"); - } - } - - break; - } - - case 0x16: - { - ShowMessages("==== CPUID.(EAX=16H) Processor Frequency Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 16h HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - // - // EAX: Processor base frequency - // - UINT32 BaseFreq = CPUID_EAX_PROCESOR_BASE_FREQUENCY_MHZ(CpuidRequest.EAX); - ShowMessages("-- EAX --\n\n"); - if (BaseFreq == 0) - { - ShowMessages(" ProcessorBaseFrequencyMhz = 0 (not supported)\n\n"); - } - else - { - ShowMessages(" ProcessorBaseFrequencyMhz = %u MHz\n", BaseFreq); - } - - // - // EBX: Maximum frequency - // - UINT32 MaxFreq = CPUID_EBX_PROCESSOR_MAXIMUM_FREQUENCY_MHZ(CpuidRequest.EBX); - ShowMessages("-- EBX --\n\n"); - if (MaxFreq == 0) - { - ShowMessages(" ProcessorMaximumFrequencyMhz = 0 (not supported)\n\n"); - } - else - { - ShowMessages(" ProcessorMaximumFrequencyMhz = %u MHz\n", MaxFreq); - } - - // - // ECX: Bus (reference) frequency - // - UINT32 BusFreq = CPUID_ECX_BUS_FREQUENCY_MHZ(CpuidRequest.ECX); - ShowMessages("-- ECX --\n\n"); - if (BusFreq == 0) - { - ShowMessages(" BusFrequencyMhz = 0 (not supported)\n\n"); - } - else - { - ShowMessages(" BusFrequencyMhz = %u MHz\n\n", BusFreq); - } - - // - // EDX: reserved - // - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", - CPUID_EDX_RESERVED(CpuidRequest.EDX)); - - // - // Display summary - // - ShowMessages("-- Frequency Summary --\n\n"); - ShowMessages(" Base Frequency: "); - if (BaseFreq == 0) - { - ShowMessages("Not Supported\n"); - } - else - { - ShowMessages("%u MHz\n", BaseFreq); - } - - // - // Maximum frequency - // - ShowMessages(" Maximum Frequency: "); - if (MaxFreq == 0) - { - ShowMessages("Not Supported\n"); - } - else - { - ShowMessages("%u MHz\n", MaxFreq); - } - - // - // Bus frequency - // - ShowMessages(" Bus Frequency: "); - if (BusFreq == 0) - { - ShowMessages("Not Supported\n"); - } - else - { - ShowMessages("%u MHz\n\n", BusFreq); - } - - // - // Show turbo boost if both base and max are supported and max > base - // - if (BaseFreq > 0 && MaxFreq > 0 && MaxFreq > BaseFreq) - { - UINT32 TurboBoost = MaxFreq - BaseFreq; - FLOAT TurboPercent = ((FLOAT)TurboBoost / BaseFreq) * 100.0f; - ShowMessages(" Turbo Boost: %u MHz above base (%.1f%% increase)\n\n", - TurboBoost, - TurboPercent); - } - - ShowMessages(" *******************************************************\n"); - ShowMessages(" * NOTE: These values are for display purposes only *\n"); - ShowMessages(" * They do not reflect actual running frequencies *\n"); - ShowMessages(" * Actual frequencies depend on workload, power, etc. *\n"); - ShowMessages(" *******************************************************\n\n"); - - break; - } - - case 0x17: - { - ShowMessages("==== CPUID.(EAX=17H) SoC Vendor Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CPUID_EAX_MAX_SOC_ID_INDEX(CpuidRequest.EAX)); - - ShowMessages("==== CPUID.(EAX=17H, ECX=%u) SoC Vendor Information ====\n\n", SubFunctionId); - - if (SubFunctionId == 0) - { - // - // Main - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxSocIdIndex = %u\n\n", CPUID_EAX_MAX_SOC_ID_INDEX(CpuidRequest.EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" SocVendorId = 0x%04X\n", - CPUID_EBX_SOC_VENDOR_ID(CpuidRequest.EBX)); - ShowMessages(" IsVendorScheme = %s\n\n", - CPUID_EBX_IS_VENDOR_SCHEME(CpuidRequest.EBX) ? "TRUE (Industry Standard)" : "FALSE (Intel Assigned)"); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" ProjectId = 0x%08X\n\n", - CPUID_ECX_PROJECT_ID(CpuidRequest.ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" SteppingId = 0x%08X\n\n", - CPUID_EDX_STEPPING_ID(CpuidRequest.EDX)); - } - - else if (SubFunctionId >= 1 && SubFunctionId <= 3) - { - // - // subleaves 1-3 (brand string) - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" SocVendorBrandString[0..3] = 0x%08X (%c%c%c%c)\n\n", - CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX), - (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX) >> 0) & 0xFF, - (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX) >> 8) & 0xFF, - (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX) >> 16) & 0xFF, - (CPUID_EAX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EAX) >> 24) & 0xFF); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" SocVendorBrandString[4..7] = 0x%08X (%c%c%c%c)\n\n", - CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX), - (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX) >> 0) & 0xFF, - (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX) >> 8) & 0xFF, - (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX) >> 16) & 0xFF, - (CPUID_EBX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EBX) >> 24) & 0xFF); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" SocVendorBrandString[8..11] = 0x%08X (%c%c%c%c)\n\n", - CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX), - (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX) >> 0) & 0xFF, - (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX) >> 8) & 0xFF, - (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX) >> 16) & 0xFF, - (CPUID_ECX_SOC_VENDOR_BRAND_STRING(CpuidRequest.ECX) >> 24) & 0xFF); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" SocVendorBrandString[12..15] = 0x%08X (%c%c%c%c)\n\n", - CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX), - (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 0) & 0xFF, - (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 8) & 0xFF, - (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 16) & 0xFF, - (CPUID_EDX_SOC_VENDOR_BRAND_STRING(CpuidRequest.EDX) >> 24) & 0xFF); - } - - else - { - // - // Sub-leaves > MaxSOCID_Index (Reserved, should return all zeros) - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); - } - break; - } - - case 0x18: - // - // DAT, 0x18 = 24 (decimal) - // - ShowMessages("==== CPUID.(EAX=18H) Deterministic Address Translation Parameters ====\n\n"); - ShowMessages(" *******************************************************\n" - " * Max NumberOfSubLeaves = %u *\n" - " *******************************************************\n\n", - CpuidRequest.LeafEaxMaxSubleaf); - - ShowMessages("==== CPUID.(EAX=18H, ECX=%u) Deterministic Address Translation Parameters ====\n\n", SubFunctionId); - - if (SubFunctionId == 0) - { - // - // main - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxSubLeaf = %u\n\n", CPUID_EAX_MAX_SUB_LEAF(CpuidRequest.EAX)); - - // - // EBX: Page size support and associativity - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" PageEntries4KbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries2MbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries4MbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries1GbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Partitioning = %u%s\n", - CPUID_EBX_PARTITIONING(CpuidRequest.EBX), - CPUID_EBX_PARTITIONING(CpuidRequest.EBX) == 0 ? " (soft partitioning)" : ""); - ShowMessages(" WaysOfAssociativity (W) = %u\n\n", - CPUID_EBX_WAYS_OF_ASSOCIATIVITY_00(CpuidRequest.EBX)); - - // - // ECX: Number of Sets - // - ShowMessages("-- ECX --\n\n"); - ShowMessages(" NumberOfSets = %u\n\n", - CPUID_ECX_NUMBER_OF_SETS(CpuidRequest.ECX)); - - // - // EDX: Translation cache type and properties - // - ShowMessages("-- EDX --\n\n"); - - switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX)) - { - case 0: - TypeName = "Null (sub-leaf not valid)"; - break; - case 1: - TypeName = "Data TLB"; - break; - case 2: - TypeName = "Instruction TLB"; - break; - case 3: - TypeName = "Unified TLB"; - break; - default: - TypeName = "Reserved"; - break; - } - ShowMessages(" TranslationCacheTypeField = %u (%s)\n", - CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX), - TypeName); - ShowMessages(" TranslationCacheLevel = %u\n", - CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidRequest.EDX)); - ShowMessages(" FullyAssociativeStructure = %s%s\n", - CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest.EDX) ? "TRUE" : "FALSE", - CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest.EDX) ? " (fully associative)" : ""); - - ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", - CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX), - CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX) + 1); - } - - else - { - // - // subleaves >= 1 (Translation Structure Information) - // - - // - // Check if this sub-leaf is valid (EDX[4:0] != 0) - // - if (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX) == 0) - { - ShowMessages(" Sub-leaf %u is invalid (TranslationCacheTypeField = 0)\n", SubFunctionId); - ShowMessages(" All registers should be zero according to spec:\n"); - ShowMessages(" EAX = 0x%08X\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); - ShowMessages(" EBX = 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX = 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX = 0x%08X\n", CpuidRequest.EDX); - } - - else - { - // - // EAX: Reserved for sub-leaves >= 1 - // - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); - - // - // EBX: Page size support and associativity - // - ShowMessages("-- EBX --\n\n"); - ShowMessages(" PageEntries4KbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_4KB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries2MbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_2MB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries4MbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_4MB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" PageEntries1GbSupported = %s\n", - CPUID_EBX_PAGE_ENTRIES_1GB_SUPPORTED(CpuidRequest.EBX) ? "TRUE" : "FALSE"); - ShowMessages(" Partitioning = %u%s\n", - CPUID_EBX_PARTITIONING(CpuidRequest.EBX), - CPUID_EBX_PARTITIONING(CpuidRequest.EBX) == 0 ? " (soft partitioning)" : ""); - ShowMessages(" WaysOfAssociativity (W) = %u\n\n", - CPUID_EBX_WAYS_OF_ASSOCIATIVITY_01(CpuidRequest.EBX)); - - // ECX: Number of Sets - ShowMessages("-- ECX --\n\n"); - ShowMessages(" NumberOfSets = %u\n\n", - CPUID_ECX_NUMBER_OF_SETS(CpuidRequest.ECX)); - - // EDX: Translation cache type and properties - ShowMessages("-- EDX --\n\n"); - switch (CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX)) - { - case 0: - TypeName = "Null (sub-leaf not valid)"; - break; - case 1: - TypeName = "Data TLB"; - break; - case 2: - TypeName = "Instruction TLB"; - break; - case 3: - TypeName = "Unified TLB"; - break; - default: - TypeName = "Reserved"; - break; - } - ShowMessages(" TranslationCacheTypeField = %u (%s)\n", - CPUID_EDX_TRANSLATION_CACHE_TYPE_FIELD(CpuidRequest.EDX), - TypeName); - ShowMessages(" TranslationCacheLevel = %u\n", - CPUID_EDX_TRANSLATION_CACHE_LEVEL(CpuidRequest.EDX)); - ShowMessages(" FullyAssociativeStructure = %s%s\n", - CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest.EDX) ? "TRUE" : "FALSE", - CPUID_EDX_FULLY_ASSOCIATIVE_STRUCTURE(CpuidRequest.EDX) ? " (fully associative)" : ""); - - ShowMessages(" MaxAddressableIdsForLogicalProcessors (raw) = %u -> actual = %u (raw + 1)\n", - CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX), - CPUID_EDX_MAX_ADDRESSABLE_IDS_FOR_LOGICAL_PROCESSORS(CpuidRequest.EDX) + 1); - } - } - - break; - - case 0x80000000: - ShowMessages("==== CPUID.(EAX=80000000H) Extended Function Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000000 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" MaxExtendedFunctions = 0x%08X (%u)\n\n", - CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest.EAX), - CPUID_EAX_MAX_EXTENDED_FUNCTIONS(CpuidRequest.EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); - - break; - - case 0x80000001: - ShowMessages("==== CPUID.(EAX=80000001H) Extended CPU Signature ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000001 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" LAHF/SAHF Available in 64-bit Mode = %s\n", - CPUID_ECX_LAHF_SAHF_AVAILABLE_IN_64_BIT_MODE(CpuidRequest.ECX) ? "True" : "False"); - ShowMessages(" LZCNT = %s\n", - CPUID_ECX_LZCNT(CpuidRequest.ECX) ? "True" : "False"); - ShowMessages(" PREFETCHW = %s\n\n", - CPUID_ECX_PREFETCHW(CpuidRequest.ECX) ? "True" : "False"); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" SYSCALL/SYSRET Available in 64-bit Mode = %s\n", - CPUID_EDX_SYSCALL_SYSRET_AVAILABLE_IN_64_BIT_MODE(CpuidRequest.EDX) ? "True" : "False"); - ShowMessages(" Execute Disable Bit Available = %s\n", - CPUID_EDX_EXECUTE_DISABLE_BIT_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); - ShowMessages(" 1-GByte Pages Available = %s\n", - CPUID_EDX_PAGES_1GB_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); - ShowMessages(" RDTSCP Available = %s\n", - CPUID_EDX_RDTSCP_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); - ShowMessages(" Intel 64 Architecture Available = %s\n\n", - CPUID_EDX_IA64_AVAILABLE(CpuidRequest.EDX) ? "True" : "False"); - - break; - // - // 0x80000002-0x80000004 - Processor brand string - // - case 0x80000002: - case 0x80000003: - case 0x80000004: - { - ShowMessages("==== CPUID.(EAX=80000002H-80000004H) Processor Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000002-4 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - ShowMessages(" Brand String = \"%s\"\n\n", CpuidRequest.BrandString); - - break; - } - case 0x80000005: - ShowMessages("EAX = 0x80000005: not implemented.\n"); - break; - - case 0x80000006: - { - ShowMessages("==== CPUID.(EAX=80000006H) Extended Cache Information ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000006 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); - - ShowMessages("-- ECX (L2 Cache Information) --\n"); - - UINT32 LineSize = CPUID_ECX_CACHE_LINE_SIZE_IN_BYTES(CpuidRequest.ECX); - UINT32 Assoc = CPUID_ECX_L2_ASSOCIATIVITY_FIELD(CpuidRequest.ECX); - UINT32 CacheSize = CPUID_ECX_CACHE_SIZE_IN_1K_UNITS(CpuidRequest.ECX); - - // - // decode associativity - // - switch (Assoc) - { - case 0x00: - AssocName = "Disabled"; - break; - case 0x01: - AssocName = "Direct mapped"; - break; - case 0x02: - AssocName = "2-way"; - break; - case 0x04: - AssocName = "4-way"; - break; - case 0x06: - AssocName = "8-way"; - break; - case 0x08: - AssocName = "16-way"; - break; - case 0x0F: - AssocName = "Fully associative"; - break; - default: - AssocName = "Reserved"; - break; - } - ShowMessages(" CacheLineSizeInBytes = %u bytes\n", LineSize); - ShowMessages(" L2AssociativityField = 0x%02X (%s)\n", Assoc, AssocName); - ShowMessages(" CacheSizeIn1KUnits = %u KB (%u MB)\n", - CacheSize, - CacheSize / 1024); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); - - break; - } - - case 0x80000007: - ShowMessages("==== CPUID.(EAX=80000007H) Extended Time Stamp Counter ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000007 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EAX_RESERVED(CpuidRequest.EAX)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" InvariantTscAvailable = %u%s\n\n", - CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidRequest.EDX), - CPUID_EDX_INVARIANT_TSC_AVAILABLE(CpuidRequest.EDX) ? " (TSC runs at constant rate)" : ""); - - break; - - case 0x80000008: - { - ShowMessages("==== CPUID.(EAX=80000008H) Virtual & Physical Address Sizes ====\n\n"); - ShowMessages(" *******************************************************\n" - " * LEAF 0x80000008 HAS NO SUBLEAVES *\n" - " * ANY SUBLEAF YOU ENTER WILL DEFAULT TO 0 *\n" - " * AND THE PROCESSOR RETURNS UNDEFINED VALUES *\n" - " *******************************************************\n\n"); - - ShowMessages("-- EAX --\n\n"); - UINT32 PhysicalBits = CPUID_EAX_NUMBER_OF_PHYSICAL_ADDRESS_BITS(CpuidRequest.EAX); - UINT32 LinearBits = CPUID_EAX_NUMBER_OF_LINEAR_ADDRESS_BITS(CpuidRequest.EAX); - - ShowMessages(" NumberOfPhysicalAddressBits = %u (max physical address = 2^%u = %llu bytes)\n", - PhysicalBits, - PhysicalBits, - (ULONG64)(1ULL << PhysicalBits)); - ShowMessages(" NumberOfLinearAddressBits = %u (max linear address = 2^%u = %llu bytes)\n", - LinearBits, - LinearBits, - (ULONG64)(1ULL << LinearBits)); - - ShowMessages("-- EBX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EBX_RESERVED(CpuidRequest.EBX)); - - ShowMessages("-- ECX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_ECX_RESERVED(CpuidRequest.ECX)); - - ShowMessages("-- EDX --\n\n"); - ShowMessages(" Reserved = 0x%08X\n\n", CPUID_EDX_RESERVED(CpuidRequest.EDX)); - - break; - } - - default: - ShowMessages("==== CPUID.(EAX=%08XH) ====\n\n", FunctionId); - ShowMessages(" CPUID leaf 0x%08X is not implemented in HyperDbg.\n", FunctionId); - ShowMessages(" You can decode the raw values yourself:\n"); - ShowMessages(" EAX: 0x%08X\n", CpuidRequest.EAX); - ShowMessages(" EBX: 0x%08X\n", CpuidRequest.EBX); - ShowMessages(" ECX: 0x%08X\n", CpuidRequest.ECX); - ShowMessages(" EDX: 0x%08X\n\n", CpuidRequest.EDX); - } + CommandShowUserCpuidMessage(FunctionId, SubFunctionId, CpuidRequest); } else @@ -2106,7 +2132,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) } /** - * @brief cpuid command handler + * @brief ucpuid command handler * * @param CommandTokens * @param Command From 7911465b93b2368c089b6eb90acd4eec1872e4f4 Mon Sep 17 00:00:00 2001 From: sina Date: Thu, 23 Jul 2026 10:03:35 +0200 Subject: [PATCH 24/50] cleanup ucpuid command codes --- .../include/SDK/headers/RequestStructures.h | 2 +- .../SDK/imports/user/HyperDbgLibImports.h | 2 +- .../commands/extension-commands/lbr.cpp | 3 +- .../code/debugger/kernel-level/kd.cpp | 24 +++++++-------- .../kernel-level/kernel-listening.cpp | 4 +-- hyperdbg/libhyperdbg/code/export/export.cpp | 2 +- .../header/debugger/core/debugger.h | 4 +-- hyperdbg/libhyperdbg/ucpuid.cpp | 29 +++++++++---------- 8 files changed, 34 insertions(+), 36 deletions(-) diff --git a/hyperdbg/include/SDK/headers/RequestStructures.h b/hyperdbg/include/SDK/headers/RequestStructures.h index 0817b45e..0fcc4006 100644 --- a/hyperdbg/include/SDK/headers/RequestStructures.h +++ b/hyperdbg/include/SDK/headers/RequestStructures.h @@ -1756,7 +1756,7 @@ typedef struct _DEBUGGER_CPUID_REQUEST_RESPONSE UINT32 FunctionId; UINT32 SubFunctionId; - + UINT32 Leaf4MaxSubLeaf; UINT32 LeafBMaxSubleaf; UINT32 Leaf12MaxSubLeaf; diff --git a/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h b/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h index c3ebdaae..112dbc97 100644 --- a/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h +++ b/hyperdbg/include/SDK/imports/user/HyperDbgLibImports.h @@ -334,7 +334,7 @@ hyperdbg_u_pt_mmap(HYPERTRACE_PT_MMAP_PACKETS * MmapRequest); // Exported functionality of the 'ucpuid', and 'cpuid' commands // IMPORT_EXPORT_LIBHYPERDBG BOOLEAN -hyperdbg_u_user_cpuid(UINT32 FunctionId, UINT32 SubFunctionId); +hyperdbg_u_request_cpuid(UINT32 FunctionId, UINT32 SubFunctionId); // // Transparent mode related command diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp index 4074c2f4..85cf9017 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp @@ -63,7 +63,8 @@ CommandLbrHelp() ShowMessages("\t or the 'kernel'. it prevents all types of branches except calls and rets\n"); ShowMessages("\t (no option): capture everything (default option)\n"); - ShowMessages("\nnote 1: LBR is usually not supported (or is emulated) in nested virtualization (VM) environments\n"); + ShowMessages("\n"); + ShowMessages("note 1: LBR is usually not supported (or is emulated) in nested virtualization (VM) environments\n"); ShowMessages("note 2: LBR will be disabled if there is a debug-break (#DB) condition, such as the trap flags or\n"); ShowMessages(" hardware debug registers (to learn how to mitigate this, check the documentation)\n"); } diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp index 71486776..6a940ae5 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp @@ -18,13 +18,13 @@ extern HANDLE g_SerialListeningThreadHandle; extern HANDLE g_SerialRemoteComPortHandle; extern HANDLE g_DebuggeeStopCommandEventHandle; extern DEBUGGER_SYNCRONIZATION_EVENTS_STATE - g_KernelSyncronizationObjectsHandleTable[DEBUGGER_MAXIMUM_SYNCRONIZATION_KERNEL_DEBUGGER_OBJECTS]; -extern BYTE g_CurrentRunningInstruction[MAXIMUM_INSTR_SIZE]; -extern BOOLEAN g_IsConnectedToHyperDbgLocally; + g_KernelSyncronizationObjectsHandleTable[DEBUGGER_MAXIMUM_SYNCRONIZATION_KERNEL_DEBUGGER_OBJECTS]; +extern BYTE g_CurrentRunningInstruction[MAXIMUM_INSTR_SIZE]; +extern BOOLEAN g_IsConnectedToHyperDbgLocally; #ifdef _WIN32 -extern OVERLAPPED g_OverlappedIoStructureForReadDebugger; -extern OVERLAPPED g_OverlappedIoStructureForWriteDebugger; -extern OVERLAPPED g_OverlappedIoStructureForReadDebuggee; +extern OVERLAPPED g_OverlappedIoStructureForReadDebugger; +extern OVERLAPPED g_OverlappedIoStructureForWriteDebugger; +extern OVERLAPPED g_OverlappedIoStructureForReadDebuggee; #endif // _WIN32 extern DEBUGGER_EVENT_AND_ACTION_RESULT g_DebuggeeResultOfRegisteringEvent; extern DEBUGGER_EVENT_AND_ACTION_RESULT @@ -344,9 +344,9 @@ BOOLEAN KdSendUserCpuidPacketToDebuggee(UINT32 FunctionId, UINT32 SubFunctionId) { DEBUGGER_CPUID_REQUEST_RESPONSE CpuidPacket = {0}; - CpuidPacket.FunctionId = FunctionId; - CpuidPacket.SubFunctionId = SubFunctionId; - + CpuidPacket.FunctionId = FunctionId; + CpuidPacket.SubFunctionId = SubFunctionId; + // // Send 'ucpuid' command as CPUID packet // @@ -731,7 +731,7 @@ KdSendRegisterEventPacketToDebuggee(PDEBUGGER_GENERAL_EVENT_DETAIL Event, EventBufferLength); PlatformZeroMemory(&g_DebuggeeResultOfRegisteringEvent, - sizeof(DEBUGGER_EVENT_AND_ACTION_RESULT)); + sizeof(DEBUGGER_EVENT_AND_ACTION_RESULT)); // // Send register event packet @@ -798,7 +798,7 @@ KdSendAddActionToEventPacketToDebuggee(PDEBUGGER_GENERAL_ACTION GeneralAction, GeneralActionLength); PlatformZeroMemory(&g_DebuggeeResultOfAddingActionsToEvent, - sizeof(DEBUGGER_EVENT_AND_ACTION_RESULT)); + sizeof(DEBUGGER_EVENT_AND_ACTION_RESULT)); // // Send add action to event packet @@ -2527,7 +2527,7 @@ KdPrepareAndConnectDebugPort(const CHAR * PortName, BOOLEAN IsNamedPipe, BOOLEAN PauseAfterConnection) { - HANDLE Comm; /* Handle to the Serial port */ + HANDLE Comm; /* Handle to the Serial port */ #ifdef _WIN32 BOOL Status; /* Status */ DCB SerialParams = {0}; /* Initializing DCB structure */ diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp index d25f5d8f..1471ff64 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp @@ -584,7 +584,7 @@ StartAgain: if (CpuidPacket->KernelStatus == DEBUGGER_OPERATION_WAS_SUCCESSFUL) { - UINT32 FunctionId = CpuidPacket->FunctionId; + UINT32 FunctionId = CpuidPacket->FunctionId; UINT32 SubFunctionId = CpuidPacket->SubFunctionId; CommandShowUserCpuidMessage(FunctionId, SubFunctionId, CpuidPacket); @@ -1466,7 +1466,7 @@ StartAgain: CHAR SerialBuffer[MaxSerialPacketSize] = { 0}; /* Buffer to send and receive data */ #ifdef _WIN32 - DWORD EventMask = 0; /* Event mask to trigger */ + DWORD EventMask = 0; /* Event mask to trigger */ #endif // _WIN32 char ReadData = NULL; /* temperory Character */ DWORD NoBytesRead = 0; /* Bytes read by ReadFile() */ diff --git a/hyperdbg/libhyperdbg/code/export/export.cpp b/hyperdbg/libhyperdbg/code/export/export.cpp index bfd933f6..d5dc56e0 100644 --- a/hyperdbg/libhyperdbg/code/export/export.cpp +++ b/hyperdbg/libhyperdbg/code/export/export.cpp @@ -1035,7 +1035,7 @@ hyperdbg_u_pt_mmap(HYPERTRACE_PT_MMAP_PACKETS * MmapRequest) * @return BOOLEAN TRUE if successful, FALSE otherwise */ BOOLEAN -hyperdbg_u_user_cpuid(UINT32 FunctionId, UINT32 SubFunctionId) +hyperdbg_u_request_cpuid(UINT32 FunctionId, UINT32 SubFunctionId) { // // Call the existing CPUID command handler diff --git a/hyperdbg/libhyperdbg/header/debugger/core/debugger.h b/hyperdbg/libhyperdbg/header/debugger/core/debugger.h index 92ed80b3..4b0a2133 100644 --- a/hyperdbg/libhyperdbg/header/debugger/core/debugger.h +++ b/hyperdbg/libhyperdbg/header/debugger/core/debugger.h @@ -225,8 +225,8 @@ VOID CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId); VOID -CommandShowUserCpuidMessage(UINT32 FunctionId, - UINT32 SubFunctionId, +CommandShowUserCpuidMessage(UINT32 FunctionId, + UINT32 SubFunctionId, PDEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest); UINT64 diff --git a/hyperdbg/libhyperdbg/ucpuid.cpp b/hyperdbg/libhyperdbg/ucpuid.cpp index caf84da4..380d4a12 100644 --- a/hyperdbg/libhyperdbg/ucpuid.cpp +++ b/hyperdbg/libhyperdbg/ucpuid.cpp @@ -25,22 +25,19 @@ extern BOOLEAN g_IsSerialConnectedToRemoteDebuggee; VOID CommandUserCpuidHelp() { - ShowMessages("ucpuid : reads CPUID information.\n\n"); - ShowMessages("syntax : \tucpuid [Function] [SubFunction]\n\n"); + ShowMessages("ucpuid : reads CPUID information on the target debuggee.\n\n"); + + ShowMessages("syntax : \tucpuid [Function (hex)] [SubFunction (hex)]\n\n"); + + ShowMessages("\n"); ShowMessages("\t\te.g : ucpuid 1\n"); ShowMessages("\t\te.g : ucpuid 4 2\n"); ShowMessages("\t\te.g : ucpuid D 0\n"); ShowMessages("\t\te.g : ucpuid 0x80000008 0\n\n"); - ShowMessages(" # Input Formats:\n"); - ShowMessages(" - Hex (default): No prefix needed. Examples: 1, 4, D, 0x80000008\n"); - ShowMessages(" - Decimal: Use 'n' prefix. Examples: n10, n15, n2147483648\n"); - ShowMessages(" - Decimal: Use '0n' prefix. Examples: 0n10, 0n15\n\n"); - ShowMessages(" # Notes:\n"); - ShowMessages(" - Function IDs are 32-bit values (max 0xFFFFFFFF / 4294967295).\n"); - ShowMessages(" - Extended function IDs range: 0x80000000 - 0x8FFFFFFF.\n"); - ShowMessages(" - Values beyond 0xFFFFFFFF are automatically rejected.\n"); - ShowMessages(" - Use `ucpuid 0` to see the maximum supported CPUID leaf.\n"); - ShowMessages(" - Use `ucpuid 0x80000000` to see the maximum supported extended leaf.\n\n"); + + ShowMessages("\n"); + ShowMessages("note 1: use `ucpuid 0` to see the maximum supported CPUID leaf\n"); + ShowMessages("note 2: use `ucpuid 0x80000000` to see the maximum supported extended leaf\n"); } /** @@ -49,8 +46,8 @@ CommandUserCpuidHelp() * @return VOID */ VOID -CommandShowUserCpuidMessage(UINT32 FunctionId, - UINT32 SubFunctionId, +CommandShowUserCpuidMessage(UINT32 FunctionId, + UINT32 SubFunctionId, PDEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest) { CONST CHAR * TypeName = NULL; @@ -64,7 +61,7 @@ CommandShowUserCpuidMessage(UINT32 FunctionId, ShowMessages(" NULL value!\n"); return; } - + // // display result // @@ -2079,7 +2076,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) PDEBUGGER_CPUID_REQUEST_RESPONSE CpuidRequest = &CpuidRequestBuffer; CpuidRequest->FunctionId = FunctionId; CpuidRequest->SubFunctionId = SubFunctionId; - + if (g_IsSerialConnectedToRemoteDebuggee) { // From aa96eaa617c0c1a432682b83a5021ac4963182d1 Mon Sep 17 00:00:00 2001 From: sina Date: Thu, 23 Jul 2026 15:46:03 +0200 Subject: [PATCH 25/50] fix snprintf_s function --- .../platform/user/code/platform-lib-calls.c | 39 +- .../platform/user/header/platform-lib-calls.h | 8 +- hyperdbg/script-engine/code/script-engine.c | 984 ++++++++++-------- 3 files changed, 620 insertions(+), 411 deletions(-) diff --git a/hyperdbg/include/platform/user/code/platform-lib-calls.c b/hyperdbg/include/platform/user/code/platform-lib-calls.c index 617cf23b..0bb8bfe1 100644 --- a/hyperdbg/include/platform/user/code/platform-lib-calls.c +++ b/hyperdbg/include/platform/user/code/platform-lib-calls.c @@ -165,6 +165,43 @@ PlatformSprintf(char * Buffer, SIZE_T BufferSize, const char * Format, ...) return Result; } +/** + * @brief Platform independent wrapper for _snprintf_s(..., _TRUNCATE, ...) + * + * Writes a formatted string into Buffer. If the output is larger than the + * buffer, it is truncated and always null-terminated. + * + * @param Buffer output buffer + * @param BufferSize size of the output buffer + * @param Format format string + * @return INT number of characters written, or -1 if truncation or an error occurred. + */ +INT +PlatformSnprintf(char * Buffer, SIZE_T BufferSize, const char * Format, ...) +{ + va_list Args; + INT Result; + + va_start(Args, Format); + +#if defined(_WIN32) + Result = _vsnprintf_s(Buffer, BufferSize, _TRUNCATE, Format, Args); +#elif defined(__linux__) + Result = vsnprintf(Buffer, BufferSize, Format, Args); + + /* Match Windows _TRUNCATE behavior: return -1 on truncation. */ + if (Result >= 0 && (SIZE_T)Result >= BufferSize) + { + Result = -1; + } +#else +# error "Unsupported platform" +#endif + + va_end(Args); + return Result; +} + /** * @brief Platform independent wrapper for strnlen_s / strnlen * @@ -337,7 +374,7 @@ PlatformGetActiveProcessorCount(VOID) GetSystemInfo(&SysInfo); return (SIZE_T)SysInfo.dwNumberOfProcessors; #elif defined(__linux__) -// Not yet tested!! + // Not yet tested!! long Count = sysconf(_SC_NPROCESSORS_ONLN); return Count > 0 ? (SIZE_T)Count : 0; #else diff --git a/hyperdbg/include/platform/user/header/platform-lib-calls.h b/hyperdbg/include/platform/user/header/platform-lib-calls.h index d5dcaf29..52760e51 100644 --- a/hyperdbg/include/platform/user/header/platform-lib-calls.h +++ b/hyperdbg/include/platform/user/header/platform-lib-calls.h @@ -48,6 +48,12 @@ PlatformCopyMemory(PVOID Destination, const VOID * Source, SIZE_T Size); INT PlatformSprintf(char * Buffer, SIZE_T BufferSize, const char * Format, ...); +// +// SNPRINTF +// +INT +PlatformSnprintf(char * Buffer, SIZE_T BufferSize, const char * Format, ...); + // // BOUNDED STRING LENGTH // @@ -83,7 +89,7 @@ PlatformSleep(DWORD Milliseconds); // DEBUG BREAK (raise a breakpoint trap in the calling process) // VOID -PlatformDebugBreak(VOID); + PlatformDebugBreak(VOID); // // HIGH-RESOLUTION PERFORMANCE COUNTER diff --git a/hyperdbg/script-engine/code/script-engine.c b/hyperdbg/script-engine/code/script-engine.c index cce6446a..e538df73 100644 --- a/hyperdbg/script-engine/code/script-engine.c +++ b/hyperdbg/script-engine/code/script-engine.c @@ -55,9 +55,9 @@ static UINT32 SizeofContextCount; typedef struct _LOGICAL_COMPILATION_CONTEXT { - BOOLEAN IsOr; - UINT32 BeginJumpTargetIndex; - PSCRIPT_ENGINE_TOKEN ResultToken; + BOOLEAN IsOr; + UINT32 BeginJumpTargetIndex; + PSCRIPT_ENGINE_TOKEN ResultToken; } LOGICAL_COMPILATION_CONTEXT; static LOGICAL_COMPILATION_CONTEXT LogicalContexts[16]; @@ -99,7 +99,7 @@ static PVARIABLE_TYPE ResolveTypeNameFromStack(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSCRIPT_ENGINE_ERROR_TYPE Error) { - UINT32 PointerDepth = 0; + UINT32 PointerDepth = 0; PVARIABLE_TYPE BaseType; while (MatchedStack->Pointer && !strcmp(Top(MatchedStack)->Value, "@DECLARE_POINTER_TYPE")) @@ -122,7 +122,7 @@ ResolveTypeNameFromStack(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, else { PSCRIPT_ENGINE_TOKEN TagToken = Pop(MatchedStack); - BaseType = FindStructType(TagToken->Value); + BaseType = FindStructType(TagToken->Value); RemoveToken(&TagToken); } @@ -161,18 +161,18 @@ ResolveTypeNameFromStack(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, } static PSCRIPT_ENGINE_TOKEN -EmitTruthValue(PSYMBOL_BUFFER CodeBuffer, - PSCRIPT_ENGINE_TOKEN Operand, +EmitTruthValue(PSYMBOL_BUFFER CodeBuffer, + PSCRIPT_ENGINE_TOKEN Operand, PSCRIPT_ENGINE_ERROR_TYPE Error) { - PVARIABLE_TYPE OperandType = (PVARIABLE_TYPE)Operand->VariableType; - UINT64 TypeId = GetScriptScalarTypeId(OperandType); + PVARIABLE_TYPE OperandType = (PVARIABLE_TYPE)Operand->VariableType; + UINT64 TypeId = GetScriptScalarTypeId(OperandType); PSCRIPT_ENGINE_TOKEN FirstTemp; PSCRIPT_ENGINE_TOKEN ResultTemp; - PSYMBOL Symbol; - PSYMBOL OperandSymbol; - PSYMBOL FirstTempSymbol; - PSYMBOL ResultTempSymbol; + PSYMBOL Symbol; + PSYMBOL OperandSymbol; + PSYMBOL FirstTempSymbol; + PSYMBOL ResultTempSymbol; if (TypeId == SCRIPT_SCALAR_TYPE_INVALID || TypeId == SCRIPT_SCALAR_TYPE_F80) { @@ -180,32 +180,32 @@ EmitTruthValue(PSYMBOL_BUFFER CodeBuffer, return NULL; } - FirstTemp = NewTemp(Error); + FirstTemp = NewTemp(Error); ResultTemp = NewTemp(Error); if (!FirstTemp || !ResultTemp || *Error != SCRIPT_ENGINE_ERROR_FREE) return NULL; - FirstTemp->VariableType = VARIABLE_TYPE_INT; + FirstTemp->VariableType = VARIABLE_TYPE_INT; ResultTemp->VariableType = VARIABLE_TYPE_INT; - OperandSymbol = ToSymbol(Operand, Error); - FirstTempSymbol = ToSymbol(FirstTemp, Error); - ResultTempSymbol = ToSymbol(ResultTemp, Error); - Symbol = NewSymbol(); + OperandSymbol = ToSymbol(Operand, Error); + FirstTempSymbol = ToSymbol(FirstTemp, Error); + ResultTempSymbol = ToSymbol(ResultTemp, Error); + Symbol = NewSymbol(); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_LOGICAL_NOT_TYPED; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, OperandSymbol); PushSymbol(CodeBuffer, FirstTempSymbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = TypeId; PushSymbol(CodeBuffer, Symbol); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_LOGICAL_NOT_TYPED; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, FirstTempSymbol); PushSymbol(CodeBuffer, ResultTempSymbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = SCRIPT_SCALAR_TYPE_I32; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); @@ -217,26 +217,30 @@ EmitTruthValue(PSYMBOL_BUFFER CodeBuffer, static PVARIABLE_TYPE GetUnsignedTypeForAccessWidth(UINT32 AccessWidth) { - if (AccessWidth == 1) return VARIABLE_TYPE_UCHAR; - if (AccessWidth == 2) return VARIABLE_TYPE_USHORT; - if (AccessWidth == 4) return VARIABLE_TYPE_UINT; - if (AccessWidth == 8) return VARIABLE_TYPE_ULLONG; + if (AccessWidth == 1) + return VARIABLE_TYPE_UCHAR; + if (AccessWidth == 2) + return VARIABLE_TYPE_USHORT; + if (AccessWidth == 4) + return VARIABLE_TYPE_UINT; + if (AccessWidth == 8) + return VARIABLE_TYPE_ULLONG; return VARIABLE_TYPE_UNKNOWN; } static PSCRIPT_ENGINE_TOKEN -EmitTypedScalarLoad(PSYMBOL_BUFFER CodeBuffer, - PSCRIPT_ENGINE_TOKEN AddressToken, - UINT32 AddressSpace, - PVARIABLE_TYPE DeclaredType, +EmitTypedScalarLoad(PSYMBOL_BUFFER CodeBuffer, + PSCRIPT_ENGINE_TOKEN AddressToken, + UINT32 AddressSpace, + PVARIABLE_TYPE DeclaredType, PSCRIPT_ENGINE_ERROR_TYPE Error) { - PVARIABLE_TYPE RawType; + PVARIABLE_TYPE RawType; PSCRIPT_ENGINE_TOKEN RawTemp = NULL; PSCRIPT_ENGINE_TOKEN ValueTemp; PSCRIPT_ENGINE_TOKEN LoadDestination; - PSYMBOL Symbol; - BOOLEAN NeedsIntegerNormalization; + PSYMBOL Symbol; + BOOLEAN NeedsIntegerNormalization; RawType = GetUnsignedTypeForAccessWidth((UINT32)DeclaredType->Size); if (RawType == VARIABLE_TYPE_UNKNOWN) @@ -248,7 +252,7 @@ EmitTypedScalarLoad(PSYMBOL_BUFFER CodeBuffer, ValueTemp = NewTemp(Error); if (!ValueTemp || *Error != SCRIPT_ENGINE_ERROR_FREE) return NULL; - ValueTemp->VariableType = DeclaredType; + ValueTemp->VariableType = DeclaredType; NeedsIntegerNormalization = IsIntegerVariableType(DeclaredType) && GetScriptScalarTypeId(RawType) != GetScriptScalarTypeId(DeclaredType); if (NeedsIntegerNormalization) @@ -264,19 +268,45 @@ EmitTypedScalarLoad(PSYMBOL_BUFFER CodeBuffer, } LoadDestination = RawTemp ? RawTemp : ValueTemp; - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_LOAD; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(AddressToken, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = AddressSpace; PushSymbol(CodeBuffer, Symbol); - Symbol->Value = DeclaredType->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(LoadDestination, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_TYPED_LOAD; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(AddressToken, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = AddressSpace; + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = DeclaredType->Size; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(LoadDestination, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); if (RawTemp) { - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(RawTemp, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(ValueTemp, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId(RawType); PushSymbol(CodeBuffer, Symbol); - Symbol->Value = GetScriptScalarTypeId(DeclaredType); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_CAST_SCALAR; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(RawTemp, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(ValueTemp, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = GetScriptScalarTypeId(RawType); + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = GetScriptScalarTypeId(DeclaredType); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); FreeTemp(RawTemp); RemoveToken(&RawTemp); } @@ -309,54 +339,90 @@ IsFloatingVariableType(PVARIABLE_TYPE VariableType) static UINT64 GetScriptScalarTypeId(PVARIABLE_TYPE VariableType) { - if (!VariableType) return SCRIPT_SCALAR_TYPE_INVALID; - if (VariableType->Kind == TY_BOOL) return SCRIPT_SCALAR_TYPE_BOOL; - if (VariableType->Kind == TY_CHAR) return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U8 : SCRIPT_SCALAR_TYPE_I8; - if (VariableType->Kind == TY_SHORT) return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U16 : SCRIPT_SCALAR_TYPE_I16; - if (VariableType->Kind == TY_INT || VariableType->Kind == TY_ENUM) return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U32 : SCRIPT_SCALAR_TYPE_I32; - if (VariableType->Kind == TY_LONG || VariableType->Kind == TY_LLONG) return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U64 : SCRIPT_SCALAR_TYPE_I64; - if (VariableType->Kind == TY_FLOAT) return SCRIPT_SCALAR_TYPE_F32; - if (VariableType->Kind == TY_DOUBLE) return SCRIPT_SCALAR_TYPE_F64; - if (VariableType->Kind == TY_PTR) return SCRIPT_SCALAR_TYPE_POINTER; - if (VariableType->Kind == TY_LDOUBLE) return SCRIPT_SCALAR_TYPE_F80; + if (!VariableType) + return SCRIPT_SCALAR_TYPE_INVALID; + if (VariableType->Kind == TY_BOOL) + return SCRIPT_SCALAR_TYPE_BOOL; + if (VariableType->Kind == TY_CHAR) + return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U8 : SCRIPT_SCALAR_TYPE_I8; + if (VariableType->Kind == TY_SHORT) + return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U16 : SCRIPT_SCALAR_TYPE_I16; + if (VariableType->Kind == TY_INT || VariableType->Kind == TY_ENUM) + return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U32 : SCRIPT_SCALAR_TYPE_I32; + if (VariableType->Kind == TY_LONG || VariableType->Kind == TY_LLONG) + return VariableType->IsUnsigned ? SCRIPT_SCALAR_TYPE_U64 : SCRIPT_SCALAR_TYPE_I64; + if (VariableType->Kind == TY_FLOAT) + return SCRIPT_SCALAR_TYPE_F32; + if (VariableType->Kind == TY_DOUBLE) + return SCRIPT_SCALAR_TYPE_F64; + if (VariableType->Kind == TY_PTR) + return SCRIPT_SCALAR_TYPE_POINTER; + if (VariableType->Kind == TY_LDOUBLE) + return SCRIPT_SCALAR_TYPE_F80; return SCRIPT_SCALAR_TYPE_INVALID; } static UINT64 GetTypedBinaryOpcode(const CHAR * Operator) { - if (!strcmp(Operator, "@ADD")) return FUNC_ADD_TYPED; - if (!strcmp(Operator, "@SUB")) return FUNC_SUB_TYPED; - if (!strcmp(Operator, "@MUL")) return FUNC_MUL_TYPED; - if (!strcmp(Operator, "@DIV")) return FUNC_DIV_TYPED; - if (!strcmp(Operator, "@MOD")) return FUNC_MOD_TYPED; - if (!strcmp(Operator, "@AND")) return FUNC_BITWISE_AND_TYPED; - if (!strcmp(Operator, "@OR")) return FUNC_BITWISE_OR_TYPED; - if (!strcmp(Operator, "@XOR")) return FUNC_BITWISE_XOR_TYPED; - if (!strcmp(Operator, "@ASL")) return FUNC_SHIFT_LEFT_TYPED; - if (!strcmp(Operator, "@ASR")) return FUNC_SHIFT_RIGHT_TYPED; - if (!strcmp(Operator, "@GT")) return FUNC_GT_TYPED; - if (!strcmp(Operator, "@LT")) return FUNC_LT_TYPED; - if (!strcmp(Operator, "@EGT")) return FUNC_EGT_TYPED; - if (!strcmp(Operator, "@ELT")) return FUNC_ELT_TYPED; - if (!strcmp(Operator, "@EQUAL")) return FUNC_EQUAL_TYPED; - if (!strcmp(Operator, "@NEQ")) return FUNC_NEQ_TYPED; + if (!strcmp(Operator, "@ADD")) + return FUNC_ADD_TYPED; + if (!strcmp(Operator, "@SUB")) + return FUNC_SUB_TYPED; + if (!strcmp(Operator, "@MUL")) + return FUNC_MUL_TYPED; + if (!strcmp(Operator, "@DIV")) + return FUNC_DIV_TYPED; + if (!strcmp(Operator, "@MOD")) + return FUNC_MOD_TYPED; + if (!strcmp(Operator, "@AND")) + return FUNC_BITWISE_AND_TYPED; + if (!strcmp(Operator, "@OR")) + return FUNC_BITWISE_OR_TYPED; + if (!strcmp(Operator, "@XOR")) + return FUNC_BITWISE_XOR_TYPED; + if (!strcmp(Operator, "@ASL")) + return FUNC_SHIFT_LEFT_TYPED; + if (!strcmp(Operator, "@ASR")) + return FUNC_SHIFT_RIGHT_TYPED; + if (!strcmp(Operator, "@GT")) + return FUNC_GT_TYPED; + if (!strcmp(Operator, "@LT")) + return FUNC_LT_TYPED; + if (!strcmp(Operator, "@EGT")) + return FUNC_EGT_TYPED; + if (!strcmp(Operator, "@ELT")) + return FUNC_ELT_TYPED; + if (!strcmp(Operator, "@EQUAL")) + return FUNC_EQUAL_TYPED; + if (!strcmp(Operator, "@NEQ")) + return FUNC_NEQ_TYPED; return FUNC_UNDEFINED; } static UINT64 GetTypedAssignmentOpcode(const CHAR * Operator) { - if (!strcmp(Operator, "@ADD_ASSIGNMENT")) return FUNC_ADD_TYPED; - if (!strcmp(Operator, "@SUB_ASSIGNMENT")) return FUNC_SUB_TYPED; - if (!strcmp(Operator, "@MUL_ASSIGNMENT")) return FUNC_MUL_TYPED; - if (!strcmp(Operator, "@DIV_ASSIGNMENT")) return FUNC_DIV_TYPED; - if (!strcmp(Operator, "@MOD_ASSIGNMENT")) return FUNC_MOD_TYPED; - if (!strcmp(Operator, "@AND_ASSIGNMENT")) return FUNC_BITWISE_AND_TYPED; - if (!strcmp(Operator, "@OR_ASSIGNMENT")) return FUNC_BITWISE_OR_TYPED; - if (!strcmp(Operator, "@XOR_ASSIGNMENT")) return FUNC_BITWISE_XOR_TYPED; - if (!strcmp(Operator, "@ASL_ASSIGNMENT")) return FUNC_SHIFT_LEFT_TYPED; - if (!strcmp(Operator, "@ASR_ASSIGNMENT")) return FUNC_SHIFT_RIGHT_TYPED; + if (!strcmp(Operator, "@ADD_ASSIGNMENT")) + return FUNC_ADD_TYPED; + if (!strcmp(Operator, "@SUB_ASSIGNMENT")) + return FUNC_SUB_TYPED; + if (!strcmp(Operator, "@MUL_ASSIGNMENT")) + return FUNC_MUL_TYPED; + if (!strcmp(Operator, "@DIV_ASSIGNMENT")) + return FUNC_DIV_TYPED; + if (!strcmp(Operator, "@MOD_ASSIGNMENT")) + return FUNC_MOD_TYPED; + if (!strcmp(Operator, "@AND_ASSIGNMENT")) + return FUNC_BITWISE_AND_TYPED; + if (!strcmp(Operator, "@OR_ASSIGNMENT")) + return FUNC_BITWISE_OR_TYPED; + if (!strcmp(Operator, "@XOR_ASSIGNMENT")) + return FUNC_BITWISE_XOR_TYPED; + if (!strcmp(Operator, "@ASL_ASSIGNMENT")) + return FUNC_SHIFT_LEFT_TYPED; + if (!strcmp(Operator, "@ASR_ASSIGNMENT")) + return FUNC_SHIFT_RIGHT_TYPED; return FUNC_UNDEFINED; } @@ -538,15 +604,15 @@ ResetStructDeclarators(VOID) free(StructDeclarators); StructDeclarators = Next; } - StructDeclaratorsTail = NULL; - StructPointerDepth = 0; + StructDeclaratorsTail = NULL; + StructPointerDepth = 0; } static PVARIABLE_TYPE ApplyStructDeclarator(PVARIABLE_TYPE BaseType, PSTRUCT_DECLARATOR_STATE Declarator) { PVARIABLE_TYPE Type = BaseType; - unsigned int Index; + unsigned int Index; for (Index = 0; Index < Declarator->PointerDepth; Index++) { @@ -571,7 +637,7 @@ ApplyStructDeclarator(PVARIABLE_TYPE BaseType, PSTRUCT_DECLARATOR_STATE Declarat static PVARIABLE_TYPE PopStructBaseType(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSCRIPT_ENGINE_ERROR_TYPE Error) { - PVARIABLE_TYPE Type; + PVARIABLE_TYPE Type; PSCRIPT_ENGINE_TOKEN TagToken; if (MatchedStack->Pointer && Top(MatchedStack)->Type == SCRIPT_VARIABLE_TYPE) @@ -1346,7 +1412,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI *Error = SCRIPT_ENGINE_ERROR_SYNTAX; break; } - SizeofContexts[SizeofContextCount].CodePointer = CodeBuffer->Pointer; + SizeofContexts[SizeofContextCount].CodePointer = CodeBuffer->Pointer; SizeofContexts[SizeofContextCount].MaxTempNumber = CurrentUserDefinedFunction->MaxTempNumber; memcpy(SizeofContexts[SizeofContextCount].TempMap, CurrentUserDefinedFunction->TempMap, @@ -1355,18 +1421,18 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (!strcmp(Operator->Value, "@SIZEOF_EXPRESSION")) { - CHAR SizeText[32]; - PVARIABLE_TYPE OperandType; + CHAR SizeText[32]; + PVARIABLE_TYPE OperandType; PSCRIPT_ENGINE_TOKEN SizeToken; if (!SizeofContextCount || !MatchedStack->Pointer) { *Error = SCRIPT_ENGINE_ERROR_SYNTAX; break; } - Op0 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); OperandType = (PVARIABLE_TYPE)Op0->VariableType; SizeofContextCount--; - CodeBuffer->Pointer = SizeofContexts[SizeofContextCount].CodePointer; + CodeBuffer->Pointer = SizeofContexts[SizeofContextCount].CodePointer; CurrentUserDefinedFunction->MaxTempNumber = SizeofContexts[SizeofContextCount].MaxTempNumber; memcpy(CurrentUserDefinedFunction->TempMap, SizeofContexts[SizeofContextCount].TempMap, @@ -1378,17 +1444,17 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI *Error = SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE; break; } - PlatformSprintf(SizeText, sizeof(SizeText), "%d", OperandType->Size); - SizeToken = NewToken(DECIMAL, SizeText); + PlatformSnprintf(SizeText, sizeof(SizeText), "%d", OperandType->Size); + SizeToken = NewToken(DECIMAL, SizeText); SizeToken->VariableType = VARIABLE_TYPE_ULLONG; RemoveToken(&Op0); Push(MatchedStack, SizeToken); } else if (!strcmp(Operator->Value, "@SIZEOF_TYPE")) { - CHAR SizeText[32]; + CHAR SizeText[32]; PSCRIPT_ENGINE_TOKEN SizeToken; - PVARIABLE_TYPE ResolvedType = ResolveTypeNameFromStack(MatchedStack, Error); + PVARIABLE_TYPE ResolvedType = ResolveTypeNameFromStack(MatchedStack, Error); if (*Error != SCRIPT_ENGINE_ERROR_FREE) break; if (ResolvedType->Kind == TY_VOID || ResolvedType->Kind == TY_FUNC || @@ -1397,8 +1463,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI *Error = SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE; break; } - PlatformSprintf(SizeText, sizeof(SizeText), "%d", ResolvedType->Size); - SizeToken = NewToken(DECIMAL, SizeText); + PlatformSnprintf(SizeText, sizeof(SizeText), "%d", ResolvedType->Size); + SizeToken = NewToken(DECIMAL, SizeText); SizeToken->VariableType = VARIABLE_TYPE_ULLONG; Push(MatchedStack, SizeToken); } @@ -1406,14 +1472,14 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { PVARIABLE_TYPE SourceType; PVARIABLE_TYPE DestinationType; - UINT64 SourceTypeId; - UINT64 DestinationTypeId; - PSYMBOL TypeSymbol; + UINT64 SourceTypeId; + UINT64 DestinationTypeId; + PSYMBOL TypeSymbol; - Op0 = Pop(MatchedStack); - DestinationType = ResolveTypeNameFromStack(MatchedStack, Error); - SourceType = (PVARIABLE_TYPE)Op0->VariableType; - SourceTypeId = GetScriptScalarTypeId(SourceType); + Op0 = Pop(MatchedStack); + DestinationType = ResolveTypeNameFromStack(MatchedStack, Error); + SourceType = (PVARIABLE_TYPE)Op0->VariableType; + SourceTypeId = GetScriptScalarTypeId(SourceType); DestinationTypeId = GetScriptScalarTypeId(DestinationType); if (*Error != SCRIPT_ENGINE_ERROR_FREE || SourceTypeId == SCRIPT_SCALAR_TYPE_INVALID || DestinationTypeId == SCRIPT_SCALAR_TYPE_INVALID || SourceTypeId == SCRIPT_SCALAR_TYPE_F80 || @@ -1428,8 +1494,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (DestinationType->Kind == TY_PTR) { - DestinationType->PointerProvenance = SourceType->Kind == TY_PTR ? - SourceType->PointerProvenance : POINTER_PROVENANCE_REMOTE; + DestinationType->PointerProvenance = SourceType->Kind == TY_PTR ? SourceType->PointerProvenance : POINTER_PROVENANCE_REMOTE; } Op0Symbol = ToSymbol(Op0, Error); @@ -1443,16 +1508,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } Op0Symbol->Len = SourceKind; } - Temp = NewTemp(Error); - Temp->VariableType = DestinationType; - TempSymbol = ToSymbol(Temp, Error); - TempSymbol->Len = GetFloatingValueKind(DestinationType); + Temp = NewTemp(Error); + Temp->VariableType = DestinationType; + TempSymbol = ToSymbol(Temp, Error); + TempSymbol->Len = GetFloatingValueKind(DestinationType); OperatorSymbol->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, OperatorSymbol); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, TempSymbol); - TypeSymbol = NewSymbol(); - TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; TypeSymbol->Value = SourceTypeId; PushSymbol(CodeBuffer, TypeSymbol); TypeSymbol->Value = DestinationTypeId; @@ -1465,7 +1530,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI else if (!strcmp(Operator->Value, "@LOGICAL_NOT_TYPED")) { PSYMBOL TypeSymbol; - Op0 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); VariableType = (PVARIABLE_TYPE)Op0->VariableType; if (GetScriptScalarTypeId(VariableType) == SCRIPT_SCALAR_TYPE_INVALID || VariableType->Kind == TY_LDOUBLE) { @@ -1473,16 +1538,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; break; } - Op0Symbol = ToSymbol(Op0, Error); - Temp = NewTemp(Error); - Temp->VariableType = VARIABLE_TYPE_INT; - TempSymbol = ToSymbol(Temp, Error); + Op0Symbol = ToSymbol(Op0, Error); + Temp = NewTemp(Error); + Temp->VariableType = VARIABLE_TYPE_INT; + TempSymbol = ToSymbol(Temp, Error); OperatorSymbol->Value = FUNC_LOGICAL_NOT_TYPED; PushSymbol(CodeBuffer, OperatorSymbol); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, TempSymbol); - TypeSymbol = NewSymbol(); - TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; TypeSymbol->Value = GetScriptScalarTypeId(VariableType); PushSymbol(CodeBuffer, TypeSymbol); RemoveSymbol(&TypeSymbol); @@ -1494,9 +1559,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI !strcmp(Operator->Value, "@LOGICAL_AND_BEGIN")) { PSCRIPT_ENGINE_TOKEN TruthToken; - PSYMBOL TruthSymbol; - PSYMBOL ResultSymbol; - PSYMBOL Symbol; + PSYMBOL TruthSymbol; + PSYMBOL ResultSymbol; + PSYMBOL Symbol; if (!MatchedStack->Pointer || LogicalContextCount >= 16) { *Error = SCRIPT_ENGINE_ERROR_SYNTAX; @@ -1505,27 +1570,27 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI TruthToken = EmitTruthValue(CodeBuffer, Top(MatchedStack), Error); if (!TruthToken || *Error != SCRIPT_ENGINE_ERROR_FREE) break; - TruthSymbol = ToSymbol(TruthToken, Error); - LogicalContexts[LogicalContextCount].IsOr = !strcmp(Operator->Value, "@LOGICAL_OR_BEGIN"); - LogicalContexts[LogicalContextCount].ResultToken = NewTemp(Error); + TruthSymbol = ToSymbol(TruthToken, Error); + LogicalContexts[LogicalContextCount].IsOr = !strcmp(Operator->Value, "@LOGICAL_OR_BEGIN"); + LogicalContexts[LogicalContextCount].ResultToken = NewTemp(Error); LogicalContexts[LogicalContextCount].ResultToken->VariableType = VARIABLE_TYPE_INT; - ResultSymbol = ToSymbol(LogicalContexts[LogicalContextCount].ResultToken, Error); - Symbol = NewSymbol(); + ResultSymbol = ToSymbol(LogicalContexts[LogicalContextCount].ResultToken, Error); + Symbol = NewSymbol(); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_MOV; PushSymbol(CodeBuffer, Symbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = LogicalContexts[LogicalContextCount].IsOr ? 1 : 0; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, ResultSymbol); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = LogicalContexts[LogicalContextCount].IsOr ? FUNC_JNZ : FUNC_JZ; PushSymbol(CodeBuffer, Symbol); LogicalContexts[LogicalContextCount].BeginJumpTargetIndex = CodeBuffer->Pointer; - Symbol->Type = SYMBOL_NUM_TYPE; - Symbol->Value = 0; + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = 0; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, TruthSymbol); RemoveSymbol(&Symbol); @@ -1537,47 +1602,47 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI !strcmp(Operator->Value, "@LOGICAL_AND_END")) { LOGICAL_COMPILATION_CONTEXT * Context; - PSCRIPT_ENGINE_TOKEN TruthToken; - PSYMBOL TruthSymbol; - PSYMBOL ResultSymbol; - PSYMBOL Symbol; - UINT32 EndJumpTargetIndex; + PSCRIPT_ENGINE_TOKEN TruthToken; + PSYMBOL TruthSymbol; + PSYMBOL ResultSymbol; + PSYMBOL Symbol; + UINT32 EndJumpTargetIndex; if (!LogicalContextCount || MatchedStack->Pointer < 2) { *Error = SCRIPT_ENGINE_ERROR_SYNTAX; break; } LogicalContextCount--; - Context = &LogicalContexts[LogicalContextCount]; - Op0 = Pop(MatchedStack); - Op1 = Pop(MatchedStack); + Context = &LogicalContexts[LogicalContextCount]; + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); TruthToken = EmitTruthValue(CodeBuffer, Op0, Error); if (!TruthToken || *Error != SCRIPT_ENGINE_ERROR_FREE) break; - TruthSymbol = ToSymbol(TruthToken, Error); + TruthSymbol = ToSymbol(TruthToken, Error); ResultSymbol = ToSymbol(Context->ResultToken, Error); - Symbol = NewSymbol(); + Symbol = NewSymbol(); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = Context->IsOr ? FUNC_JNZ : FUNC_JZ; PushSymbol(CodeBuffer, Symbol); EndJumpTargetIndex = CodeBuffer->Pointer; - Symbol->Type = SYMBOL_NUM_TYPE; - Symbol->Value = 0; + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = 0; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, TruthSymbol); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_MOV; PushSymbol(CodeBuffer, Symbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Context->IsOr ? 0 : 1; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, ResultSymbol); RemoveSymbol(&Symbol); CodeBuffer->Head[Context->BeginJumpTargetIndex].Value = CodeBuffer->Pointer; - CodeBuffer->Head[EndJumpTargetIndex].Value = CodeBuffer->Pointer; + CodeBuffer->Head[EndJumpTargetIndex].Value = CodeBuffer->Pointer; FreeTemp(TruthToken); RemoveToken(&TruthToken); FreeTemp(Op0); @@ -1593,7 +1658,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI else if (!strcmp(Operator->Value, "@STRUCT_ARRAY_DIMENSION")) { unsigned long long Dimension; - Op0 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); Dimension = strtoull(Op0->Value, NULL, 0); RemoveToken(&Op0); if (!Dimension || Dimension > UINT32_MAX) @@ -1611,15 +1676,15 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI else if (!strcmp(Operator->Value, "@STRUCT_DECLARATOR_COMPLETE")) { PSTRUCT_DECLARATOR_STATE Declarator; - Op0 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); Declarator = (PSTRUCT_DECLARATOR_STATE)calloc(1, sizeof(STRUCT_DECLARATOR_STATE)); if (!Declarator) { *Error = SCRIPT_ENGINE_ERROR_SYNTAX; break; } - Declarator->Name = PlatformStrDup(Op0->Value); - Declarator->PointerDepth = StructPointerDepth; + Declarator->Name = PlatformStrDup(Op0->Value); + Declarator->PointerDepth = StructPointerDepth; RemoveToken(&Op0); if (StructDeclaratorsTail) @@ -1644,7 +1709,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (!strcmp(Operator->Value, "@STRUCT_DEFINITION_BEGIN")) { - Op0 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); CurrentStructDefinition = FindStructType(Op0->Value); if (CurrentStructDefinition && CurrentStructDefinition->IsComplete) { @@ -1662,7 +1727,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (!strcmp(Operator->Value, "@STRUCT_MEMBER_DECLARATION")) { - PVARIABLE_TYPE BaseType = PopStructBaseType(MatchedStack, Error); + PVARIABLE_TYPE BaseType = PopStructBaseType(MatchedStack, Error); PSTRUCT_DECLARATOR_STATE Declarator; if (!BaseType) { @@ -1674,9 +1739,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PVARIABLE_TYPE MemberType = ApplyStructDeclarator(BaseType, Declarator); if (!MemberType) { - *Error = (BaseType->Kind == TY_STRUCT && !BaseType->IsComplete) ? - SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE : - SCRIPT_ENGINE_ERROR_INVALID_ARRAY_SIZE; + *Error = (BaseType->Kind == TY_STRUCT && !BaseType->IsComplete) ? SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE : SCRIPT_ENGINE_ERROR_INVALID_ARRAY_SIZE; break; } if (MemberType->Kind == TY_STRUCT && !MemberType->IsComplete) @@ -1701,7 +1764,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (!strcmp(Operator->Value, "@STRUCT_VARIABLE_DECLARATION")) { - PVARIABLE_TYPE BaseType; + PVARIABLE_TYPE BaseType; PSTRUCT_DECLARATOR_STATE Declarator; if (CurrentStructDefinition && CurrentStructDefinition->IsComplete && !MatchedStack->Pointer) @@ -1719,7 +1782,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI for (Declarator = StructDeclarators; Declarator; Declarator = Declarator->Next) { - PVARIABLE_TYPE ObjectType = ApplyStructDeclarator(BaseType, Declarator); + PVARIABLE_TYPE ObjectType = ApplyStructDeclarator(BaseType, Declarator); PSCRIPT_ENGINE_TOKEN IdToken; if (!ObjectType || (ObjectType->Kind == TY_STRUCT && !ObjectType->IsComplete)) { @@ -1737,10 +1800,10 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI SetLocalIdentifierVariableType(IdToken, ObjectType); if (LastStructObject) RemoveToken(&LastStructObject); - IdToken->Type = LOCAL_ID; + IdToken->Type = LOCAL_ID; IdToken->VariableType = ObjectType; - LastStructObject = CopyToken(IdToken); - LastStructObjectType = ObjectType; + LastStructObject = CopyToken(IdToken); + LastStructObjectType = ObjectType; RemoveToken(&IdToken); } ResetStructDeclarators(); @@ -1753,9 +1816,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI else if (!strcmp(Operator->Value, "@STRUCT_INITIALIZER_END")) { PSCRIPT_ENGINE_TOKEN Values[64]; - unsigned int Count = 0; - PSTRUCT_MEMBER Member; - PSYMBOL Symbol; + unsigned int Count = 0; + PSTRUCT_MEMBER Member; + PSYMBOL Symbol; while (MatchedStack->Pointer && strcmp(Top(MatchedStack)->Value, "@STRUCT_INITIALIZER_BEGIN")) { @@ -1775,17 +1838,31 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0 = Pop(MatchedStack); RemoveToken(&Op0); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_AGGREGATE_ZERO; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(LastStructObject, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = LastStructObjectType->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_AGGREGATE_ZERO; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(LastStructObject, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = LastStructObjectType->Size; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); Member = LastStructObjectType->Members; while (Count && Member) { - PSCRIPT_ENGINE_TOKEN ValueToken = Values[--Count]; - PSCRIPT_ENGINE_TOKEN AddressToken = LastStructObject; - BOOLEAN AddressIsTemp = FALSE; + PSCRIPT_ENGINE_TOKEN ValueToken = Values[--Count]; + PSCRIPT_ENGINE_TOKEN AddressToken = LastStructObject; + BOOLEAN AddressIsTemp = FALSE; if (Member->Type->Kind == TY_STRUCT || Member->Type->Kind == TY_ARRAY || (Member->Type->Size != 1 && Member->Type->Size != 2 && Member->Type->Size != 4 && Member->Type->Size != 8)) { @@ -1795,21 +1872,50 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } if (Member->Offset) { - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = CreatePointerType(Member->Type); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_ADD; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(LastStructObject, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Member->Offset; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - AddressToken = Temp; + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_ADD; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(LastStructObject, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Member->Offset; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(Temp, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + AddressToken = Temp; AddressIsTemp = TRUE; } - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_STORE; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(ValueToken, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(AddressToken, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Member->Type->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - if (AddressIsTemp) FreeTemp(Temp); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_TYPED_STORE; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(ValueToken, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(AddressToken, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Member->Type->Size; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + if (AddressIsTemp) + FreeTemp(Temp); RemoveToken(&ValueToken); Member = Member->Next; } @@ -1819,7 +1925,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI else if (!strcmp(Operator->Value, "@STRUCT_POINTER_CAST")) { PVARIABLE_TYPE RemotePointerType; - PSYMBOL Symbol; + PSYMBOL Symbol; Op0 = Pop(MatchedStack); while (MatchedStack->Pointer && Top(MatchedStack)->Type != LOCAL_UNRESOLVED_ID && Top(MatchedStack)->Type != LOCAL_ID) { @@ -1841,9 +1947,17 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI LastStructObjectType = RemotePointerType; LastStructObject->VariableType = RemotePointerType; SetLocalIdentifierVariableType(LastStructObject, RemotePointerType); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_MOV; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(Op0, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(LastStructObject, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_MOV; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(Op0, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(LastStructObject, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); RemoveToken(&Op0); } else if (!strcmp(Operator->Value, "@MEMBER_DOT_LVALUE") || @@ -1851,16 +1965,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI !strcmp(Operator->Value, "@MEMBER_DOT_READ") || !strcmp(Operator->Value, "@MEMBER_ARROW_READ")) { - BOOLEAN IsArrow = strstr(Operator->Value, "ARROW") != NULL; - BOOLEAN IsRead = strstr(Operator->Value, "READ") != NULL; - PVARIABLE_TYPE BaseType; - PVARIABLE_TYPE PointerType = NULL; - PSTRUCT_MEMBER Member; + BOOLEAN IsArrow = strstr(Operator->Value, "ARROW") != NULL; + BOOLEAN IsRead = strstr(Operator->Value, "READ") != NULL; + PVARIABLE_TYPE BaseType; + PVARIABLE_TYPE PointerType = NULL; + PSTRUCT_MEMBER Member; PSCRIPT_ENGINE_TOKEN AddressToken; - PSYMBOL Symbol; + PSYMBOL Symbol; - Op0 = Pop(MatchedStack); /* member name */ - Op1 = Pop(MatchedStack); /* object, pointer, or prior member address */ + Op0 = Pop(MatchedStack); /* member name */ + Op1 = Pop(MatchedStack); /* object, pointer, or prior member address */ BaseType = (PVARIABLE_TYPE)Op1->VariableType; if (!BaseType && (Op1->Type == LOCAL_ID || Op1->Type == LOCAL_UNRESOLVED_ID)) BaseType = GetLocalIdentifierVariableType(Op1); @@ -1872,7 +1986,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (!BaseType || BaseType->Kind != TY_PTR || !BaseType->Base || BaseType->Base->Kind != TY_STRUCT) { *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; - RemoveToken(&Op0); RemoveToken(&Op1); + RemoveToken(&Op0); + RemoveToken(&Op1); break; } AddressToken = Op1; @@ -1884,7 +1999,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (!BaseType || BaseType->Kind != TY_STRUCT) { *Error = SCRIPT_ENGINE_ERROR_UNDEFINED_VARIABLE_TYPE; - RemoveToken(&Op0); RemoveToken(&Op1); + RemoveToken(&Op0); + RemoveToken(&Op1); break; } AddressToken = Op1; @@ -1893,26 +2009,38 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (!BaseType->IsComplete || !(Member = FindStructMember(BaseType, Op0->Value))) { *Error = BaseType->IsComplete ? SCRIPT_ENGINE_ERROR_UNRESOLVED_VARIABLE : SCRIPT_ENGINE_ERROR_INCOMPLETE_TYPE; - RemoveToken(&Op0); RemoveToken(&Op1); + RemoveToken(&Op0); + RemoveToken(&Op1); break; } Temp = NewTemp(Error); if (*Error != SCRIPT_ENGINE_ERROR_FREE) { - RemoveToken(&Op0); RemoveToken(&Op1); + RemoveToken(&Op0); + RemoveToken(&Op1); break; } Temp->VariableType = Member->Type; Temp->IsAddress = TRUE; - Temp->AddressSpace = IsArrow ? - GetStructPointerAddressSpace(PointerType, Op1) : - (Op1->AddressSpace ? Op1->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL); + Temp->AddressSpace = IsArrow ? GetStructPointerAddressSpace(PointerType, Op1) : (Op1->AddressSpace ? Op1->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_ADD; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(AddressToken, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Member->Offset; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_ADD; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(AddressToken, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Member->Offset; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = ToSymbol(Temp, Error); + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); RemoveToken(&Op0); RemoveToken(&Op1); @@ -1943,7 +2071,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI else if (!strcmp(Operator->Value, "@TYPEDEF_DECLARATION")) { PVARIABLE_TYPE BaseType; - unsigned int Index; + unsigned int Index; Op0 = Pop(MatchedStack); BaseType = PopStructBaseType(MatchedStack, Error); if (!BaseType) @@ -2416,7 +2544,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI // // Add return variable symbol // - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = (PVARIABLE_TYPE)Node->VariableType; Push(MatchedStack, Temp); @@ -2446,13 +2574,13 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (!strcmp(Operator->Value, "@MULTIPLE_ASSIGNMENT")) { - int Op1Capacity = 8; - int Op1Count = 0; + int Op1Capacity = 8; + int Op1Count = 0; BOOLEAN HasExplicitDestinationType = FALSE; - PSCRIPT_ENGINE_TOKEN * Op1Array = (PSCRIPT_ENGINE_TOKEN *)malloc(sizeof(PSCRIPT_ENGINE_TOKEN) * Op1Capacity); - PSYMBOL Symbol = NewSymbol(); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; - Symbol->Value = FUNC_MOV; + PSCRIPT_ENGINE_TOKEN * Op1Array = (PSCRIPT_ENGINE_TOKEN *)malloc(sizeof(PSCRIPT_ENGINE_TOKEN) * Op1Capacity); + PSYMBOL Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_MOV; Op0 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); @@ -2715,11 +2843,10 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (!strcmp(Operator->Value, "@ARRAY_INDEX_WRITE")) { - OffsetToken->Type = DEFERENCE_TEMP; + OffsetToken->Type = DEFERENCE_TEMP; OffsetToken->VariableType = VariableType; - OffsetToken->IsAddress = TRUE; - OffsetToken->AddressSpace = IdToken->AddressSpace ? - IdToken->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; + OffsetToken->IsAddress = TRUE; + OffsetToken->AddressSpace = IdToken->AddressSpace ? IdToken->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; } Push(MatchedStack, OffsetToken); @@ -2728,17 +2855,17 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (!strcmp(Operator->Value, "@MOV")) { - BOOLEAN IsFloatingInitialization = FALSE; - BOOLEAN ScalarAssignmentConverted = FALSE; - BOOLEAN HasExplicitDestinationType = FALSE; - PSCRIPT_ENGINE_TOKEN ConvertedTemp = NULL; - PSYMBOL ConvertedTempSymbol = NULL; + BOOLEAN IsFloatingInitialization = FALSE; + BOOLEAN ScalarAssignmentConverted = FALSE; + BOOLEAN HasExplicitDestinationType = FALSE; + PSCRIPT_ENGINE_TOKEN ConvertedTemp = NULL; + PSYMBOL ConvertedTempSymbol = NULL; PushSymbol(CodeBuffer, OperatorSymbol); Op0 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); - Op1 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); HasExplicitDestinationType = MatchedStack->Pointer > 0 && (!strcmp(Top(MatchedStack)->Value, "@DECLARE_POINTER_TYPE") || Top(MatchedStack)->Type == SCRIPT_VARIABLE_TYPE); @@ -2746,7 +2873,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { Op1->VariableType = GetDefaultImplicitVariableType(); Op1->IsImplicitType = !HasExplicitDestinationType; - Op1Symbol = NewSymbol(); + Op1Symbol = NewSymbol(); free((void *)Op1Symbol->Value); Op1Symbol->Value = NewGlobalIdentifier(Op1); SetType(&Op1Symbol->Type, SYMBOL_GLOBAL_ID_TYPE); @@ -2756,7 +2883,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { Op1->VariableType = GetDefaultImplicitVariableType(); Op1->IsImplicitType = !HasExplicitDestinationType; - Op1Symbol = NewSymbol(); + Op1Symbol = NewSymbol(); free((void *)Op1Symbol->Value); Op1Symbol->Value = NewLocalIdentifier(Op1, 8); SetType(&Op1Symbol->Type, SYMBOL_LOCAL_ID_TYPE); @@ -2795,7 +2922,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI VariableType = PointerVariableType; } - Op1->VariableType = VariableType; + Op1->VariableType = VariableType; IsFloatingInitialization = VariableType->Kind == TY_FLOAT || VariableType->Kind == TY_DOUBLE; if (Op1->Type == LOCAL_UNRESOLVED_ID || Op1->Type == LOCAL_ID) @@ -2811,8 +2938,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (Op0->VariableType && Op1->VariableType) { - UINT64 SourceTypeId = GetScriptScalarTypeId((PVARIABLE_TYPE)Op0->VariableType); - UINT64 DestinationTypeId = GetScriptScalarTypeId((PVARIABLE_TYPE)Op1->VariableType); + UINT64 SourceTypeId = GetScriptScalarTypeId((PVARIABLE_TYPE)Op0->VariableType); + UINT64 DestinationTypeId = GetScriptScalarTypeId((PVARIABLE_TYPE)Op1->VariableType); BOOLEAN PointerConversionAllowed = TRUE; if (SourceTypeId == SCRIPT_SCALAR_TYPE_POINTER && DestinationTypeId != SCRIPT_SCALAR_TYPE_POINTER && @@ -2837,16 +2964,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0Symbol->Len = SourceKind; } - ConvertedTemp = NewTemp(Error); + ConvertedTemp = NewTemp(Error); ConvertedTemp->VariableType = (PVARIABLE_TYPE)Op1->VariableType; - ConvertedTempSymbol = ToSymbol(ConvertedTemp, Error); - ConvertedTempSymbol->Len = GetFloatingValueKind((PVARIABLE_TYPE)Op1->VariableType); + ConvertedTempSymbol = ToSymbol(ConvertedTemp, Error); + ConvertedTempSymbol->Len = GetFloatingValueKind((PVARIABLE_TYPE)Op1->VariableType); (CodeBuffer->Head + CodeBuffer->Pointer - 1)->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, ConvertedTempSymbol); - TypeSymbol = NewSymbol(); - TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; TypeSymbol->Value = SourceTypeId; PushSymbol(CodeBuffer, TypeSymbol); TypeSymbol->Value = DestinationTypeId; @@ -2863,7 +2990,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (!ScalarAssignmentConverted && IsFloatingInitialization) { - UINT64 ValueKind = GetFloatingValueKind(VariableType); + UINT64 ValueKind = GetFloatingValueKind(VariableType); BOOLEAN RequiresConversion = FALSE; if (Op1->Type != LOCAL_UNRESOLVED_ID && Op1->Type != LOCAL_ID) @@ -2902,7 +3029,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PVARIABLE_TYPE SourcePointerType = (PVARIABLE_TYPE)Op0->VariableType; PVARIABLE_TYPE DestinationPointerType = (PVARIABLE_TYPE)Op1->VariableType; PVARIABLE_TYPE AssignedPointerType = CreateStructPointerType(DestinationPointerType->Base, - SourcePointerType->PointerProvenance); + SourcePointerType->PointerProvenance); if (!AssignedPointerType) { *Error = SCRIPT_ENGINE_ERROR_SYNTAX; @@ -2932,10 +3059,22 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } (CodeBuffer->Head + CodeBuffer->Pointer - 1)->Value = FUNC_AGGREGATE_COPY; PushSymbol(CodeBuffer, Op1Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace ? Op1->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Op1->AddressSpace ? Op1->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); PushSymbol(CodeBuffer, Op0Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op0->AddressSpace ? Op0->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = ((PVARIABLE_TYPE)Op0->VariableType)->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Op0->AddressSpace ? Op0->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = ((PVARIABLE_TYPE)Op0->VariableType)->Size; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); } else if (ScalarAssignmentConverted) { @@ -2943,12 +3082,12 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (Op1->IsAddress) { PVARIABLE_TYPE DestinationType = (PVARIABLE_TYPE)Op1->VariableType; - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; - Symbol->Value = FUNC_TYPED_STORE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_TYPED_STORE; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, ConvertedTempSymbol); PushSymbol(CodeBuffer, Op1Symbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace; PushSymbol(CodeBuffer, Symbol); Symbol->Value = DestinationType->Size; @@ -2956,9 +3095,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else { - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; - Symbol->Value = IsFloatingVariableType((PVARIABLE_TYPE)Op1->VariableType) ? - FUNC_MOV_FLOAT : FUNC_MOV; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = IsFloatingVariableType((PVARIABLE_TYPE)Op1->VariableType) ? FUNC_MOV_FLOAT : FUNC_MOV; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, ConvertedTempSymbol); Op1Symbol->Len = GetFloatingValueKind((PVARIABLE_TYPE)Op1->VariableType); @@ -2969,7 +3107,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else if (Op1->IsAddress) { - PSYMBOL Symbol; + PSYMBOL Symbol; PVARIABLE_TYPE DestinationType = (PVARIABLE_TYPE)Op1->VariableType; if (!DestinationType || (DestinationType->Size != 1 && DestinationType->Size != 2 && DestinationType->Size != 4 && DestinationType->Size != 8)) { @@ -2979,8 +3117,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI (CodeBuffer->Head + CodeBuffer->Pointer - 1)->Value = FUNC_TYPED_STORE; PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, Op1Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = DestinationType->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Op1->AddressSpace; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = DestinationType->Size; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); } else { @@ -3328,9 +3474,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } AddressSpace = Op0->AddressSpace ? Op0->AddressSpace : SCRIPT_ENGINE_ADDRESS_SPACE_LOCAL; - Provenance = AddressSpace == SCRIPT_ENGINE_ADDRESS_SPACE_REMOTE ? - POINTER_PROVENANCE_REMOTE : - POINTER_PROVENANCE_LOCAL; + Provenance = AddressSpace == SCRIPT_ENGINE_ADDRESS_SPACE_REMOTE ? POINTER_PROVENANCE_REMOTE : POINTER_PROVENANCE_LOCAL; Temp = NewTemp(Error); if (*Error != SCRIPT_ENGINE_ERROR_FREE) @@ -3425,8 +3569,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } else { - VariableType = (VARIABLE_TYPE *)Op0->VariableType; - Op0Symbol = ToSymbol(Op0, Error); + VariableType = (VARIABLE_TYPE *)Op0->VariableType; + Op0Symbol = ToSymbol(Op0, Error); BOOLEAN IsTypedIntegerUnary = FALSE; if (!strcmp(Operator->Value, "@NEG") && @@ -3438,17 +3582,17 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI else if (IsIntegerVariableType(VariableType) && (!strcmp(Operator->Value, "@NEG") || !strcmp(Operator->Value, "@NOT"))) { - VariableType = PromoteIntegerVariableType(VariableType); - OperatorSymbol->Value = !strcmp(Operator->Value, "@NEG") ? - FUNC_NEG_TYPED : FUNC_BITWISE_NOT_TYPED; - IsTypedIntegerUnary = TRUE; + VariableType = PromoteIntegerVariableType(VariableType); + OperatorSymbol->Value = !strcmp(Operator->Value, "@NEG") ? FUNC_NEG_TYPED : FUNC_BITWISE_NOT_TYPED; + IsTypedIntegerUnary = TRUE; } PushSymbol(CodeBuffer, OperatorSymbol); Temp = NewTemp(Error); Temp->VariableType = (!strcmp(Operator->Value, "@NEG") || - !strcmp(Operator->Value, "@NOT")) ? - VariableType : GetDefaultImplicitVariableType(); + !strcmp(Operator->Value, "@NOT")) + ? VariableType + : GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -3457,8 +3601,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (IsTypedIntegerUnary) { PSYMBOL TypeSymbol = NewSymbol(); - TypeSymbol->Type = SYMBOL_NUM_TYPE; - TypeSymbol->Value = GetScriptScalarTypeId(VariableType); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = GetScriptScalarTypeId(VariableType); PushSymbol(CodeBuffer, TypeSymbol); RemoveSymbol(&TypeSymbol); } @@ -3601,7 +3745,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { PushSymbol(CodeBuffer, OperatorSymbol); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -3633,7 +3777,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI break; } - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -3682,7 +3826,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op1Symbol); PushSymbol(CodeBuffer, Op2Symbol); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -3733,11 +3877,11 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (Op1->IsAddress && ((VARIABLE_TYPE *)Op1->VariableType)->Kind != TY_PTR) { - PVARIABLE_TYPE LValueType = (PVARIABLE_TYPE)Op1->VariableType; - PVARIABLE_TYPE CommonType; - UINT64 TypedOpcode; + PVARIABLE_TYPE LValueType = (PVARIABLE_TYPE)Op1->VariableType; + PVARIABLE_TYPE CommonType; + UINT64 TypedOpcode; PSCRIPT_ENGINE_TOKEN LoadedValue; - PSYMBOL Symbol; + PSYMBOL Symbol; if (LValueType->Size != 1 && LValueType->Size != 2 && LValueType->Size != 4 && LValueType->Size != 8) @@ -3749,8 +3893,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI break; } - Op0 = Pop(MatchedStack); - Op1 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); LoadedValue = EmitTypedScalarLoad(CodeBuffer, Op1, Op1->AddressSpace, @@ -3772,9 +3916,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { PSCRIPT_ENGINE_TOKEN OperationTemp = NewTemp(Error); PSCRIPT_ENGINE_TOKEN CastTemp = NewTemp(Error); - PSYMBOL OperationTempSymbol; - PSYMBOL CastTempSymbol; - PSYMBOL LoadedValueSymbol; + PSYMBOL OperationTempSymbol; + PSYMBOL CastTempSymbol; + PSYMBOL LoadedValueSymbol; OperationTemp->VariableType = CommonType; CastTemp->VariableType = LValueType; @@ -3782,23 +3926,38 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI CastTempSymbol = ToSymbol(CastTemp, Error); LoadedValueSymbol = ToSymbol(LoadedValue, Error); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = TypedOpcode; PushSymbol(CodeBuffer, Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = TypedOpcode; + PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, LoadedValueSymbol); PushSymbol(CodeBuffer, OperationTempSymbol); - Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId(CommonType); PushSymbol(CodeBuffer, Symbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = GetScriptScalarTypeId(CommonType); + PushSymbol(CodeBuffer, Symbol); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, Symbol); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_CAST_SCALAR; + PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, OperationTempSymbol); PushSymbol(CodeBuffer, CastTempSymbol); - Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId(CommonType); PushSymbol(CodeBuffer, Symbol); - Symbol->Value = GetScriptScalarTypeId(LValueType); PushSymbol(CodeBuffer, Symbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = GetScriptScalarTypeId(CommonType); + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = GetScriptScalarTypeId(LValueType); + PushSymbol(CodeBuffer, Symbol); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_STORE; PushSymbol(CodeBuffer, Symbol); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_TYPED_STORE; + PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, CastTempSymbol); PushSymbol(CodeBuffer, Op1Symbol); - Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace; PushSymbol(CodeBuffer, Symbol); - Symbol->Value = LValueType->Size; PushSymbol(CodeBuffer, Symbol); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Op1->AddressSpace; + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = LValueType->Size; + PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); FreeTemp(OperationTemp); @@ -3814,11 +3973,20 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, TempSymbol); PushSymbol(CodeBuffer, TempSymbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_TYPED_STORE; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_TYPED_STORE; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); PushSymbol(CodeBuffer, TempSymbol); PushSymbol(CodeBuffer, Op1Symbol); - Symbol = NewSymbol(); Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = Op1->AddressSpace; PushSymbol(CodeBuffer, Symbol); - Symbol->Value = LValueType->Size; PushSymbol(CodeBuffer, Symbol); RemoveSymbol(&Symbol); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Value = Op1->AddressSpace; + PushSymbol(CodeBuffer, Symbol); + Symbol->Value = LValueType->Size; + PushSymbol(CodeBuffer, Symbol); + RemoveSymbol(&Symbol); } FreeTemp(Op0); @@ -3926,50 +4094,50 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (!Handled) { PVARIABLE_TYPE CommonType; - UINT64 TypedOpcode; - Op0 = Pop(MatchedStack); - Op1 = Pop(MatchedStack); - Op0Symbol = ToSymbol(Op0, Error); - Op1Symbol = ToSymbol(Op1, Error); - CommonType = GetCommonVariableType((PVARIABLE_TYPE)Op0->VariableType, - (PVARIABLE_TYPE)Op1->VariableType); + UINT64 TypedOpcode; + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); + Op0Symbol = ToSymbol(Op0, Error); + Op1Symbol = ToSymbol(Op1, Error); + CommonType = GetCommonVariableType((PVARIABLE_TYPE)Op0->VariableType, + (PVARIABLE_TYPE)Op1->VariableType); TypedOpcode = GetTypedAssignmentOpcode(Operator->Value); if (IsIntegerVariableType(CommonType) && TypedOpcode != FUNC_UNDEFINED && IsIntegerVariableType((PVARIABLE_TYPE)Op1->VariableType)) { PSCRIPT_ENGINE_TOKEN OperationTemp = NewTemp(Error); - PSCRIPT_ENGINE_TOKEN CastTemp = NewTemp(Error); - PSYMBOL OperationTempSymbol; - PSYMBOL CastTempSymbol; - PSYMBOL Symbol = NewSymbol(); + PSCRIPT_ENGINE_TOKEN CastTemp = NewTemp(Error); + PSYMBOL OperationTempSymbol; + PSYMBOL CastTempSymbol; + PSYMBOL Symbol = NewSymbol(); OperationTemp->VariableType = CommonType; - CastTemp->VariableType = (PVARIABLE_TYPE)Op1->VariableType; - OperationTempSymbol = ToSymbol(OperationTemp, Error); - CastTempSymbol = ToSymbol(CastTemp, Error); + CastTemp->VariableType = (PVARIABLE_TYPE)Op1->VariableType; + OperationTempSymbol = ToSymbol(OperationTemp, Error); + CastTempSymbol = ToSymbol(CastTemp, Error); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = TypedOpcode; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, Op1Symbol); PushSymbol(CodeBuffer, OperationTempSymbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId(CommonType); PushSymbol(CodeBuffer, Symbol); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, OperationTempSymbol); PushSymbol(CodeBuffer, CastTempSymbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId(CommonType); PushSymbol(CodeBuffer, Symbol); Symbol->Value = GetScriptScalarTypeId((PVARIABLE_TYPE)Op1->VariableType); PushSymbol(CodeBuffer, Symbol); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; Symbol->Value = FUNC_MOV; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, CastTempSymbol); @@ -4015,8 +4183,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI !IsIntegerVariableType((PVARIABLE_TYPE)Op1->VariableType))) { *Error = SCRIPT_ENGINE_ERROR_UNSUPPORTED_FLOAT_OPERATION; - Op0 = Pop(MatchedStack); - Op1 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); RemoveToken(&Op0); RemoveToken(&Op1); Handled = TRUE; @@ -4025,11 +4193,12 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI { PVARIABLE_TYPE ResultType = ((PVARIABLE_TYPE)Op0->VariableType)->Kind == TY_DOUBLE || - ((PVARIABLE_TYPE)Op1->VariableType)->Kind == TY_DOUBLE ? - VARIABLE_TYPE_DOUBLE : VARIABLE_TYPE_FLOAT; + ((PVARIABLE_TYPE)Op1->VariableType)->Kind == TY_DOUBLE + ? VARIABLE_TYPE_DOUBLE + : VARIABLE_TYPE_FLOAT; PSCRIPT_ENGINE_TOKEN ConvertedOp0 = NULL; PSCRIPT_ENGINE_TOKEN ConvertedOp1 = NULL; - PSYMBOL Symbol; + PSYMBOL Symbol; Op0 = Pop(MatchedStack); Op1 = Pop(MatchedStack); @@ -4038,16 +4207,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if ((PVARIABLE_TYPE)Op0->VariableType != ResultType) { - ConvertedOp0 = NewTemp(Error); + ConvertedOp0 = NewTemp(Error); ConvertedOp0->VariableType = ResultType; - PSYMBOL ConvertedSymbol = ToSymbol(ConvertedOp0, Error); - Symbol = NewSymbol(); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; - Symbol->Value = FUNC_CAST_SCALAR; + PSYMBOL ConvertedSymbol = ToSymbol(ConvertedOp0, Error); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, ConvertedSymbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId((PVARIABLE_TYPE)Op0->VariableType); PushSymbol(CodeBuffer, Symbol); Symbol->Value = GetScriptScalarTypeId(ResultType); @@ -4057,16 +4226,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI } if ((PVARIABLE_TYPE)Op1->VariableType != ResultType) { - ConvertedOp1 = NewTemp(Error); + ConvertedOp1 = NewTemp(Error); ConvertedOp1->VariableType = ResultType; - PSYMBOL ConvertedSymbol = ToSymbol(ConvertedOp1, Error); - Symbol = NewSymbol(); - Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; - Symbol->Value = FUNC_CAST_SCALAR; + PSYMBOL ConvertedSymbol = ToSymbol(ConvertedOp1, Error); + Symbol = NewSymbol(); + Symbol->Type = SYMBOL_SEMANTIC_RULE_TYPE; + Symbol->Value = FUNC_CAST_SCALAR; PushSymbol(CodeBuffer, Symbol); PushSymbol(CodeBuffer, Op1Symbol); PushSymbol(CodeBuffer, ConvertedSymbol); - Symbol->Type = SYMBOL_NUM_TYPE; + Symbol->Type = SYMBOL_NUM_TYPE; Symbol->Value = GetScriptScalarTypeId((PVARIABLE_TYPE)Op1->VariableType); PushSymbol(CodeBuffer, Symbol); Symbol->Value = GetScriptScalarTypeId(ResultType); @@ -4074,10 +4243,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI RemoveSymbol(&Symbol); Op1Symbol = ConvertedSymbol; } - Temp = NewTemp(Error); - Temp->VariableType = IsFloatingComparisonOperator(Operator->Value) ? - VARIABLE_TYPE_INT : ResultType; - TempSymbol = ToSymbol(Temp, Error); + Temp = NewTemp(Error); + Temp->VariableType = IsFloatingComparisonOperator(Operator->Value) ? VARIABLE_TYPE_INT : ResultType; + TempSymbol = ToSymbol(Temp, Error); OperatorSymbol->Value = FloatingOpcode; PushSymbol(CodeBuffer, OperatorSymbol); @@ -4119,16 +4287,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PSYMBOL TypeSymbol; OperatorSymbol->Value = FUNC_POINTER_DIFF; PushSymbol(CodeBuffer, OperatorSymbol); - Op0Symbol = ToSymbol(Op0, Error); - Op1Symbol = ToSymbol(Op1, Error); - Temp = NewTemp(Error); + Op0Symbol = ToSymbol(Op0, Error); + Op1Symbol = ToSymbol(Op1, Error); + Temp = NewTemp(Error); Temp->VariableType = VARIABLE_TYPE_LONG; - TempSymbol = ToSymbol(Temp, Error); + TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, Op1Symbol); PushSymbol(CodeBuffer, TempSymbol); - TypeSymbol = NewSymbol(); - TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; TypeSymbol->Value = ((PVARIABLE_TYPE)Op0->VariableType)->Base->Size; PushSymbol(CodeBuffer, TypeSymbol); RemoveSymbol(&TypeSymbol); @@ -4172,9 +4340,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op1Symbol = ToSymbol(Op1, Error); PushSymbol(CodeBuffer, Op1Symbol); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = (PVARIABLE_TYPE)Op0->VariableType; - TempSymbol = ToSymbol(Temp, Error); + TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); PushSymbol(CodeBuffer, OperatorSymbol); @@ -4218,9 +4386,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op0Symbol); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = (PVARIABLE_TYPE)Op1->VariableType; - TempSymbol = ToSymbol(Temp, Error); + TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); PushSymbol(CodeBuffer, OperatorSymbol); @@ -4287,9 +4455,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op1Symbol = ToSymbol(Op1, Error); PushSymbol(CodeBuffer, Op1Symbol); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = CreatePointerType(((PVARIABLE_TYPE)Op0->VariableType)->Base); - TempSymbol = ToSymbol(Temp, Error); + TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); PushSymbol(CodeBuffer, OperatorSymbol); @@ -4340,9 +4508,9 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op0Symbol); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = CreatePointerType(((PVARIABLE_TYPE)Op1->VariableType)->Base); - TempSymbol = ToSymbol(Temp, Error); + TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, TempSymbol); PushSymbol(CodeBuffer, OperatorSymbol); @@ -4377,25 +4545,25 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI ((PVARIABLE_TYPE)Op1->VariableType)->Base != VARIABLE_TYPE_VOID) { *Error = SCRIPT_ENGINE_ERROR_SYNTAX; - Op0 = Pop(MatchedStack); - Op1 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); } else { - Op0 = Pop(MatchedStack); - Op1 = Pop(MatchedStack); + Op0 = Pop(MatchedStack); + Op1 = Pop(MatchedStack); OperatorSymbol->Value = GetTypedBinaryOpcode(Operator->Value); PushSymbol(CodeBuffer, OperatorSymbol); - Op0Symbol = ToSymbol(Op0, Error); - Op1Symbol = ToSymbol(Op1, Error); - Temp = NewTemp(Error); + Op0Symbol = ToSymbol(Op0, Error); + Op1Symbol = ToSymbol(Op1, Error); + Temp = NewTemp(Error); Temp->VariableType = VARIABLE_TYPE_INT; - TempSymbol = ToSymbol(Temp, Error); + TempSymbol = ToSymbol(Temp, Error); PushSymbol(CodeBuffer, Op0Symbol); PushSymbol(CodeBuffer, Op1Symbol); PushSymbol(CodeBuffer, TempSymbol); - TypeSymbol = NewSymbol(); - TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol = NewSymbol(); + TypeSymbol->Type = SYMBOL_NUM_TYPE; TypeSymbol->Value = SCRIPT_SCALAR_TYPE_POINTER; PushSymbol(CodeBuffer, TypeSymbol); RemoveSymbol(&TypeSymbol); @@ -4414,17 +4582,16 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op1 = Pop(MatchedStack); Op1Symbol = ToSymbol(Op1, Error); - PVARIABLE_TYPE CommonType = GetCommonVariableType((PVARIABLE_TYPE)Op0->VariableType, - (PVARIABLE_TYPE)Op1->VariableType); - UINT64 TypedOpcode = GetTypedBinaryOpcode(Operator->Value); - BOOLEAN TypedIntegerOperation = IsIntegerVariableType(CommonType) && TypedOpcode != FUNC_UNDEFINED; + PVARIABLE_TYPE CommonType = GetCommonVariableType((PVARIABLE_TYPE)Op0->VariableType, + (PVARIABLE_TYPE)Op1->VariableType); + UINT64 TypedOpcode = GetTypedBinaryOpcode(Operator->Value); + BOOLEAN TypedIntegerOperation = IsIntegerVariableType(CommonType) && TypedOpcode != FUNC_UNDEFINED; if (TypedIntegerOperation) OperatorSymbol->Value = TypedOpcode; PushSymbol(CodeBuffer, OperatorSymbol); - Temp = NewTemp(Error); - Temp->VariableType = IsFloatingComparisonOperator(Operator->Value) ? - VARIABLE_TYPE_INT : CommonType; + Temp = NewTemp(Error); + Temp->VariableType = IsFloatingComparisonOperator(Operator->Value) ? VARIABLE_TYPE_INT : CommonType; Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -4434,8 +4601,8 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI if (TypedIntegerOperation) { PSYMBOL TypeSymbol = NewSymbol(); - TypeSymbol->Type = SYMBOL_NUM_TYPE; - TypeSymbol->Value = GetScriptScalarTypeId(CommonType); + TypeSymbol->Type = SYMBOL_NUM_TYPE; + TypeSymbol->Value = GetScriptScalarTypeId(CommonType); PushSymbol(CodeBuffer, TypeSymbol); RemoveSymbol(&TypeSymbol); } @@ -5151,7 +5318,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -5181,7 +5348,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI break; } - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -5209,7 +5376,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op1Symbol); PushSymbol(CodeBuffer, Op2Symbol); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -5232,7 +5399,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI Op0 = Pop(MatchedStack); Op0Symbol = ToSymbol(Op0, Error); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -5262,7 +5429,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI break; } - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -5291,7 +5458,7 @@ CodeGen(PSCRIPT_ENGINE_TOKEN_LIST MatchedStack, PSYMBOL_BUFFER CodeBuffer, PSCRI PushSymbol(CodeBuffer, Op1Symbol); PushSymbol(CodeBuffer, Op2Symbol); - Temp = NewTemp(Error); + Temp = NewTemp(Error); Temp->VariableType = GetDefaultImplicitVariableType(); Push(MatchedStack, Temp); TempSymbol = ToSymbol(Temp, Error); @@ -5823,7 +5990,7 @@ ToSymbol(PSCRIPT_ENGINE_TOKEN Token, PSCRIPT_ENGINE_ERROR_TYPE Error) SetType(&Symbol->Type, SYMBOL_TEMP_TYPE); } else if (((VARIABLE_TYPE *)Token->VariableType)->Kind == TY_ARRAY || - ((VARIABLE_TYPE *)Token->VariableType)->Kind == TY_STRUCT) + ((VARIABLE_TYPE *)Token->VariableType)->Kind == TY_STRUCT) { SetType(&Symbol->Type, SYMBOL_REFERENCE_TEMP_TYPE); } @@ -6702,7 +6869,6 @@ FuncGetNumberOfOperands(UINT64 FuncType, UINT32 * NumberOfGetOperands, UINT32 * switch (FuncType) { - case FUNC_CAST_SCALAR: *NumberOfGetOperands = 3; @@ -6777,55 +6943,55 @@ FuncGetNumberOfOperands(UINT64 FuncType, UINT32 * NumberOfGetOperands, UINT32 * break; - // - // This code is not tested yet, so they are commented out for now - // - //case FUNC_MOV_FLOAT: - //case FUNC_NEG_FLOAT: - //case FUNC_CONVERT_FLOAT: - // *NumberOfGetOperands = 1; - // *NumberOfSetOperands = 1; - // Result = TRUE; - // break; + // + // This code is not tested yet, so they are commented out for now + // + // case FUNC_MOV_FLOAT: + // case FUNC_NEG_FLOAT: + // case FUNC_CONVERT_FLOAT: + // *NumberOfGetOperands = 1; + // *NumberOfSetOperands = 1; + // Result = TRUE; + // break; - //case FUNC_ADD_FLOAT: - //case FUNC_SUB_FLOAT: - //case FUNC_MUL_FLOAT: - //case FUNC_DIV_FLOAT: - //case FUNC_GT_FLOAT: - //case FUNC_LT_FLOAT: - //case FUNC_EGT_FLOAT: - //case FUNC_ELT_FLOAT: - //case FUNC_EQUAL_FLOAT: - //case FUNC_NEQ_FLOAT: - // *NumberOfGetOperands = 2; - // *NumberOfSetOperands = 1; - // Result = TRUE; - // break; + // case FUNC_ADD_FLOAT: + // case FUNC_SUB_FLOAT: + // case FUNC_MUL_FLOAT: + // case FUNC_DIV_FLOAT: + // case FUNC_GT_FLOAT: + // case FUNC_LT_FLOAT: + // case FUNC_EGT_FLOAT: + // case FUNC_ELT_FLOAT: + // case FUNC_EQUAL_FLOAT: + // case FUNC_NEQ_FLOAT: + // *NumberOfGetOperands = 2; + // *NumberOfSetOperands = 1; + // Result = TRUE; + // break; - //case FUNC_TYPED_LOAD: - // *NumberOfGetOperands = 3; - // *NumberOfSetOperands = 1; - // Result = TRUE; - // break; + // case FUNC_TYPED_LOAD: + // *NumberOfGetOperands = 3; + // *NumberOfSetOperands = 1; + // Result = TRUE; + // break; - //case FUNC_TYPED_STORE: - // *NumberOfGetOperands = 4; - // *NumberOfSetOperands = 0; - // Result = TRUE; - // break; + // case FUNC_TYPED_STORE: + // *NumberOfGetOperands = 4; + // *NumberOfSetOperands = 0; + // Result = TRUE; + // break; - //case FUNC_AGGREGATE_COPY: - // *NumberOfGetOperands = 5; - // *NumberOfSetOperands = 0; - // Result = TRUE; - // break; + // case FUNC_AGGREGATE_COPY: + // *NumberOfGetOperands = 5; + // *NumberOfSetOperands = 0; + // Result = TRUE; + // break; - //case FUNC_AGGREGATE_ZERO: - // *NumberOfGetOperands = 3; - // *NumberOfSetOperands = 0; - // Result = TRUE; - // break; + // case FUNC_AGGREGATE_ZERO: + // *NumberOfGetOperands = 3; + // *NumberOfSetOperands = 0; + // Result = TRUE; + // break; case FUNC_INC: From 36a4f675019adba8cc497baf0f9492acf410ce75 Mon Sep 17 00:00:00 2001 From: sina Date: Fri, 24 Jul 2026 13:13:49 +0200 Subject: [PATCH 26/50] update version and CHANGELOG.md --- CHANGELOG.md | 20 ++++++++++++++++++++ CREDITS.md | 3 ++- hyperdbg/include/SDK/headers/Constants.h | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b68f01cf..0a25b995 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.23.0.0] - 2026-XX-XX +New release of the HyperDbg Debugger. + +### Added +- Added the 'ucpuid' command ([link](https://docs.hyperdbg.org/commands/debugging-commands/ucpuid))([link](https://github.com/HyperDbg/HyperDbg/pull/658)) +- Added floating-point support in the script engine ([link](https://docs.hyperdbg.org/commands/scripting-language/data-types-and-operators))([link](https://github.com/HyperDbg/HyperDbg/pull/655)) +- Added new platform functions for missed CPUID wrapper ([link](https://github.com/HyperDbg/HyperDbg/commit/dd38a30d224d05bb9cfab28f6024db8cc51acffd)) +- Added guards and compilation flags in CMake ([link](https://github.com/HyperDbg/HyperDbg/commit/860f736bd21a274930420a12ed7eac970732717a)) +- Added SDK function for the 'ucpuid' command ([link](https://docs.hyperdbg.org/commands/debugging-commands/ucpuid))([link](https://github.com/HyperDbg/HyperDbg/pull/659)) +- Added a new socket platform API and named-pipe Linux file ([link](https://github.com/HyperDbg/HyperDbg/commit/6683c2dc3db640e8b75786570759daf4e630c7f0)) + +### Changed +- Updated variable types and added float types in the script engine ([link](https://github.com/HyperDbg/HyperDbg/commit/d44c726dff91402a1f093455b69449b65657bce0)) +- Porting status update and terminate thread platform call ([link](https://github.com/HyperDbg/HyperDbg/commit/a29e210ab067d4a96a0d130f61aeed5b53387565)) +- Sweep and extra guards and some new platform functions ([link](https://github.com/HyperDbg/HyperDbg/commit/926070135d44b7459409e1cce1d4595426062daa)) +- Fix UInt32 conversion for negative (signed) values ([link](https://github.com/HyperDbg/HyperDbg/commit/d4132ee7db092140b526d4cd31e445114aa470ec)) +- Fix the 'snprintf_s' wrapper function for cross-platform compilation ([link](https://github.com/HyperDbg/HyperDbg/commit/aa96eaa617c0c1a432682b83a5021ac4963182d1)) +- Changed 'CpuIdEx' variants to a cross-platform 'CpuCpuIdEx' ([link](https://github.com/HyperDbg/HyperDbg/commit/c13f45f8b05743c5d87d3a50687507defe54af2b)) +- Updated number of CPUs to a cross-platform function ([link](https://github.com/HyperDbg/HyperDbg/commit/5fdd2e7738e6f68ed5ff516467fbc5bfdaec9759)) + ## [0.22.0.0] - 2026-07-20 New release of the HyperDbg Debugger. diff --git a/CREDITS.md b/CREDITS.md index 5fef45b1..3d5b0072 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -28,4 +28,5 @@ Just so you know – the attributions listed on this credits page are acknowledg - Artem Shishkin ([@honorary_bot](https://twitter.com/honorary_bot)) for always answering our hypervisor questions - unrustled.jimmies for helping us debug and fix issues, and his contributions in HyperDbg - Hari Mishal ([@harimishal1](https://github.com/harimishal1)) for his works on the hypertrace project for supporting Last Branch Record (LBR) -- Masoud Rahimi Jafari ([@masoudrahimi01](https://github.com/masoudrahimi01)) for his works on the hypertrace project for supporting Intel Processor Trace (PT) \ No newline at end of file +- Masoud Rahimi Jafari ([@masoudrahimi01](https://github.com/masoudrahimi01)) for his works on the hypertrace project for supporting Intel Processor Trace (PT) +- Abolfazl Hassani ([@FallinBinary](https://github.com/FallinBinary)) for his contributions in HyperDbg \ No newline at end of file diff --git a/hyperdbg/include/SDK/headers/Constants.h b/hyperdbg/include/SDK/headers/Constants.h index 9c647346..af8804d6 100644 --- a/hyperdbg/include/SDK/headers/Constants.h +++ b/hyperdbg/include/SDK/headers/Constants.h @@ -18,7 +18,7 @@ ////////////////////////////////////////////////// #define VERSION_MAJOR 0 -#define VERSION_MINOR 22 +#define VERSION_MINOR 23 #define VERSION_PATCH 0 #define BETA_VERSION FALSE From 7141e23aadd6cc92d7edf1259fc0a6438a96737a Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 18:27:26 +0200 Subject: [PATCH 27/50] Added unix implementation of asm-vmx-checks.asm, and made naming convention for both files. Updated the Porting status and updated the build files. --- hyperdbg/libhyperdbg/CMakeLists.txt | 11 ++++- .../code/assembly/asm-vmx-checks-gas-unix.s | 44 +++++++++++++++++++ ...ks.asm => asm-vmx-checks-masm-windows.asm} | 0 hyperdbg/libhyperdbg/libhyperdbg.vcxproj | 2 +- .../libhyperdbg/libhyperdbg.vcxproj.filters | 2 +- hyperdbg/linux/PORTING_STATUS.md | 13 ++++++ 6 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 hyperdbg/libhyperdbg/code/assembly/asm-vmx-checks-gas-unix.s rename hyperdbg/libhyperdbg/code/assembly/{asm-vmx-checks.asm => asm-vmx-checks-masm-windows.asm} (100%) diff --git a/hyperdbg/libhyperdbg/CMakeLists.txt b/hyperdbg/libhyperdbg/CMakeLists.txt index 1b7333e1..6879e96b 100644 --- a/hyperdbg/libhyperdbg/CMakeLists.txt +++ b/hyperdbg/libhyperdbg/CMakeLists.txt @@ -160,7 +160,7 @@ set(SourceFiles "code/debugger/tests/tests.cpp" "code/debugger/transparency/gaussian-rng.cpp" "code/debugger/transparency/transparency.cpp" - "code/assembly/asm-vmx-checks.asm" + "code/assembly/asm-vmx-checks-masm-windows.asm" ) include_directories( "../dependencies/phnt" @@ -197,6 +197,15 @@ if(UNIX) list(APPEND SourceFiles "code/debugger/driver-loader/install-linux.cpp") list(REMOVE_ITEM SourceFiles "code/debugger/communication/namedpipe.cpp") list(APPEND SourceFiles "code/debugger/communication/namedpipe-linux.cpp") + + # + # The MASM (.asm) implementation only builds with the Microsoft assembler, + # so swap it for the GAS (AT&T syntax) port and enable the ASM language so + # CMake assembles the .s file with the system assembler. + # + list(REMOVE_ITEM SourceFiles "code/assembly/asm-vmx-checks-masm-windows.asm") + list(APPEND SourceFiles "code/assembly/asm-vmx-checks-gas-unix.s") + enable_language(ASM) endif() add_library(libhyperdbg SHARED ${SourceFiles}) diff --git a/hyperdbg/libhyperdbg/code/assembly/asm-vmx-checks-gas-unix.s b/hyperdbg/libhyperdbg/code/assembly/asm-vmx-checks-gas-unix.s new file mode 100644 index 00000000..e590170f --- /dev/null +++ b/hyperdbg/libhyperdbg/code/assembly/asm-vmx-checks-gas-unix.s @@ -0,0 +1,44 @@ +/* ------------------------------------------------------------------------ + * GAS (AT&T syntax) port of asm-vmx-checks-masm-windows.asm + * + * AsmVmxSupportDetection: returns 1 in rax if the CPU reports VMX support + * (CPUID.1:ECX[5]), 0 otherwise. + * ------------------------------------------------------------------------ */ + + .text + .globl AsmVmxSupportDetection + .type AsmVmxSupportDetection, @function + +/* ------------------------------------------------------------------------ */ + +AsmVmxSupportDetection: + push %rbx + push %rcx + push %rdx + + xor %eax, %eax + inc %eax + cpuid + xor %rax, %rax + bt $0x05, %ecx + jc VMXSupport + +VMXNotSupport: + jmp RetInst + +VMXSupport: + mov $0x01, %rax + +RetInst: + pop %rdx + pop %rcx + pop %rbx + + ret + + .size AsmVmxSupportDetection, .-AsmVmxSupportDetection + +/* ------------------------------------------------------------------------ */ + +/* Mark the stack as non-executable (no executable-stack requirement). */ + .section .note.GNU-stack,"",@progbits diff --git a/hyperdbg/libhyperdbg/code/assembly/asm-vmx-checks.asm b/hyperdbg/libhyperdbg/code/assembly/asm-vmx-checks-masm-windows.asm similarity index 100% rename from hyperdbg/libhyperdbg/code/assembly/asm-vmx-checks.asm rename to hyperdbg/libhyperdbg/code/assembly/asm-vmx-checks-masm-windows.asm diff --git a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj index 7d4c3eb4..81674601 100644 --- a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj +++ b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj @@ -331,7 +331,7 @@ msbuild "$(SolutionDir)dependencies\zydis\msvc\Zydis.sln" /m /p:Configuration="R - + diff --git a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters index 7f9bdb60..81c07a6b 100644 --- a/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters +++ b/hyperdbg/libhyperdbg/libhyperdbg.vcxproj.filters @@ -747,7 +747,7 @@ - + code\assembly diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index 05839ac3..ae0be7ef 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -411,6 +411,19 @@ shims in `Environment.h`. Note the pre-existing latent teardown-ordering issue is unchanged; see the `PlatformTerminateThread` TODO below (remote-connection's listening thread). +### asm-vmx-checks — DONE via GAS port + CMake swap (2026-07-24) + +`code/assembly/asm-vmx-checks-masm-windows.asm` (MASM, `AsmVmxSupportDetection`: +CPUID.1 → `bt ecx,5` → return 1/0 for VMX support) only assembles with ml64. +Ported to a new GAS/AT&T-syntax `code/assembly/asm-vmx-checks-gas-unix.s` — +instruction-for-instruction equivalent, `.globl AsmVmxSupportDetection`, plus a +`.note.GNU-stack` non-exec-stack marker. No logic change. The Windows `.asm` is +left untouched. CMake: base `SourceFiles` entry renamed to `-masm-windows.asm`, +and the `if(UNIX)` block REMOVE_ITEMs it, APPENDs the `.s`, and calls +`enable_language(ASM)` so CMake assembles it with the system assembler. Windows +`libhyperdbg.vcxproj` + `.filters` `` updated to the renamed +`-masm-windows.asm`. Assemble-verified with `as` (exports `AsmVmxSupportDetection`). + --- ## TODO ledger — revisit before Linux is functional From f5f822a46f5aa3041cda6f7a1c29aaf18f705f15 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 19:21:06 +0200 Subject: [PATCH 28/50] Added the hwdbg files to the cmake files and replaced the platform files, RTLzeroMemory --- hyperdbg/CMakeLists.txt | 5 +++-- hyperdbg/libhyperdbg/CMakeLists.txt | 3 +++ .../libhyperdbg/code/hwdbg/hwdbg-scripts.cpp | 2 +- hyperdbg/linux/PORTING_STATUS.md | 16 ++++++++++++++++ hyperdbg/script-engine/CMakeLists.txt | 2 ++ hyperdbg/script-engine/code/hardware.c | 4 ++-- 6 files changed, 27 insertions(+), 5 deletions(-) diff --git a/hyperdbg/CMakeLists.txt b/hyperdbg/CMakeLists.txt index 389ba4e4..df6a851f 100644 --- a/hyperdbg/CMakeLists.txt +++ b/hyperdbg/CMakeLists.txt @@ -72,10 +72,11 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}") #target_link_libraries(script-engine symbol-parser) add_subdirectory(script-engine) -link_directories(libraries/zydis/user libraries/keystone/release-lib) +#link_directories(libraries/zydis/user libraries/keystone/release-lib) add_subdirectory(libhyperdbg) find_package(Threads REQUIRED) -target_link_libraries(libhyperdbg Zycore Zydis script-engine keystone Threads::Threads ${CMAKE_DL_LIBS}) +#target_link_libraries(libhyperdbg Zycore Zydis script-engine keystone Threads::Threads ${CMAKE_DL_LIBS}) +target_link_libraries(libhyperdbg Zycore Zydis script-engine Threads::Threads ${CMAKE_DL_LIBS}) add_subdirectory(hyperdbg-cli) target_link_libraries(hyperdbg-cli libhyperdbg) diff --git a/hyperdbg/libhyperdbg/CMakeLists.txt b/hyperdbg/libhyperdbg/CMakeLists.txt index 6879e96b..89d96cd8 100644 --- a/hyperdbg/libhyperdbg/CMakeLists.txt +++ b/hyperdbg/libhyperdbg/CMakeLists.txt @@ -12,6 +12,7 @@ set(SourceFiles "header/globals/globals.h" "header/debugger/commands/help.h" "header/hwdbg/hwdbg-interpreter.h" + "header/hwdbg/hwdbg-scripts.h" "header/debugger/misc/inipp.h" "header/debugger/driver-loader/install.h" "header/debugger/kernel-level/kd.h" @@ -52,6 +53,7 @@ set(SourceFiles "code/debugger/commands/extension-commands/trace.cpp" "code/debugger/commands/extension-commands/track.cpp" "code/debugger/commands/extension-commands/mode.cpp" + "code/debugger/commands/hwdbg-commands/hw.cpp" "code/debugger/commands/hwdbg-commands/hw_clk.cpp" "code/debugger/commands/meta-commands/dump.cpp" "code/debugger/commands/meta-commands/kill.cpp" @@ -78,6 +80,7 @@ set(SourceFiles "code/debugger/user-level/user-listening.cpp" "code/export/export.cpp" "code/hwdbg/hwdbg-interpreter.cpp" + "code/hwdbg/hwdbg-scripts.cpp" "code/objects/objects.cpp" "code/rev/rev-ctrl.cpp" "pch.cpp" diff --git a/hyperdbg/libhyperdbg/code/hwdbg/hwdbg-scripts.cpp b/hyperdbg/libhyperdbg/code/hwdbg/hwdbg-scripts.cpp index f905eba3..9379518a 100644 --- a/hyperdbg/libhyperdbg/code/hwdbg/hwdbg-scripts.cpp +++ b/hyperdbg/libhyperdbg/code/hwdbg/hwdbg-scripts.cpp @@ -412,7 +412,7 @@ HwdbgScriptSendScriptPacket(HWDBG_INSTANCE_INFORMATION * InstanceInfo, return FALSE; } - RtlZeroMemory(FinalBuffer, BufferLength + sizeof(HWDBG_SCRIPT_BUFFER)); + PlatformZeroMemory(FinalBuffer, BufferLength + sizeof(HWDBG_SCRIPT_BUFFER)); // // Copy the packet into the FinalBuffer diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index ae0be7ef..ed1ba72c 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -126,6 +126,15 @@ equivalent, behavior-preserving. "%d", …)` → `PlatformSprintf(Buf, sizeof(Buf), "%d", …)`. Both buffers are `CHAR[32]` formatting a single `%d`, so the dropped `_TRUNCATE` truncation semantics are unreachable. +- `code/hardware.c` (+ `header/hardware.h`) — added to script-engine CMake + `SourceFiles` (was in the vcxproj, missing from the Linux build). Provides the + `HardwareScriptInterpreter*` family the hwdbg TUs call. One bucket-1 swap to + compile: `RtlZeroMemory`→`PlatformZeroMemory` ×2 (lines 499, 564). Resolves the + `HardwareScriptInterpreter*` link errors. NOTE: two more files are still in the + vcxproj but missing from script-engine's CMake — `code/script_include.c` + (undefined `ResolveIncludePath`/`ParseIncludeFile`/`FileExists`/`InsertStrNew`) + and `include/platform/user/code/platform-lib-calls.c` (undefined `Platform*` in + libscript-engine.so). Adding both is the next script-engine build step. ### Kernel-level debugger (remote protocol) - `kd.cpp` — largest sweep (~46 `Platform*`): serial open/configure/close via @@ -181,6 +190,13 @@ equivalent, behavior-preserving. ### hwdbg - `hwdbg-interpreter.cpp` — `RtlCopyMemory`→`PlatformCopyMemory`, `RtlZeroMemory`→`PlatformZeroMemory`. +- `hwdbg-scripts.cpp` + `hwdbg-commands/hw.cpp` — added to libhyperdbg CMake + `SourceFiles` (were missing from the Linux build; present in the vcxproj all + along), plus the `header/hwdbg/hwdbg-scripts.h` list entry. `hw.cpp` built + clean; `hwdbg-scripts.cpp` needed one bucket-1 swap: `RtlZeroMemory`→ + `PlatformZeroMemory` (line 415). Both compile on Linux now. NOTE: their + `HardwareScriptInterpreter*` callees live in `script-engine/code/hardware.c`, + now added to script-engine's CMake (see the script-engine subproject section). ### objects - `objects.cpp` — wrapper sweep: `RtlCopyMemory`×2→`PlatformCopyMemory`, diff --git a/hyperdbg/script-engine/CMakeLists.txt b/hyperdbg/script-engine/CMakeLists.txt index 85623bea..b6064ae0 100644 --- a/hyperdbg/script-engine/CMakeLists.txt +++ b/hyperdbg/script-engine/CMakeLists.txt @@ -3,6 +3,7 @@ set(SourceFiles "../include/platform/general/header/Environment.h" "header/common.h" "header/globals.h" + "header/hardware.h" "header/parse-table.h" "header/scanner.h" "header/script-engine.h" @@ -10,6 +11,7 @@ set(SourceFiles "header/pch.h" "code/common.c" "code/globals.c" + "code/hardware.c" "code/parse-table.c" "code/scanner.c" "code/script-engine.c" diff --git a/hyperdbg/script-engine/code/hardware.c b/hyperdbg/script-engine/code/hardware.c index 2b986898..a1639791 100644 --- a/hyperdbg/script-engine/code/hardware.c +++ b/hyperdbg/script-engine/code/hardware.c @@ -496,7 +496,7 @@ HardwareScriptInterpreterCompressBuffer(UINT64 * Buffer, // // Copy the compressed data back to the original buffer // - RtlZeroMemory(Buffer, BufferLength); + PlatformZeroMemory(Buffer, BufferLength); memcpy(Buffer, TempBuffer, *NewBufferSize); // @@ -561,7 +561,7 @@ HardwareScriptInterpreterConvertSymbolToHwdbgShortSymbolBuffer( // // Zeroing the short symbol buffer // - RtlZeroMemory(HwdbgShortSymbolBuffer, *NewBufferSize); + PlatformZeroMemory(HwdbgShortSymbolBuffer, *NewBufferSize); // // Filling the short symbol buffer from original buffer From 7ea5eb6f2b92a8e18e962cd2277f67344194d1c0 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 19:36:31 +0200 Subject: [PATCH 29/50] gcc enum init fix {0} -> {} --- hyperdbg/libhyperdbg/CMakeLists.txt | 21 +++++++++++++++++++ .../commands/extension-commands/apic.cpp | 4 ++-- .../commands/extension-commands/lbr.cpp | 2 +- .../commands/extension-commands/lbrdump.cpp | 2 +- .../commands/extension-commands/pcicam.cpp | 2 +- .../commands/extension-commands/pcitree.cpp | 2 +- .../commands/extension-commands/smi.cpp | 2 +- 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/hyperdbg/libhyperdbg/CMakeLists.txt b/hyperdbg/libhyperdbg/CMakeLists.txt index 89d96cd8..2fec06ad 100644 --- a/hyperdbg/libhyperdbg/CMakeLists.txt +++ b/hyperdbg/libhyperdbg/CMakeLists.txt @@ -42,13 +42,25 @@ set(SourceFiles "../script-eval/code/ScriptEngineEval.c" "code/common/spinlock.cpp" "code/debugger/commands/debugging-commands/a.cpp" + "code/debugger/commands/debugging-commands/continue.cpp" + "code/debugger/commands/debugging-commands/gg.cpp" "code/debugger/commands/debugging-commands/core.cpp" "code/debugger/commands/debugging-commands/dt-struct.cpp" "code/debugger/commands/debugging-commands/gu.cpp" "code/debugger/commands/debugging-commands/k.cpp" "code/debugger/commands/debugging-commands/preactivate.cpp" "code/debugger/commands/debugging-commands/prealloc.cpp" + "code/debugger/commands/extension-commands/apic.cpp" "code/debugger/commands/extension-commands/crwrite.cpp" + "code/debugger/commands/extension-commands/idt.cpp" + "code/debugger/commands/extension-commands/ioapic.cpp" + "code/debugger/commands/extension-commands/lbr.cpp" + "code/debugger/commands/extension-commands/lbrdump.cpp" + "code/debugger/commands/extension-commands/pcicam.cpp" + "code/debugger/commands/extension-commands/pcitree.cpp" + "code/debugger/commands/extension-commands/pt.cpp" + "code/debugger/commands/extension-commands/smi.cpp" + "code/debugger/commands/extension-commands/xsetbv.cpp" "code/debugger/commands/extension-commands/rev.cpp" "code/debugger/commands/extension-commands/trace.cpp" "code/debugger/commands/extension-commands/track.cpp" @@ -118,6 +130,7 @@ set(SourceFiles "code/debugger/commands/debugging-commands/wrmsr.cpp" "code/debugger/commands/debugging-commands/x.cpp" "code/debugger/commands/extension-commands/cpuid.cpp" + "ucpuid.cpp" "code/debugger/commands/extension-commands/dr.cpp" "code/debugger/commands/extension-commands/epthook.cpp" "code/debugger/commands/extension-commands/epthook2.cpp" @@ -201,6 +214,14 @@ if(UNIX) list(REMOVE_ITEM SourceFiles "code/debugger/communication/namedpipe.cpp") list(APPEND SourceFiles "code/debugger/communication/namedpipe-linux.cpp") + # + # pt.cpp (Intel PT command) is an un-ported Windows process-control TU + # (OpenProcess/CreateToolhelp32Snapshot/CreateThread/WaitForMultipleObjects). + # Keep it out of the Linux build until the process-control port lands; + # CommandPt stays unresolved (same as before it was added to the list). + # + list(REMOVE_ITEM SourceFiles "code/debugger/commands/extension-commands/pt.cpp") + # # The MASM (.asm) implementation only builds with the Microsoft assembler, # so swap it for the GAS (AT&T syntax) port and enable the ASM language so diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/apic.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/apic.cpp index 12a805c3..fc282286 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/apic.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/apic.cpp @@ -90,7 +90,7 @@ CommandApicSendRequest(DEBUGGER_APIC_REQUEST_TYPE ApicType, else { *IsUsingX2APIC = ApicRequest->IsUsingX2APIC; - RtlCopyMemory(ApicBuffer, (PVOID)(((CHAR *)ApicRequest) + sizeof(DEBUGGER_APIC_REQUEST)), ExpectedRequestSize); + PlatformCopyMemory(ApicBuffer, (PVOID)(((CHAR *)ApicRequest) + sizeof(DEBUGGER_APIC_REQUEST)), ExpectedRequestSize); free(ApicRequest); return TRUE; @@ -139,7 +139,7 @@ CommandApicSendRequest(DEBUGGER_APIC_REQUEST_TYPE ApicType, // Fill the request buffer // *IsUsingX2APIC = ApicRequest->IsUsingX2APIC; - RtlCopyMemory(ApicBuffer, (PVOID)(((CHAR *)ApicRequest) + sizeof(DEBUGGER_APIC_REQUEST)), ExpectedRequestSize); + PlatformCopyMemory(ApicBuffer, (PVOID)(((CHAR *)ApicRequest) + sizeof(DEBUGGER_APIC_REQUEST)), ExpectedRequestSize); free(ApicRequest); return TRUE; diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp index 85cf9017..32a5e101 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbr.cpp @@ -329,7 +329,7 @@ CommandLbrShowSuccessMessage(const HYPERTRACE_LBR_OPERATION_PACKETS * LbrRequest VOID CommandLbr(vector CommandTokens, string Command) { - HYPERTRACE_LBR_OPERATION_PACKETS LbrRequest = {0}; + HYPERTRACE_LBR_OPERATION_PACKETS LbrRequest = {}; BOOLEAN ParseResult = FALSE; if (CommandTokens.size() == 1) diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbrdump.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbrdump.cpp index e5980446..152e6fc3 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbrdump.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/lbrdump.cpp @@ -239,7 +239,7 @@ CommandLbrdumpPrint(HYPERTRACE_LBR_DUMP_PACKETS * LbrdumpRequest) VOID CommandLbrdump(vector CommandTokens, string Command) { - HYPERTRACE_LBR_DUMP_PACKETS LbrdumpRequest = {0}; + HYPERTRACE_LBR_DUMP_PACKETS LbrdumpRequest = {}; UINT32 CoreId = 0; BOOLEAN ContinueDumpingAllCores = TRUE; diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcicam.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcicam.cpp index ba0ac2ee..d046c286 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcicam.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcicam.cpp @@ -48,7 +48,7 @@ CommandPcicam(vector CommandTokens, string Command) { BOOL Status; ULONG ReturnedLength; - DEBUGGEE_PCIDEVINFO_REQUEST_RESPONSE_PACKET PcidevinfoPacket = {0}; + DEBUGGEE_PCIDEVINFO_REQUEST_RESPONSE_PACKET PcidevinfoPacket = {}; UINT32 TargetBus = 0; UINT32 TargetDevice = 0; UINT32 TargetFunction = 0; diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcitree.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcitree.cpp index 52b34159..c5d776d7 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcitree.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pcitree.cpp @@ -46,7 +46,7 @@ CommandPcitree(vector CommandTokens, string Command) { BOOL Status; ULONG ReturnedLength; - DEBUGGEE_PCITREE_REQUEST_RESPONSE_PACKET PcitreePacket = {0}; + DEBUGGEE_PCITREE_REQUEST_RESPONSE_PACKET PcitreePacket = {}; if (CommandTokens.size() != 1) { diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/smi.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/smi.cpp index 89e92f70..5b4c3d84 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/smi.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/smi.cpp @@ -122,7 +122,7 @@ HyperDbgPerformSmiOperation(SMI_OPERATION_PACKETS * SmiOperation) VOID CommandSmi(vector CommandTokens, string Command) { - SMI_OPERATION_PACKETS SmiOperationRequest = {0}; + SMI_OPERATION_PACKETS SmiOperationRequest = {}; if (CommandTokens.size() != 2) { From 8583d99d14eed83e982df08106d8f50d04c36e6a Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 19:48:24 +0200 Subject: [PATCH 30/50] Added ucpuid to CMakeList.txt and made it portable --- .../platform/general/header/Environment.h | 6 +++ hyperdbg/libhyperdbg/ucpuid.cpp | 4 +- hyperdbg/linux/PORTING_STATUS.md | 39 +++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/hyperdbg/include/platform/general/header/Environment.h b/hyperdbg/include/platform/general/header/Environment.h index 237ce6f9..b04c138a 100644 --- a/hyperdbg/include/platform/general/header/Environment.h +++ b/hyperdbg/include/platform/general/header/Environment.h @@ -64,6 +64,12 @@ typedef const char * PCSTR; typedef char * PSTR; typedef short * PWCHAR; +// Windows generic type aliases (winnt.h): CONST is the const qualifier keyword, +// FLOAT is a plain float. Kept so shared source using the Win32 spellings +// compiles unchanged. +# define CONST const +typedef float FLOAT; + // Windows socket type (Linux sockets are plain int) typedef int SOCKET; # define INVALID_SOCKET ((SOCKET)(-1)) diff --git a/hyperdbg/libhyperdbg/ucpuid.cpp b/hyperdbg/libhyperdbg/ucpuid.cpp index 380d4a12..2c932cac 100644 --- a/hyperdbg/libhyperdbg/ucpuid.cpp +++ b/hyperdbg/libhyperdbg/ucpuid.cpp @@ -2098,7 +2098,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) // want to pass some other arguments to the kernel in // the future // - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( g_DeviceHandle, // Handle to device IOCTL_DEBUGGER_CPUID, // IO Control Code (IOCTL) CpuidRequest, // Input Buffer to driver. @@ -2112,7 +2112,7 @@ CommandCpuidRequestCpuid(UINT32 FunctionId, UINT32 SubFunctionId) if (!Status) { - ShowMessages("ioctl failed with code 0x%x\n", GetLastError()); + ShowMessages("ioctl failed with code 0x%x\n", PlatformGetLastError()); return; } diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index ed1ba72c..ab04c9e1 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -288,6 +288,45 @@ reasons (`RTL_PROCESS_MODULES` / `RTL_PROCESS_MODULE_INFORMATION` undeclared, an `WCHAR *` vs `wchar_t *` — the wide-char item below); none of those are on lines this sweep touched. +### Command files wired into Linux CMake — DONE (2026-07-24) + +The 2026-07-20 sweep ported these files' bucket-1 calls but never added them to +`libhyperdbg/CMakeLists.txt`, so they were compiled on Windows only and their +`Command*` symbols were unresolved at the Linux CLI link. Added the 12 missing +command TUs to `SourceFiles`: +- Debugging: `continue.cpp`, `gg.cpp` +- Extension: `apic.cpp`, `idt.cpp`, `ioapic.cpp`, `lbr.cpp`, `lbrdump.cpp`, + `pcicam.cpp`, `pcitree.cpp`, `smi.cpp`, `xsetbv.cpp` +- Plus top-level `ucpuid.cpp` (defines `CommandUserCpuid` / `CommandUserCpuidHelp` + / `CommandCpuidRequestCpuid` / `CommandShowUserCpuidMessage`; lives at + `libhyperdbg/ucpuid.cpp`, not under `code/`, which is why the earlier diff + missed it). + +Stragglers the 07-20 sweep didn't cover, fixed to compile (all mechanical): +- `apic.cpp` — 2× `RtlCopyMemory`→`PlatformCopyMemory` (sweep only did the + ZeroMemory family). +- Enum-first aggregate init `= {0}`→`= {}` (GCC rejects `int`→enum in `{0}`; + `{}` value-inits identically): `lbr.cpp:332`, `lbrdump.cpp:242`, + `pcicam.cpp:51`, `pcitree.cpp:49`, `smi.cpp:125`. (apic's `LAPIC_PAGE {0}` and + lbrdump's `CHAR[] {0}` are scalar-first and compile fine, left as-is.) +- `ucpuid.cpp` — `DeviceIoControl`→`PlatformDeviceIoControl`, + `GetLastError`→`PlatformGetLastError` (1 each; same drop-in as the sweep). +- `Environment.h` — added the two missing generic Win32 aliases `ucpuid.cpp` + needs: `#define CONST const` and `typedef float FLOAT;` (winnt.h spellings; + benefits any future file too). + +**`pt.cpp` deliberately excluded from the Linux build** via an `if(UNIX)` +`REMOVE_ITEM` (like namedpipe/symbol/pe-parser). It's the un-started +process-control port (`OpenProcess(PROCESS_ALL_ACCESS)`, +`CreateToolhelp32Snapshot`, `CreateThread`, `WaitForMultipleObjects`, Win32 +process/thread handles) — see the `pt.cpp` TODO below. `CommandPt`/`CommandPtHelp` +stay unresolved, same as before it was added to the list. + +Result: every `Command*` link error is resolved except the two `CommandPt*`. +Remaining CLI-link buckets are unrelated: `Sym*` (symbol-linux stub, 15), `ks_*` +(keystone Linux lib, 5), `Platform*` + include-family (script_include.c / +platform-lib-calls.c missing from script-engine's CMake, 8). + ### rdmsr.cpp core-count — DONE (2026-07-22) Follow-up to the bucket-1 sweep of `rdmsr.cpp` above (this is a separate bucket-2 From 5175381c7304a268660377f3ed1c2e8860f96c55 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 20:02:00 +0200 Subject: [PATCH 31/50] script engine linux build complete, added undefined references with empty stubs or linux port and updated the Cmake file accordingly --- .../platform/user/code/platform-lib-calls.c | 1 + hyperdbg/linux/PORTING_STATUS.md | 14 +- hyperdbg/script-engine/CMakeLists.txt | 20 ++ .../script-engine/code/script_include-linux.c | 71 +++++++ .../script-engine/code/symbol-stub-linux.c | 199 ++++++++++++++++++ 5 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 hyperdbg/script-engine/code/script_include-linux.c create mode 100644 hyperdbg/script-engine/code/symbol-stub-linux.c diff --git a/hyperdbg/include/platform/user/code/platform-lib-calls.c b/hyperdbg/include/platform/user/code/platform-lib-calls.c index 0bb8bfe1..a0a801d6 100644 --- a/hyperdbg/include/platform/user/code/platform-lib-calls.c +++ b/hyperdbg/include/platform/user/code/platform-lib-calls.c @@ -22,6 +22,7 @@ # include # include # include +# include // clock_gettime / CLOCK_MONOTONIC (PlatformQueryPerformanceCounter) #endif // defined(__linux__) /** diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index ab04c9e1..ce27e1e3 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -494,7 +494,19 @@ Grouped by subsystem. These are the shortcuts taken to reach compilation. I/O and the user-debugger path can actually open files. ### Symbols -- [ ] Replace `symbol-linux.cpp` stubs with a real ELF/DWARF symbol parser. +- [x] symbol-parser (`Sym*`) Linux stubs — DONE (2026-07-24). The 15 `Sym*` + exports (`SymConvertNameToAddress`, `SymLoadFileSymbol`, `SymbolInitLoad`, + `SymGetFieldOffset`, `SymShowDataBasedOnSymbolTypes`, `SymSetTextMessageCallback`, + …) live in the Windows-only `symbol-parser/` subproject (DbgHelp + DIA-SDK + pdbex, ~3800 LOC, not built on Linux). They're called only by + `script-engine/code/script-engine.c`, so `libscript-engine.so` was the one with + the unresolved refs. Added `script-engine/code/symbol-stub-linux.c` (new file, + `#ifdef __linux__`) implementing all 15 as no-op/failure stubs (return `0`/`FALSE`, + out-params cleared), signatures mirroring `HyperDbgSymImports.h`. Wired into + `script-engine/CMakeLists.txt` under `if(UNIX)`. User chose the stub path over a + real backend port. Resolves all 15 `Sym*` link errors. +- [ ] Replace the `symbol-linux.cpp` (`Symbol*`) and `symbol-stub-linux.c` + (`Sym*`) stubs with a real ELF/DWARF (or LLVM DebugInfo/PDB) symbol parser. ### PE parsing - [ ] Recreate Windows `IMAGE_*` headers for Linux and port `pe-parser.cpp` diff --git a/hyperdbg/script-engine/CMakeLists.txt b/hyperdbg/script-engine/CMakeLists.txt index b6064ae0..b925e080 100644 --- a/hyperdbg/script-engine/CMakeLists.txt +++ b/hyperdbg/script-engine/CMakeLists.txt @@ -9,15 +9,35 @@ set(SourceFiles "header/script-engine.h" "header/type.h" "header/pch.h" + "../include/platform/user/code/platform-lib-calls.c" "code/common.c" "code/globals.c" "code/hardware.c" "code/parse-table.c" "code/scanner.c" "code/script-engine.c" + "code/script_include.c" "code/type.c" "code/pch.c" ) + +if(UNIX) + # + # The symbol-parser (Sym*) exports live in the Windows-only symbol-parser/ + # subproject (DbgHelp + DIA-SDK pdbex). script-engine.c calls them directly, + # so provide Linux stubs here to satisfy the link until a real backend lands. + # + list(APPEND SourceFiles "code/symbol-stub-linux.c") + + # + # script_include.c resolves script #include paths via Win32 (GetModuleFileNameA + # / GetFileAttributesA). Swap it for an empty Linux stub until a real resolver + # (readlink + stat) is implemented. + # + list(REMOVE_ITEM SourceFiles "code/script_include.c") + list(APPEND SourceFiles "code/script_include-linux.c") +endif() + include_directories( "header" "../include" diff --git a/hyperdbg/script-engine/code/script_include-linux.c b/hyperdbg/script-engine/code/script_include-linux.c new file mode 100644 index 00000000..72cdd372 --- /dev/null +++ b/hyperdbg/script-engine/code/script_include-linux.c @@ -0,0 +1,71 @@ +/** + * @file script_include-linux.c + * @author Max Raulea (max.raulea@hyperdbg.org) + * @brief Linux stub implementations of the script include-file resolver + * @details The Windows implementation (script_include.c) uses Win32 APIs + * (GetModuleFileNameA / GetFileAttributesA) to resolve `#include` + * directives in scripts. Those calls have no drop-in Linux equivalent, + * so for now this file provides empty stubs that satisfy the link and + * keep every call site intact. Script includes are simply unsupported + * on Linux until a real resolver (readlink("/proc/self/exe") + stat) is + * implemented. + * + * Signatures mirror script-engine/header/script_include.h exactly. + * + * TODO: implement the real Linux path resolution and drop this file + * from the UNIX branch of script-engine/CMakeLists.txt. + * + * @version 0.1 + * @date 2026-07-24 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#include "pch.h" +#include "script_include.h" + +#ifdef __linux__ + +VOID +ResolveIncludePath(const char * IncludeFilePath, char * OutPath) +{ + (void)IncludeFilePath; + + if (OutPath != NULL) + { + OutPath[0] = '\0'; + } +} + +BOOLEAN +FileExists(const char * Path) +{ + (void)Path; + + return FALSE; +} + +BOOLEAN +ParseIncludeFile(char * IncludeFile, char ** Buffer) +{ + (void)IncludeFile; + + if (Buffer != NULL) + { + *Buffer = NULL; + } + + return FALSE; +} + +char * +InsertStrNew(char * Str, int InputIdx, const char * Buf) +{ + (void)Str; + (void)InputIdx; + (void)Buf; + + return NULL; +} + +#endif // __linux__ diff --git a/hyperdbg/script-engine/code/symbol-stub-linux.c b/hyperdbg/script-engine/code/symbol-stub-linux.c new file mode 100644 index 00000000..7b585fbe --- /dev/null +++ b/hyperdbg/script-engine/code/symbol-stub-linux.c @@ -0,0 +1,199 @@ +/** + * @file symbol-stub-linux.c + * @author Max Raulea (max.raulea@hyperdbg.org) + * @brief Linux stub implementations of the symbol-parser (Sym*) exports + * @details The Windows implementation lives in the symbol-parser/ subproject and + * is built on DbgHelp + PDB files (via the DIA-SDK-based pdbex), none of + * which is available on Linux. The script-engine library calls these + * Sym* functions directly, so without definitions libscript-engine.so + * fails to link. These stubs satisfy the link and keep every call site + * intact; symbol resolution is simply unavailable until a real Linux + * backend (ELF/DWARF, or an LLVM DebugInfo/PDB port of symbol-parser) + * is implemented. + * + * The signatures mirror include/SDK/imports/user/HyperDbgSymImports.h + * exactly. Return values indicate "nothing found / not supported" + * (0 / FALSE) and any out-parameters are cleared. + * + * TODO: replace with a real symbol backend and drop this file from the + * UNIX branch of script-engine/CMakeLists.txt. + * + * @version 0.1 + * @date 2026-07-24 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#include "pch.h" + +#ifdef __linux__ + +VOID +SymSetTextMessageCallback(PVOID Handler) +{ + (void)Handler; +} + +VOID +SymbolAbortLoading() +{ +} + +UINT64 +SymConvertNameToAddress(const CHAR * FunctionOrVariableName, PBOOLEAN WasFound) +{ + (void)FunctionOrVariableName; + + if (WasFound != NULL) + { + *WasFound = FALSE; + } + + return 0; +} + +UINT32 +SymLoadFileSymbol(UINT64 BaseAddress, const CHAR * PdbFileName, const CHAR * CustomModuleName) +{ + (void)BaseAddress; + (void)PdbFileName; + (void)CustomModuleName; + + return 0; +} + +UINT32 +SymUnloadAllSymbols() +{ + return 0; +} + +UINT32 +SymUnloadModuleSymbol(CHAR * ModuleName) +{ + (void)ModuleName; + + return 0; +} + +UINT32 +SymSearchSymbolForMask(const CHAR * SearchMask) +{ + (void)SearchMask; + + return 0; +} + +BOOLEAN +SymGetFieldOffset(CHAR * TypeName, CHAR * FieldName, UINT32 * FieldOffset) +{ + (void)TypeName; + (void)FieldName; + + if (FieldOffset != NULL) + { + *FieldOffset = 0; + } + + return FALSE; +} + +BOOLEAN +SymGetDataTypeSize(CHAR * TypeName, UINT64 * TypeSize) +{ + (void)TypeName; + + if (TypeSize != NULL) + { + *TypeSize = 0; + } + + return FALSE; +} + +BOOLEAN +SymCreateSymbolTableForDisassembler(PVOID CallbackFunction) +{ + (void)CallbackFunction; + + return FALSE; +} + +BOOLEAN +SymConvertFileToPdbPath(const CHAR * LocalFilePath, CHAR * ResultPath, SIZE_T ResultPathSize) +{ + (void)LocalFilePath; + + if (ResultPath != NULL && ResultPathSize > 0) + { + ResultPath[0] = '\0'; + } + + return FALSE; +} + +BOOLEAN +SymConvertFileToPdbFileAndGuidAndAgeDetails(const CHAR * LocalFilePath, + CHAR * PdbFilePath, + CHAR * GuidAndAgeDetails, + BOOLEAN Is32BitModule) +{ + (void)LocalFilePath; + (void)PdbFilePath; + (void)GuidAndAgeDetails; + (void)Is32BitModule; + + return FALSE; +} + +BOOLEAN +SymConvertLoadedModuleToPdbFileAndGuidAndAgeDetails(const BYTE * LoadedImageBytes, + SIZE_T LoadedImageSize, + const CHAR * LocalFilePath, + CHAR * PdbFilePath, + CHAR * GuidAndAgeDetails, + BOOLEAN Is32BitModule) +{ + (void)LoadedImageBytes; + (void)LoadedImageSize; + (void)LocalFilePath; + (void)PdbFilePath; + (void)GuidAndAgeDetails; + (void)Is32BitModule; + + return FALSE; +} + +BOOLEAN +SymbolInitLoad(PVOID BufferToStoreDetails, + UINT32 StoredLength, + BOOLEAN DownloadIfAvailable, + const CHAR * SymbolPath, + BOOLEAN IsSilentLoad) +{ + (void)BufferToStoreDetails; + (void)StoredLength; + (void)DownloadIfAvailable; + (void)SymbolPath; + (void)IsSilentLoad; + + return FALSE; +} + +BOOLEAN +SymShowDataBasedOnSymbolTypes(const CHAR * TypeName, + UINT64 Address, + BOOLEAN IsStruct, + PVOID BufferAddress, + const CHAR * AdditionalParameters) +{ + (void)TypeName; + (void)Address; + (void)IsStruct; + (void)BufferAddress; + (void)AdditionalParameters; + + return FALSE; +} + +#endif // __linux__ From d19ffdcd42ca74605560da2f49b314e02e66adbb Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 20:02:22 +0200 Subject: [PATCH 32/50] Documentation update --- hyperdbg/linux/PORTING_STATUS.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index ce27e1e3..8d3e7a1f 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -135,6 +135,30 @@ equivalent, behavior-preserving. (undefined `ResolveIncludePath`/`ParseIncludeFile`/`FileExists`/`InsertStrNew`) and `include/platform/user/code/platform-lib-calls.c` (undefined `Platform*` in libscript-engine.so). Adding both is the next script-engine build step. +- `code/script_include.c` + `platform-lib-calls.c` — DONE (2026-07-24). + `libscript-engine.so` is now fully self-contained (zero undefined refs): + - Added `../include/platform/user/code/platform-lib-calls.c` to the base + `SourceFiles` — it's compiled into libhyperdbg too, but each `.so` needs its + own copy of the `Platform*` symbols (script-engine calls `PlatformSnprintf`/ + `PlatformStrDup`/`PlatformVsnprintf`/`PlatformZeroMemory`). No swap: it builds + on both OSes. Needed one root-cause fix — added `#include ` to its + Linux include block (`clock_gettime`/`CLOCK_MONOTONIC` in + `PlatformQueryPerformanceCounter`); it previously only compiled because + libhyperdbg's pch pulled `` in transitively, but script-engine's pch + doesn't. + - Added `code/script_include.c` to base `SourceFiles`, then swapped it for a new + empty stub `code/script_include-linux.c` under `if(UNIX)` (user chose stubs + over porting the Win32 path logic for now). The stub implements + `ResolveIncludePath`/`FileExists`/`ParseIncludeFile`/`InsertStrNew` as + no-op/failure; script `#include` resolution is unsupported on Linux until a + real resolver (`readlink("/proc/self/exe")` + `stat`) lands. `script_include.c` + left pristine (Windows path uses `GetModuleFileNameA`/`GetFileAttributesA`). + + Result: every remaining CLI-link undefined ref (23) now belongs to + `liblibhyperdbg.so` alone — keystone (`ks_*`, 5), the excluded `pt.cpp` + (`CommandPt*`/`HyperDbgPt*`, 4), and missing libhyperdbg TUs behind the + PCI-ID/Vendor, Stepping, text-callback, `ShowMessages`, `IrpBasedBufferThread` + symbols (14). ### Kernel-level debugger (remote protocol) - `kd.cpp` — largest sweep (~46 `Platform*`): serial open/configure/close via From 4bf987a5968a65eebdbb69f514e50ee08d74aa34 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 21:06:04 +0200 Subject: [PATCH 33/50] Added missing files to the CMake build file and sweeped them for the Platform functions and guarded windows only code --- .../platform/general/header/Environment.h | 7 ++ .../platform/user/code/platform-lib-calls.c | 70 +++++++++++++++++++ .../platform/user/header/platform-lib-calls.h | 12 ++++ hyperdbg/libhyperdbg/CMakeLists.txt | 8 +++ hyperdbg/libhyperdbg/code/app/messaging.cpp | 2 +- hyperdbg/libhyperdbg/code/app/packets.cpp | 21 ++---- .../libhyperdbg/code/debugger/misc/pci-id.cpp | 8 +-- 7 files changed, 109 insertions(+), 19 deletions(-) diff --git a/hyperdbg/include/platform/general/header/Environment.h b/hyperdbg/include/platform/general/header/Environment.h index b04c138a..8c2d276a 100644 --- a/hyperdbg/include/platform/general/header/Environment.h +++ b/hyperdbg/include/platform/general/header/Environment.h @@ -70,6 +70,13 @@ typedef short * PWCHAR; # define CONST const typedef float FLOAT; +// MSVC secure-CRT truncation sentinel and status code (crtdefs.h / errno.h). +// _TRUNCATE passed as the count to strncpy_s and friends means "copy as much as +// fits and always null-terminate"; STRUNCATE is what they return when that +// truncation actually happened. Kept at their canonical MSVC values. +# define _TRUNCATE ((SIZE_T)-1) +# define STRUNCATE 80 + // Windows socket type (Linux sockets are plain int) typedef int SOCKET; # define INVALID_SOCKET ((SOCKET)(-1)) diff --git a/hyperdbg/include/platform/user/code/platform-lib-calls.c b/hyperdbg/include/platform/user/code/platform-lib-calls.c index a0a801d6..32777ba5 100644 --- a/hyperdbg/include/platform/user/code/platform-lib-calls.c +++ b/hyperdbg/include/platform/user/code/platform-lib-calls.c @@ -271,6 +271,76 @@ PlatformStrCpy(char * Dest, SIZE_T DestSize, const char * Src) #endif } +/** + * @brief Platform independent wrapper for strncpy_s + * + * @details Copies the first D characters of Src into the DestSize-byte Dest + * buffer and appends a null terminator, where D is the lesser of Count and the + * length of Src. If those characters do not fit while still leaving room for the + * terminator, Dest is set to an empty string and a non-zero error is returned. + * Passing _TRUNCATE as Count instead copies as much of Src as fits, returning + * STRUNCATE when anything had to be dropped. On Linux there is no standard + * strncpy_s, so this reproduces those same rules. + * + * @param Dest destination buffer + * @param DestSize size of the destination buffer in bytes + * @param Src source string + * @param Count maximum characters to copy, or _TRUNCATE + * @return INT 0 on success, STRUNCATE if truncated, non-zero on failure + */ +INT +PlatformStrNCpy(char * Dest, SIZE_T DestSize, const char * Src, SIZE_T Count) +{ +#if defined(_WIN32) + return strncpy_s(Dest, DestSize, Src, Count); +#elif defined(__linux__) + // NOT YET TESTED!! So needs some testing to see if it actually behaves the same as strncpy_s on windows + SIZE_T Length; + + if (Dest == NULL || DestSize == 0 || Src == NULL) + { + if (Dest != NULL && DestSize != 0) + { + Dest[0] = '\0'; + } + return -1; + } + + // + // Never read past Count characters of Src; it need not be null-terminated + // within that span + // + Length = PlatformStrnlen(Src, Count == _TRUNCATE ? DestSize : Count); + + if (Count == _TRUNCATE) + { + // + // Copy as much as fits and report whether anything was dropped + // + if (Length >= DestSize) + { + memcpy(Dest, Src, DestSize - 1); + Dest[DestSize - 1] = '\0'; + return STRUNCATE; + } + } + else if (Length >= DestSize) + { + // + // Source does not fit (need room for the null terminator too) + // + Dest[0] = '\0'; + return -1; + } + + memcpy(Dest, Src, Length); + Dest[Length] = '\0'; + return 0; +#else +# error "Unsupported platform" +#endif +} + /** * @brief Platform independent wrapper for _stricmp * diff --git a/hyperdbg/include/platform/user/header/platform-lib-calls.h b/hyperdbg/include/platform/user/header/platform-lib-calls.h index 52760e51..687f0e5b 100644 --- a/hyperdbg/include/platform/user/header/platform-lib-calls.h +++ b/hyperdbg/include/platform/user/header/platform-lib-calls.h @@ -70,6 +70,18 @@ PlatformStrnlen(const char * Str, SIZE_T MaxLength); INT PlatformStrCpy(char * Dest, SIZE_T DestSize, const char * Src); +// +// BOUNDED COUNTED STRING COPY +// +// Mirrors strncpy_s: copies at most Count characters of Src into Dest (of +// DestSize bytes) and always null-terminates. Passing _TRUNCATE as Count means +// "copy as much as fits", returning STRUNCATE if it had to truncate. Otherwise +// returns 0 on success, non-zero if the arguments are invalid or Count does not +// fit (in which case Dest is left as an empty string). +// +INT +PlatformStrNCpy(char * Dest, SIZE_T DestSize, const char * Src, SIZE_T Count); + // // CASE-INSENSITIVE STRING COMPARE // diff --git a/hyperdbg/libhyperdbg/CMakeLists.txt b/hyperdbg/libhyperdbg/CMakeLists.txt index 2fec06ad..a6b394f9 100644 --- a/hyperdbg/libhyperdbg/CMakeLists.txt +++ b/hyperdbg/libhyperdbg/CMakeLists.txt @@ -17,6 +17,10 @@ set(SourceFiles "header/debugger/driver-loader/install.h" "header/debugger/kernel-level/kd.h" "header/app/libhyperdbg.h" + "header/app/messaging.h" + "header/app/packets.h" + "header/debugger/core/steppings.h" + "header/debugger/misc/pci-id.h" "header/common/list.h" "header/debugger/communication/namedpipe.h" "header/objects/objects.h" @@ -98,6 +102,10 @@ set(SourceFiles "pch.cpp" "code/app/dllmain.cpp" "code/app/libhyperdbg.cpp" + "code/app/messaging.cpp" + "code/app/packets.cpp" + "code/debugger/core/steppings.cpp" + "code/debugger/misc/pci-id.cpp" "code/common/common.cpp" "code/debugger/commands/debugging-commands/bc.cpp" "code/debugger/commands/debugging-commands/bd.cpp" diff --git a/hyperdbg/libhyperdbg/code/app/messaging.cpp b/hyperdbg/libhyperdbg/code/app/messaging.cpp index ca0f7264..d35f72c9 100644 --- a/hyperdbg/libhyperdbg/code/app/messaging.cpp +++ b/hyperdbg/libhyperdbg/code/app/messaging.cpp @@ -54,7 +54,7 @@ SetTextMessageCallbackUsingSharedBuffer(PVOID Handler) return NULL; } - RtlZeroMemory(g_MessageHandlerSharedBuffer, COMMUNICATION_BUFFER_SIZE + TCP_END_OF_BUFFER_CHARS_COUNT); + PlatformZeroMemory(g_MessageHandlerSharedBuffer, COMMUNICATION_BUFFER_SIZE + TCP_END_OF_BUFFER_CHARS_COUNT); return g_MessageHandlerSharedBuffer; } diff --git a/hyperdbg/libhyperdbg/code/app/packets.cpp b/hyperdbg/libhyperdbg/code/app/packets.cpp index e6b280ad..b6cf4db4 100644 --- a/hyperdbg/libhyperdbg/code/app/packets.cpp +++ b/hyperdbg/libhyperdbg/code/app/packets.cpp @@ -46,18 +46,11 @@ ReadIrpBasedBuffer() // a pending IOCTL while the main debugger handle continues sending other // synchronous IOCTLs. // - Handle = CreateFileA( - "\\\\.\\HyperDbgDebuggerDevice", - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - NULL, /// lpSecurityAttirbutes - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); /// lpTemplateFile + Handle = PlatformOpenDevice("\\\\.\\HyperDbgDebuggerDevice"); if (Handle == INVALID_HANDLE_VALUE) { - ErrorNum = GetLastError(); + ErrorNum = PlatformGetLastError(); if (ErrorNum == ERROR_ACCESS_DENIED) { @@ -92,9 +85,9 @@ ReadIrpBasedBuffer() // // Clear the buffer // - ZeroMemory(OutputBuffer, UsermodeBufferSize); + PlatformZeroMemory(OutputBuffer, UsermodeBufferSize); - Status = DeviceIoControl( + Status = PlatformDeviceIoControl( Handle, // Handle to device IOCTL_REGISTER_EVENT, // IO Control Code (IOCTL) &RegisterEvent, // Input Buffer to driver. @@ -253,7 +246,7 @@ ReadIrpBasedBuffer() // // Indicate that driver (Hypervisor) is loaded successfully // - SetEvent(g_IsDriverLoadedSuccessfully); + PlatformSetEvent(g_IsDriverLoadedSuccessfully); break; @@ -321,9 +314,9 @@ ReadIrpBasedBuffer() // // close handle // - if (!CloseHandle(Handle)) + if (!PlatformCloseHandle(Handle)) { - ShowMessages("err, closing handle 0x%x\n", GetLastError()); + ShowMessages("err, closing handle 0x%x\n", PlatformGetLastError()); } } diff --git a/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp b/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp index 12953a2e..d730987f 100644 --- a/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp @@ -73,7 +73,7 @@ ReadLine(CHAR * DestBuffer, UINT64 CharLimit, CHAR ** SrcBuffer) } else { - strncpy_s(DestBuffer, CharLimit, *SrcBuffer, (Line - *SrcBuffer)); + PlatformStrNCpy(DestBuffer, CharLimit, *SrcBuffer, (Line - *SrcBuffer)); *SrcBuffer += (Line - *SrcBuffer + 1); return *SrcBuffer; } @@ -155,7 +155,7 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) { return NULL; } - strncpy_s(MatchedVendor->VendorName, sizeof(MatchedVendor->VendorName), TrimWhitespace(VendorNameBuf, PCI_NAME_STR_LENGTH), _TRUNCATE); + PlatformStrNCpy(MatchedVendor->VendorName, sizeof(MatchedVendor->VendorName), TrimWhitespace(VendorNameBuf, PCI_NAME_STR_LENGTH), _TRUNCATE); FoundVendorId = TRUE; } } @@ -182,7 +182,7 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) return NULL; } - strncpy_s(NewDevice->DeviceName, sizeof(NewDevice->DeviceName), TrimWhitespace(DeviceNameBuf, PCI_NAME_STR_LENGTH), _TRUNCATE); + PlatformStrNCpy(NewDevice->DeviceName, sizeof(NewDevice->DeviceName), TrimWhitespace(DeviceNameBuf, PCI_NAME_STR_LENGTH), _TRUNCATE); NewDevice->SubDevices = NULL; NewDevice->Next = NULL; @@ -227,7 +227,7 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) return NULL; } - strncpy_s(NewSubDevice->SubSystemName, sizeof(NewSubDevice->SubSystemName), TrimWhitespace(SubsystemNameBuf, PCI_NAME_STR_LENGTH), _TRUNCATE); + PlatformStrNCpy(NewSubDevice->SubSystemName, sizeof(NewSubDevice->SubSystemName), TrimWhitespace(SubsystemNameBuf, PCI_NAME_STR_LENGTH), _TRUNCATE); NewSubDevice->Next = NULL; if (LastSubDevice) From 600eaa47ba7bc5731c677030dea7d0562e95b97b Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 21:11:23 +0200 Subject: [PATCH 34/50] update doc and added stub for vendorID pci-id.cpp file, TODO on linux --- .../libhyperdbg/code/debugger/misc/pci-id.cpp | 12 ++++ hyperdbg/linux/PORTING_STATUS.md | 64 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp b/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp index d730987f..5ce39f9e 100644 --- a/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp @@ -304,6 +304,7 @@ FreePciIdDatabase() Vendor * GetVendorById(UINT16 VendorId) { +#ifdef _WIN32 CHAR VendorIdAsStr[5]; CHAR ExecutablePath[MAX_PATH]; HMODULE hModule = GetModuleHandle(NULL); @@ -326,6 +327,17 @@ GetVendorById(UINT16 VendorId) strncpy(ExecutableName, PCI_ID_DATABASE_PATH, sizeof(PCI_ID_DATABASE_PATH)); return GetVendorByIdStr(ExecutablePath, ToLower(VendorIdAsStr)); +#else + // + // TODO(Linux): resolve the PCI ID database next to the executable via + // readlink("/proc/self/exe") once the path separator and + // PCI_ID_DATABASE_PATH ("constants\\pci.ids") are made portable. Until + // then no vendor/device names are available on Linux. + // + UNREFERENCED_PARAMETER(VendorId); + + return NULL; +#endif } /** diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index 8d3e7a1f..2345283a 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -503,6 +503,64 @@ and the `if(UNIX)` block REMOVE_ITEMs it, APPENDs the `.s`, and calls `libhyperdbg.vcxproj` + `.filters` `` updated to the renamed `-masm-windows.asm`. Assemble-verified with `as` (exports `AsmVmxSupportDetection`). +### Remaining libhyperdbg TUs wired into Linux CMake — DONE (2026-07-24) + +Same gap class as the 2026-07-24 command-file batch: four TUs present in +`libhyperdbg.vcxproj` all along but never added to `libhyperdbg/CMakeLists.txt`, +so they were compiled on Windows only and their symbols were unresolved at the +Linux CLI link. Added to `SourceFiles` (plus their four header entries): + +| TU | Symbols it was missing | +|----|------------------------| +| `code/app/messaging.cpp` | `ShowMessages`, `SetTextMessageCallback`, `SetTextMessageCallbackUsingSharedBuffer`, `UnsetTextMessageCallback` | +| `code/app/packets.cpp` | `IrpBasedBufferThread` | +| `code/debugger/core/steppings.cpp` | `SteppingStepOver`, `SteppingStepOverForGu`, `SteppingRegularStepIn`, `SteppingInstrumentationStepIn`, `SteppingInstrumentationStepInForTracking` | +| `code/debugger/misc/pci-id.cpp` | `GetVendorById`, `GetDeviceFromVendor`, `FreeVendor`, `FreePciIdDatabase` | + +`steppings.cpp` compiled with no changes at all. The others needed: + +- `messaging.cpp` — 1 bucket-1 swap: `RtlZeroMemory`→`PlatformZeroMemory` (line 57). +- `packets.cpp` — bucket-1 sweep: `ZeroMemory`→`PlatformZeroMemory`, + `DeviceIoControl`→`PlatformDeviceIoControl`, `SetEvent`→`PlatformSetEvent`, + `CloseHandle`→`PlatformCloseHandle`, `GetLastError`×2→`PlatformGetLastError`. + Plus the packet-reader's dedicated device handle: the same + `CreateFileA("\\.\HyperDbgDebuggerDevice", GENERIC_READ|GENERIC_WRITE, …)` + block already ported in `libhyperdbg.cpp` → `PlatformOpenDevice(...)`, with the + surrounding `ERROR_ACCESS_DENIED`/`ERROR_GEN_FAILURE` handling left at the call + site (identical shape to the libhyperdbg.cpp call site). +- `pci-id.cpp` — 4× `strncpy_s`→ new `PlatformStrNCpy` (below), and + `GetVendorById` body guarded `#ifdef _WIN32` (below). + +**Pure addition: `PlatformStrNCpy(Dest, DestSize, Src, Count)`** in +`platform-lib-calls.{h,c}` — Windows `strncpy_s` verbatim; Linux reproduces the +documented rules: copies D = min(Count, strlen(Src)) chars and null-terminates, +or empties Dest + returns non-zero if D doesn't fit; `Count == _TRUNCATE` instead +copies as much as fits and returns `STRUNCATE`. Sibling of the existing +`PlatformStrCpy`; a plain `PlatformStrCpy` could not be reused because +`ReadLine` (pci-id.cpp:76) copies a *substring* out of a longer stream buffer. +Also **pure addition** to the `Environment.h` Linux block: `_TRUNCATE` +(`((SIZE_T)-1)`) and `STRUNCATE` (`80`) at their canonical MSVC values, matching +the existing `CBR_*`/`ERROR_*`/`PROCESS_*` constant blocks. +⚠️ Linux branch marked `NOT YET TESTED!!` in source, like `PlatformStrCpy`. + +**`GetVendorById` body guarded `#ifdef _WIN32`** (pattern 1; user chose the stub +over porting). It resolves the PCI ID database *relative to the executable*: +`GetModuleHandle`/`GetModuleFileName`, then `strrchr(Path, '\\')` to strip the +exe name and append `PCI_ID_DATABASE_PATH`. The two Win32 calls would wrap +cleanly (`readlink("/proc/self/exe")`), but the surrounding logic is +Windows-path-shaped in two places — the `'\\'` separator and the constant itself +(`pci-id.h:44`, `"constants\\pci.ids"`) — so wrapping only the calls would leave +`strrchr` returning NULL, silently overwriting the whole path and resolving +against the cwd. That is a behaviour change, not a port, so the whole body is +Windows-only and Linux returns NULL. `GetVendorByIdStr`, `GetDeviceFromVendor`, +`FreeVendor` and `FreePciIdDatabase` are plain C and compile unchanged. +Consequence: `!pcitree` / `!pcicam` show no vendor or device names on Linux. + +**Result: the CLI link is down from 23 undefined refs to 9**, and every +"missing TU" bucket is now closed. What is left is both known and deliberate: +`ks_*` (5 — keystone, no Linux lib linked) and `CommandPt*`/`HyperDbgPt*` +(4 — `pt.cpp` excluded from the Linux build, port not started). + --- ## TODO ledger — revisit before Linux is functional @@ -532,6 +590,12 @@ Grouped by subsystem. These are the shortcuts taken to reach compilation. - [ ] Replace the `symbol-linux.cpp` (`Symbol*`) and `symbol-stub-linux.c` (`Sym*`) stubs with a real ELF/DWARF (or LLVM DebugInfo/PDB) symbol parser. +### PCI ID database +- [ ] `pci-id.cpp::GetVendorById` — Linux returns NULL (whole body Windows-only). + Needs `readlink("/proc/self/exe")` **plus** a portable path separator and a + portable `PCI_ID_DATABASE_PATH` (`pci-id.h:44` is `"constants\\pci.ids"`). + Until then `!pcitree` / `!pcicam` print no vendor/device names on Linux. + ### PE parsing - [ ] Recreate Windows `IMAGE_*` headers for Linux and port `pe-parser.cpp` (replace `pe-parser-linux.cpp`). Affects `!pe`; `!hide` currently gets `0` for From f938929a8cd8391a00c52f39dd9a129a7abf9b33 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 21:20:44 +0200 Subject: [PATCH 35/50] Empty Linux stub for the keystone library --- .../code/debugger/misc/assembler.cpp | 19 ++++++++ hyperdbg/linux/PORTING_STATUS.md | 43 +++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/hyperdbg/libhyperdbg/code/debugger/misc/assembler.cpp b/hyperdbg/libhyperdbg/code/debugger/misc/assembler.cpp index 8c8990ee..b835502e 100644 --- a/hyperdbg/libhyperdbg/code/debugger/misc/assembler.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/misc/assembler.cpp @@ -118,6 +118,7 @@ AssembleData::ParseAssemblyData() INT AssembleData::Assemble(UINT64 StartAddr, ks_arch Arch, INT Mode, INT Syntax) { +#ifdef _WIN32 ks_engine * Ks; KsErr = ks_open(Arch, Mode, &Ks); @@ -175,6 +176,24 @@ AssembleData::Assemble(UINT64 StartAddr, ks_arch Arch, INT Mode, INT Syntax) } ks_close(Ks); return -1; +#else + // + // TODO(Linux): the Keystone assembler engine is not linked on Linux. Only a + // Windows keystone.lib is vendored (libraries/keystone/release-lib) and + // dependencies/keystone/ ships headers only, so the ks_* types and constants + // resolve but the 5 ks_* functions do not. Build upstream Keystone for Linux + // and restore link_directories()/target_link_libraries(keystone) in the + // top-level CMakeLists.txt to make this real. + // + UNREFERENCED_PARAMETER(StartAddr); + UNREFERENCED_PARAMETER(Arch); + UNREFERENCED_PARAMETER(Mode); + UNREFERENCED_PARAMETER(Syntax); + + ShowMessages("err, the assembler is not supported on Linux yet\n"); + + return -1; +#endif } AssembleData * diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index 2345283a..0e036a3a 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -561,6 +561,44 @@ Consequence: `!pcitree` / `!pcicam` show no vendor or device names on Linux. `ks_*` (5 — keystone, no Linux lib linked) and `CommandPt*`/`HyperDbgPt*` (4 — `pt.cpp` excluded from the Linux build, port not started). +### keystone assembler stubbed on Linux — DONE (2026-07-24) + +The 5 `ks_*` link errors (`ks_open`/`ks_option`/`ks_asm`/`ks_errno`/`ks_close`). +Only a **Windows** `keystone.lib` is vendored (`libraries/keystone/release-lib/`, +PE/COFF) and `dependencies/keystone/` ships **headers only** — no Linux library, +no source, not a git submodule. The `link_directories(...keystone...)` and the +`keystone` entry in `target_link_libraries` were previously commented out in the +top-level `CMakeLists.txt` to get past `cannot find -lkeystone`, which is what +left the 5 symbols unresolved. + +Because `dependencies/keystone/include/keystone/keystone.h` *is* present (and +included unconditionally from `pch.h:138`), every `ks_*` **type and constant** +(`ks_engine`, `ks_err`, `ks_arch`, `KS_ARCH_X86`, `KS_MODE_64`, +`KS_OPT_SYNTAX_INTEL`, …) resolves fine on Linux — only the 5 *functions* are +missing. That means no header surgery and no `-linux.cpp` fork were needed: +`assembler.h`'s class declaration (which has `ks_err KsErr` as a member and +`ks_arch`/`KS_*` as default arguments) compiles untouched. + +All 5 calls are confined to one method, so this is pattern 1 — the body of +`AssembleData::Assemble` (`assembler.cpp:119`) is guarded `#ifdef _WIN32` +(Windows verbatim) with a Linux `#else` that emits +`"err, the assembler is not supported on Linux yet"` and returns `-1`, plus +`UNREFERENCED_PARAMETER` ×4 and a TODO(Linux). No call-site changes were needed: +both callers (`HyperDbgAssembleGetLength`, `HyperDbgAssemble`) already treat a +non-zero `Assemble()` return as failure and return `FALSE`, so the stub flows +through the existing error paths. The rest of the TU stays live on Linux — +notably `ParseAssemblyData`, which does the `` resolution. + +Affects the `a` (assemble) command and anything calling `HyperDbgAssemble`. + +- [ ] Real fix: build upstream Keystone for Linux → `libkeystone.a`/`.so`, then + restore the two commented-out lines in the top-level `CMakeLists.txt` and drop + the guard. + +**Result: the CLI link is down to 4 undefined refs**, all `pt.cpp` +(`CommandPt`, `CommandPtHelp`, `HyperDbgPtMmapSendRequest`, +`HyperDbgPerformPtOperation`) — the one remaining deliberate exclusion. + --- ## TODO ledger — revisit before Linux is functional @@ -590,6 +628,11 @@ Grouped by subsystem. These are the shortcuts taken to reach compilation. - [ ] Replace the `symbol-linux.cpp` (`Symbol*`) and `symbol-stub-linux.c` (`Sym*`) stubs with a real ELF/DWARF (or LLVM DebugInfo/PDB) symbol parser. +### Assembler (keystone) +- [ ] `assembler.cpp::AssembleData::Assemble` — Linux body stubbed (`return -1`). + Needs a Linux Keystone build plus the two restored CMake lines; see the + keystone section above. + ### PCI ID database - [ ] `pci-id.cpp::GetVendorById` — Linux returns NULL (whole body Windows-only). Needs `readlink("/proc/self/exe")` **plus** a portable path separator and a From 2024cb9374e29fbd511ba931ab8b2bf7d483457c Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 22:07:08 +0200 Subject: [PATCH 36/50] Build file edit for first build og hyperdbg-cli --- hyperdbg/libhyperdbg/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hyperdbg/libhyperdbg/CMakeLists.txt b/hyperdbg/libhyperdbg/CMakeLists.txt index a6b394f9..9812631f 100644 --- a/hyperdbg/libhyperdbg/CMakeLists.txt +++ b/hyperdbg/libhyperdbg/CMakeLists.txt @@ -225,10 +225,11 @@ if(UNIX) # # pt.cpp (Intel PT command) is an un-ported Windows process-control TU # (OpenProcess/CreateToolhelp32Snapshot/CreateThread/WaitForMultipleObjects). - # Keep it out of the Linux build until the process-control port lands; - # CommandPt stays unresolved (same as before it was added to the list). + # Keep it out of the Linux build until the process-control port lands and + # swap in the stub that provides its 4 externally visible functions. # list(REMOVE_ITEM SourceFiles "code/debugger/commands/extension-commands/pt.cpp") + list(APPEND SourceFiles "code/debugger/commands/extension-commands/pt-linux.cpp") # # The MASM (.asm) implementation only builds with the Microsoft assembler, From 1a9a62a91671055aa8e482e52e4b0fbf52a6a0c4 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 22:10:08 +0200 Subject: [PATCH 37/50] Forgot to add the new linux stubs to tracked files, so here it is --- .../commands/extension-commands/pt-linux.cpp | 119 ++++++++++++++++++ hyperdbg/linux/PORTING_STATUS.md | 23 ++++ 2 files changed, 142 insertions(+) create mode 100644 hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pt-linux.cpp diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pt-linux.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pt-linux.cpp new file mode 100644 index 00000000..d7f23313 --- /dev/null +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/pt-linux.cpp @@ -0,0 +1,119 @@ +/** + * @file pt-linux.cpp + * @author Max Raulea (max.raulea@hyperdbg.org) + * @brief Linux stub implementations of the !pt (Intel Processor Trace) command (pt.cpp) + * @details The Windows implementation (pt.cpp) drives Intel PT by attaching to a + * live process, so it is built almost entirely out of Win32 + * process/thread management — roughly 27 raw Win32 call sites, with no + * #ifdef guards anywhere in the file: + * - CreateToolhelp32Snapshot + Process32First/Next and + * Thread32First/Next to walk processes and threads by name/pid/tid, + * - OpenProcess / OpenThread plus the handle lifetime around them + * (CloseHandle x8), + * - SetThreadAffinityMask to pin the traced thread to a core, + * - CreateEvent / CreateThread / WaitForMultipleObjects for the + * background trace thread and its g_PtTraceStopEvent stop signal, + * - two DeviceIoControl + GetLastError pairs. + * + * Those last two are simple renames onto the existing Platform* + * wrappers, but everything above needs a real decision per call site — + * either route it through a new cross-platform wrapper, or guard the + * whole enclosing function for Windows and give Linux a stub — because + * the Win32 calls are interleaved with the surrounding walk and UI + * logic rather than sitting behind a clean boundary. Porting half the + * file would leave it in a worse state than leaving it whole, so until + * that work is done the entire translation unit is swapped out on Linux + * (CMake `if(UNIX)` REMOVE_ITEM pt.cpp + APPEND pt-linux.cpp). This + * mirrors how symbol.cpp, pe-parser.cpp, install.cpp and namedpipe.cpp + * are handled; pt.cpp itself is left 100% untouched for the Windows + * build. + * + * Only the 4 externally visible functions are provided here — CommandPt + * and CommandPtHelp (declared in commands.h / help.h, reached from the + * command dispatch table) and HyperDbgPerformPtOperation / + * HyperDbgPtMmapSendRequest (declared in debugger.h). Everything else + * in pt.cpp is helper code reached only through those entry points, so + * it simply does not exist in the Linux translation unit. + * + * TODO(Linux) to make these real: the Toolhelp process/thread walks + * become /proc enumeration, OpenProcess/OpenThread become pid/tid + * handles (or a ptrace attach), SetThreadAffinityMask becomes + * sched_setaffinity(2), and the event/thread machinery becomes the + * existing Platform* wrappers. Note the underlying IOCTL transport + * (platform-ioctl) is itself still a Linux stub, so a working !pt also + * depends on the kernel module landing. + * + * @version 0.1 + * @date 2026-07-24 + * + * @copyright This project is released under the GNU Public License v3. + * + */ +#include "pch.h" + +#ifdef __linux__ + +/** + * @brief help of the !pt command + * + * @return VOID + */ +VOID +CommandPtHelp() +{ + ShowMessages("!pt : enables, disables and configures Intel Processor Trace (PT).\n\n"); + ShowMessages("err, the !pt command is not supported on Linux yet\n"); +} + +/** + * @brief !pt command handler + * + * @param CommandTokens + * @param Command + * + * @return VOID + */ +VOID +CommandPt(vector CommandTokens, string Command) +{ + UNREFERENCED_PARAMETER(CommandTokens); + UNREFERENCED_PARAMETER(Command); + + ShowMessages("err, the !pt command is not supported on Linux yet\n"); +} + +/** + * @brief Send an Intel PT operation request to the kernel + * + * @param PtRequest + * + * @return BOOLEAN + */ +BOOLEAN +HyperDbgPerformPtOperation(HYPERTRACE_PT_OPERATION_PACKETS * PtRequest) +{ + UNREFERENCED_PARAMETER(PtRequest); + + ShowMessages("err, Intel PT operations are not supported on Linux yet\n"); + + return FALSE; +} + +/** + * @brief Send an Intel PT trace-buffer mapping request to the kernel + * + * @param MmapRequest + * + * @return BOOLEAN + */ +BOOLEAN +HyperDbgPtMmapSendRequest(HYPERTRACE_PT_MMAP_PACKETS * MmapRequest) +{ + UNREFERENCED_PARAMETER(MmapRequest); + + ShowMessages("err, Intel PT buffer mapping is not supported on Linux yet\n"); + + return FALSE; +} + +#endif // __linux__ diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index 0e036a3a..be9101d9 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -599,6 +599,29 @@ Affects the `a` (assemble) command and anything calling `HyperDbgAssemble`. (`CommandPt`, `CommandPtHelp`, `HyperDbgPtMmapSendRequest`, `HyperDbgPerformPtOperation`) — the one remaining deliberate exclusion. +### pt.cpp stubbed on Linux — DONE (2026-07-24) — **THE LINK NOW SUCCEEDS** + +The last 4 undefined refs (`CommandPt`, `CommandPtHelp`, +`HyperDbgPerformPtOperation`, `HyperDbgPtMmapSendRequest`). `pt.cpp` was already +`REMOVE_ITEM`'d from the Linux build; it now gets a replacement stub instead of +leaving the symbols dangling, following the same pattern as symbol.cpp, +pe-parser.cpp, install.cpp and namedpipe.cpp. + +New `code/debugger/commands/extension-commands/pt-linux.cpp` (`#ifdef __linux__`) +implements only the 4 externally visible functions — the two command entry +points reached from the dispatch table (`CommandPt`, `CommandPtHelp`) and the two +kernel-request helpers declared in `debugger.h`. Each prints a "not supported on +Linux yet" note; the `BOOLEAN` pair returns FALSE. Everything else in `pt.cpp` is +helper code reached only through those entry points, so it does not exist in the +Linux TU. `pt.cpp` is still left 100% untouched. CMake `if(UNIX)` now does the +usual REMOVE_ITEM + APPEND pair. + +**Result: `hyperdbg-cli` links and runs on Linux for the first time.** The binary +starts, prints its banner and reaches the `HyperDbg>` prompt, and `.exit` exits +cleanly (0). The port is out of the compile/link phase and into the runtime phase. + +- [ ] Port `pt.cpp` for real — see the process-control entry in the TODO ledger. + --- ## TODO ledger — revisit before Linux is functional From bdc7a150cbefbc3d85a05d2a995bad4db34fc321 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Fri, 24 Jul 2026 22:28:44 +0200 Subject: [PATCH 38/50] Fixed bug that made script-engine segfault, explained in the porting status, so you can type commands now --- hyperdbg/CMakeLists.txt | 23 ++++++++++++ hyperdbg/linux/PORTING_STATUS.md | 61 +++++++++++++++++++++++++++++--- 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/hyperdbg/CMakeLists.txt b/hyperdbg/CMakeLists.txt index df6a851f..c6b38ed0 100644 --- a/hyperdbg/CMakeLists.txt +++ b/hyperdbg/CMakeLists.txt @@ -78,6 +78,29 @@ find_package(Threads REQUIRED) #target_link_libraries(libhyperdbg Zycore Zydis script-engine keystone Threads::Threads ${CMAKE_DL_LIBS}) target_link_libraries(libhyperdbg Zycore Zydis script-engine Threads::Threads ${CMAKE_DL_LIBS}) +# +# Each library must define its own HYPERDBG_* macro so that the IMPORT_EXPORT_* +# annotations in include/SDK/imports/user/ resolve to the "export" form +# (visibility("default")) while it is being built, and to the "import" form in +# every other translation unit. This mirrors what the Windows .vcxproj files do +# with __declspec(dllexport)/dllimport. +# +target_compile_definitions(script-engine PRIVATE HYPERDBG_SCRIPT_ENGINE) +target_compile_definitions(libhyperdbg PRIVATE HYPERDBG_LIBHYPERDBG) + +# +# The annotations above only mean something if the default visibility is hidden; +# otherwise every symbol is exported anyway and visibility("default") is a no-op. +# Hiding by default matches the Windows model (private unless dllexport-ed) and +# keeps each library's internal globals private, so same-named module-private +# globals in different libraries are no longer merged by the dynamic linker. +# +set_target_properties(script-engine libhyperdbg PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON +) + add_subdirectory(hyperdbg-cli) target_link_libraries(hyperdbg-cli libhyperdbg) diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index be9101d9..70ddd06f 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -616,15 +616,66 @@ helper code reached only through those entry points, so it does not exist in the Linux TU. `pt.cpp` is still left 100% untouched. CMake `if(UNIX)` now does the usual REMOVE_ITEM + APPEND pair. -**Result: `hyperdbg-cli` links and runs on Linux for the first time.** The binary -starts, prints its banner and reaches the `HyperDbg>` prompt, and `.exit` exits -cleanly (0). The port is out of the compile/link phase and into the runtime phase. +**Result: `hyperdbg-cli` links and runs on Linux for the first time.** With the +symbol-visibility fix below also in place, the binary starts, reaches the +`HyperDbg>` prompt and executes host-side commands correctly — verified with +`.help`, `.help !monitor`, `.formats 0x1337` (full hex/decimal/octal/binary/char/ +time/float/double output) and `? 5 * 8` (script engine) — then exits cleanly on +`.exit`. The port is out of the compile/link phase and into the runtime phase. + +Run it with: +```bash +LD_LIBRARY_PATH=$PWD/libhyperdbg:$PWD/script-engine ./hyperdbg-cli/hyperdbg-cli +``` - [ ] Port `pt.cpp` for real — see the process-control entry in the TODO ledger. ---- +### Symbol visibility: honour the existing IMPORT_EXPORT_* model — DONE (2026-07-24) -## TODO ledger — revisit before Linux is functional +Build-system change in the top-level `CMakeLists.txt`, two parts: + +```cmake +target_compile_definitions(script-engine PRIVATE HYPERDBG_SCRIPT_ENGINE) +target_compile_definitions(libhyperdbg PRIVATE HYPERDBG_LIBHYPERDBG) + +set_target_properties(script-engine libhyperdbg PROPERTIES + C_VISIBILITY_PRESET hidden + CXX_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON) +``` + +**Why.** `include/SDK/imports/user/HyperDbg*Imports.h` already carries a Linux +branch for each library's export macro — `IMPORT_EXPORT_LIBHYPERDBG` and friends +expand to `__attribute__((visibility("default")))` when the library's own +`HYPERDBG_*` macro is defined, and to nothing otherwise, mirroring the +`__declspec(dllexport)`/`dllimport` pair used on Windows. 77 symbols are annotated +for libhyperdbg and 29 for script-engine. Neither half was active on Linux: the +`HYPERDBG_*` defines were never set by CMake, and `visibility("default")` is a +no-op unless the compiler's baseline visibility is `hidden` (it can only raise a +symbol above the baseline, and the baseline was already default). So the whole +export model existed in the headers but did nothing, and every symbol in both +libraries was exported. + +That matters because ELF merges same-named exported symbols across shared objects, +whereas a Windows DLL's non-exported globals are private to it. Three globals were +defined independently in both libraries and were being silently collapsed into one +object at load time: + +| Symbol | libhyperdbg | script-engine | +|--------|-------------|---------------| +| `g_MessageHandler` | `header/globals/globals.h:460` | `code/globals.c:24` | +| `g_HwdbgInstanceInfo` | ” | ” | +| `g_HwdbgInstanceInfoIsValid` | ” | ” | + +Turning both halves on restores the Windows semantics (private unless explicitly +exported). Exported data symbols drop to **0** in both libraries; total exports go +from everything to 264 (libhyperdbg) and 25 (script-engine). The link stays clean +— **0 undefined references** — so nothing was relying on an unannotated symbol +crossing a library boundary. No source file was touched. + +⚠️ `VISIBILITY_INLINES_HIDDEN` is included to match the usual CMake pairing; if a +future change takes the address of an inline member across a library boundary and +compares it, that flag is the first thing to re-check. Grouped by subsystem. These are the shortcuts taken to reach compilation. From 2cd78897c07b04137baa07443a7d894f6e106a2b Mon Sep 17 00:00:00 2001 From: munraimix Date: Sun, 26 Jul 2026 22:43:57 +1000 Subject: [PATCH 39/50] Resync serial stream on framing overflow instead of flooding the debuggee When the debugger drops the serial link uncleanly mid-frame (no CLOSE_AND_UNLOAD packet), SerialConnectionRecvBuffer overflowed without an end-of-buffer marker and returned FALSE into the KD dispatch loop retry. The loop re-entered the same desynced stream, so it overflowed again at once and flooded 'buffer exceeds the buffer limitation' (and could wedge the KD driver on the next reconnect). Discard bytes to the next end-of-buffer marker to re-align, start a fresh frame, and log once per desync episode with LogWarning. Framing and protocol are unchanged. Refs #661 --- .../debugger/communication/SerialConnection.c | 80 ++++++++++++++++++- hyperdbg/include/SDK/headers/Constants.h | 7 ++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/hyperdbg/hyperkd/code/debugger/communication/SerialConnection.c b/hyperdbg/hyperkd/code/debugger/communication/SerialConnection.c index f7c55d7a..086fc249 100644 --- a/hyperdbg/hyperkd/code/debugger/communication/SerialConnection.c +++ b/hyperdbg/hyperkd/code/debugger/communication/SerialConnection.c @@ -87,6 +87,52 @@ SerialConnectionCheckForTheEndOfTheBuffer(PUINT32 CurrentLoopIndex, BYTE * Buffe return FALSE; } +// +// Set when the serial stream desyncs so the warning is logged once per episode +// (cleared on the next good frame) instead of on every overflow +// +static BOOLEAN g_SerialConnectionDesyncReported = FALSE; + +/** + * @brief Discard bytes until the next end of buffer marker to re-align the + * stream to a frame boundary after a desync + * + * @return BOOLEAN TRUE if a marker was found (stream re-aligned), FALSE if too + * many bytes arrived without one (treat the link as dead) + */ +BOOLEAN +SerialConnectionResyncToNextFrame() +{ + BYTE Window[4] = {NULL_ZERO, NULL_ZERO, NULL_ZERO, NULL_ZERO}; + UINT32 Discarded = 0; + + while (Discarded < SERIAL_RESYNC_MAX_BYTES) + { + UCHAR RecvChar = NULL_ZERO; + + if (!KdHyperDbgRecvByte(&RecvChar)) + { + continue; + } + + Window[0] = Window[1]; + Window[1] = Window[2]; + Window[2] = Window[3]; + Window[3] = RecvChar; + Discarded++; + + if (Window[0] == SERIAL_END_OF_BUFFER_CHAR_1 && + Window[1] == SERIAL_END_OF_BUFFER_CHAR_2 && + Window[2] == SERIAL_END_OF_BUFFER_CHAR_3 && + Window[3] == SERIAL_END_OF_BUFFER_CHAR_4) + { + return TRUE; + } + } + + return FALSE; +} + /** * @brief Receive packet from the debugger * @@ -120,10 +166,33 @@ SerialConnectionRecvBuffer(CHAR * BufferToSave, if (!(MaxSerialPacketSize > Loop)) { // - // Invalid buffer (size of buffer exceeds the limitation) + // Overflowed without an end of buffer marker, so the stream is + // desynced (the debugger most likely dropped the link mid-frame + // without sending the close packet). Returning FALSE here sends the + // caller straight back into the same desynced stream, which + // overflows again at once and floods the log. Log once per episode + // and resync to the next frame boundary instead. // - LogError("Err, a buffer received in debuggee which exceeds the buffer limitation"); - return FALSE; + if (!g_SerialConnectionDesyncReported) + { + LogWarning("Warning, serial stream desynced (exceeded the buffer " + "limitation with no end marker); resyncing to the next frame"); + g_SerialConnectionDesyncReported = TRUE; + } + + if (!SerialConnectionResyncToNextFrame()) + { + // + // Too many bytes without a marker, treat the link as dead + // + return FALSE; + } + + // + // Re-aligned to a frame boundary, start a fresh frame + // + Loop = 0; + continue; } BufferToSave[Loop] = RecvChar; @@ -136,6 +205,11 @@ SerialConnectionRecvBuffer(CHAR * BufferToSave, Loop++; } + // + // A full frame arrived, so the stream is back in sync + // + g_SerialConnectionDesyncReported = FALSE; + // // Set the length // diff --git a/hyperdbg/include/SDK/headers/Constants.h b/hyperdbg/include/SDK/headers/Constants.h index af8804d6..072a51b6 100644 --- a/hyperdbg/include/SDK/headers/Constants.h +++ b/hyperdbg/include/SDK/headers/Constants.h @@ -436,6 +436,13 @@ const UCHAR BuildSignature[] = { #define SERIAL_END_OF_BUFFER_CHAR_3 0xEE #define SERIAL_END_OF_BUFFER_CHAR_4 0xFF +/** + * @brief maximum number of bytes to discard while resyncing the serial stream + * to the next end of buffer marker after a framing overflow (bounded so that a + * dead link cannot spin forever) + */ +#define SERIAL_RESYNC_MAX_BYTES (MaxSerialPacketSize * 4) + /** * @brief count of characters for tcp end of buffer */ From b2b98033ef7f5b15cbfeb51ea0eb0581a1b6b2d2 Mon Sep 17 00:00:00 2001 From: munraimix Date: Mon, 27 Jul 2026 22:40:06 +1000 Subject: [PATCH 40/50] Resync libhyperdbg's serial receivers on framing overflow too The debuggee-side hyperkd fix stops the driver flooding, but the same delimiter-only framing with a blind retry loop also lives in the user-mode receivers. Mirror the resync there so an unclean disconnect does not flood the console either: KdReceivePacketFromDebuggee, KdReceivePacketFromDebugger, and the ListeningSerialPortInDebuggee loop. On overflow with no end-of-buffer marker, warn once per episode and discard to the next frame boundary (bounded by SERIAL_RESYNC_MAX_BYTES) instead of returning into the still-desynced stream. Refs #661 --- .../code/debugger/kernel-level/kd.cpp | 398 +++++++++++++----- .../kernel-level/kernel-listening.cpp | 106 ++++- 2 files changed, 400 insertions(+), 104 deletions(-) diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp index 6a940ae5..5e06bdac 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp @@ -1590,6 +1590,123 @@ KdGetWindowVersion(CHAR * BufferToSave) #endif // _WIN32 } +// +// Set when the debugger-side serial receiver desyncs, so the warning is shown +// once per episode (cleared on the next good frame) instead of on every +// overflow while the stream stays desynced. +// +static BOOLEAN g_KdSerialReceiverDesyncReported = FALSE; + +/** + * @brief Read a single byte from the debuggee over the serial link + * + * @details Encapsulates the platform-specific single-byte read used by the + * debugger-side receiver so the framing loop and the resync path share one + * implementation. + * + * @param ReadData receives the byte that was read + * @param NoBytesRead receives the number of bytes actually read + * + * @return BOOLEAN TRUE on a successful read, FALSE on a hard read error + */ +static BOOLEAN +KdReadByteFromDebuggeeSerial(CHAR * ReadData, DWORD * NoBytesRead) +{ +#ifdef _WIN32 + // + // Try to read one byte in overlapped I/O (in debugger) + // + if (!ReadFile(g_SerialRemoteComPortHandle, ReadData, sizeof(CHAR), NULL, &g_OverlappedIoStructureForReadDebugger)) + { + DWORD e = GetLastError(); + + if (e != ERROR_IO_PENDING) + { + return FALSE; + } + } + + // + // Wait till one packet becomes available + // + WaitForSingleObject(g_OverlappedIoStructureForReadDebugger.hEvent, + INFINITE); + + // + // Get the result + // + GetOverlappedResult(g_SerialRemoteComPortHandle, + &g_OverlappedIoStructureForReadDebugger, + NoBytesRead, + FALSE); + + // + // Reset event for next try + // + ResetEvent(g_OverlappedIoStructureForReadDebugger.hEvent); + + return TRUE; +#else + // + // Linux: read one byte through the cross-platform serial transport + // + return PlatformSerialReadByte(g_SerialRemoteComPortHandle, + ReadData, + NoBytesRead, + PLATFORM_SERIAL_IO_DEBUGGER); +#endif // _WIN32 +} + +/** + * @brief Discard bytes until the next end-of-buffer marker, re-aligning the + * debugger-side serial receiver to a frame boundary after a desync + * + * @details Mirrors SerialConnectionResyncToNextFrame() on the debuggee side. + * Bounded by SERIAL_RESYNC_MAX_BYTES so a dead or garbage link cannot spin + * forever. + * + * @return BOOLEAN TRUE if a marker was found (stream re-aligned), FALSE if too + * many bytes arrived without one (treat the link as dead) + */ +static BOOLEAN +KdResyncDebuggeeStreamToNextFrame() +{ + BYTE Window[SERIAL_END_OF_BUFFER_CHARS_COUNT] = {NULL_ZERO, NULL_ZERO, NULL_ZERO, NULL_ZERO}; + UINT32 Discarded = 0; + + while (Discarded < SERIAL_RESYNC_MAX_BYTES) + { + CHAR ReadData = NULL_ZERO; + DWORD NoBytesRead = 0; + + if (!KdReadByteFromDebuggeeSerial(&ReadData, &NoBytesRead)) + { + return FALSE; + } + + if (NoBytesRead == 0) + { + continue; + } + + Window[0] = Window[1]; + Window[1] = Window[2]; + Window[2] = Window[3]; + Window[3] = (BYTE)ReadData; + Discarded++; + + if (Window[0] == SERIAL_END_OF_BUFFER_CHAR_1 && + Window[1] == SERIAL_END_OF_BUFFER_CHAR_2 && + Window[2] == SERIAL_END_OF_BUFFER_CHAR_3 && + Window[3] == SERIAL_END_OF_BUFFER_CHAR_4) + { + return TRUE; + } + } + + return FALSE; +} + /** * @brief Receive packet from the debuggee * @@ -1611,54 +1728,10 @@ KdReceivePacketFromDebuggee(CHAR * BufferToSave, // do { -#ifdef _WIN32 - // - // It's in the debugger - // - - // - // Try to read one byte in overlapped I/O (in debugger) - // - if (!ReadFile(g_SerialRemoteComPortHandle, &ReadData, sizeof(ReadData), NULL, &g_OverlappedIoStructureForReadDebugger)) - { - DWORD e = GetLastError(); - - if (e != ERROR_IO_PENDING) - { - return FALSE; - } - } - - // - // Wait till one packet becomes available - // - WaitForSingleObject(g_OverlappedIoStructureForReadDebugger.hEvent, - INFINITE); - - // - // Get the result - // - GetOverlappedResult(g_SerialRemoteComPortHandle, - &g_OverlappedIoStructureForReadDebugger, - &NoBytesRead, - FALSE); - - // - // Reset event for next try - // - ResetEvent(g_OverlappedIoStructureForReadDebugger.hEvent); -#else - // - // Linux: read one byte through the cross-platform serial transport - // - if (!PlatformSerialReadByte(g_SerialRemoteComPortHandle, - &ReadData, - &NoBytesRead, - PLATFORM_SERIAL_IO_DEBUGGER)) + if (!KdReadByteFromDebuggeeSerial(&ReadData, &NoBytesRead)) { return FALSE; } -#endif // // We already now that the maximum packet size is MaxSerialPacketSize @@ -1667,11 +1740,30 @@ KdReceivePacketFromDebuggee(CHAR * BufferToSave, if (!(MaxSerialPacketSize > Loop)) { // - // Invalid buffer + // Overflowed without an end-of-buffer marker: the stream is + // desynced (the debuggee most likely dropped the link mid-frame + // without sending a close packet). Returning FALSE here sends the + // caller straight back into the same desynced stream, which + // overflows again at once and floods the output. Show the warning + // once per episode and resync to the next frame boundary instead. // - ShowMessages("err, a buffer received in which exceeds the " - "buffer limitation\n"); - return FALSE; + if (!g_KdSerialReceiverDesyncReported) + { + ShowMessages("err, serial stream desynced (a buffer exceeded the " + "buffer limitation with no end marker); resyncing\n"); + g_KdSerialReceiverDesyncReported = TRUE; + } + + if (!KdResyncDebuggeeStreamToNextFrame()) + { + // + // Too many bytes without a marker: treat the link as dead. + // + return FALSE; + } + + Loop = 0; + continue; } BufferToSave[Loop] = ReadData; @@ -1685,6 +1777,11 @@ KdReceivePacketFromDebuggee(CHAR * BufferToSave, } while (NoBytesRead > 0); + // + // A full frame arrived, so the stream is back in sync. + // + g_KdSerialReceiverDesyncReported = FALSE; + // // Set the length // @@ -1693,6 +1790,129 @@ KdReceivePacketFromDebuggee(CHAR * BufferToSave, return TRUE; } +// +// Set when the debuggee-side serial receiver (packets coming from the debugger) +// desyncs, so the warning is shown once per episode (cleared on the next good +// frame) instead of on every overflow while the stream stays desynced. +// +static BOOLEAN g_KdReceiveFromDebuggerDesyncReported = FALSE; + +/** + * @brief Read a single byte from the debugger over the serial link + * + * @details Debuggee-side counterpart of KdReadByteFromDebuggeeSerial(); reads + * through the read-from-debugger overlapped structure so the framing loop and + * the resync path share one implementation. + * + * @param ReadData receives the byte that was read + * @param NoBytesRead receives the number of bytes actually read + * + * @return BOOLEAN TRUE on a successful read, FALSE on a hard read error + */ +static BOOLEAN +KdReadByteFromDebuggerSerial(CHAR * ReadData, DWORD * NoBytesRead) +{ +#ifdef _WIN32 + // + // Try to read one byte in overlapped I/O (in debuggee) + // + if (!ReadFile(g_SerialRemoteComPortHandle, ReadData, sizeof(CHAR), NULL, &g_OverlappedIoStructureForReadDebuggee)) + { + DWORD e = GetLastError(); + + if (e != ERROR_IO_PENDING) + { + return FALSE; + } + } + + // + // Wait till one packet becomes available + // + WaitForSingleObject(g_OverlappedIoStructureForReadDebuggee.hEvent, + INFINITE); + + // + // Get the result + // + GetOverlappedResult(g_SerialRemoteComPortHandle, + &g_OverlappedIoStructureForReadDebuggee, + NoBytesRead, + FALSE); + + // + // Reset event for next try + // + ResetEvent(g_OverlappedIoStructureForReadDebuggee.hEvent); + + return TRUE; +#else + // + // Linux: read one byte through the cross-platform serial transport + // (the 5s read timeout is applied inside the platform layer) + // + return PlatformSerialReadByte(g_SerialRemoteComPortHandle, + ReadData, + NoBytesRead, + PLATFORM_SERIAL_IO_DEBUGGEE); +#endif // _WIN32 +} + +/** + * @brief Discard bytes until the next end-of-buffer marker, re-aligning the + * debuggee-side serial receiver to a frame boundary after a desync + * + * @details Mirrors KdResyncDebuggeeStreamToNextFrame(). This receiver runs with + * a 5s comm read timeout, so a zero-byte read means the link went idle; treat + * that as a dead link and bail rather than spin. Bounded by + * SERIAL_RESYNC_MAX_BYTES so a garbage link cannot spin forever either. + * + * @return BOOLEAN TRUE if a marker was found (stream re-aligned), FALSE if the + * link went idle or too many bytes arrived without a marker + */ +static BOOLEAN +KdResyncDebuggerStreamToNextFrame() +{ + BYTE Window[SERIAL_END_OF_BUFFER_CHARS_COUNT] = {NULL_ZERO, NULL_ZERO, NULL_ZERO, NULL_ZERO}; + UINT32 Discarded = 0; + + while (Discarded < SERIAL_RESYNC_MAX_BYTES) + { + CHAR ReadData = NULL_ZERO; + DWORD NoBytesRead = 0; + + if (!KdReadByteFromDebuggerSerial(&ReadData, &NoBytesRead)) + { + return FALSE; + } + + if (NoBytesRead == 0) + { + // + // The read timed out with no data: the link is idle, so stop + // discarding and let the caller fall back to its idle handling. + // + return FALSE; + } + + Window[0] = Window[1]; + Window[1] = Window[2]; + Window[2] = Window[3]; + Window[3] = (BYTE)ReadData; + Discarded++; + + if (Window[0] == SERIAL_END_OF_BUFFER_CHAR_1 && + Window[1] == SERIAL_END_OF_BUFFER_CHAR_2 && + Window[2] == SERIAL_END_OF_BUFFER_CHAR_3 && + Window[3] == SERIAL_END_OF_BUFFER_CHAR_4) + { + return TRUE; + } + } + + return FALSE; +} + /** * @brief Receive packet from the debugger * @@ -1733,55 +1953,10 @@ KdReceivePacketFromDebugger(CHAR * BufferToSave, // do { -#ifdef _WIN32 - // - // It's in the debuggee - // - - // - // Try to read one byte in overlapped I/O (in debugger) - // - if (!ReadFile(g_SerialRemoteComPortHandle, &ReadData, sizeof(ReadData), NULL, &g_OverlappedIoStructureForReadDebuggee)) - { - DWORD e = GetLastError(); - - if (e != ERROR_IO_PENDING) - { - return FALSE; - } - } - - // - // Wait till one packet becomes available - // - WaitForSingleObject(g_OverlappedIoStructureForReadDebuggee.hEvent, - INFINITE); - - // - // Get the result - // - GetOverlappedResult(g_SerialRemoteComPortHandle, - &g_OverlappedIoStructureForReadDebuggee, - &NoBytesRead, - FALSE); - - // - // Reset event for next try - // - ResetEvent(g_OverlappedIoStructureForReadDebuggee.hEvent); -#else - // - // Linux: read one byte through the cross-platform serial transport - // (the 5s read timeout is applied inside the platform layer) - // - if (!PlatformSerialReadByte(g_SerialRemoteComPortHandle, - &ReadData, - &NoBytesRead, - PLATFORM_SERIAL_IO_DEBUGGEE)) + if (!KdReadByteFromDebuggerSerial(&ReadData, &NoBytesRead)) { return FALSE; } -#endif // // We already now that the maximum packet size is MaxSerialPacketSize @@ -1790,11 +1965,31 @@ KdReceivePacketFromDebugger(CHAR * BufferToSave, if (!(MaxSerialPacketSize > Loop)) { // - // Invalid buffer + // Overflowed without an end-of-buffer marker: the stream is + // desynced (the debugger most likely dropped the link mid-frame + // without sending a close packet). Returning FALSE here sends the + // caller straight back into the same desynced stream, which + // overflows again at once and floods the output. Show the warning + // once per episode and resync to the next frame boundary instead. // - ShowMessages("err, a buffer received in which exceeds the " - "buffer limitation\n"); - return FALSE; + if (!g_KdReceiveFromDebuggerDesyncReported) + { + ShowMessages("err, serial stream desynced (a buffer exceeded the " + "buffer limitation with no end marker); resyncing\n"); + g_KdReceiveFromDebuggerDesyncReported = TRUE; + } + + if (!KdResyncDebuggerStreamToNextFrame()) + { + // + // The link went idle or stayed garbage past the bound: treat it + // as dead so the caller can fall back to its idle handling. + // + return FALSE; + } + + Loop = 0; + continue; } BufferToSave[Loop] = ReadData; @@ -1808,6 +2003,11 @@ KdReceivePacketFromDebugger(CHAR * BufferToSave, } while (NoBytesRead > 0); + // + // A full frame arrived, so the stream is back in sync. + // + g_KdReceiveFromDebuggerDesyncReported = FALSE; + // // Set the length // diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp index 1471ff64..a3a6983f 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp @@ -1451,6 +1451,75 @@ StartAgain: return TRUE; } +// +// Set when the debuggee-side listening loop desyncs, so the warning is shown +// once per episode (cleared on the next good frame) instead of on every +// overflow while the stream stays desynced. +// +static BOOLEAN g_ListeningDebuggeeDesyncReported = FALSE; + +/** + * @brief Discard bytes until the next end-of-buffer marker, re-aligning the + * debuggee-side listening loop to a frame boundary after a desync + * + * @details Bounded by SERIAL_RESYNC_MAX_BYTES so a dead or garbage link cannot + * spin forever. + * + * @return BOOLEAN TRUE if a marker was found (stream re-aligned), FALSE on a + * read error or if too many bytes arrived without a marker + */ +static BOOLEAN +ListeningDebuggeeResyncToNextFrame() +{ + BYTE Window[SERIAL_END_OF_BUFFER_CHARS_COUNT] = {NULL_ZERO, NULL_ZERO, NULL_ZERO, NULL_ZERO}; + UINT32 Discarded = 0; + + while (Discarded < SERIAL_RESYNC_MAX_BYTES) + { + char ReadData = NULL_ZERO; + DWORD NoBytesRead = 0; + BOOL Status; + +#ifdef _WIN32 + Status = ReadFile(g_SerialRemoteComPortHandle, &ReadData, sizeof(ReadData), &NoBytesRead, NULL); +#else + // + // Linux: read one byte through the cross-platform serial transport + // + Status = PlatformSerialReadByte(g_SerialRemoteComPortHandle, + &ReadData, + &NoBytesRead, + PLATFORM_SERIAL_IO_DEBUGGEE); +#endif // _WIN32 + + if (!Status) + { + return FALSE; + } + + if (NoBytesRead == 0) + { + continue; + } + + Window[0] = Window[1]; + Window[1] = Window[2]; + Window[2] = Window[3]; + Window[3] = (BYTE)ReadData; + Discarded++; + + if (Window[0] == SERIAL_END_OF_BUFFER_CHAR_1 && + Window[1] == SERIAL_END_OF_BUFFER_CHAR_2 && + Window[2] == SERIAL_END_OF_BUFFER_CHAR_3 && + Window[3] == SERIAL_END_OF_BUFFER_CHAR_4) + { + return TRUE; + } + } + + return FALSE; +} + /** * @brief Check if the remote debugger needs to pause the system * @@ -1527,23 +1596,50 @@ StartAgain: PLATFORM_SERIAL_IO_DEBUGGEE); #endif // _WIN32 + // + // Hard read error: restart the listen. StartAgain re-arms the wait, + // which blocks until data arrives, so it cannot busy-loop. + // + if (!Status) + { + goto StartAgain; + } + // // Check to make sure that we don't pass the boundaries // - if (!Status || !(MaxSerialPacketSize > Loop)) + if (!(MaxSerialPacketSize > Loop)) { // - // Invalid buffer + // Overflowed without an end-of-buffer marker: the stream is + // desynced. Restarting into the same desynced stream floods the + // output, so show the warning once per episode and resync to the + // next frame boundary instead. // - ShowMessages("err, a buffer received in debuggee which exceeds the " - "buffer limitation\n"); - goto StartAgain; + if (!g_ListeningDebuggeeDesyncReported) + { + ShowMessages("err, serial stream desynced in debuggee (a buffer " + "exceeded the buffer limitation with no end marker); resyncing\n"); + g_ListeningDebuggeeDesyncReported = TRUE; + } + + if (!ListeningDebuggeeResyncToNextFrame()) + { + goto StartAgain; + } + + Loop = 0; + continue; } SerialBuffer[Loop] = ReadData; if (KdCheckForTheEndOfTheBuffer(&Loop, (BYTE *)SerialBuffer)) { + // + // A full frame arrived, so the stream is back in sync. + // + g_ListeningDebuggeeDesyncReported = FALSE; break; } From b77df6a62bacf4bff29198b3d1acd7961a3e7f38 Mon Sep 17 00:00:00 2001 From: sina Date: Wed, 29 Jul 2026 15:02:53 +0200 Subject: [PATCH 41/50] remove unused serial codes --- .../platform/user/code/platform-serial.c | 186 +----------------- 1 file changed, 1 insertion(+), 185 deletions(-) diff --git a/hyperdbg/include/platform/user/code/platform-serial.c b/hyperdbg/include/platform/user/code/platform-serial.c index f1c01050..dcfdad4c 100644 --- a/hyperdbg/include/platform/user/code/platform-serial.c +++ b/hyperdbg/include/platform/user/code/platform-serial.c @@ -23,185 +23,8 @@ #if defined(_WIN32) // -// Per-direction overlapped I/O state, owned by the transport layer. +// Not implemented here // -static OVERLAPPED g_PlatformOverlappedReadDebugger = {0}; -static OVERLAPPED g_PlatformOverlappedReadDebuggee = {0}; -static OVERLAPPED g_PlatformOverlappedWriteDebugger = {0}; - -HANDLE -PlatformSerialOpen(const char * PortName, PLATFORM_SERIAL_IO_ROLE Role) -{ - HANDLE Comm; - char PortNo[24] = {0}; - - // - // Append name to make a Windows-understandable format - // - sprintf_s(PortNo, sizeof(PortNo), "\\\\.\\%s", PortName); - - if (Role == PLATFORM_SERIAL_IO_DEBUGGEE) - { - // - // Debuggee uses non-overlapped (blocking) I/O - // - Comm = CreateFile(PortNo, - GENERIC_READ | GENERIC_WRITE, - 0, - NULL, - OPEN_EXISTING, - 0, - NULL); - - g_PlatformOverlappedReadDebuggee.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - } - else - { - // - // Debugger uses overlapped (async) I/O - // - Comm = CreateFile(PortNo, - GENERIC_READ | GENERIC_WRITE, - 0, - NULL, - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED, - NULL); - - g_PlatformOverlappedReadDebugger.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - g_PlatformOverlappedWriteDebugger.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - } - - if (Comm == INVALID_HANDLE_VALUE) - { - return NULL; - } - - // - // Purge the serial port - // - PurgeComm(Comm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT); - - return Comm; -} - -BOOLEAN -PlatformSerialConfigure(HANDLE Handle, DWORD BaudRate) -{ - DCB SerialParams = {0}; - SerialParams.DCBlength = sizeof(SerialParams); - - if (GetCommState(Handle, &SerialParams) == FALSE) - { - return FALSE; - } - - SerialParams.BaudRate = BaudRate; - SerialParams.ByteSize = 8; - SerialParams.StopBits = ONESTOPBIT; - SerialParams.Parity = NOPARITY; - - if (SetCommState(Handle, &SerialParams) == FALSE) - { - return FALSE; - } - - return TRUE; -} - -BOOLEAN -PlatformSerialReadByte(HANDLE Handle, - CHAR * OutByte, - DWORD * BytesRead, - PLATFORM_SERIAL_IO_ROLE Role) -{ - OVERLAPPED * Ovl = (Role == PLATFORM_SERIAL_IO_DEBUGGEE) - ? &g_PlatformOverlappedReadDebuggee - : &g_PlatformOverlappedReadDebugger; - - if (Role == PLATFORM_SERIAL_IO_DEBUGGEE) - { - // - // Apply a read timeout for the debuggee side - // - COMMTIMEOUTS Timeouts; - GetCommTimeouts(Handle, &Timeouts); - Timeouts.ReadIntervalTimeout = MAXDWORD; - Timeouts.ReadTotalTimeoutConstant = 5000; - Timeouts.ReadTotalTimeoutMultiplier = 0; - Timeouts.WriteTotalTimeoutConstant = 0; - Timeouts.WriteTotalTimeoutMultiplier = 0; - SetCommTimeouts(Handle, &Timeouts); - } - - if (!ReadFile(Handle, OutByte, sizeof(CHAR), NULL, Ovl)) - { - if (GetLastError() != ERROR_IO_PENDING) - { - return FALSE; - } - } - - WaitForSingleObject(Ovl->hEvent, INFINITE); - GetOverlappedResult(Handle, Ovl, BytesRead, FALSE); - ResetEvent(Ovl->hEvent); - - return TRUE; -} - -BOOLEAN -PlatformSerialWrite(HANDLE Handle, const void * Buffer, UINT32 Length, BOOLEAN Synchronous) -{ - if (Synchronous) - { - DWORD BytesWritten = 0; - if (WriteFile(Handle, Buffer, Length, &BytesWritten, NULL) == FALSE) - { - return FALSE; - } - return (BytesWritten == Length); - } - else - { - if (WriteFile(Handle, Buffer, Length, NULL, &g_PlatformOverlappedWriteDebugger)) - { - return TRUE; - } - - if (GetLastError() != ERROR_IO_PENDING) - { - return FALSE; - } - - if (WaitForSingleObject(g_PlatformOverlappedWriteDebugger.hEvent, INFINITE) != WAIT_OBJECT_0) - { - return FALSE; - } - - ResetEvent(g_PlatformOverlappedWriteDebugger.hEvent); - return TRUE; - } -} - -BOOLEAN -PlatformSerialClose(HANDLE Handle) -{ - if (g_PlatformOverlappedReadDebugger.hEvent) - CloseHandle(g_PlatformOverlappedReadDebugger.hEvent); - if (g_PlatformOverlappedReadDebuggee.hEvent) - CloseHandle(g_PlatformOverlappedReadDebuggee.hEvent); - if (g_PlatformOverlappedWriteDebugger.hEvent) - CloseHandle(g_PlatformOverlappedWriteDebugger.hEvent); - - g_PlatformOverlappedReadDebugger.hEvent = NULL; - g_PlatformOverlappedReadDebuggee.hEvent = NULL; - g_PlatformOverlappedWriteDebugger.hEvent = NULL; - - if (Handle) - return (BOOLEAN)CloseHandle(Handle); - - return TRUE; -} #elif defined(__linux__) @@ -258,13 +81,6 @@ PlatformSerialWrite(HANDLE Handle, const void * Buffer, UINT32 Length, BOOLEAN S return FALSE; } -BOOLEAN -PlatformSerialClose(HANDLE Handle) -{ - (void)Handle; - return TRUE; -} - #else # error "Unsupported platform" #endif From 1abdde7702c2b5a968e34511f07131879c4dc282 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 1 Aug 2026 14:22:52 +0000 Subject: [PATCH 42/50] Fix memory-safety and robustness issues in script engine and PCI ID parser Code audit of the script engine's scanner/token handling and of the PCI ID database parser. Each of the issues below was reproduced against the current code before the fix and re-checked afterwards. script-engine/scanner.c * An unterminated string literal ("abc or L"abc) hung the scanner in an endless loop: sgetc() returns EOF without consuming input, and neither string loop tested for it, so the token grew until allocation failed. Both loops now stop at EOF and report the token as UNKNOWN. script-engine/common.c * AppendByte()/AppendWchar() doubled Token->MaxLen before checking whether the larger buffer was actually allocated. After a failed allocation MaxLen described memory that did not exist and the next append wrote past the end of the old buffer. MaxLen is now committed only on success. * CopyToken() allocated strlen(Value) + 1 bytes but carried over the source token's Len and MaxLen, so the copy's advertised capacity did not match its allocation, and WSTRING payloads were truncated at their first embedded null byte. The copy is now sized from Len/MaxLen and copied by length, with a fallback to the string length for the grammar tokens in parse-table.c, which only initialize Type and Value. * NewToken() set MaxLen to the value length, which is zero for an empty value. The 'Len >= MaxLen - 1' test in the append routines is unsigned, so a zero MaxLen wrapped and disabled buffer growth entirely. * IsUnderscore() tested 'c >= '_'', which also accepted the backtick, the lowercase letters, '{', '|', '}', '~' and DEL. Register scanning uses it, so '@rax|1' was lexed as one malformed register name instead of a register, an operator and a number. The pseudo-register path already compared against '_' directly. * NewTokenList() did not check the allocation of its Head buffer. * NewTemp() kept the last handed-out id in a static, so an exhausted temp list produced a token aliasing a temporary still in use, and it derived MaxTempNumber from an out-of-range index. It also dereferenced the new token without a null check. * FreeTemp() indexed the MAX_TEMP_COUNT-entry map with an unchecked value parsed out of the token text. * RotateLeftStringOnce() wrote to str[-1] when handed an empty string. libhyperdbg/debugger/misc/pci-id.cpp * The database file was read into a malloc(Length) buffer that was never null-terminated, while ReadLine() walks it with strchr(). Looking up an absent vendor scans to the end and reads past the allocation. * The matched Vendor was allocated with malloc() and its Devices list head was only assigned once a device line was parsed, so a vendor with no device entries left it uninitialized and FreeVendor() walked a garbage pointer. * FreeVendor() released the device and subdevice lists but never the Vendor itself, leaking one per lookup for every enumerated PCI device. * The file handle leaked when the buffer allocation failed, ftell() and fread() results were unused, and several error paths leaked the Vendor or the not-yet-linked Device/SubDevice. * strncmp() compared sizeof(VendorId) bytes, which is the size of the pointer rather than the length of a vendor id. * ReadLine() passed an unclamped count to strncpy_s(), which triggers the invalid parameter handler for a line longer than the destination. * GetVendorById() ignored the GetModuleFileName() result and overwrote the tail of the path buffer without checking the room left in it. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01W3C1DuhHtqK64eEkHjKCHM --- .../libhyperdbg/code/debugger/misc/pci-id.cpp | 95 +++++++++++-- hyperdbg/script-engine/code/common.c | 133 +++++++++++++++--- hyperdbg/script-engine/code/scanner.c | 20 +++ 3 files changed, 221 insertions(+), 27 deletions(-) diff --git a/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp b/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp index 12953a2e..88547399 100644 --- a/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp @@ -73,7 +73,18 @@ ReadLine(CHAR * DestBuffer, UINT64 CharLimit, CHAR ** SrcBuffer) } else { - strncpy_s(DestBuffer, CharLimit, *SrcBuffer, (Line - *SrcBuffer)); + // + // The copy length is clamped to the destination, otherwise a line longer than + // CharLimit makes strncpy_s() invoke the invalid parameter handler + // + SIZE_T LineLength = (SIZE_T)(Line - *SrcBuffer); + + if (LineLength > CharLimit - 1) + { + LineLength = (SIZE_T)(CharLimit - 1); + } + + strncpy_s(DestBuffer, (rsize_t)CharLimit, *SrcBuffer, LineLength); *SrcBuffer += (Line - *SrcBuffer + 1); return *SrcBuffer; } @@ -108,17 +119,35 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) } fseek(f, 0, SEEK_END); - Length = ftell(f); - PciIdDatabaseBuffer = (CHAR *)malloc(Length); + LONG FileSize = ftell(f); + + if (FileSize < 0) + { + ShowMessages("Error: Cannot determine the size of file '%s': error %d\n", Filename, errno); + fclose(f); + return NULL; + } + + Length = (SIZE_T)FileSize; + + // + // One extra byte is allocated for the null terminator, as the buffer is later + // walked with strchr() by ReadLine() and would otherwise be read past its end + // + PciIdDatabaseBuffer = (CHAR *)malloc(Length + 1); if (!PciIdDatabaseBuffer) { + fclose(f); return NULL; } fseek(f, 0, SEEK_SET); - fread(PciIdDatabaseBuffer, 1, Length, f); + + SIZE_T BytesRead = fread(PciIdDatabaseBuffer, 1, Length, f); fclose(f); + + PciIdDatabaseBuffer[BytesRead] = '\0'; } PciIdDbBufPtr = PciIdDatabaseBuffer; @@ -142,9 +171,19 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) snprintf(FormatStr, sizeof(FormatStr), "%%4s %%%d[^\n]", PCI_NAME_STR_LENGTH); // FormatStr = "%4s %PCI_NAME_STR_LENGTH[^\n]" if (sscanf(Line, FormatStr, VendorBuf, VendorNameBuf) == 2) { - if (strncmp(VendorBuf, VendorId, sizeof(VendorId)) == 0) + // + // VendorId is a pointer, so sizeof() on it yielded the pointer size + // rather than the length of a PCI vendor id + // + if (strncmp(VendorBuf, VendorId, PCI_ID_AS_STR_LENGTH) == 0) { - MatchedVendor = (Vendor *)malloc(sizeof(Vendor)); + // + // calloc() so that the Devices list head starts out empty: it is + // only assigned once a device line is parsed, and FreeVendor() + // would otherwise walk an uninitialized pointer for a vendor that + // has no devices listed + // + MatchedVendor = (Vendor *)calloc(1, sizeof(Vendor)); if (!MatchedVendor) { return NULL; @@ -153,6 +192,7 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) INT Result = sscanf(VendorBuf, "%hx", &(MatchedVendor->VendorId)); if (Result != 1) { + FreeVendor(MatchedVendor); return NULL; } strncpy_s(MatchedVendor->VendorName, sizeof(MatchedVendor->VendorName), TrimWhitespace(VendorNameBuf, PCI_NAME_STR_LENGTH), _TRUNCATE); @@ -178,6 +218,11 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) int Result = sscanf(DeviceBuf, "%hx", &(NewDevice->DeviceId)); if (Result != 1) { + // + // NewDevice is not linked into the vendor's list yet, so it has to + // be released separately from FreeVendor() + // + free(NewDevice); FreeVendor(MatchedVendor); return NULL; } @@ -216,6 +261,11 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) int Result = sscanf(SubVendorBuf, "%hx", &NewSubDevice->SubVendorId); if (Result != 1) { + // + // NewSubDevice is not linked into the device's list yet, so it has + // to be released separately from FreeVendor() + // + free(NewSubDevice); FreeVendor(MatchedVendor); return NULL; } @@ -223,6 +273,7 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) Result = sscanf(SubDeviceBuf, "%hx", &NewSubDevice->SubDeviceId); if (Result != 1) { + free(NewSubDevice); FreeVendor(MatchedVendor); return NULL; } @@ -278,6 +329,13 @@ FreeVendor(Vendor * VendorToFree) free(CurrentDevice); CurrentDevice = NextDevice; } + + // + // The Vendor itself is allocated by GetVendorByIdStr() and was previously never + // released, leaking one Vendor per call for every PCI device that got enumerated + // + VendorToFree->Devices = NULL; + free(VendorToFree); } /** @@ -309,7 +367,17 @@ GetVendorById(UINT16 VendorId) HMODULE hModule = GetModuleHandle(NULL); snprintf(VendorIdAsStr, sizeof(VendorIdAsStr), "%04X", VendorId); - GetModuleFileName(hModule, ExecutablePath, sizeof(ExecutablePath)); + + DWORD PathLength = GetModuleFileName(hModule, ExecutablePath, sizeof(ExecutablePath)); + + // + // A zero length means the call failed; a length equal to the buffer size means the + // path was truncated and, on older Windows versions, left without a null terminator + // + if (PathLength == 0 || PathLength >= sizeof(ExecutablePath)) + { + return NULL; + } // Extract executable name CHAR * ExecutableName = strrchr(ExecutablePath, '\\'); @@ -323,7 +391,18 @@ GetVendorById(UINT16 VendorId) } // Swap executable name for PCI_ID_DATABASE_PATH - strncpy(ExecutableName, PCI_ID_DATABASE_PATH, sizeof(PCI_ID_DATABASE_PATH)); + // + // The database path can be longer than the executable name it replaces, so the + // room left in ExecutablePath is checked before overwriting the tail + // + SIZE_T RemainingSpace = sizeof(ExecutablePath) - (SIZE_T)(ExecutableName - ExecutablePath); + + if (RemainingSpace < sizeof(PCI_ID_DATABASE_PATH)) + { + return NULL; + } + + memcpy(ExecutableName, PCI_ID_DATABASE_PATH, sizeof(PCI_ID_DATABASE_PATH)); return GetVendorByIdStr(ExecutablePath, ToLower(VendorIdAsStr)); } diff --git a/hyperdbg/script-engine/code/common.c b/hyperdbg/script-engine/code/common.c index d755a222..82e514bf 100644 --- a/hyperdbg/script-engine/code/common.c +++ b/hyperdbg/script-engine/code/common.c @@ -86,10 +86,14 @@ NewToken(SCRIPT_ENGINE_TOKEN_TYPE Type, char * Value) // // Init fields // + // Note that MaxLen is never allowed to be zero here. AppendByte()/AppendWchar() + // test for a full buffer with 'Len >= MaxLen - 1' on an unsigned type, so a zero + // MaxLen would wrap around and let those routines write past the allocation + // unsigned int Len = (unsigned int)strlen(Value); Token->Type = Type; Token->Len = Len; - Token->MaxLen = Len; + Token->MaxLen = Len > TOKEN_VALUE_MAX_LEN ? Len : TOKEN_VALUE_MAX_LEN; Token->Value = (char *)calloc(Token->MaxLen + 1, sizeof(char)); Token->VariableType = (VARIABLE_TYPE *)VARIABLE_TYPE_LONG; Token->VariableMemoryIdx = 0; @@ -254,11 +258,16 @@ AppendByte(PSCRIPT_ENGINE_TOKEN Token, char c) // // Double the length of the allocated space for the string // - Token->MaxLen *= 2; - char * NewValue = (char *)calloc(Token->MaxLen + 1, sizeof(char)); + unsigned int NewMaxLen = Token->MaxLen * 2; + char * NewValue = (char *)calloc(NewMaxLen + 1, sizeof(char)); if (NewValue == NULL) { + // + // MaxLen is only committed once the bigger buffer is in hand, otherwise + // it would describe a buffer that was never allocated and the next call + // would consider the (still small) buffer to have free space in it + // printf("err, could not allocate buffer"); return; } @@ -268,7 +277,8 @@ AppendByte(PSCRIPT_ENGINE_TOKEN Token, char c) // memcpy(NewValue, Token->Value, Token->Len); free(Token->Value); - Token->Value = NewValue; + Token->Value = NewValue; + Token->MaxLen = NewMaxLen; } // @@ -296,11 +306,15 @@ AppendWchar(PSCRIPT_ENGINE_TOKEN Token, wchar_t c) // // Double the length of the allocated space for the wstring // - Token->MaxLen *= 2; - char * NewValue = (char *)calloc(Token->MaxLen + 2, sizeof(char)); + unsigned int NewMaxLen = Token->MaxLen * 2; + char * NewValue = (char *)calloc(NewMaxLen + 2, sizeof(char)); if (NewValue == NULL) { + // + // Keep MaxLen describing the buffer that is actually allocated, see the + // matching comment in AppendByte() + // printf("err, could not allocate buffer"); return; } @@ -310,7 +324,8 @@ AppendWchar(PSCRIPT_ENGINE_TOKEN Token, wchar_t c) // memcpy(NewValue, Token->Value, Token->Len); free(Token->Value); - Token->Value = NewValue; + Token->Value = NewValue; + Token->MaxLen = NewMaxLen; } // @@ -339,11 +354,35 @@ CopyToken(PSCRIPT_ENGINE_TOKEN Token) return NULL; } - TokenCopy->Type = Token->Type; - TokenCopy->MaxLen = Token->MaxLen; - TokenCopy->Len = Token->Len; - TokenCopy->Value = (char *)calloc(strlen(Token->Value) + 1, sizeof(char)); - TokenCopy->VariableType = Token->VariableType; + // + // The number of bytes to copy is the larger of Len and the string length: + // + // - WSTRING tokens hold UTF-16 data whose embedded null bytes make strlen() + // (and strcpy()) stop early, so Len is the meaningful size for them + // - tokens taken from the static grammar tables in parse-table.c only have + // their Type and Value initialized, leaving Len at zero, so the string + // length is the meaningful size for those + // + unsigned int ValueLen = (unsigned int)strlen(Token->Value); + unsigned int CopyLen = Token->Len > ValueLen ? Token->Len : ValueLen; + unsigned int MaxLen = Token->MaxLen > CopyLen ? Token->MaxLen : CopyLen; + + if (MaxLen < TOKEN_VALUE_MAX_LEN) + { + MaxLen = TOKEN_VALUE_MAX_LEN; + } + + TokenCopy->Type = Token->Type; + // + // MaxLen describes the buffer that is actually allocated below. It used to be + // copied verbatim from the source token while the allocation was sized from the + // string length, so the two could disagree and let AppendByte()/AppendWchar() + // write past the end of the copy + // + TokenCopy->MaxLen = MaxLen; + TokenCopy->Len = Token->Len; + TokenCopy->Value = (char *)calloc(MaxLen + 2, sizeof(char)); + TokenCopy->VariableType = Token->VariableType; TokenCopy->VariableMemoryIdx = Token->VariableMemoryIdx; TokenCopy->AddressSpace = Token->AddressSpace; TokenCopy->IsAddress = Token->IsAddress; @@ -357,7 +396,7 @@ CopyToken(PSCRIPT_ENGINE_TOKEN Token) return NULL; } - strcpy(TokenCopy->Value, Token->Value); + memcpy(TokenCopy->Value, Token->Value, CopyLen); return TokenCopy; } @@ -396,6 +435,15 @@ NewTokenList(void) // TokenList->Head = (PSCRIPT_ENGINE_TOKEN *)malloc(TokenList->Size * sizeof(PSCRIPT_ENGINE_TOKEN)); + if (TokenList->Head == NULL) + { + // + // There was an error allocating buffer + // + free(TokenList); + return NULL; + } + return TokenList; } @@ -612,7 +660,7 @@ IsLetter(char c) char IsUnderscore(char c) { - if (c >= '_') + if (c == '_') return 1; else { @@ -661,8 +709,8 @@ IsOctal(char c) PSCRIPT_ENGINE_TOKEN NewTemp(PSCRIPT_ENGINE_ERROR_TYPE Error) { - static unsigned int TempID = 0; - int i; + unsigned int TempID = 0; + int i; for (i = 0; i < MAX_TEMP_COUNT; i++) { if (CurrentUserDefinedFunction->TempMap[i] == 0) @@ -674,15 +722,42 @@ NewTemp(PSCRIPT_ENGINE_ERROR_TYPE Error) } if (i == MAX_TEMP_COUNT) { + // + // No slot is free. The error is reported to the caller, which aborts the + // code generation. A token is still returned so that the (many) call sites + // that dereference the result before testing *Error keep working + // + // TempID is deliberately a plain local rather than a static: when it was + // static it kept the id handed out by the previous call, so an exhausted + // temp list produced a token aliasing a temporary that was still in use + // *Error = SCRIPT_ENGINE_ERROR_TEMP_LIST_FULL; } + PSCRIPT_ENGINE_TOKEN Temp = NewUnknownToken(); - char TempValue[8]; + + if (Temp == NULL) + { + // + // There was an error allocating the token, so release the reserved slot + // + if (i != MAX_TEMP_COUNT) + { + CurrentUserDefinedFunction->TempMap[i] = 0; + } + return NULL; + } + + char TempValue[8]; sprintf(TempValue, "%d", TempID); strcpy(Temp->Value, TempValue); Temp->Type = TEMP; - if (CurrentUserDefinedFunction->MaxTempNumber < (i + 1)) + // + // 'i' is only a valid temporary index when a free slot was actually found, + // otherwise this would size the frame for MAX_TEMP_COUNT + 1 temporaries + // + if (i != MAX_TEMP_COUNT && CurrentUserDefinedFunction->MaxTempNumber < (unsigned long long)(i + 1)) { CurrentUserDefinedFunction->MaxTempNumber = i + 1; } @@ -699,8 +774,18 @@ NewTemp(PSCRIPT_ENGINE_ERROR_TYPE Error) VOID FreeTemp(PSCRIPT_ENGINE_TOKEN Temp) { + if (Temp->Type != TEMP && Temp->Type != DEFERENCE_TEMP) + { + return; + } + + // + // The index is derived from the token's textual value, so it is range-checked + // before indexing the MAX_TEMP_COUNT-entry map + // INT Id = (INT)DecimalToInt(Temp->Value); - if (Temp->Type == TEMP || Temp->Type == DEFERENCE_TEMP) + + if (Id >= 0 && Id < MAX_TEMP_COUNT) { CurrentUserDefinedFunction->TempMap[Id] = 0; } @@ -1544,6 +1629,16 @@ RotateLeftStringOnce(char * str) { INT Length = (INT)strlen(str); CHAR Temp = str[0]; + + // + // An empty string has nothing to rotate, and writing the saved character back + // would land on str[-1] + // + if (Length == 0) + { + return; + } + for (int i = 0; i < (Length - 1); i++) { str[i] = str[i + 1]; diff --git a/hyperdbg/script-engine/code/scanner.c b/hyperdbg/script-engine/code/scanner.c index 4cb1faa2..2f8f1ddc 100644 --- a/hyperdbg/script-engine/code/scanner.c +++ b/hyperdbg/script-engine/code/scanner.c @@ -32,6 +32,16 @@ GetToken(char * c, char * str) { *c = sgetc(str); + // + // An unterminated string literal would otherwise spin here forever, + // since sgetc() keeps returning EOF without consuming any input + // + if ((int)*c == EOF) + { + Token->Type = UNKNOWN; + return Token; + } + if (*c == '\\') { *c = sgetc(str); @@ -650,6 +660,16 @@ GetToken(char * c, char * str) { *c = sgetc(str); + // + // An unterminated wide string literal would otherwise spin here + // forever, since sgetc() keeps returning EOF without consuming input + // + if ((int)*c == EOF) + { + Token->Type = UNKNOWN; + return Token; + } + if (*c == '\\') { *c = sgetc(str); From e8650e43ac563d451c835b1a01c0241929cf3c2c Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Sat, 1 Aug 2026 16:51:58 +0200 Subject: [PATCH 43/50] Linux kernel module build file --- hyperdbg/Kbuild | 231 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 hyperdbg/Kbuild diff --git a/hyperdbg/Kbuild b/hyperdbg/Kbuild new file mode 100644 index 00000000..9ebba79a --- /dev/null +++ b/hyperdbg/Kbuild @@ -0,0 +1,231 @@ +# SPDX-License-Identifier: GPL-3.0 +# +# Kbuild for the HyperDbg Linux kernel module. +# +# This file is read by the kernel build system when it is invoked with +# M= pointing at this directory (the hyperdbg/ repo root): +# +# make -C /lib/modules/$(uname -r)/build M= modules +# +# It is driven by linux/kernel/Makefile. kbuild prefers a file named "Kbuild" +# over "Makefile" in the M= directory, so the CMake-generated ./Makefile (which +# builds the *user-mode* CLI) is left untouched — the two build systems coexist. +# +# --------------------------------------------------------------------------- +# DESIGN +# --------------------------------------------------------------------------- +# Windows builds SEVEN separate kernel binaries (hyperkd.sys + hyperhv/hyperlog/ +# hyperevade/hypertrace/hyperperf/kdserial as KMDF "export driver" DLLs that link +# against each other's import .libs). Linux has no equivalent of that idiom, so +# everything collapses into a SINGLE module: HyperDbg.ko. All the cross-module +# __declspec(dllexport/dllimport) plumbing and the DllInitialize/DllUnload unload +# trick simply disappear (one link unit, all symbols internal). kdserial is +# dropped entirely (Windows-only serial transport). +# +# Because M= is the repo root, every source the module needs already lives under +# it — no copying/symlinking, and full relative object paths mean the several +# same-named files (Common.c, DpcRoutines.c, UnloadDll.c, Broadcast.c ...) never +# collide. +# +# --------------------------------------------------------------------------- +# STATUS +# --------------------------------------------------------------------------- +# Only the objects under "ACTIVE" below actually compile as kernel code today +# (the Platform* memory/intrinsic wrappers, proven by linux/mock/kernel). Every +# other object is listed but COMMENTED OUT: the source still targets the Windows +# WDK (ntoskrnl/WDF/ntifs.h) and will not compile until its dependencies are +# routed through the platform layer. Uncomment each line as its translation unit +# is ported — the module still links and loads in the meantime. +# +# The list mirrors the .c files actually present on disk (the per-module +# CMakeLists.txt files are stale and were NOT trusted). +# =========================================================================== + +obj-m += HyperDbg.o + +# Include paths (union; harmless for the commented-out sources). +# linux/kernel -> the unified kernel pch.h that every `#include "pch.h"` hits +# include -> SDK/, platform/, config/, macros/, components/ roots +ccflags-y += -I$(src)/linux/kernel +ccflags-y += -I$(src)/include +ccflags-y += -I$(src)/dependencies + +# Force default C dialect etc. can be added here later, e.g.: +# ccflags-y += -Wno-declaration-after-statement +# +# When the module translation units come online they all `#include "pch.h"`, +# which resolves to linux/kernel/pch.h via the -I above. If a module header dir +# that itself contains a pch.h (e.g. hyperkd/header) is ever added to ccflags, +# put it AFTER -I$(src)/linux/kernel or the wrong pch wins. + +# =========================================================================== +# ACTIVE — compiles + links today +# =========================================================================== +HyperDbg-objs += linux/kernel/Entry.o +HyperDbg-objs += include/platform/kernel/code/PlatformMem.o +HyperDbg-objs += include/platform/kernel/code/PlatformIntrinsics.o +HyperDbg-objs += include/platform/kernel/code/PlatformIntrinsicsVmx.o + +# =========================================================================== +# PENDING — uncomment as each is ported off the WDK +# =========================================================================== + +# --- platform/kernel (OS abstraction layer) -------------------------------- +HyperDbg-objs += include/platform/kernel/code/PlatformBroadcast.o +HyperDbg-objs += include/platform/kernel/code/PlatformCpu.o +HyperDbg-objs += include/platform/kernel/code/PlatformDbg.o +HyperDbg-objs += include/platform/kernel/code/PlatformDpc.o +HyperDbg-objs += include/platform/kernel/code/PlatformEvent.o +HyperDbg-objs += include/platform/kernel/code/PlatformIo.o +HyperDbg-objs += include/platform/kernel/code/PlatformIrql.o +HyperDbg-objs += include/platform/kernel/code/PlatformProcess.o +HyperDbg-objs += include/platform/kernel/code/PlatformSpinlock.o +HyperDbg-objs += include/platform/kernel/code/PlatformTime.o + +# --- components (shared, header-driven) ------------------------------------ +# HyperDbg-objs += include/components/spinlock/code/Spinlock.o +# HyperDbg-objs += include/components/optimizations/code/AvlTree.o +# HyperDbg-objs += include/components/optimizations/code/BinarySearch.o +# HyperDbg-objs += include/components/optimizations/code/InsertionSort.o +# HyperDbg-objs += include/components/optimizations/code/OptimizationsExamples.o +# HyperDbg-objs += include/components/callback/code/HyperLogCallback.o + +# --- script-eval (script engine kernel eval) ------------------------------- +# HyperDbg-objs += script-eval/code/Functions.o +# HyperDbg-objs += script-eval/code/Keywords.o +# HyperDbg-objs += script-eval/code/PseudoRegisters.o +# HyperDbg-objs += script-eval/code/Regs.o +# HyperDbg-objs += script-eval/code/ScriptEngineEval.o + +# --- hyperlog (message logging/tracing) ------------------------------------ +# HyperDbg-objs += hyperlog/code/Logging.o +# HyperDbg-objs += hyperlog/code/UnloadDll.o + +# --- hyperhv (hypervisor: VMX/EPT) ----------------------------------------- +# HyperDbg-objs += hyperhv/code/broadcast/Broadcast.o +# HyperDbg-objs += hyperhv/code/broadcast/DpcRoutines.o +# HyperDbg-objs += hyperhv/code/common/Bitwise.o +# HyperDbg-objs += hyperhv/code/common/Common.o +# HyperDbg-objs += hyperhv/code/common/UnloadDll.o +# HyperDbg-objs += hyperhv/code/components/registers/DebugRegisters.o +# HyperDbg-objs += hyperhv/code/devices/Apic.o +# HyperDbg-objs += hyperhv/code/devices/Pci.o +# HyperDbg-objs += hyperhv/code/disassembler/Disassembler.o +# HyperDbg-objs += hyperhv/code/disassembler/ZydisKernel.o +# HyperDbg-objs += hyperhv/code/features/CompatibilityChecks.o +# HyperDbg-objs += hyperhv/code/features/DirtyLogging.o +# HyperDbg-objs += hyperhv/code/globals/GlobalVariableManagement.o +# HyperDbg-objs += hyperhv/code/hooks/ept-hook/EptHook.o +# HyperDbg-objs += hyperhv/code/hooks/ept-hook/ExecTrap.o +# HyperDbg-objs += hyperhv/code/hooks/ept-hook/ModeBasedExecHook.o +# HyperDbg-objs += hyperhv/code/hooks/syscall-hook/EferHook.o +# HyperDbg-objs += hyperhv/code/hooks/syscall-hook/SyscallCallback.o +# HyperDbg-objs += hyperhv/code/interface/Callback.o +# HyperDbg-objs += hyperhv/code/interface/Configuration.o +# HyperDbg-objs += hyperhv/code/interface/DirectVmcall.o +# HyperDbg-objs += hyperhv/code/interface/Dispatch.o +# HyperDbg-objs += hyperhv/code/interface/Export.o +# HyperDbg-objs += hyperhv/code/interface/HyperEvade.o +# HyperDbg-objs += hyperhv/code/memory/AddressCheck.o +# HyperDbg-objs += hyperhv/code/memory/Conversion.o +# HyperDbg-objs += hyperhv/code/memory/Layout.o +# HyperDbg-objs += hyperhv/code/memory/MemoryManager.o +# HyperDbg-objs += hyperhv/code/memory/MemoryMapper.o +# HyperDbg-objs += hyperhv/code/memory/Segmentation.o +# HyperDbg-objs += hyperhv/code/memory/SwitchLayout.o +# HyperDbg-objs += hyperhv/code/mmio/MmioShadowing.o +# HyperDbg-objs += hyperhv/code/processor/Idt.o +# HyperDbg-objs += hyperhv/code/processor/Smm.o +# HyperDbg-objs += hyperhv/code/vmm/ept/Ept.o +# HyperDbg-objs += hyperhv/code/vmm/ept/Invept.o +# HyperDbg-objs += hyperhv/code/vmm/ept/Vpid.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/Counters.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/CrossVmcalls.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/CrossVmexits.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/Events.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/Hv.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/IdtEmulation.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/IoHandler.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/ManageRegs.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/MsrHandlers.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/Mtf.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/ProtectedHv.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/Vmcall.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/Vmexit.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/Vmx.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/VmxBroadcast.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/VmxMechanisms.o +# HyperDbg-objs += hyperhv/code/vmm/vmx/VmxRegions.o +# hyperhv assembly (MASM -> GAS/.S translation required; not just a build change) +# HyperDbg-objs += hyperhv/code/assembly/AsmCommon.o +# HyperDbg-objs += hyperhv/code/assembly/AsmEpt.o +# HyperDbg-objs += hyperhv/code/assembly/AsmHooks.o +# HyperDbg-objs += hyperhv/code/assembly/AsmInterruptHandlers.o +# HyperDbg-objs += hyperhv/code/assembly/AsmSegmentRegs.o +# HyperDbg-objs += hyperhv/code/assembly/AsmVmexitHandler.o +# HyperDbg-objs += hyperhv/code/assembly/AsmVmxContextState.o +# HyperDbg-objs += hyperhv/code/assembly/AsmVmxOperation.o + +# --- hyperkd (the driver: device/IOCTL + debugger core) -------------------- +# HyperDbg-objs += hyperkd/code/common/Common.o +# HyperDbg-objs += hyperkd/code/common/Synchronization.o +# HyperDbg-objs += hyperkd/code/debugger/broadcast/DpcRoutines.o +# HyperDbg-objs += hyperkd/code/debugger/broadcast/HaltedBroadcast.o +# HyperDbg-objs += hyperkd/code/debugger/broadcast/HaltedRoutines.o +# HyperDbg-objs += hyperkd/code/debugger/commands/BreakpointCommands.o +# HyperDbg-objs += hyperkd/code/debugger/commands/Callstack.o +# HyperDbg-objs += hyperkd/code/debugger/commands/DebuggerCommands.o +# HyperDbg-objs += hyperkd/code/debugger/commands/ExtensionCommands.o +# HyperDbg-objs += hyperkd/code/debugger/communication/SerialConnection.o +# HyperDbg-objs += hyperkd/code/debugger/core/Debugger.o +# HyperDbg-objs += hyperkd/code/debugger/core/DebuggerVmcalls.o +# HyperDbg-objs += hyperkd/code/debugger/core/HaltedCore.o +# HyperDbg-objs += hyperkd/code/debugger/events/ApplyEvents.o +# HyperDbg-objs += hyperkd/code/debugger/events/DebuggerEvents.o +# HyperDbg-objs += hyperkd/code/debugger/events/Termination.o +# HyperDbg-objs += hyperkd/code/debugger/events/ValidateEvents.o +# HyperDbg-objs += hyperkd/code/debugger/kernel-level/Kd.o +# HyperDbg-objs += hyperkd/code/debugger/memory/Allocations.o +# HyperDbg-objs += hyperkd/code/debugger/memory/PoolManager.o +# HyperDbg-objs += hyperkd/code/debugger/meta-events/MetaDispatch.o +# HyperDbg-objs += hyperkd/code/debugger/meta-events/Tracing.o +# HyperDbg-objs += hyperkd/code/debugger/objects/Process.o +# HyperDbg-objs += hyperkd/code/debugger/objects/Thread.o +# HyperDbg-objs += hyperkd/code/debugger/script-engine/ScriptEngine.o +# HyperDbg-objs += hyperkd/code/debugger/tests/KernelTests.o +# HyperDbg-objs += hyperkd/code/debugger/user-level/Attaching.o +# HyperDbg-objs += hyperkd/code/debugger/user-level/ThreadHolder.o +# HyperDbg-objs += hyperkd/code/debugger/user-level/Ud.o +# HyperDbg-objs += hyperkd/code/debugger/user-level/UserAccess.o +# HyperDbg-objs += hyperkd/code/driver/Driver.o +# HyperDbg-objs += hyperkd/code/driver/Ioctl.o +# HyperDbg-objs += hyperkd/code/driver/Loader.o +# hyperkd assembly (MASM -> GAS/.S translation required) +# HyperDbg-objs += hyperkd/code/assembly/AsmDebugger.o + +# --- hyperevade (transparency / anti-detection) ---------------------------- +# HyperDbg-objs += hyperevade/code/SyscallFootprints.o +# HyperDbg-objs += hyperevade/code/Transparency.o +# HyperDbg-objs += hyperevade/code/UnloadDll.o +# HyperDbg-objs += hyperevade/code/VmxFootprints.o + +# --- hyperperf (PMU) ------------------------------------------------------- +# HyperDbg-objs += hyperperf/code/api/PerfApi.o +# HyperDbg-objs += hyperperf/code/broadcast/Broadcast.o +# HyperDbg-objs += hyperperf/code/broadcast/DpcRoutines.o +# HyperDbg-objs += hyperperf/code/common/UnloadDll.o + +# --- hypertrace (LBR / Intel PT) ------------------------------------------- +# HyperDbg-objs += hypertrace/code/api/LbrApi.o +# HyperDbg-objs += hypertrace/code/api/PtApi.o +# HyperDbg-objs += hypertrace/code/api/TraceApi.o +# HyperDbg-objs += hypertrace/code/broadcast/Broadcast.o +# HyperDbg-objs += hypertrace/code/broadcast/DpcRoutines.o +# HyperDbg-objs += hypertrace/code/common/UnloadDll.o +# HyperDbg-objs += hypertrace/code/lbr/Lbr.o +# HyperDbg-objs += hypertrace/code/pt/Pt.o + +# --- zydis (kernel disassembler, needed by hyperhv/disassembler) ----------- +# Built with ZYAN_NO_LIBC;ZYDIS_NO_LIBC;ZYDIS_STATIC_BUILD;ZYCORE_STATIC_BUILD. +# Enumerate dependencies/zydis/src/*.c + dependencies/zydis/.../zycore/*.c here, +# or build them into a built-in.a. Deferred until hyperhv compiles. From be2c96d192f42cc52ecd4eb3d8aa159a4f3723cf Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Sat, 1 Aug 2026 16:52:29 +0200 Subject: [PATCH 44/50] Environment header file guards For the kernel module build some libc header files are not present so we guard them out for the kernel build --- .../include/platform/general/header/Environment.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/hyperdbg/include/platform/general/header/Environment.h b/hyperdbg/include/platform/general/header/Environment.h index 8c2d276a..a09a2992 100644 --- a/hyperdbg/include/platform/general/header/Environment.h +++ b/hyperdbg/include/platform/general/header/Environment.h @@ -44,15 +44,22 @@ # define _Out_writes_bytes_(x) # define _Inout_updates_bytes_all_(x) +// The following libc headers exist only in user space; a Linux KERNEL build +// (HYPERDBG_KERNEL_MODE) has no libc, so they are guarded out there. User-mode +// Linux is unaffected — HYPERDBG_KERNEL_MODE is never defined in that path. +# ifndef HYPERDBG_KERNEL_MODE + // wchar_t is a C++ built-in but needs this header in C -# include +# include // POSIX sleep primitives (usleep) backing the Win32 Sleep() shim below -# include +# include // DECIMAL_DIG and the FLT/DBL limits (ISO C99 ); MSVC exposes these // transitively through its CRT/pch, glibc needs the explicit include -# include +# include + +# endif // !HYPERDBG_KERNEL_MODE // Windows string/char types typedef char TCHAR; From 953af9388a163b9e71f48bc68966f8e670fcef27 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Sat, 1 Aug 2026 16:54:08 +0200 Subject: [PATCH 45/50] PlatformCPU Linux Implementation Filled in the stubs for the windows functions: KeQueryActiveProcessorCount(0) and KeGetCurrentProcessorNumberEx(NULL). KeQueryActiveProcessorCount(0) maps one to one to num_online_cpus() KeGetCurrentProcessorNumberEx(NULL) maps to raw_smp_processor_id(), however this can also be smp_processor_id(), we have to decide based on preemption, the latter checks for preemption and throws a warning if it is executed in preemptible code. (I dont know the kernel code well enough so this may need some discussion) --- hyperdbg/include/platform/kernel/code/PlatformCpu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hyperdbg/include/platform/kernel/code/PlatformCpu.c b/hyperdbg/include/platform/kernel/code/PlatformCpu.c index eaece365..9d69e651 100644 --- a/hyperdbg/include/platform/kernel/code/PlatformCpu.c +++ b/hyperdbg/include/platform/kernel/code/PlatformCpu.c @@ -29,8 +29,8 @@ PlatformCpuGetActiveProcessorCount(VOID) #elif defined(__linux__) -# error "Not yet implemented" - + return num_online_cpus(); + #else # error "Unsupported platform" @@ -52,7 +52,7 @@ PlatformCpuGetCurrentProcessorNumber(VOID) #elif defined(__linux__) -# error "Not yet implemented" + return raw_smp_processor_id(); #else From 652721be62f759535d59fec5e603923076bc62b0 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Sat, 1 Aug 2026 17:06:58 +0200 Subject: [PATCH 46/50] Added Printk in rhw platformDBG file For debug printing added printk for linux kernel logging. --- hyperdbg/include/platform/kernel/code/PlatformDbg.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/hyperdbg/include/platform/kernel/code/PlatformDbg.c b/hyperdbg/include/platform/kernel/code/PlatformDbg.c index f1f866ec..17543cbe 100644 --- a/hyperdbg/include/platform/kernel/code/PlatformDbg.c +++ b/hyperdbg/include/platform/kernel/code/PlatformDbg.c @@ -33,9 +33,10 @@ PlatformDbgPrint(const CHAR * Format, ...) va_end(ArgList); #elif defined(__linux__) - -# error "Not yet implemented" - + va_list ArgList; + va_start(ArgList, Format); + vprintk(Format, ArgList); + va_end(ArgList); #else # error "Unsupported platform" From 17fb85f3668adddf531ad44944b9f23fea60cf5c Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Sat, 1 Aug 2026 17:08:20 +0200 Subject: [PATCH 47/50] added header for PLatformCPU --- hyperdbg/include/platform/kernel/header/PlatformCpu.h | 1 + 1 file changed, 1 insertion(+) diff --git a/hyperdbg/include/platform/kernel/header/PlatformCpu.h b/hyperdbg/include/platform/kernel/header/PlatformCpu.h index fb3413f9..79936baf 100644 --- a/hyperdbg/include/platform/kernel/header/PlatformCpu.h +++ b/hyperdbg/include/platform/kernel/header/PlatformCpu.h @@ -13,6 +13,7 @@ #if defined(__linux__) # include "../../../../include/SDK/HyperDbgSdk.h" +# include #endif // defined(__linux__) ////////////////////////////////////////////////// From 622ea9df9730e3fe0a8ff22f035772631308ac36 Mon Sep 17 00:00:00 2001 From: Max Raulea Date: Sat, 1 Aug 2026 17:09:55 +0200 Subject: [PATCH 48/50] Porting Documentation update --- hyperdbg/linux/PORTING_STATUS.md | 88 +++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/hyperdbg/linux/PORTING_STATUS.md b/hyperdbg/linux/PORTING_STATUS.md index 70ddd06f..870cbfd0 100644 --- a/hyperdbg/linux/PORTING_STATUS.md +++ b/hyperdbg/linux/PORTING_STATUS.md @@ -9,7 +9,8 @@ the *state* of the work; the README is the *method*. > Status in one line: the userspace library (`libhyperdbg`) compiles file-by-file > on Linux. Many Windows-only paths are **stubbed to compile+link**, not yet -> implemented. See the TODO ledger below. +> implemented. See the TODO ledger below. Work has now also started on the +> **kernel module** (`HyperDbg.ko`) — see its section near the end. --- @@ -814,7 +815,90 @@ but out of scope for the port. ### Build system - [ ] Add `.gitignore` rules for the in-source CMake build output (`CMakeCache.txt`, `CMakeFiles/`, generated `Makefile`, `cmake_install.cmake`, - `*.o`, `*.so`) — or switch to an out-of-source `build/` directory. + `*.o`, `*.so`) — or switch to an out-of-source `build/` directory. Now also + applies to the kbuild output (`*.ko`, `*.mod`, `*.mod.c`, `.*.cmd`, + `modules.order`, `Module.symvers`), which lands in-tree at the repo root. + +--- + +## Kernel module (`HyperDbg.ko`) — IN PROGRESS + +Phase two. Windows' seven kernel binaries (hyperkd.sys + hyperhv/hyperlog/ +hyperevade/hypertrace/hyperperf/kdserial, KMDF export drivers) collapse into one +Linux module. Design notes: the root [`Kbuild`](../Kbuild) header. + +```bash +cd linux/kernel # NOT the CMake root Makefile — that builds the user-mode CLI +make # -> HyperDbg.ko at the repo root +make clean / load / unload +make KDIR=/path/to/linux-headers +``` + +kbuild prefers the root `Kbuild` under `M=`, so both build systems coexist. +`Kbuild` lists every future object with the un-ported ones commented out. Current +front: the ten `include/platform/kernel/` TUs, all uncommented — so the build +stops at the first `#error "Not yet implemented"`. + +| TU | Status | +|----|--------| +| `PlatformMem.c` | ✅ builds (pre-existing) | +| `PlatformIntrinsics.c` | ✅ builds (pre-existing) | +| `PlatformIntrinsicsVmx.c` | ✅ builds (pre-existing) | +| `PlatformBroadcast.c` | ✅ ported 2026-08-01 | +| `PlatformCpu.c` | ✅ ported 2026-08-01 — see below | +| `PlatformDbg.c` | ✅ ported 2026-08-01 — see below | +| `PlatformDpc.c` | ❌ 2 stubs — **next to fail**; also 2 *type* errors (see below) | +| `PlatformIrql.c` | ❌ 2 stubs | +| `PlatformEvent.c` | ❌ 3 stubs | +| `PlatformIo.c` | ❌ 3 stubs | +| `PlatformSpinlock.c` | ❌ 3 stubs | +| `PlatformTime.c` | ❌ 3 stubs | +| `PlatformProcess.c` | ❌ 5 stubs | + +### `PlatformCpu.c` — DONE (2026-08-01) + +| Windows | Linux | +|---------|-------| +| `KeQueryActiveProcessorCount(0)` | `num_online_cpus()` | +| `KeGetCurrentProcessorNumberEx(NULL)` | `raw_smp_processor_id()` | + +Both Windows calls return system-wide (all-group) values, matching Linux's flat +CPU numbering — no group translation. + +`raw_` chosen deliberately: plain `smp_processor_id()` asserts preemption is +disabled (`CONFIG_DEBUG_PREEMPT` splat), a precondition the Windows API doesn't +have and no caller establishes. Both current callers can run preemptible +(`Logging.c:1001` per-core VMX buffer index, but only on the vmx-root path; +`PseudoRegisters.c:49` `$core`). The 72 raw `KeGetCurrentProcessorNumberEx` sites +in 21 files still pending (`__CPU_INDEX__`, `g_GuestState[]`/`g_DbgState[]`) are +all vmx-root/raised-IRQL — identical either way. + +No new include needed (resolves via `linux/kernel/pch.h`; add `` if +that ever breaks). + +### `PlatformDbg.c` — DONE (2026-08-01) + +| Windows | Linux | +|---------|-------| +| `vDbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, Format, ArgList)` | `vprintk(Format, ArgList)` | + +`va_start`/`va_end` scaffolding unchanged; no new include needed. + +Nuances, deliberately not "fixed" (would be logic changes; callers unaffected): +- printk reads its level from a `KERN_*` prefix on the format string and no caller + has one → messages land at the default loglevel, not "info". +- printk isn't MSVC's CRT (no `%I64d`/`%ws`). All six callers use only `%s`/`%x`. +- `Logging.c:833` chunks at `DbgPrintLimitation` (512, `Constants.h:223`) = + DbgPrint's limit, not printk's `LOG_LINE_MAX`. Works, just mis-sized. + +- [ ] Revisit loglevel + `DbgPrintLimitation` sizing once kernel logging is exercised. + +### Next up: `PlatformDpc.c` + +Not a body swap — the signatures fail too (`PRKDPC`, `PKDEFERRED_ROUTINE` unknown +on Linux). Needs Linux types for the KDPC object + deferred-routine fn-ptr first. +Backing it with `smp_call_function_single_async` / `irq_work` / `tasklet` is a +design decision, not a mechanical swap. --- From a24c8c0a91485132ac9e28bfb588a689c8359359 Mon Sep 17 00:00:00 2001 From: sina Date: Sat, 1 Aug 2026 20:49:02 +0200 Subject: [PATCH 49/50] cleanup for resync serial codes and update CHANGELOG.md --- CHANGELOG.md | 24 +- .../debugger/communication/SerialConnection.c | 11 +- hyperdbg/hyperkd/header/globals/Global.h | 7 + .../commands/extension-commands/epthook.cpp | 1 + .../code/debugger/kernel-level/kd.cpp | 262 +++++++++--------- .../kernel-level/kernel-listening.cpp | 72 +---- .../header/debugger/kernel-level/kd.h | 19 ++ hyperdbg/libhyperdbg/header/globals/globals.h | 14 + 8 files changed, 200 insertions(+), 210 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0a25b995..f7b40e9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,25 +4,43 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.23.0.0] - 2026-XX-XX +## [0.23.0.0] - 2026-08-03 New release of the HyperDbg Debugger. ### Added -- Added the 'ucpuid' command ([link](https://docs.hyperdbg.org/commands/debugging-commands/ucpuid))([link](https://github.com/HyperDbg/HyperDbg/pull/658)) +- Added the 'ucpuid' command, thanks to [@nikzad66](https://github.com/nikzad66) ([link](https://docs.hyperdbg.org/commands/debugging-commands/ucpuid))([link](https://github.com/HyperDbg/HyperDbg/pull/658)) - Added floating-point support in the script engine ([link](https://docs.hyperdbg.org/commands/scripting-language/data-types-and-operators))([link](https://github.com/HyperDbg/HyperDbg/pull/655)) - Added new platform functions for missed CPUID wrapper ([link](https://github.com/HyperDbg/HyperDbg/commit/dd38a30d224d05bb9cfab28f6024db8cc51acffd)) - Added guards and compilation flags in CMake ([link](https://github.com/HyperDbg/HyperDbg/commit/860f736bd21a274930420a12ed7eac970732717a)) - Added SDK function for the 'ucpuid' command ([link](https://docs.hyperdbg.org/commands/debugging-commands/ucpuid))([link](https://github.com/HyperDbg/HyperDbg/pull/659)) - Added a new socket platform API and named-pipe Linux file ([link](https://github.com/HyperDbg/HyperDbg/commit/6683c2dc3db640e8b75786570759daf4e630c7f0)) +- Added unix implementation of 'asm-vmx-checks.asm', and made naming convention for both files ([link](https://github.com/HyperDbg/HyperDbg/commit/7141e23aadd6cc92d7edf1259fc0a6438a96737a)) +- Added the hwdbg files to the CMake files and replaced the platform files, 'RTLZeroMemory' ([link](https://github.com/HyperDbg/HyperDbg/commit/f5f822a46f5aa3041cda6f7a1c29aaf18f705f15)) +- Added ucpuid to CMakeList.txt and made it portable ([link](https://github.com/HyperDbg/HyperDbg/commit/8583d99d14eed83e982df08106d8f50d04c36e6a)) +- Script engine Linux build completed, and added undefined references with empty stubs for the Linux port and updated the CMake file accordingly ([link](https://github.com/HyperDbg/HyperDbg/commit/5175381c7304a268660377f3ed1c2e8860f96c55)) +- Added missing files to the CMake build file and swept them for the Platform functions and guarded Windows-only code ([link](https://github.com/HyperDbg/HyperDbg/commit/4bf987a5968a65eebdbb69f514e50ee08d74aa34)) +- Added stub for vendorID on the 'pci-id.cpp' file ([link](https://github.com/HyperDbg/HyperDbg/commit/600eaa47ba7bc5731c677030dea7d0562e95b97b)) +- Added Linux kernel module build file (Kbuild) ([link](https://github.com/HyperDbg/HyperDbg/commit/e8650e43ac563d451c835b1a01c0241929cf3c2c)) +- Added PlatformCPU Linux implementation ([link](https://github.com/HyperDbg/HyperDbg/commit/953af9388a163b9e71f48bc68966f8e670fcef27)) +- Added 'vprintk' in the kernel module files for Linux ([link](https://github.com/HyperDbg/HyperDbg/commit/652721be62f759535d59fec5e603923076bc62b0)) ### Changed - Updated variable types and added float types in the script engine ([link](https://github.com/HyperDbg/HyperDbg/commit/d44c726dff91402a1f093455b69449b65657bce0)) - Porting status update and terminate thread platform call ([link](https://github.com/HyperDbg/HyperDbg/commit/a29e210ab067d4a96a0d130f61aeed5b53387565)) - Sweep and extra guards and some new platform functions ([link](https://github.com/HyperDbg/HyperDbg/commit/926070135d44b7459409e1cce1d4595426062daa)) -- Fix UInt32 conversion for negative (signed) values ([link](https://github.com/HyperDbg/HyperDbg/commit/d4132ee7db092140b526d4cd31e445114aa470ec)) +- Fix 'UInt32' conversion for negative (signed) values ([link](https://github.com/HyperDbg/HyperDbg/commit/d4132ee7db092140b526d4cd31e445114aa470ec)) - Fix the 'snprintf_s' wrapper function for cross-platform compilation ([link](https://github.com/HyperDbg/HyperDbg/commit/aa96eaa617c0c1a432682b83a5021ac4963182d1)) - Changed 'CpuIdEx' variants to a cross-platform 'CpuCpuIdEx' ([link](https://github.com/HyperDbg/HyperDbg/commit/c13f45f8b05743c5d87d3a50687507defe54af2b)) - Updated number of CPUs to a cross-platform function ([link](https://github.com/HyperDbg/HyperDbg/commit/5fdd2e7738e6f68ed5ff516467fbc5bfdaec9759)) +- Empty Linux stub for the keystone library ([link](https://github.com/HyperDbg/HyperDbg/commit/f938929a8cd8391a00c52f39dd9a129a7abf9b33)) +- Build file edit for first build on 'hyperdbg-cli' ([link](https://github.com/HyperDbg/HyperDbg/commit/2024cb9374e29fbd511ba931ab8b2bf7d483457c)) +- Fixed bug that made script-engine segfault, so we can type commands now ([link](https://github.com/HyperDbg/HyperDbg/commit/bdc7a150cbefbc3d85a05d2a995bad4db34fc321)) +- Resync serial stream on framing overflow instead of flooding the debuggee, thanks to [@munraimix](https://github.com/munraimix) ([link](https://github.com/HyperDbg/HyperDbg/pull/663))([link](https://github.com/HyperDbg/HyperDbg/issues/661)) +- Resync libhyperdbg's serial receivers on framing overflow too, thanks to [@munraimix](https://github.com/munraimix) ([link](https://github.com/HyperDbg/HyperDbg/pull/663))([link](https://github.com/HyperDbg/HyperDbg/issues/661)) +- Updated Linux port documentation ([link](https://github.com/HyperDbg/HyperDbg/commit/622ea9df9730e3fe0a8ff22f035772631308ac36)) + +### Removed +- Removed unused serial codes ([link](https://github.com/HyperDbg/HyperDbg/commit/b77df6a62bacf4bff29198b3d1acd7961a3e7f38)) ## [0.22.0.0] - 2026-07-20 New release of the HyperDbg Debugger. diff --git a/hyperdbg/hyperkd/code/debugger/communication/SerialConnection.c b/hyperdbg/hyperkd/code/debugger/communication/SerialConnection.c index 086fc249..bd8035a1 100644 --- a/hyperdbg/hyperkd/code/debugger/communication/SerialConnection.c +++ b/hyperdbg/hyperkd/code/debugger/communication/SerialConnection.c @@ -87,12 +87,6 @@ SerialConnectionCheckForTheEndOfTheBuffer(PUINT32 CurrentLoopIndex, BYTE * Buffe return FALSE; } -// -// Set when the serial stream desyncs so the warning is logged once per episode -// (cleared on the next good frame) instead of on every overflow -// -static BOOLEAN g_SerialConnectionDesyncReported = FALSE; - /** * @brief Discard bytes until the next end of buffer marker to re-align the * stream to a frame boundary after a desync @@ -438,6 +432,11 @@ SerialConnectionPrepare(PDEBUGGER_PREPARE_DEBUGGEE DebuggeeRequest) return STATUS_UNSUCCESSFUL; } + // + // Not in the desync state (reset desync flag) + // + g_SerialConnectionDesyncReported = FALSE; + // // Prepare the structures needed for connecting remote port // diff --git a/hyperdbg/hyperkd/header/globals/Global.h b/hyperdbg/hyperkd/header/globals/Global.h index 02195709..f332160a 100644 --- a/hyperdbg/hyperkd/header/globals/Global.h +++ b/hyperdbg/hyperkd/header/globals/Global.h @@ -213,6 +213,13 @@ BOOLEAN g_IsWaitingForUserModeProcessEntryToBeCalled; */ BOOLEAN g_InterceptBreakpointsAndEventsForCommandsInRemoteComputer; +/** + * Set when the serial stream desyncs so the warning is logged once per episode + * (cleared on the next good frame) instead of on every overflow + * + */ +BOOLEAN g_SerialConnectionDesyncReported; + /** * @brief Global test flag (for testing purposes) * diff --git a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/epthook.cpp b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/epthook.cpp index 6eb15d88..009fc5f4 100644 --- a/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/epthook.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/commands/extension-commands/epthook.cpp @@ -32,6 +32,7 @@ CommandEptHookHelp() ShowMessages("\t\te.g : !epthook fffff801deadb000\n"); ShowMessages("\t\te.g : !epthook fffff801deadb000 pid 400\n"); ShowMessages("\t\te.g : !epthook fffff801deadb000 core 2 pid 400\n"); + ShowMessages("\t\te.g : !epthook nt!ExAllocatePoolWithTag script { printf(\"hook triggered at: %%llx\\n\", $context); }\n"); ShowMessages("\t\te.g : !epthook fffff801deadb000 script { printf(\"hook triggered at: %%llx\\n\", $context); }\n"); ShowMessages("\t\te.g : !epthook fffff801deadb000 asm code { nop; nop; nop }\n"); } diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp index 5e06bdac..fd7eba48 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kd.cpp @@ -31,6 +31,7 @@ extern DEBUGGER_EVENT_AND_ACTION_RESULT g_DebuggeeResultOfAddingActionsToEvent; extern BOOLEAN g_IsSerialConnectedToRemoteDebuggee; extern BOOLEAN g_IsSerialConnectedToRemoteDebugger; +extern BOOLEAN g_KdReceiveFromDebuggerDesyncReported; extern BOOLEAN g_IsDebuggerConntectedToNamedPipe; extern BOOLEAN g_IsDebuggeeRunning; extern BOOLEAN g_IsKdModuleLoaded; @@ -1657,20 +1658,84 @@ KdReadByteFromDebuggeeSerial(CHAR * ReadData, DWORD * NoBytesRead) #endif // _WIN32 } +/** + * @brief Read a single byte from the debugger over the serial link + * + * @details Debuggee-side counterpart of KdReadByteFromDebuggeeSerial(); reads + * through the read-from-debugger overlapped structure so the framing loop and + * the resync path share one implementation. + * + * @param ReadData receives the byte that was read + * @param NoBytesRead receives the number of bytes actually read + * + * @return BOOLEAN TRUE on a successful read, FALSE on a hard read error + */ +static BOOLEAN +KdReadByteFromDebuggerSerial(CHAR * ReadData, DWORD * NoBytesRead) +{ +#ifdef _WIN32 + // + // Try to read one byte in overlapped I/O (in debuggee) + // + if (!ReadFile(g_SerialRemoteComPortHandle, ReadData, sizeof(CHAR), NULL, &g_OverlappedIoStructureForReadDebuggee)) + { + DWORD e = GetLastError(); + + if (e != ERROR_IO_PENDING) + { + return FALSE; + } + } + + // + // Wait till one packet becomes available + // + WaitForSingleObject(g_OverlappedIoStructureForReadDebuggee.hEvent, + INFINITE); + + // + // Get the result + // + GetOverlappedResult(g_SerialRemoteComPortHandle, + &g_OverlappedIoStructureForReadDebuggee, + NoBytesRead, + FALSE); + + // + // Reset event for next try + // + ResetEvent(g_OverlappedIoStructureForReadDebuggee.hEvent); + + return TRUE; +#else + // + // Linux: read one byte through the cross-platform serial transport + // (the 5s read timeout is applied inside the platform layer) + // + return PlatformSerialReadByte(g_SerialRemoteComPortHandle, + ReadData, + NoBytesRead, + PLATFORM_SERIAL_IO_DEBUGGEE); +#endif // _WIN32 +} + /** * @brief Discard bytes until the next end-of-buffer marker, re-aligning the * debugger-side serial receiver to a frame boundary after a desync * - * @details Mirrors SerialConnectionResyncToNextFrame() on the debuggee side. + * @details Mirrors SerialConnectionResyncToNextFrame() on the debuggee side * Bounded by SERIAL_RESYNC_MAX_BYTES so a dead or garbage link cannot spin - * forever. + * forever + * + * @param IsDebuggee * * @return BOOLEAN TRUE if a marker was found (stream re-aligned), FALSE if too * many bytes arrived without one (treat the link as dead) */ -static BOOLEAN -KdResyncDebuggeeStreamToNextFrame() +BOOLEAN +KdResyncStreamToNextFrame(DEBUGGER_PACKET_RESYNC_ENUM ReSyncType) { + BOOL Status; BYTE Window[SERIAL_END_OF_BUFFER_CHARS_COUNT] = {NULL_ZERO, NULL_ZERO, NULL_ZERO, NULL_ZERO}; UINT32 Discarded = 0; @@ -1679,14 +1744,72 @@ KdResyncDebuggeeStreamToNextFrame() CHAR ReadData = NULL_ZERO; DWORD NoBytesRead = 0; - if (!KdReadByteFromDebuggeeSerial(&ReadData, &NoBytesRead)) + if (ReSyncType == DEBUGGER_PACKET_RESYNC_DEBUGGEE) { + // + // It is for the debuggee + // + if (!KdReadByteFromDebuggeeSerial(&ReadData, &NoBytesRead)) + { + return FALSE; + } + } + else if (ReSyncType == DEBUGGER_PACKET_RESYNC_DEBUGGER) + { + // + // It is for the debugger + // + if (!KdReadByteFromDebuggerSerial(&ReadData, &NoBytesRead)) + { + return FALSE; + } + } + else if (ReSyncType == DEBUGGER_PACKET_RESYNC_LISTENING) + { +#ifdef _WIN32 + Status = ReadFile(g_SerialRemoteComPortHandle, &ReadData, sizeof(ReadData), &NoBytesRead, NULL); +#else + // + // Linux: read one byte through the cross-platform serial transport + // + Status = PlatformSerialReadByte(g_SerialRemoteComPortHandle, + &ReadData, + &NoBytesRead, + PLATFORM_SERIAL_IO_DEBUGGEE); +#endif // _WIN32 + + if (!Status) + { + return FALSE; + } + } + else + { + ShowMessages("err, invalid resync type\n"); return FALSE; } if (NoBytesRead == 0) { - continue; + if (ReSyncType == DEBUGGER_PACKET_RESYNC_DEBUGGEE || ReSyncType == DEBUGGER_PACKET_RESYNC_LISTENING) + { + // + // For the debuggee and listening + // + continue; + } + else if (DEBUGGER_PACKET_RESYNC_DEBUGGER) + { + // + // For the debugger + // + + // + // The read timed out with no data: the link is idle, so stop + // discarding and let the caller fall back to its idle handling. + // + return FALSE; + } } Window[0] = Window[1]; @@ -1754,7 +1877,7 @@ KdReceivePacketFromDebuggee(CHAR * BufferToSave, g_KdSerialReceiverDesyncReported = TRUE; } - if (!KdResyncDebuggeeStreamToNextFrame()) + if (!KdResyncStreamToNextFrame(DEBUGGER_PACKET_RESYNC_DEBUGGEE)) { // // Too many bytes without a marker: treat the link as dead. @@ -1790,129 +1913,6 @@ KdReceivePacketFromDebuggee(CHAR * BufferToSave, return TRUE; } -// -// Set when the debuggee-side serial receiver (packets coming from the debugger) -// desyncs, so the warning is shown once per episode (cleared on the next good -// frame) instead of on every overflow while the stream stays desynced. -// -static BOOLEAN g_KdReceiveFromDebuggerDesyncReported = FALSE; - -/** - * @brief Read a single byte from the debugger over the serial link - * - * @details Debuggee-side counterpart of KdReadByteFromDebuggeeSerial(); reads - * through the read-from-debugger overlapped structure so the framing loop and - * the resync path share one implementation. - * - * @param ReadData receives the byte that was read - * @param NoBytesRead receives the number of bytes actually read - * - * @return BOOLEAN TRUE on a successful read, FALSE on a hard read error - */ -static BOOLEAN -KdReadByteFromDebuggerSerial(CHAR * ReadData, DWORD * NoBytesRead) -{ -#ifdef _WIN32 - // - // Try to read one byte in overlapped I/O (in debuggee) - // - if (!ReadFile(g_SerialRemoteComPortHandle, ReadData, sizeof(CHAR), NULL, &g_OverlappedIoStructureForReadDebuggee)) - { - DWORD e = GetLastError(); - - if (e != ERROR_IO_PENDING) - { - return FALSE; - } - } - - // - // Wait till one packet becomes available - // - WaitForSingleObject(g_OverlappedIoStructureForReadDebuggee.hEvent, - INFINITE); - - // - // Get the result - // - GetOverlappedResult(g_SerialRemoteComPortHandle, - &g_OverlappedIoStructureForReadDebuggee, - NoBytesRead, - FALSE); - - // - // Reset event for next try - // - ResetEvent(g_OverlappedIoStructureForReadDebuggee.hEvent); - - return TRUE; -#else - // - // Linux: read one byte through the cross-platform serial transport - // (the 5s read timeout is applied inside the platform layer) - // - return PlatformSerialReadByte(g_SerialRemoteComPortHandle, - ReadData, - NoBytesRead, - PLATFORM_SERIAL_IO_DEBUGGEE); -#endif // _WIN32 -} - -/** - * @brief Discard bytes until the next end-of-buffer marker, re-aligning the - * debuggee-side serial receiver to a frame boundary after a desync - * - * @details Mirrors KdResyncDebuggeeStreamToNextFrame(). This receiver runs with - * a 5s comm read timeout, so a zero-byte read means the link went idle; treat - * that as a dead link and bail rather than spin. Bounded by - * SERIAL_RESYNC_MAX_BYTES so a garbage link cannot spin forever either. - * - * @return BOOLEAN TRUE if a marker was found (stream re-aligned), FALSE if the - * link went idle or too many bytes arrived without a marker - */ -static BOOLEAN -KdResyncDebuggerStreamToNextFrame() -{ - BYTE Window[SERIAL_END_OF_BUFFER_CHARS_COUNT] = {NULL_ZERO, NULL_ZERO, NULL_ZERO, NULL_ZERO}; - UINT32 Discarded = 0; - - while (Discarded < SERIAL_RESYNC_MAX_BYTES) - { - CHAR ReadData = NULL_ZERO; - DWORD NoBytesRead = 0; - - if (!KdReadByteFromDebuggerSerial(&ReadData, &NoBytesRead)) - { - return FALSE; - } - - if (NoBytesRead == 0) - { - // - // The read timed out with no data: the link is idle, so stop - // discarding and let the caller fall back to its idle handling. - // - return FALSE; - } - - Window[0] = Window[1]; - Window[1] = Window[2]; - Window[2] = Window[3]; - Window[3] = (BYTE)ReadData; - Discarded++; - - if (Window[0] == SERIAL_END_OF_BUFFER_CHAR_1 && - Window[1] == SERIAL_END_OF_BUFFER_CHAR_2 && - Window[2] == SERIAL_END_OF_BUFFER_CHAR_3 && - Window[3] == SERIAL_END_OF_BUFFER_CHAR_4) - { - return TRUE; - } - } - - return FALSE; -} - /** * @brief Receive packet from the debugger * @@ -1979,7 +1979,7 @@ KdReceivePacketFromDebugger(CHAR * BufferToSave, g_KdReceiveFromDebuggerDesyncReported = TRUE; } - if (!KdResyncDebuggerStreamToNextFrame()) + if (!KdResyncStreamToNextFrame(DEBUGGER_PACKET_RESYNC_DEBUGGER)) { // // The link went idle or stayed garbage past the bound: treat it diff --git a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp index a3a6983f..81e88b30 100644 --- a/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/kernel-level/kernel-listening.cpp @@ -18,6 +18,7 @@ extern BYTE g_CurrentRunningInstruction[MAXIMUM_INSTR_SIZE]; extern HANDLE g_SerialRemoteComPortHandle; extern BOOLEAN g_IsSerialConnectedToRemoteDebuggee; +extern BOOLEAN g_ListeningDebuggeeDesyncReported; extern BOOLEAN g_IsDebuggeeRunning; extern BOOLEAN g_IgnoreNewLoggingMessages; extern BOOLEAN g_SharedEventStatus; @@ -1451,75 +1452,6 @@ StartAgain: return TRUE; } -// -// Set when the debuggee-side listening loop desyncs, so the warning is shown -// once per episode (cleared on the next good frame) instead of on every -// overflow while the stream stays desynced. -// -static BOOLEAN g_ListeningDebuggeeDesyncReported = FALSE; - -/** - * @brief Discard bytes until the next end-of-buffer marker, re-aligning the - * debuggee-side listening loop to a frame boundary after a desync - * - * @details Bounded by SERIAL_RESYNC_MAX_BYTES so a dead or garbage link cannot - * spin forever. - * - * @return BOOLEAN TRUE if a marker was found (stream re-aligned), FALSE on a - * read error or if too many bytes arrived without a marker - */ -static BOOLEAN -ListeningDebuggeeResyncToNextFrame() -{ - BYTE Window[SERIAL_END_OF_BUFFER_CHARS_COUNT] = {NULL_ZERO, NULL_ZERO, NULL_ZERO, NULL_ZERO}; - UINT32 Discarded = 0; - - while (Discarded < SERIAL_RESYNC_MAX_BYTES) - { - char ReadData = NULL_ZERO; - DWORD NoBytesRead = 0; - BOOL Status; - -#ifdef _WIN32 - Status = ReadFile(g_SerialRemoteComPortHandle, &ReadData, sizeof(ReadData), &NoBytesRead, NULL); -#else - // - // Linux: read one byte through the cross-platform serial transport - // - Status = PlatformSerialReadByte(g_SerialRemoteComPortHandle, - &ReadData, - &NoBytesRead, - PLATFORM_SERIAL_IO_DEBUGGEE); -#endif // _WIN32 - - if (!Status) - { - return FALSE; - } - - if (NoBytesRead == 0) - { - continue; - } - - Window[0] = Window[1]; - Window[1] = Window[2]; - Window[2] = Window[3]; - Window[3] = (BYTE)ReadData; - Discarded++; - - if (Window[0] == SERIAL_END_OF_BUFFER_CHAR_1 && - Window[1] == SERIAL_END_OF_BUFFER_CHAR_2 && - Window[2] == SERIAL_END_OF_BUFFER_CHAR_3 && - Window[3] == SERIAL_END_OF_BUFFER_CHAR_4) - { - return TRUE; - } - } - - return FALSE; -} - /** * @brief Check if the remote debugger needs to pause the system * @@ -1623,7 +1555,7 @@ StartAgain: g_ListeningDebuggeeDesyncReported = TRUE; } - if (!ListeningDebuggeeResyncToNextFrame()) + if (!KdResyncStreamToNextFrame(DEBUGGER_PACKET_RESYNC_LISTENING)) { goto StartAgain; } diff --git a/hyperdbg/libhyperdbg/header/debugger/kernel-level/kd.h b/hyperdbg/libhyperdbg/header/debugger/kernel-level/kd.h index edd20852..7ab34974 100644 --- a/hyperdbg/libhyperdbg/header/debugger/kernel-level/kd.h +++ b/hyperdbg/libhyperdbg/header/debugger/kernel-level/kd.h @@ -41,6 +41,22 @@ public: }; #endif // _WIN32 +////////////////////////////////////////////////// +// enums // +////////////////////////////////////////////////// + +/** + * @brief Type of resync + * + */ +typedef enum _DEBUGGER_PACKET_RESYNC_ENUM +{ + DEBUGGER_PACKET_RESYNC_DEBUGGEE, + DEBUGGER_PACKET_RESYNC_DEBUGGER, + DEBUGGER_PACKET_RESYNC_LISTENING + +} DEBUGGER_PACKET_RESYNC_ENUM; + ////////////////////////////////////////////////// // Functions // ////////////////////////////////////////////////// @@ -228,6 +244,9 @@ KdSendPcitreePacketToDebuggee(PDEBUGGEE_PCITREE_REQUEST_RESPONSE_PACKET PcitreeP BOOLEAN KdSendPcidevinfoPacketToDebuggee(PDEBUGGEE_PCIDEVINFO_REQUEST_RESPONSE_PACKET PcidevinfoPacket); +BOOLEAN +KdResyncStreamToNextFrame(DEBUGGER_PACKET_RESYNC_ENUM ReSyncType); + VOID KdUninitializeConnection(); diff --git a/hyperdbg/libhyperdbg/header/globals/globals.h b/hyperdbg/libhyperdbg/header/globals/globals.h index bf8dfd11..04bf6531 100644 --- a/hyperdbg/libhyperdbg/header/globals/globals.h +++ b/hyperdbg/libhyperdbg/header/globals/globals.h @@ -238,6 +238,20 @@ BOOLEAN g_IsRunningInstruction32Bit = FALSE; */ HANDLE g_SerialListeningThreadHandle = NULL; +/** + * Set when the debuggee-side serial receiver (packets coming from the debugger) + * desyncs, so the warning is shown once per episode (cleared on the next good + * frame) instead of on every overflow while the stream stays desynced. + */ +BOOLEAN g_KdReceiveFromDebuggerDesyncReported = FALSE; + +/** + * Set when the debuggee-side listening loop desyncs, so the warning is shown + * once per episode (cleared on the next good frame) instead of on every + * overflow while the stream stays desynced. + */ +BOOLEAN g_ListeningDebuggeeDesyncReported = FALSE; + /** * @brief In debugger (not debuggee), we save the handle * of the user-mode listening thread for remote system here From ffbfc0416ab0296abf4b3988f3be43d4ce874856 Mon Sep 17 00:00:00 2001 From: sina Date: Sun, 2 Aug 2026 11:01:19 +0200 Subject: [PATCH 50/50] Revert NewTemp modifications and adjust error messages --- CHANGELOG.md | 2 + .../libhyperdbg/code/debugger/misc/pci-id.cpp | 4 +- hyperdbg/script-engine/code/common.c | 41 ++----------------- 3 files changed, 8 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7b40e9b..b36e7cb9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,8 @@ New release of the HyperDbg Debugger. - Resync serial stream on framing overflow instead of flooding the debuggee, thanks to [@munraimix](https://github.com/munraimix) ([link](https://github.com/HyperDbg/HyperDbg/pull/663))([link](https://github.com/HyperDbg/HyperDbg/issues/661)) - Resync libhyperdbg's serial receivers on framing overflow too, thanks to [@munraimix](https://github.com/munraimix) ([link](https://github.com/HyperDbg/HyperDbg/pull/663))([link](https://github.com/HyperDbg/HyperDbg/issues/661)) - Updated Linux port documentation ([link](https://github.com/HyperDbg/HyperDbg/commit/622ea9df9730e3fe0a8ff22f035772631308ac36)) +- Applied cleanup for resync serial codes ([link](https://github.com/HyperDbg/HyperDbg/commit/a24c8c0a91485132ac9e28bfb588a689c8359359)) +- Fix memory-safety and robustness issues in the script engine and the PCI ID parser, thanks to [@enzo-berry](https://github.com/enzo-berry) ([link](https://github.com/HyperDbg/HyperDbg/pull/665)) ### Removed - Removed unused serial codes ([link](https://github.com/HyperDbg/HyperDbg/commit/b77df6a62bacf4bff29198b3d1acd7961a3e7f38)) diff --git a/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp b/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp index 11dcc467..92034535 100644 --- a/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp +++ b/hyperdbg/libhyperdbg/code/debugger/misc/pci-id.cpp @@ -114,7 +114,7 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) if (f == NULL) { - ShowMessages("Error: Cannot open file '%s': error %d\n", Filename, errno); + ShowMessages("err, cannot open file '%s' (error 0x%x)\n", Filename, errno); return NULL; } @@ -124,7 +124,7 @@ GetVendorByIdStr(const CHAR * Filename, const CHAR * VendorId) if (FileSize < 0) { - ShowMessages("Error: Cannot determine the size of file '%s': error %d\n", Filename, errno); + ShowMessages("err, cannot determine the size of file '%s' (error: 0x%x)\n", Filename, errno); fclose(f); return NULL; } diff --git a/hyperdbg/script-engine/code/common.c b/hyperdbg/script-engine/code/common.c index 173c8b9b..557dbdd3 100644 --- a/hyperdbg/script-engine/code/common.c +++ b/hyperdbg/script-engine/code/common.c @@ -703,17 +703,11 @@ IsOctal(char c) return 0; } -/** - * @brief Allocates a new temporary variable and returns it - * - * @param Error the error type pointer - * @return PSCRIPT_ENGINE_TOKEN - */ PSCRIPT_ENGINE_TOKEN NewTemp(PSCRIPT_ENGINE_ERROR_TYPE Error) { - unsigned int TempID = 0; - int i; + static unsigned int TempID = 0; + int i; for (i = 0; i < MAX_TEMP_COUNT; i++) { if (CurrentUserDefinedFunction->TempMap[i] == 0) @@ -725,42 +719,15 @@ NewTemp(PSCRIPT_ENGINE_ERROR_TYPE Error) } if (i == MAX_TEMP_COUNT) { - // - // No slot is free. The error is reported to the caller, which aborts the - // code generation. A token is still returned so that the (many) call sites - // that dereference the result before testing *Error keep working - // - // TempID is deliberately a plain local rather than a static: when it was - // static it kept the id handed out by the previous call, so an exhausted - // temp list produced a token aliasing a temporary that was still in use - // *Error = SCRIPT_ENGINE_ERROR_TEMP_LIST_FULL; } - PSCRIPT_ENGINE_TOKEN Temp = NewUnknownToken(); - - if (Temp == NULL) - { - // - // There was an error allocating the token, so release the reserved slot - // - if (i != MAX_TEMP_COUNT) - { - CurrentUserDefinedFunction->TempMap[i] = 0; - } - return NULL; - } - - char TempValue[8]; + char TempValue[8]; sprintf(TempValue, "%d", TempID); strcpy(Temp->Value, TempValue); Temp->Type = TEMP; - // - // 'i' is only a valid temporary index when a free slot was actually found, - // otherwise this would size the frame for MAX_TEMP_COUNT + 1 temporaries - // - if (i != MAX_TEMP_COUNT && CurrentUserDefinedFunction->MaxTempNumber < (unsigned long long)(i + 1)) + if (CurrentUserDefinedFunction->MaxTempNumber < (i + 1)) { CurrentUserDefinedFunction->MaxTempNumber = i + 1; }