diff --git a/src/apps/terminal/Arguments.cpp b/src/apps/terminal/Arguments.cpp index 311e11a1bd..3c3405238b 100644 --- a/src/apps/terminal/Arguments.cpp +++ b/src/apps/terminal/Arguments.cpp @@ -19,7 +19,7 @@ Arguments::Arguments() fShellArguments(NULL), fTitle(NULL) { - const char *argv[] = { "/bin/sh", "--login" }; + const char *argv[] = { "/bin/bash", "--login" }; _SetShellArguments(2, argv); } diff --git a/src/apps/terminal/BasicTerminalBuffer.cpp b/src/apps/terminal/BasicTerminalBuffer.cpp index 196ed44090..2a376f0e0c 100644 --- a/src/apps/terminal/BasicTerminalBuffer.cpp +++ b/src/apps/terminal/BasicTerminalBuffer.cpp @@ -13,7 +13,6 @@ #include -#include "CodeConv.h" #include "TermConst.h" #include "TerminalCharClassifier.h" #include "TerminalLine.h" @@ -550,8 +549,6 @@ BasicTerminalBuffer::InsertChar(UTF8Char c, uint32 width, uint32 attributes) { //debug_printf("BasicTerminalBuffer::InsertChar('%.*s' (%d), %#lx)\n", //(int)c.ByteCount(), c.bytes, c.bytes[0], attributes); - // TODO: Check if this method can be removed completely - //int width = CodeConv::UTF8GetFontWidth(c.bytes); if ((int32)width == FULL_WIDTH) attributes |= A_WIDTH; @@ -589,8 +586,6 @@ BasicTerminalBuffer::InsertChar(UTF8Char c, uint32 width, uint32 attributes) void BasicTerminalBuffer::FillScreen(UTF8Char c, uint32 width, uint32 attributes) { - // TODO: Check if this method can be removed completely - //int width = CodeConv::UTF8GetFontWidth(c.bytes); if ((int32)width == FULL_WIDTH) attributes |= A_WIDTH; diff --git a/src/apps/terminal/CodeConv.cpp b/src/apps/terminal/CodeConv.cpp deleted file mode 100644 index d7fa9fbeeb..0000000000 --- a/src/apps/terminal/CodeConv.cpp +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2001-2007, Haiku, Inc. - * Copyright (c) 2003-4 Kian Duffy - * Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai. - * Distributed under the terms of the MIT license. - */ - -/********************************************************************* -MuTerminal Code Conversion class (MC3). - -version 1.1 Internal coding system is UTF8. - -Code conversion member functions are convert character code and calc -font width. - -Available coding systems. - -ISO-8859-1 ... 10 -Shift JIS -EUC-jp -UTF8 - -************************************************************************/ - -#include -#include - -#include "CodeConv.h" - -#define BEGINS_CHAR(byte) ((byte & 0xc0) >= 0x80) - - -extern char gUTF8WidthTable[]; // defined in UTF8WidthTbl.c - - -//! get font width in coding. -/* static */ -int32 -CodeConv::UTF8GetFontWidth(const char *string) -{ - ushort unicode = UTF8toUnicode(string); - uchar width = gUTF8WidthTable[unicode >> 3]; - ushort offset = unicode & 0x07; - - uchar point = 0x80 >> offset; - - return (width & point) > 0 ? 2 : 1; -} - - -//! Convert internal coding from src coding. -/* static */ -int32 -CodeConv::ConvertFromInternal(const char *src, int32 srclen, char *dst, int coding) -{ - if (srclen == -1) - srclen = strlen(src); - - if (coding == M_UTF8) { - memcpy(dst, src, srclen); - dst[srclen] = '\0'; - return srclen; - } - - int32 dstlen = srclen * 256; - long state = 0; - convert_from_utf8(coding, (char *)src, &srclen, - (char *)dst, &dstlen, &state, '?'); - - // TODO: Apart from this particular case, looks like we could use the - // system api for code conversion... check if this (which looks a lot like a workaround) - // applies to haiku, and if not, get rid of this class and just use the system api directly. - if (coding == B_EUC_CONVERSION && state != 0) { - const char *end_of_jis = "\033(B"; - strncpy((char *)dst + dstlen, end_of_jis, 3); - dstlen += 3; - } - - dst[dstlen] = '\0'; - return dstlen; -} - - -//! Convert internal coding to src coding. -/* static */ -int32 -CodeConv::ConvertToInternal(const char *src, int32 srclen, char *dst, int coding) -{ - if (srclen == -1) - srclen = strlen(src); - - if (coding == M_UTF8) { - memcpy(dst, src, srclen); - dst[srclen] = '\0'; - return srclen; - } - -#if 0 -#ifndef __INTEL__ - if (coding = M_EUC_JP) { - uchar buf[2]; - memcpy (buf, src, 2); - euc_to_sjis (buf); - srclen = 2; - convert_to_utf8 (B_SJIS_CONVERSION, (char*) buf, &srclen, - (char *)dst, &dstlen, - &state, '?'); - dst[dstlen] = '\0'; - return; - } -#endif -#endif - - int32 dstlen = 4; - long state = 0; - convert_to_utf8(coding, (char *)src, &srclen, - (char *)dst, &dstlen, &state, '?'); - - dst[dstlen] = '\0'; - return dstlen; -} - - -/* static */ -unsigned short -CodeConv::UTF8toUnicode(const char *utf8) -{ - uchar tmp; - unsigned short unicode = 0x0000; - - tmp = *utf8 & 0xe0; - - if (tmp < 0x80) { - unicode = (unsigned short)*utf8; - } else if (tmp < 0xe0) { - unicode = (unsigned short)*utf8++ & 0x1f; - unicode = unicode << 6; - unicode = unicode | ((unsigned short)*utf8 & 0x3f); - } else if (tmp < 0xf0) { - unicode = (unsigned short)*utf8++ & 0x0f; - unicode = unicode << 6; - unicode = unicode | ((unsigned short)*utf8++ & 0x3f); - unicode = unicode << 6; - unicode = unicode | ((unsigned short)*utf8 & 0x3f); - } - - return unicode; -} - - -/* static */ -void -CodeConv::euc_to_sjis(uchar *buf) -{ - int gl, gr; - int p; - int c1, c2; - - gl = *buf & 0x7F; - gr = *(buf + 1) & 0x7F; - gl -= 0x21; - gr -= 0x21; - - p = gl * 94 + gr; - - c1 = p / 188; - c2 = p % 188; - - if (c1 >= 31) - c1 = c1 - 31 + 0xE0; - else - c1 += 0x81; - - if (c2 >= 63) - c2 = c2 - 63 + 0x80; - else - c2 += 0x40; - - *buf++ = c1; - *buf = c2; -} diff --git a/src/apps/terminal/CodeConv.h b/src/apps/terminal/CodeConv.h deleted file mode 100644 index e20420469b..0000000000 --- a/src/apps/terminal/CodeConv.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2001-2005, Haiku, Inc. - * Copyright (c) 2003-4 Kian Duffy - * Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai. - * Distributed under the terms of the MIT license. - */ -#ifndef CODECONV_H -#define CODECONV_H - - -#include - -#include "Encoding.h" - -class CodeConv { - public: - static int32 UTF8GetFontWidth(const char *string); - - /* internal(UTF8) -> coding */ - static int32 ConvertFromInternal(const char *src, int32 bytes, char *dst, int coding); - - /* coding -> internal(UTF8) */ - static int32 ConvertToInternal(const char *src, int32 bytes, char *dst, int coding); - - private: - static void euc_to_sjis(uchar *buf); - static unsigned short UTF8toUnicode(const char *utf8); -}; - - -#endif /* CODECONV_H */ diff --git a/src/apps/terminal/Encoding.cpp b/src/apps/terminal/Encoding.cpp index ac54b1429f..54f420c6f8 100644 --- a/src/apps/terminal/Encoding.cpp +++ b/src/apps/terminal/Encoding.cpp @@ -4,6 +4,7 @@ */ #include "Encoding.h" +#include "TermConst.h" #include diff --git a/src/apps/terminal/Encoding.h b/src/apps/terminal/Encoding.h index d4641df63d..3f5d3945a0 100644 --- a/src/apps/terminal/Encoding.h +++ b/src/apps/terminal/Encoding.h @@ -35,7 +35,6 @@ #include #include -#define M_UTF8 (-1) status_t get_next_encoding(int i, int *id); diff --git a/src/apps/terminal/Jamfile b/src/apps/terminal/Jamfile index 5f8d59454d..481131deb2 100644 --- a/src/apps/terminal/Jamfile +++ b/src/apps/terminal/Jamfile @@ -8,7 +8,6 @@ Application Terminal : AppearPrefView.cpp Arguments.cpp BasicTerminalBuffer.cpp - CodeConv.cpp Encoding.cpp FindWindow.cpp Globals.cpp @@ -25,7 +24,6 @@ Application Terminal : TermScrollView.cpp TermView.cpp TermWindow.cpp - UTF8WidthTbl.c VTKeyTbl.c VTPrsTbl.c : be tracker textencoding $(TARGET_LIBSUPC++) diff --git a/src/apps/terminal/TermConst.h b/src/apps/terminal/TermConst.h index 70ab2bac27..e3d0cf6331 100644 --- a/src/apps/terminal/TermConst.h +++ b/src/apps/terminal/TermConst.h @@ -152,6 +152,8 @@ enum{ SCRDOWN }; +#define M_UTF8 -1 + #define TAB_WIDTH 8 #define MIN_COLS 10 diff --git a/src/apps/terminal/TermParse.cpp b/src/apps/terminal/TermParse.cpp index 9682e221be..f742e480bd 100644 --- a/src/apps/terminal/TermParse.cpp +++ b/src/apps/terminal/TermParse.cpp @@ -19,8 +19,8 @@ #include #include #include +#include -#include "CodeConv.h" #include "TermConst.h" #include "TerminalBuffer.h" #include "VTparse.h" @@ -47,19 +47,17 @@ extern int gMbcsTable[]; /* ESC $ */ //! Get char from pty reader buffer. -inline status_t -TermParse::_NextParseChar(uchar &c) +inline uchar +TermParse::_NextParseChar() { if (fParserBufferOffset >= fParserBufferSize) { // parser buffer empty status_t error = _ReadParserBuffer(); if (error != B_OK) - return error; + throw error; } - c = fParserBuffer[fParserBufferOffset++]; - - return B_OK; + return fParserBuffer[fParserBufferOffset++]; } @@ -94,14 +92,14 @@ TermParse::StartThreads(TerminalBuffer *buffer) fQuitting = false; fBuffer = buffer; - - status_t status = InitPtyReader(); + + status_t status = _InitPtyReader(); if (status < B_OK) { fBuffer = NULL; return status; } - status = InitTermParse(); + status = _InitTermParse(); if (status < B_OK) { StopPtyReader(); fBuffer = NULL; @@ -120,8 +118,8 @@ TermParse::StopThreads() fQuitting = true; - StopPtyReader(); - StopTermParse(); + _StopPtyReader(); + _StopTermParse(); fBuffer = NULL; @@ -131,7 +129,7 @@ TermParse::StopThreads() //! Initialize and spawn EscParse thread. status_t -TermParse::InitTermParse() +TermParse::_InitTermParse() { if (fParseThread >= 0) return B_ERROR; // we might want to return B_OK instead ? @@ -139,6 +137,9 @@ TermParse::InitTermParse() fParseThread = spawn_thread(_escparse_thread, "EscParse", B_DISPLAY_PRIORITY, this); + if (fParseThread < 0) + return fParseThread; + resume_thread(fParseThread); return B_OK; @@ -147,7 +148,7 @@ TermParse::InitTermParse() //! Initialize and spawn PtyReader thread. status_t -TermParse::InitPtyReader() +TermParse::_InitPtyReader() { if (fReaderThread >= 0) return B_ERROR; // same as above @@ -180,7 +181,7 @@ TermParse::InitPtyReader() void -TermParse::StopTermParse() +TermParse::_StopTermParse() { if (fParseThread >= 0) { status_t dummy; @@ -191,7 +192,7 @@ TermParse::StopTermParse() void -TermParse::StopPtyReader() +TermParse::_StopPtyReader() { if (fReaderSem >= 0) { delete_sem(fReaderSem); @@ -287,13 +288,15 @@ TermParse::DumpState(int *groundtable, int *parsestate, uchar c) }; int i; fprintf(stderr, "groundtable: "); - for (i = 0; tables[i].p; i++) + for (i = 0; tables[i].p; i++) { if (tables[i].p == groundtable) fprintf(stderr, "%s\t", tables[i].name); + } fprintf(stderr, "parsestate: "); - for (i = 0; tables[i].p; i++) + for (i = 0; tables[i].p; i++) { if (tables[i].p == parsestate) fprintf(stderr, "%s\t", tables[i].name); + } fprintf(stderr, "char: 0x%02x (%d)\n", c, c); } @@ -301,708 +304,726 @@ TermParse::DumpState(int *groundtable, int *parsestate, uchar c) int32 TermParse::EscParse() { - int top, bot; + int top; + int bottom; int cs96 = 0; uchar curess = 0; - char cbuf[4], dstbuf[4]; + char cbuf[4]; + char dstbuf[4]; char *ptr; - int now_coding = -1; + int currentEncoding = -1; int param[NPARAM]; int nparam = 1; - int row, col; + int row; + int column; - /* default coding system is UTF8 */ + /* default encoding system is UTF8 */ int *groundtable = gUTF8GroundTable; - int *parsestate = groundtable; + int *parsestate = gUTF8GroundTable; + int32 srcLen; + int32 dstLen; + long dummyState = 0; + int width = 1; BAutolock locker(fBuffer); fAttr = fSavedAttr = BACKCOLOR; while (!fQuitting) { - uchar c; - if (_NextParseChar(c) < B_OK) - break; + try { + uchar c = _NextParseChar(); - //DumpState(groundtable, parsestate, c); + //DumpState(groundtable, parsestate, c); - if (now_coding != fBuffer->Encoding()) { - /* - * Change coding, change parse table. - */ - switch (fBuffer->Encoding()) { - case B_ISO1_CONVERSION: - case B_ISO2_CONVERSION: - case B_ISO3_CONVERSION: - case B_ISO4_CONVERSION: - case B_ISO5_CONVERSION: - case B_ISO6_CONVERSION: - case B_ISO7_CONVERSION: - case B_ISO8_CONVERSION: - case B_ISO9_CONVERSION: - case B_ISO10_CONVERSION: - groundtable = gISO8859GroundTable; - break; - case B_SJIS_CONVERSION: - groundtable = gSJISGroundTable; - break; - case B_EUC_CONVERSION: - case B_EUC_KR_CONVERSION: - case B_JIS_CONVERSION: - case B_GBK_CONVERSION: - case B_BIG5_CONVERSION: - groundtable = gISO8859GroundTable; - break; - case M_UTF8: - default: - groundtable = gUTF8GroundTable; - break; + if (currentEncoding != fBuffer->Encoding()) { + /* + * Change coding, change parse table. + */ + switch (fBuffer->Encoding()) { + case B_ISO1_CONVERSION: + case B_ISO2_CONVERSION: + case B_ISO3_CONVERSION: + case B_ISO4_CONVERSION: + case B_ISO5_CONVERSION: + case B_ISO6_CONVERSION: + case B_ISO7_CONVERSION: + case B_ISO8_CONVERSION: + case B_ISO9_CONVERSION: + case B_ISO10_CONVERSION: + groundtable = gISO8859GroundTable; + break; + case B_SJIS_CONVERSION: + groundtable = gSJISGroundTable; + break; + case B_EUC_CONVERSION: + case B_EUC_KR_CONVERSION: + case B_JIS_CONVERSION: + case B_GBK_CONVERSION: + case B_BIG5_CONVERSION: + groundtable = gISO8859GroundTable; + break; + case M_UTF8: + default: + groundtable = gUTF8GroundTable; + break; + } + parsestate = groundtable; + currentEncoding = fBuffer->Encoding(); } - parsestate = groundtable; - now_coding = fBuffer->Encoding(); - } -//debug_printf("TermParse: char: '%c' (%d), parse state: %d\n", c, c, parsestate[c]); - switch (parsestate[c]) { - case CASE_PRINT: - fBuffer->InsertChar((char)c, fAttr); - break; + //debug_printf("TermParse: char: '%c' (%d), parse state: %d\n", c, c, parsestate[c]); + switch (parsestate[c]) { + case CASE_PRINT: + fBuffer->InsertChar((char)c, fAttr); + break; - case CASE_PRINT_GR: - /* case iso8859 gr character, or euc */ - ptr = cbuf; - if (now_coding == B_EUC_CONVERSION - || now_coding == B_EUC_KR_CONVERSION - || now_coding == B_JIS_CONVERSION - || now_coding == B_GBK_CONVERSION - || now_coding == B_BIG5_CONVERSION) { - switch (parsestate[curess]) { - case CASE_SS2: /* JIS X 0201 */ - width = 1; - *ptr++ = curess; - *ptr++ = c; - *ptr = 0; - curess = 0; - break; + case CASE_PRINT_GR: + /* case iso8859 gr character, or euc */ + ptr = cbuf; + if (currentEncoding == B_EUC_CONVERSION + || currentEncoding == B_EUC_KR_CONVERSION + || currentEncoding == B_JIS_CONVERSION + || currentEncoding == B_GBK_CONVERSION + || currentEncoding == B_BIG5_CONVERSION) { + switch (parsestate[curess]) { + case CASE_SS2: /* JIS X 0201 */ + width = 1; + *ptr++ = curess; + *ptr++ = c; + *ptr = 0; + curess = 0; + break; - case CASE_SS3: /* JIS X 0212 */ - width = 1; - *ptr++ = curess; - *ptr++ = c; - _NextParseChar(c); - *ptr++ = c; - *ptr = 0; - curess = 0; - break; + case CASE_SS3: /* JIS X 0212 */ + width = 1; + *ptr++ = curess; + *ptr++ = c; + c = _NextParseChar(); + *ptr++ = c; + *ptr = 0; + curess = 0; + break; - default: /* JIS X 0208 */ - width = 2; - *ptr++ = c; - _NextParseChar(c); - *ptr++ = c; - *ptr = 0; - break; + default: /* JIS X 0208 */ + width = 2; + *ptr++ = c; + c = _NextParseChar(); + *ptr++ = c; + *ptr = 0; + break; + } + } else { + /* ISO-8859-1...10 and MacRoman */ + *ptr++ = c; + *ptr = 0; } - } else { - /* ISO-8859-1...10 and MacRoman */ - *ptr++ = c; - *ptr = 0; - } - if (now_coding != B_JIS_CONVERSION) { - CodeConv::ConvertToInternal(cbuf, -1, dstbuf, now_coding); - } else { - CodeConv::ConvertToInternal(cbuf, -1, dstbuf, - B_EUC_CONVERSION); - } + srcLen = strlen(cbuf); + if (currentEncoding != B_JIS_CONVERSION) { + convert_to_utf8(currentEncoding, cbuf, &srcLen, + dstbuf, &dstLen, &dummyState, '?'); + } else { + convert_to_utf8(B_EUC_CONVERSION, cbuf, &srcLen, + dstbuf, &dstLen, &dummyState, '?'); + } - fBuffer->InsertChar(dstbuf, 4, width, fAttr); - break; - - case CASE_PRINT_CS96: - cbuf[0] = c | 0x80; - _NextParseChar(c); - cbuf[1] = c | 0x80; - cbuf[2] = 0; - CodeConv::ConvertToInternal(cbuf, 2, dstbuf, B_EUC_CONVERSION); - fBuffer->InsertChar(dstbuf, 4, fAttr); - break; - - case CASE_LF: - fBuffer->InsertLF(); - break; - - case CASE_CR: - fBuffer->InsertCR(); - break; - - case CASE_SJIS_KANA: - cbuf[0] = c; - cbuf[1] = '\0'; - CodeConv::ConvertToInternal(cbuf, 1, dstbuf, now_coding); - fBuffer->InsertChar(dstbuf, 4, fAttr); - break; - - case CASE_SJIS_INSTRING: - cbuf[0] = c; - _NextParseChar(c); - cbuf[1] = c; - cbuf[2] = '\0'; - CodeConv::ConvertToInternal(cbuf, 2, dstbuf, now_coding); - fBuffer->InsertChar(dstbuf, 4, fAttr); - break; - - case CASE_UTF8_2BYTE: - cbuf[0] = c; - _NextParseChar(c); - if (groundtable[c] != CASE_UTF8_INSTRING) + fBuffer->InsertChar(dstbuf, dstLen, width, fAttr); break; - cbuf[1] = c; - cbuf[2] = '\0'; - fBuffer->InsertChar(cbuf, 2, fAttr); - break; - - case CASE_UTF8_3BYTE: - cbuf[0] = c; - _NextParseChar(c); - if (groundtable[c] != CASE_UTF8_INSTRING) + case CASE_PRINT_CS96: + cbuf[0] = c | 0x80; + c = _NextParseChar(); + cbuf[1] = c | 0x80; + cbuf[2] = 0; + srcLen = 2; + dstLen = 0; + convert_to_utf8(B_EUC_CONVERSION, cbuf, &srcLen, + dstbuf, &dstLen, &dummyState, '?'); + fBuffer->InsertChar(dstbuf, dstLen, fAttr); break; - cbuf[1] = c; - _NextParseChar(c); - if (groundtable[c] != CASE_UTF8_INSTRING) + case CASE_LF: + fBuffer->InsertLF(); break; - cbuf[2] = c; - cbuf[3] = '\0'; - fBuffer->InsertChar(cbuf, 3, fAttr); - break; - case CASE_MBCS: - /* ESC $ */ - parsestate = gMbcsTable; - break; + case CASE_CR: + fBuffer->InsertCR(); + break; - case CASE_GSETS: - /* ESC $ ? */ - parsestate = gCS96GroundTable; - cs96 = 1; - break; + case CASE_SJIS_KANA: + cbuf[0] = c; + cbuf[1] = '\0'; + srcLen = 1; + dstLen = 0; + convert_to_utf8(currentEncoding, cbuf, &srcLen, + dstbuf, &dstLen, &dummyState, '?'); + fBuffer->InsertChar(dstbuf, dstLen, fAttr); + break; - case CASE_SCS_STATE: - { - cs96 = 0; - uchar dummy; - _NextParseChar(dummy); - parsestate = groundtable; - break; - } - case CASE_GROUND_STATE: - /* exit ignore mode */ - parsestate = groundtable; - break; + case CASE_SJIS_INSTRING: + cbuf[0] = c; + c = _NextParseChar(); + cbuf[1] = c; + cbuf[2] = '\0'; + srcLen = 2; + dstLen = 0; + convert_to_utf8(currentEncoding, cbuf, &srcLen, + dstbuf, &dstLen, &dummyState, '?'); + fBuffer->InsertChar(dstbuf, dstLen, fAttr); + break; - case CASE_BELL: - beep(); - break; - - case CASE_BS: - fBuffer->MoveCursorLeft(1); - break; - - case CASE_TAB: - fBuffer->InsertTab(); - break; - - case CASE_ESC: - /* escape */ - parsestate = gEscTable; - break; - - case CASE_IGNORE_STATE: - /* Ies: ignore anything else */ - parsestate = gIgnoreTable; - break; - - case CASE_IGNORE_ESC: - /* Ign: escape */ - parsestate = gIesTable; - break; - - case CASE_IGNORE: - /* Ignore character */ - break; - - case CASE_SI: - break; - - case CASE_SO: - break; - - case CASE_SCR_STATE: // ESC # - /* enter scr state */ - parsestate = gScrTable; - break; - - case CASE_ESC_IGNORE: - /* unknown escape sequence */ - parsestate = gEscIgnoreTable; - break; - - case CASE_ESC_DIGIT: // ESC [ number - /* digit in csi or dec mode */ - if ((row = param[nparam - 1]) == DEFAULT) - row = 0; - param[nparam - 1] = 10 * row + (c - '0'); - break; - - case CASE_ESC_SEMI: // ESC ; - /* semicolon in csi or dec mode */ - if (nparam < NPARAM) - param[nparam++] = DEFAULT; - break; - - case CASE_DEC_STATE: - /* enter dec mode */ - parsestate = gDecTable; - break; - - case CASE_ICH: // ESC [@ insert charactor - /* ICH */ - if ((row = param[0]) < 1) - row = 1; - fBuffer->InsertSpace(row); - parsestate = groundtable; - break; - - case CASE_CUU: // ESC [A cursor up, up arrow key. - /* CUU */ - if ((row = param[0]) < 1) - row = 1; - fBuffer->MoveCursorUp(row); - parsestate = groundtable; - break; - - case CASE_CUD: // ESC [B cursor down, down arrow key. - /* CUD */ - if ((row = param[0]) < 1) - row = 1; - fBuffer->MoveCursorDown(row); - parsestate = groundtable; - break; - - case CASE_CUF: // ESC [C cursor forword - /* CUF */ - if ((row = param[0]) < 1) - row = 1; - fBuffer->MoveCursorRight(row); - parsestate = groundtable; - break; - - case CASE_CUB: // ESC [D cursor backword - /* CUB */ - if ((row = param[0]) < 1) - row = 1; - fBuffer->MoveCursorLeft(row); - parsestate = groundtable; - break; - - case CASE_CUP: // ESC [...H move cursor - /* CUP | HVP */ - if ((row = param[0]) < 1) - row = 1; - if (nparam < 2 || (col = param[1]) < 1) - col = 1; - - fBuffer->SetCursor(col - 1, row - 1 ); - parsestate = groundtable; - break; - - case CASE_ED: // ESC [ ...J clear screen - /* ED */ - switch (param[0]) { - case DEFAULT: - case 0: - fBuffer->EraseBelow(); + case CASE_UTF8_2BYTE: + cbuf[0] = c; + c = _NextParseChar(); + if (groundtable[c] != CASE_UTF8_INSTRING) break; + cbuf[1] = c; + cbuf[2] = '\0'; - case 1: - fBuffer->EraseAbove(); - break; + fBuffer->InsertChar(cbuf, 2, fAttr); + break; - case 2: - fBuffer->EraseAll(); + case CASE_UTF8_3BYTE: + cbuf[0] = c; + c = _NextParseChar(); + if (groundtable[c] != CASE_UTF8_INSTRING) break; + cbuf[1] = c; + + c = _NextParseChar(); + if (groundtable[c] != CASE_UTF8_INSTRING) + break; + cbuf[2] = c; + cbuf[3] = '\0'; + fBuffer->InsertChar(cbuf, 3, fAttr); + break; + + case CASE_MBCS: + /* ESC $ */ + parsestate = gMbcsTable; + break; + + case CASE_GSETS: + /* ESC $ ? */ + parsestate = gCS96GroundTable; + cs96 = 1; + break; + + case CASE_SCS_STATE: + { + cs96 = 0; + _NextParseChar(); + // skip next char + parsestate = groundtable; + break; } - parsestate = groundtable; - break; + case CASE_GROUND_STATE: + /* exit ignore mode */ + parsestate = groundtable; + break; - case CASE_EL: // ESC [ ...K delete line - /* EL */ - switch (param[0]) { - case DEFAULT: - case 0: - fBuffer->DeleteColumns(); - break; + case CASE_BELL: + beep(); + break; - case 1: - fBuffer->EraseCharsFrom(0, fBuffer->Cursor().x + 1); - break; + case CASE_BS: + fBuffer->MoveCursorLeft(1); + break; - case 2: - fBuffer->DeleteColumnsFrom(0); - break; - } - parsestate = groundtable; - break; + case CASE_TAB: + fBuffer->InsertTab(); + break; - case CASE_IL: - /* IL */ - if ((row = param[0]) < 1) - row = 1; - fBuffer->InsertLines(row); - parsestate = groundtable; - break; + case CASE_ESC: + /* escape */ + parsestate = gEscTable; + break; - case CASE_DL: - /* DL */ - if ((row = param[0]) < 1) - row = 1; - fBuffer->DeleteLines(row); - parsestate = groundtable; - break; + case CASE_IGNORE_STATE: + /* Ies: ignore anything else */ + parsestate = gIgnoreTable; + break; - case CASE_DCH: - /* DCH */ - if ((row = param[0]) < 1) - row = 1; - fBuffer->DeleteChars(row); - parsestate = groundtable; - break; + case CASE_IGNORE_ESC: + /* Ign: escape */ + parsestate = gIesTable; + break; - case CASE_SET: - /* SET */ - if (param[0] == 4) - fBuffer->SetInsertMode(MODE_INSERT); - parsestate = groundtable; - break; + case CASE_IGNORE: + /* Ignore character */ + break; - case CASE_RST: - /* RST */ - if (param[0] == 4) - fBuffer->SetInsertMode(MODE_OVER); - parsestate = groundtable; - break; + case CASE_SI: + break; - case CASE_SGR: - /* SGR */ - for (row = 0; row < nparam; ++row) { - switch (param[row]) { + case CASE_SO: + break; + + case CASE_SCR_STATE: // ESC # + /* enter scr state */ + parsestate = gScrTable; + break; + + case CASE_ESC_IGNORE: + /* unknown escape sequence */ + parsestate = gEscIgnoreTable; + break; + + case CASE_ESC_DIGIT: // ESC [ number + /* digit in csi or dec mode */ + if ((row = param[nparam - 1]) == DEFAULT) + row = 0; + param[nparam - 1] = 10 * row + (c - '0'); + break; + + case CASE_ESC_SEMI: // ESC ; + /* semicolon in csi or dec mode */ + if (nparam < NPARAM) + param[nparam++] = DEFAULT; + break; + + case CASE_DEC_STATE: + /* enter dec mode */ + parsestate = gDecTable; + break; + + case CASE_ICH: // ESC [@ insert charactor + /* ICH */ + if ((row = param[0]) < 1) + row = 1; + fBuffer->InsertSpace(row); + parsestate = groundtable; + break; + + case CASE_CUU: // ESC [A cursor up, up arrow key. + /* CUU */ + if ((row = param[0]) < 1) + row = 1; + fBuffer->MoveCursorUp(row); + parsestate = groundtable; + break; + + case CASE_CUD: // ESC [B cursor down, down arrow key. + /* CUD */ + if ((row = param[0]) < 1) + row = 1; + fBuffer->MoveCursorDown(row); + parsestate = groundtable; + break; + + case CASE_CUF: // ESC [C cursor forword + /* CUF */ + if ((row = param[0]) < 1) + row = 1; + fBuffer->MoveCursorRight(row); + parsestate = groundtable; + break; + + case CASE_CUB: // ESC [D cursor backword + /* CUB */ + if ((row = param[0]) < 1) + row = 1; + fBuffer->MoveCursorLeft(row); + parsestate = groundtable; + break; + + case CASE_CUP: // ESC [...H move cursor + /* CUP | HVP */ + if ((row = param[0]) < 1) + row = 1; + if (nparam < 2 || (column = param[1]) < 1) + column = 1; + + fBuffer->SetCursor(column - 1, row - 1 ); + parsestate = groundtable; + break; + + case CASE_ED: // ESC [ ...J clear screen + /* ED */ + switch (param[0]) { case DEFAULT: - case 0: /* Reset attribute */ - fAttr = 0; + case 0: + fBuffer->EraseBelow(); break; case 1: - case 5: /* Bold */ - fAttr |= BOLD; + fBuffer->EraseAbove(); break; - case 4: /* Underline */ - fAttr |= UNDERLINE; - break; - - case 7: /* Inverse */ - fAttr |= INVERSE; - break; - - case 22: /* Not Bold */ - fAttr &= ~BOLD; - break; - - case 24: /* Not Underline */ - fAttr &= ~UNDERLINE; - break; - - case 27: /* Not Inverse */ - fAttr &= ~INVERSE; - break; - - case 30: - case 31: - case 32: - case 33: - case 34: - case 35: - case 36: - case 37: - fAttr &= ~FORECOLOR; - fAttr |= FORECOLORED(param[row] - 30); - fAttr |= FORESET; - break; - - case 39: - fAttr &= ~FORESET; - break; - - case 40: - case 41: - case 42: - case 43: - case 44: - case 45: - case 46: - case 47: - fAttr &= ~BACKCOLOR; - fAttr |= BACKCOLORED(param[row] - 40); - fAttr |= BACKSET; - break; - - case 49: - fAttr &= ~BACKSET; + case 2: + fBuffer->EraseAll(); break; } - } - parsestate = groundtable; - break; - - case CASE_CPR: - // Q & D hack by Y.Hayakawa (hida@sawada.riec.tohoku.ac.jp) - // 21-JUL-99 - _DeviceStatusReport(param[0]); parsestate = groundtable; break; - case CASE_DA1: - // DA - report device attributes - if (param[0] < 1) - // claim to be a VT102 - write(fFd, "\033[?6c", 5); - parsestate = groundtable; - break; - - case CASE_DECSTBM: - /* DECSTBM - set scrolling region */ - - if ((top = param[0]) < 1) - top = 1; - - if (nparam < 2) - bot = fBuffer->Height(); - else - bot = param[1]; - - top--; - bot--; - - if (bot > top) - fBuffer->SetScrollRegion(top, bot); - - parsestate = groundtable; - break; - - case CASE_DECREQTPARM: - // DEXREQTPARM - request terminal parameters - _DecReqTermParms(param[0]); - parsestate = groundtable; - break; - - case CASE_DECSET: - /* DECSET */ - for (int i = 0; i < nparam; i++) - _DecPrivateModeSet(param[i]); - parsestate = groundtable; - break; - - case CASE_DECRST: - /* DECRST */ - for (int i = 0; i < nparam; i++) - _DecPrivateModeReset(param[i]); - parsestate = groundtable; - break; - - case CASE_DECALN: - /* DECALN */ - fBuffer->FillScreen(UTF8Char('E'), 1, 0); - parsestate = groundtable; - break; - - // case CASE_GSETS: - // screen->gsets[scstype] = GSET(c) | cs96; - // parsestate = groundtable; - // break; - - case CASE_DECSC: - /* DECSC */ - _DecSaveCursor(); - parsestate = groundtable; - break; - - case CASE_DECRC: - /* DECRC */ - _DecRestoreCursor(); - parsestate = groundtable; - break; - - case CASE_HTS: - /* HTS */ - fBuffer->SetTabStop(fBuffer->Cursor().x); - parsestate = groundtable; - break; - - case CASE_TBC: - /* TBC */ - if (param[0] < 1) - fBuffer->ClearTabStop(fBuffer->Cursor().x); - else if (param[0] == 3) - fBuffer->ClearAllTabStops(); - parsestate = groundtable; - break; - - case CASE_RI: - /* RI */ - fBuffer->InsertRI(); - parsestate = groundtable; - break; - - case CASE_SS2: - /* SS2 */ - curess = c; - parsestate = groundtable; - break; - - case CASE_SS3: - /* SS3 */ - curess = c; - parsestate = groundtable; - break; - - case CASE_CSI_STATE: - /* enter csi state */ - nparam = 1; - param[0] = DEFAULT; - parsestate = gCsiTable; - break; - - case CASE_OSC: - { - /* Operating System Command: ESC ] */ - char string[512]; - uint32 len = 0; - uchar mode_char; - _NextParseChar(mode_char); - if (mode_char != '0' - && mode_char != '1' - && mode_char != '2') { - parsestate = groundtable; - break; - } - uchar current_char; - _NextParseChar(current_char); - while (_NextParseChar(current_char) == B_OK - && current_char != 0x7) { - if (!isprint(current_char & 0x7f) - || len+2 >= sizeof(string)) + case CASE_EL: // ESC [ ...K delete line + /* EL */ + switch (param[0]) { + case DEFAULT: + case 0: + fBuffer->DeleteColumns(); + break; + + case 1: + fBuffer->EraseCharsFrom(0, fBuffer->Cursor().x + 1); + break; + + case 2: + fBuffer->DeleteColumnsFrom(0); break; - string[len++] = current_char; } - if (current_char == 0x7) { - string[len] = '\0'; - switch (mode_char) { - case '0': - case '2': - fBuffer->SetTitle(string); + parsestate = groundtable; + break; + + case CASE_IL: + /* IL */ + if ((row = param[0]) < 1) + row = 1; + fBuffer->InsertLines(row); + parsestate = groundtable; + break; + + case CASE_DL: + /* DL */ + if ((row = param[0]) < 1) + row = 1; + fBuffer->DeleteLines(row); + parsestate = groundtable; + break; + + case CASE_DCH: + /* DCH */ + if ((row = param[0]) < 1) + row = 1; + fBuffer->DeleteChars(row); + parsestate = groundtable; + break; + + case CASE_SET: + /* SET */ + if (param[0] == 4) + fBuffer->SetInsertMode(MODE_INSERT); + parsestate = groundtable; + break; + + case CASE_RST: + /* RST */ + if (param[0] == 4) + fBuffer->SetInsertMode(MODE_OVER); + parsestate = groundtable; + break; + + case CASE_SGR: + /* SGR */ + for (row = 0; row < nparam; ++row) { + switch (param[row]) { + case DEFAULT: + case 0: /* Reset attribute */ + fAttr = 0; break; - case '1': + + case 1: + case 5: /* Bold */ + fAttr |= BOLD; + break; + + case 4: /* Underline */ + fAttr |= UNDERLINE; + break; + + case 7: /* Inverse */ + fAttr |= INVERSE; + break; + + case 22: /* Not Bold */ + fAttr &= ~BOLD; + break; + + case 24: /* Not Underline */ + fAttr &= ~UNDERLINE; + break; + + case 27: /* Not Inverse */ + fAttr &= ~INVERSE; + break; + + case 30: + case 31: + case 32: + case 33: + case 34: + case 35: + case 36: + case 37: + fAttr &= ~FORECOLOR; + fAttr |= FORECOLORED(param[row] - 30); + fAttr |= FORESET; + break; + + case 39: + fAttr &= ~FORESET; + break; + + case 40: + case 41: + case 42: + case 43: + case 44: + case 45: + case 46: + case 47: + fAttr &= ~BACKCOLOR; + fAttr |= BACKCOLORED(param[row] - 40); + fAttr |= BACKSET; + break; + + case 49: + fAttr &= ~BACKSET; break; } } parsestate = groundtable; break; + + case CASE_CPR: + // Q & D hack by Y.Hayakawa (hida@sawada.riec.tohoku.ac.jp) + // 21-JUL-99 + _DeviceStatusReport(param[0]); + parsestate = groundtable; + break; + + case CASE_DA1: + // DA - report device attributes + if (param[0] < 1) { + // claim to be a VT102 + write(fFd, "\033[?6c", 5); + } + parsestate = groundtable; + break; + + case CASE_DECSTBM: + /* DECSTBM - set scrolling region */ + + if ((top = param[0]) < 1) + top = 1; + + if (nparam < 2) + bottom = fBuffer->Height(); + else + bottom = param[1]; + + top--; + bottom--; + + if (bottom > top) + fBuffer->SetScrollRegion(top, bottom); + + parsestate = groundtable; + break; + + case CASE_DECREQTPARM: + // DEXREQTPARM - request terminal parameters + _DecReqTermParms(param[0]); + parsestate = groundtable; + break; + + case CASE_DECSET: + /* DECSET */ + for (int i = 0; i < nparam; i++) + _DecPrivateModeSet(param[i]); + parsestate = groundtable; + break; + + case CASE_DECRST: + /* DECRST */ + for (int i = 0; i < nparam; i++) + _DecPrivateModeReset(param[i]); + parsestate = groundtable; + break; + + case CASE_DECALN: + /* DECALN */ + fBuffer->FillScreen(UTF8Char('E'), 1, 0); + parsestate = groundtable; + break; + + // case CASE_GSETS: + // screen->gsets[scstype] = GSET(c) | cs96; + // parsestate = groundtable; + // break; + + case CASE_DECSC: + /* DECSC */ + _DecSaveCursor(); + parsestate = groundtable; + break; + + case CASE_DECRC: + /* DECRC */ + _DecRestoreCursor(); + parsestate = groundtable; + break; + + case CASE_HTS: + /* HTS */ + fBuffer->SetTabStop(fBuffer->Cursor().x); + parsestate = groundtable; + break; + + case CASE_TBC: + /* TBC */ + if (param[0] < 1) + fBuffer->ClearTabStop(fBuffer->Cursor().x); + else if (param[0] == 3) + fBuffer->ClearAllTabStops(); + parsestate = groundtable; + break; + + case CASE_RI: + /* RI */ + fBuffer->InsertRI(); + parsestate = groundtable; + break; + + case CASE_SS2: + /* SS2 */ + curess = c; + parsestate = groundtable; + break; + + case CASE_SS3: + /* SS3 */ + curess = c; + parsestate = groundtable; + break; + + case CASE_CSI_STATE: + /* enter csi state */ + nparam = 1; + param[0] = DEFAULT; + parsestate = gCsiTable; + break; + + case CASE_OSC: + { + /* Operating System Command: ESC ] */ + char string[512]; + uint32 len = 0; + uchar mode_char = _NextParseChar(); + if (mode_char != '0' + && mode_char != '1' + && mode_char != '2') { + parsestate = groundtable; + break; + } + uchar currentChar = _NextParseChar(); + while ((currentChar = _NextParseChar()) != 0x7) { + if (!isprint(currentChar & 0x7f) + || len+2 >= sizeof(string)) + break; + string[len++] = currentChar; + } + if (currentChar == 0x7) { + string[len] = '\0'; + switch (mode_char) { + case '0': + case '2': + fBuffer->SetTitle(string); + break; + case '1': + break; + } + } + parsestate = groundtable; + break; + } + + case CASE_RIS: // ESC c ... Reset terminal. + break; + + case CASE_LS2: + /* LS2 */ + // screen->curgl = 2; + parsestate = groundtable; + break; + + case CASE_LS3: + /* LS3 */ + // screen->curgl = 3; + parsestate = groundtable; + break; + + case CASE_LS3R: + /* LS3R */ + // screen->curgr = 3; + parsestate = groundtable; + break; + + case CASE_LS2R: + /* LS2R */ + // screen->curgr = 2; + parsestate = groundtable; + break; + + case CASE_LS1R: + /* LS1R */ + // screen->curgr = 1; + parsestate = groundtable; + break; + + case CASE_VPA: // ESC [...d move cursor absolute vertical + /* VPA (CV) */ + if ((row = param[0]) < 1) + row = 1; + + // note beterm wants it 1-based unlike usual terminals + fBuffer->SetCursorY(row - 1); + parsestate = groundtable; + break; + + case CASE_HPA: // ESC [...G move cursor absolute horizontal + /* HPA (CH) */ + if ((column = param[0]) < 1) + column = 1; + + // note beterm wants it 1-based unlike usual terminals + fBuffer->SetCursorX(column - 1); + parsestate = groundtable; + break; + + case CASE_SU: // scroll screen up + if ((row = param[0]) < 1) + row = 1; + fBuffer->ScrollBy(row); + parsestate = groundtable; + break; + + case CASE_SD: // scroll screen down + if ((row = param[0]) < 1) + row = 1; + fBuffer->ScrollBy(-row); + parsestate = groundtable; + break; + + + case CASE_ECH: // erase characters + if ((column = param[0]) < 1) + column = 1; + fBuffer->EraseChars(column); + parsestate = groundtable; + break; + + default: + break; } - - case CASE_RIS: // ESC c ... Reset terminal. - break; - - case CASE_LS2: - /* LS2 */ - // screen->curgl = 2; - parsestate = groundtable; - break; - - case CASE_LS3: - /* LS3 */ - // screen->curgl = 3; - parsestate = groundtable; - break; - - case CASE_LS3R: - /* LS3R */ - // screen->curgr = 3; - parsestate = groundtable; - break; - - case CASE_LS2R: - /* LS2R */ - // screen->curgr = 2; - parsestate = groundtable; - break; - - case CASE_LS1R: - /* LS1R */ - // screen->curgr = 1; - parsestate = groundtable; - break; - - case CASE_VPA: // ESC [...d move cursor absolute vertical - /* VPA (CV) */ - if ((row = param[0]) < 1) - row = 1; - - // note beterm wants it 1-based unlike usual terminals - fBuffer->SetCursorY(row - 1); - parsestate = groundtable; - break; - - case CASE_HPA: // ESC [...G move cursor absolute horizontal - /* HPA (CH) */ - if ((col = param[0]) < 1) - col = 1; - - // note beterm wants it 1-based unlike usual terminals - fBuffer->SetCursorX(col - 1); - parsestate = groundtable; - break; - - case CASE_SU: // scroll screen up - if ((row = param[0]) < 1) - row = 1; - fBuffer->ScrollBy(row); - parsestate = groundtable; - break; - - case CASE_SD: // scroll screen down - if ((row = param[0]) < 1) - row = 1; - fBuffer->ScrollBy(-row); - parsestate = groundtable; - break; - - - case CASE_ECH: // erase characters - if ((col = param[0]) < 1) - col = 1; - fBuffer->EraseChars(col); - parsestate = groundtable; - break; - - default: - break; + } catch (...) { + break; } } diff --git a/src/apps/terminal/TermParse.h b/src/apps/terminal/TermParse.h index a4bd40ec71..2f493ec423 100644 --- a/src/apps/terminal/TermParse.h +++ b/src/apps/terminal/TermParse.h @@ -56,14 +56,14 @@ public: status_t StopThreads(); private: - inline status_t _NextParseChar(uchar &c); + inline uchar _NextParseChar(); // Initialize TermParse and PtyReader thread. - status_t InitTermParse(); - status_t InitPtyReader(); + status_t _InitTermParse(); + status_t _InitPtyReader(); - void StopTermParse(); - void StopPtyReader(); + void _StopTermParse(); + void _StopPtyReader(); int32 EscParse(); int32 PtyReader(); diff --git a/src/apps/terminal/TermView.cpp b/src/apps/terminal/TermView.cpp index 8b5acfdb2c..bc9be240b5 100644 --- a/src/apps/terminal/TermView.cpp +++ b/src/apps/terminal/TermView.cpp @@ -48,7 +48,7 @@ #include #include -#include "CodeConv.h" +#include "Encoding.h" #include "InlineInput.h" #include "Shell.h" #include "TermConst.h" @@ -343,15 +343,15 @@ TermView::_InitObject(int32 argc, const char** argv) SetTermFont(be_fixed_font); - status_t status = fShell->Open(fRows, fColumns, + error = fShell->Open(fRows, fColumns, EncodingAsShortString(fEncoding), argc, argv); - if (status < B_OK) - return status; + if (error < B_OK) + return error; - status = _AttachShell(fShell); - if (status < B_OK) - return status; + error = _AttachShell(fShell); + if (error < B_OK) + return error; SetLowColor(fTextBackColor); SetViewColor(B_TRANSPARENT_32_BIT); @@ -1243,10 +1243,12 @@ TermView::KeyDown(const char *bytes, int32 numBytes) if (numBytes > 1) { if (fEncoding != M_UTF8) { char destBuffer[16]; - int cnum = CodeConv::ConvertFromInternal(bytes, numBytes, - (char *)destBuffer, fEncoding); + int32 destLen; + long state = 0; + convert_from_utf8(fEncoding, bytes, &numBytes, destBuffer, + &destLen, &state, '?'); _ScrollTo(0, true); - fShell->Write(destBuffer, cnum); + fShell->Write(destBuffer, destLen); return; } diff --git a/src/apps/terminal/UTF8WidthTbl.c b/src/apps/terminal/UTF8WidthTbl.c deleted file mode 100644 index a404c68f10..0000000000 --- a/src/apps/terminal/UTF8WidthTbl.c +++ /dev/null @@ -1,8234 +0,0 @@ -/* - * Copyright 2007 Haiku, Inc. - * Copyright (c) 2003-4 Kian Duffy - * Parts Copyright (C) 1998,99 Kazuho Okui and Takashi Murai. - * - * Permission is hereby granted, free of charge, to any person obtaining - * a copy of this software and associated documentation files or portions - * thereof (the "Software"), to deal in the Software without restriction, - * including without limitation the rights to use, copy, modify, merge, - * publish, distribute, sublicense, and/or sell copies of the Software, - * and to permit persons to whom the Software is furnished to do so, subject - * to the following conditions: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright notice - * in the binary, as well as this list of conditions and the following - * disclaimer in the documentation and/or other materials provided with - * the distribution. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -#ifndef __UTF8WIDTHTBL_H -#define __UTF8WIDTHTBL_H - -#include - -uchar gUTF8WidthTable[] = -{ -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, -48, -1, -128, -64, -48, -0, -0, -0, -15, -128, -0, -0, -0, -0, -0, -0, -0, -0, -0, -7, -255, -248, -0, -0, -4, -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, -112, -128, -32, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -16, -0, -154, -204, -199, -0, -180, -16, -8, -0, -0, -0, -0, -0, -8, -1, -120, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -20, -64, -16, -0, -98, -16, -0, -0, -0, -0, -24, -30, -255, -240, -255, -192, -0, -0, -255, -192, -0, -0, -0, -0, -0, -0, -40, -0, -0, -0, -0, -0, -177, -145, -96, -39, -133, -250, -15, -12, -0, -136, -32, -0, -207, -51, -0, -0, -51, -0, -4, -64, -4, -0, -0, -1, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -32, -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, -255, -255, -255, -255, -64, -0, -0, -0, -0, -0, -0, -0, -255, -254, -15, -255, -255, -255, -255, -255, -255, -255, -252, -0, -0, -0, -255, -255, -255, -192, -0, -0, -255, -255, -255, -255, -255, -255, -255, -255, -255, -240, -128, -2, -64, -39, -240, -0, -127, -255, -44, -0, -223, -192, -51, -12, -195, -147, -192, -0, -60, -1, -0, -0, -6, -3, -0, -10, -0, -0, -0, -0, -160, -0, -0, -0, -221, -237, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -16, -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, -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, -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, -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, -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, -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, -247, -255, -255, -14, -127, -192, -0, -0, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -240, -30, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -30, -7, -255, -255, -255, -255, -192, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -255, -255, -255, -248, -255, -192, -0, -0, -0, -0, -0, -0, -255, -255, -255, -241, -0, -0, -0, -0, -16, -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, -248, -255, -255, -255, -255, -255, -255, -255, -255, -227, -246, -156, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -253, -255, -255, -255, -255, -255, -254, -255, -255, -223, -255, -239, -242, -244, -223, -67, -255, -255, -255, -255, -255, -223, -255, -123, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -175, -191, -255, -255, -255, -255, -255, -255, -253, -127, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -254, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -250, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -245, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -222, -255, -255, -255, -223, -254, -253, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -255, -253, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -191, -255, -63, -239, -255, -255, -255, -247, -252, -255, -255, -255, -255, -255, -255, -253, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -255, -255, -255, -255, -255, -239, -255, -239, -255, -255, -255, -255, -255, -255, -255, -248, -187, -127, -255, -255, -255, -255, -255, -255, -255, -174, -7, -191, -255, -255, -255, -255, -255, -255, -255, -87, -255, -255, -255, -255, -255, -249, -55, -255, -255, -255, -255, -223, -27, -255, -255, -255, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -159, -255, -183, -255, -127, -31, -247, -255, -249, -255, -255, -255, -255, -255, -255, -255, -255, -191, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -255, -254, -191, -255, -255, -255, -254, -255, -255, -255, -255, -255, -255, -254, -205, -255, -255, -255, -255, -255, -220, -255, -255, -255, -255, -253, -255, -255, -255, -255, -255, -239, -255, -255, -253, -255, -255, -239, -255, -255, -255, -219, -255, -127, -255, -255, -191, -253, -255, -255, -255, -239, -255, -251, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -255, -255, -255, -255, -251, -255, -255, -255, -255, -175, -255, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -251, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -191, -255, -255, -255, -239, -255, -254, -255, -255, -255, -222, -255, -239, -255, -255, -255, -255, -255, -255, -255, -207, -255, -255, -255, -238, -255, -255, -255, -243, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -251, -255, -255, -253, -255, -255, -251, -255, -253, -254, -255, -255, -255, -255, -255, -211, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -251, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -247, -255, -251, -255, -255, -247, -251, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -127, -255, -255, -255, -255, -247, -223, -255, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -125, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -251, -255, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -239, -255, -255, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -253, -255, -255, -255, -255, -255, -255, -255, -119, -255, -255, -255, -255, -255, -255, -255, -255, -255, -253, -191, -255, -255, -255, -255, -255, -255, -255, -231, -231, -255, -255, -255, -255, -255, -255, -255, -255, -191, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -253, -255, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -191, -255, -255, -253, -254, -255, -255, -255, -255, -191, -255, -127, -255, -251, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -255, -223, -255, -191, -255, -251, -255, -127, -255, -255, -255, -255, -255, -254, -255, -255, -255, -255, -255, -255, -255, -247, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -253, -251, -127, -255, -255, -255, -255, -255, -255, -255, -255, -221, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -248, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -251, -255, -167, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -231, -255, -255, -255, -255, -255, -255, -255, -255, -255, -215, -255, -255, -255, -255, -255, -255, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -255, -242, -207, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -253, -255, -250, -255, -255, -249, -251, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -243, -255, -255, -253, -255, -255, -255, -255, -253, -255, -255, -255, -255, -255, -127, -255, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -183, -123, -255, -255, -255, -255, -255, -255, -255, -255, -255, -219, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -182, -207, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -55, -255, -255, -255, -255, -255, -255, -255, -255, -255, -171, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -249, -255, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -253, -255, -255, -255, -254, -255, -255, -255, -255, -251, -223, -255, -255, -255, -255, -159, -255, -255, -191, -255, -168, -127, -255, -255, -255, -255, -255, -184, -255, -255, -255, -253, -255, -255, -255, -247, -255, -255, -255, -255, -249, -255, -255, -252, -255, -255, -253, -255, -127, -255, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -254, -127, -255, -255, -247, -255, -255, -255, -255, -255, -255, -159, -255, -255, -191, -255, -255, -255, -255, -255, -255, -254, -127, -255, -255, -253, -223, -255, -255, -255, -254, -239, -255, -255, -255, -255, -255, -255, -255, -127, -255, -251, -255, -255, -247, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -251, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -253, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -251, -253, -255, -238, -255, -255, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -253, -255, -239, -255, -255, -255, -255, -255, -255, -111, -255, -255, -255, -255, -255, -255, -255, -255, -255, -175, -255, -255, -255, -251, -191, -255, -231, -15, -255, -255, -235, -255, -255, -255, -255, -255, -255, -255, -252, -255, -255, -255, -254, -127, -255, -253, -255, -255, -239, -255, -255, -255, -223, -255, -237, -255, -239, -249, -255, -255, -255, -255, -255, -255, -253, -255, -255, -191, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -253, -255, -255, -255, -255, -243, -255, -255, -255, -255, -255, -223, -253, -255, -255, -255, -255, -255, -253, -255, -255, -254, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -255, -255, -255, -183, -255, -255, -255, -246, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -254, -255, -255, -255, -255, -255, -255, -255, -254, -223, -255, -223, -253, -255, -255, -255, -127, -255, -255, -255, -255, -255, -255, -255, -183, -255, -255, -255, -255, -255, -255, -255, -255, -255, -191, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -231, -255, -255, -255, -255, -255, -252, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -253, -247, -231, -255, -255, -253, -255, -247, -247, -255, -191, -255, -223, -127, -253, -255, -255, -255, -255, -127, -191, -253, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -159, -255, -255, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -191, -255, -239, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -255, -254, -255, -255, -255, -253, -127, -255, -255, -255, -255, -255, -255, -255, -255, -251, -255, -253, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -123, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -255, -79, -255, -255, -255, -255, -255, -255, -255, -255, -187, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -221, -191, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -253, -159, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -251, -255, -255, -255, -247, -255, -255, -255, -254, -255, -243, -255, -255, -255, -255, -255, -223, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -223, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -249, -191, -255, -255, -255, -254, -255, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -127, -255, -255, -255, -255, -255, -252, -255, -255, -255, -255, -254, -255, -255, -254, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -255, -243, -255, -255, -127, -255, -255, -119, -255, -255, -255, -255, -255, -255, -127, -239, -251, -255, -255, -255, -255, -255, -255, -191, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -254, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -239, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -191, -239, -254, -255, -127, -255, -255, -223, -255, -255, -255, -191, -255, -253, -255, -255, -255, -255, -255, -255, -223, -255, -255, -253, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -247, -255, -127, -127, -255, -255, -255, -255, -255, -158, -254, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -255, -255, -253, -255, -255, -253, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -253, -255, -249, -127, -255, -255, -255, -255, -255, -255, -247, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -127, -247, -223, -255, -255, -223, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -247, -253, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -255, -255, -255, -223, -255, -255, -255, -255, -191, -207, -255, -255, -255, -255, -255, -255, -255, -255, -239, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -255, -255, -243, -255, -255, -255, -255, -255, -255, -255, -255, -250, -31, -255, -255, -255, -255, -255, -255, -255, -248, -255, -255, -255, -255, -255, -255, -240, -255, -255, -255, -255, -255, -254, -31, -255, -255, -255, -255, -255, -197, -255, -255, -255, -255, -255, -255, -255, -252, -255, -255, -255, -255, -255, -189, -127, -255, -255, -255, -255, -254, -254, -231, -223, -253, -255, -255, -239, -255, -255, -255, -247, -126, -255, -239, -251, -239, -111, -251, -223, -127, -253, -243, -255, -255, -255, -254, -255, -255, -223, -255, -255, -255, -252, -255, -255, -254, -247, -255, -254, -254, -255, -239, -111, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -239, -255, -243, -247, -255, -255, -255, -251, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -237, -219, -191, -239, -255, -255, -255, -255, -254, -116, -255, -127, -255, -255, -255, -255, -252, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -213, -255, -239, -45, -207, -181, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -223, -255, -239, -185, -243, -191, -253, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -251, -255, -255, -253, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -249, -103, -150, -236, -59, -255, -214, -255, -188, -31, -63, -159, -207, -39, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -191, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -246, -253, -119, -231, -127, -251, -69, -186, -27, -252, -215, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -191, -255, -255, -255, -255, -247, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -159, -255, -255, -255, -252, -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, -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, -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, -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, -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, -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, -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, -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, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -201, -224, -255, -124, -136, -13, -192, -200, -128, -20, -8, -136, -0, -0, -201, -160, -222, -120, -136, -13, -192, -233, -128, -220, -72, -136, -5, -0, -201, -169, -214, -12, -138, -13, -64, -136, -128, -76, -12, -136, -13, -64, -136, -128, -80, -12, -158, -29, -96, -200, -128, -12, -8, -0, -1, -0, -200, -128, -208, -8, -136, -0, -0, -201, -192, -212, -8, -0, -0, -0, -201, -160, -214, -46, -138, -13, -196, -200, -128, -220, -12, -8, -0, -0, -0, -0, -0, -14, -136, -13, -192, -200, -0, -148, -8, -136, -1, -132, -128, -0, -0, -12, -168, -13, -112, -192, -128, -12, -12, -0, -0, -64, -136, -128, -196, -8, -0, -0, -0, -200, -129, -214, -8, -8, -0, -192, -200, -128, -200, -8, -136, -12, -0, -128, -0, -0, -12, -170, -29, -68, -0, -0, -0, -12, -136, -13, -64, -233, -224, -223, -92, -136, -13, -192, -200, -128, -132, -0, -0, -0, -0, -216, -176, -220, -28, -136, -13, -192, -200, -128, -204, -136, -128, -0, -0, -200, -160, -212, -56, -136, -0, -128, -0, -0, -0, -8, -136, -13, -0, -200, -128, -84, -12, -152, -13, -64, -128, -0, -8, -8, -0, -0, -0, -136, -128, -192, -12, -8, -12, -64, -200, -224, -214, -40, -136, -0, -0, -200, -160, -212, -46, -159, -29, -241, -200, -128, -220, -8, -0, -0, -0, -0, -0, -0, -14, -155, -13, -82, -200, -128, -220, -8, -136, -0, -192, -136, -0, -0, -12, -154, -141, -84, -136, -128, -0, -8, -0, -0, -128, -136, -128, -208, -8, -0, -0, -0, -200, -128, -212, -8, -0, -0, -128, -128, -0, -4, -8, -136, -5, -64, -136, -128, -132, -12, -154, -13, -64, -128, -0, -0, -12, -152, -13, -224, -200, -128, -220, -28, -136, -13, -192, -0, -0, -0, -0, -0, -0, -0, -200, -176, -220, -28, -136, -13, -192, -128, -0, -8, -0, -0, -0, -0, -200, -128, -4, -8, -8, -0, -0, -128, -0, -0, -8, -128, -0, -0, -0, -0, -0, -12, -136, -24, -64, -0, -0, -0, -8, -0, -0, -0, -136, -128, -196, -0, -0, -0, -0, -201, -128, -208, -8, -136, -12, -0, -136, -128, -212, -12, -136, -13, -227, -200, -128, -220, -12, -128, -1, -64, -0, -0, -0, -12, -136, -13, -193, -200, -128, -212, -12, -136, -13, -192, -136, -0, -80, -12, -136, -13, -64, -136, -0, -4, -0, -0, -0, -128, -136, -128, -212, -8, -136, -5, -64, -200, -128, -212, -8, -0, -0, -128, -128, -0, -0, -12, -136, -9, -64, -200, -128, -212, -12, -136, -13, -102, -0, -0, -0, -12, -136, -13, -64, -203, -224, -214, -92, -136, -13, -224, -192, -128, -4, -0, -0, -0, -0, -200, -160, -214, -28, -136, -13, -192, -200, -128, -29, -8, -0, -0, -0, -216, -160, -212, -8, -128, -0, -192, -0, -0, -0, -8, -136, -5, -64, -136, -128, -80, -14, -158, -13, -69, -136, -128, -80, -8, -0, -0, -0, -136, -128, -0, -8, -136, -9, -0, -136, -128, -144, -0, -0, -0, -0, -201, -160, -221, -79, -159, -13, -68, -200, -128, -220, -76, -128, -4, -0, -0, -0, -0, -12, -154, -13, -96, -201, -128, -220, -12, -136, -5, -196, -136, -0, -0, -14, -136, -13, -64, -136, -0, -8, -8, -0, -0, -128, -200, -128, -192, -8, -128, -0, -0, -201, -224, -212, -104, -8, -0, -128, -128, -0, -0, -12, -136, -0, -64, -136, -128, -148, -12, -136, -13, -0, -0, -0, -0, -12, -138, -13, -112, -200, -160, -220, -28, -136, -13, -192, -192, -0, -128, -0, -0, -0, -0, -201, -128, -156, -8, -0, -0, -64, -192, -0, -220, -0, -0, -0, -0, -200, -128, -196, -0, -0, -0, -0, -0, -0, -0, -8, -0, -0, -0, -128, -0, -4, -12, -136, -9, -64, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -8, -0, -0, -64, -136, -128, -192, -0, -0, -0, -0, -200, -128, -212, -13, -158, -13, -196, -200, -128, -220, -12, -136, -13, -64, -136, -128, -132, -15, -155, -13, -194, -200, -128, -220, -12, -136, -13, -192, -136, -128, -4, -14, -138, -13, -68, -200, -128, -4, -8, -136, -9, -128, -136, -128, -208, -12, -136, -13, -64, -201, -128, -213, -104, -0, -0, -128, -200, -128, -132, -12, -136, -13, -64, -192, -128, -148, -12, -140, -13, -64, -0, -0, -0, -12, -152, -29, -66, -216, -128, -204, -28, -136, -12, -192, -0, -0, -4, -0, -0, -0, -0, -200, -160, -204, -8, -136, -0, -0, -0, -0, -0, -0, -128, -0, -0, -201, -160, -196, -12, -128, -0, -128, -128, -0, -8, -8, -136, -12, -0, -128, -0, -0, -12, -136, -12, -64, -128, -0, -8, -8, -0, -0, -0, -136, -0, -0, -0, -0, -0, -64, -200, -161, -192, -8, -136, -8, -0, -200, -128, -212, -12, -238, -29, -198, -200, -128, -220, -12, -137, -13, -69, -136, -128, -64, -12, -222, -15, -234, -200, -128, -212, -14, -139, -15, -199, -136, -128, -216, -12, -142, -157, -80, -200, -128, -220, -12, -128, -9, -64, -200, -128, -212, -12, -136, -13, -64, -200, -224, -212, -12, -136, -12, -192, -200, -128, -196, -12, -136, -13, -64, -200, -128, -213, -12, -136, -45, -127, -136, -128, -144, -12, -142, -29, -226, -203, -160, -222, -12, -136, -13, -192, -202, -128, -132, -8, -136, -0, -0, -200, -160, -214, -12, -136, -13, -64, -136, -128, -204, -8, -0, -0, -0, -200, -160, -215, -28, -8, -5, -64, -128, -0, -12, -8, -136, -13, -64, -200, -0, -4, -12, -142, -13, -64, -128, -0, -8, -8, -0, -0, -0, -200, -128, -208, -8, -136, -8, -0, -200, -128, -212, -0, -0, -0, -0, -201, -160, -214, -108, -169, -13, -192, -200, -128, -220, -8, -128, -0, -64, -0, -0, -0, -12, -136, -13, -192, -128, -0, -4, -8, -0, -0, -128, -0, -0, -0, -12, -136, -13, -80, -192, -128, -8, -8, -0, -0, -128, -136, -128, -192, -0, -0, -0, -64, -200, -128, -196, -8, -0, -0, -192, -0, -0, -0, -8, -0, -0, -0, -128, -0, -0, -8, -0, -9, -64, -0, -0, -0, -12, -136, -12, -97, -202, -128, -222, -12, -136, -13, -192, -138, -128, -132, -0, -0, -0, -0, -200, -128, -220, -12, -136, -13, -64, -136, -0, -8, -8, -128, -0, -64, -200, -128, -212, -8, -136, -0, -64, -0, -0, -0, -8, -136, -13, -64, -128, -0, -128, -12, -136, -13, -64, -128, -0, -8, -8, -128, -0, -0, -136, -128, -212, -8, -136, -8, -64, -200, -128, -212, -0, -0, -0, -0, -201, -192, -212, -12, -136, -13, -64, -200, -128, -220, -12, -0, -0, -64, -0, -0, -0, -12, -152, -13, -192, -200, -128, -212, -8, -136, -13, -192, -128, -0, -0, -12, -136, -13, -64, -200, -128, -132, -8, -0, -0, -64, -128, -128, -0, -8, -0, -0, -0, -200, -128, -212, -8, -136, -0, -64, -128, -0, -4, -12, -136, -13, -64, -136, -128, -128, -12, -136, -12, -64, -0, -0, -0, -12, -136, -13, -64, -200, -192, -220, -12, -136, -13, -192, -128, -0, -4, -0, -0, -0, -0, -200, -160, -220, -12, -136, -13, -64, -136, -0, -8, -8, -128, -0, -0, -200, -128, -212, -40, -128, -0, -0, -128, -0, -0, -8, -128, -1, -64, -128, -0, -0, -12, -136, -13, -64, -128, -0, -8, -8, -0, -0, -0, -200, -128, -196, -8, -136, -8, -64, -201, -160, -208, -8, -136, -12, -0, -200, -128, -212, -14, -138, -13, -196, -200, -128, -220, -12, -0, -0, -0, -0, -0, -0, -12, -136, -13, -192, -200, -128, -212, -8, -136, -12, -192, -128, -128, -80, -12, -136, -13, -64, -128, -0, -4, -0, -0, -0, -0, -136, -0, -0, -8, -136, -5, -0, -201, -160, -212, -8, -0, -0, -64, -0, -0, -0, -8, -136, -9, -0, -136, -128, -148, -8, -136, -13, -0, -0, -0, -0, -12, -136, -13, -64, -200, -132, -212, -12, -136, -13, -192, -128, -0, -4, -0, -0, -0, -0, -200, -160, -212, -12, -136, -13, -64, -200, -128, -220, -8, -136, -4, -0, -200, -132, -212, -76, -136, -1, -64, -200, -0, -20, -12, -136, -5, -64, -136, -128, -80, -12, -136, -73, -64, -136, -128, -132, -12, -136, -0, -64, -200, -128, -212, -12, -136, -9, -64, -203, -192, -212, -72, -136, -12, -64, -200, -128, -212, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -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, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -240, -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, -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, -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, -231, -255, -248, -126, -239, -127, -254, -240, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -127, -255, -255, -255, -255, -255, -255, -255, -255, -255, -255, -254, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -0, -246, -0, -0, -0, -}; - -#endif // __UTF8WIDTHTBL_H -