Mozilla/mozilla/js2/src/strings.cpp
rginda%netscape.com 0d19733052 initial checkin for source reorg. leaf copied mozilla/js/js2 to mozilla/js2/src, mozilla/js/js2/jsc to mozilla/js2/jsc, mozilla/js/js2/tools to mozilla/js2/tools, and mozilla/js/semantics to mozilla/js2/semantics
unix now has an autoconf based make system.  currently the new make system only makes parser related files, back end stuff to be added soon.

mac and windows makesystems will be checked in next.

parser.cpp has been factored into token.*, lexer.*, and parser.*
utilities.cpp has been factored into formatter.*, exception.*, mem.*, strings.*,ds.h, stlcfg.h, and algo.h


git-svn-id: svn://10.0.0.236/trunk@86568 18797224-902f-48f8-a5cc-f745e15eee43
2001-02-07 21:21:22 +00:00

1467 lines
76 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express oqr
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is the JavaScript 2 Prototype.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the
* terms of the GNU Public License (the "GPL"), in which case the
* provisions of the GPL are applicable instead of those above.
* If you wish to allow use of your version of this file only
* under the terms of the GPL and not to allow others to use your
* version of this file under the NPL, indicate your decision by
* deleting the provisions above and replace them with the notice
* and other provisions required by the GPL. If you do not delete
* the provisions above, a recipient may use your version of this
* file under either the NPL or the GPL.
*/
#include <algorithm>
#include "strings.h"
namespace JavaScript
{
//
// Unicode UTF-16 characters and strings
//
#ifdef _WIN32 // Microsoft VC6 bug: String constructor and append limited to
// char16 iterators
// Return a String containing the characters of the null-terminated C string cstr
// (without the trailing null).
String
widenCString(const char *cstr)
{
size_t len = strlen(cstr);
String s(len, uni::null);
std::transform(cstr, cstr+len, s.begin(), widen);
return s;
}
// Widen and append length characters starting at chars to the end of str.
void
appendChars(String &str, const char *chars, size_t length)
{
String::size_type strLen = str.size();
str.append(length, uni::null);
std::transform(chars, chars+length, str.begin()+strLen, widen);
}
// Widen and insert length characters starting at chars into the given position
// of str.
void
insertChars(String &str, String::size_type pos, const char *chars,
size_t length)
{
str.insert(pos, length, uni::null);
std::transform(chars, chars+length, str.begin()+pos, widen);
}
#endif
// Widen and insert the null-terminated string cstr into the given position of
// str.
void
insertChars(String &str, String::size_type pos, const char *cstr)
{
insertChars(str, pos, cstr, strlen(cstr));
}
// Widen and append the null-terminated string cstr to the end of str.
// Return str.
String &
operator+=(String &str, const char *cstr)
{
appendChars(str, cstr, strlen(cstr));
return str;
}
// Return the concatenation of str and the null-terminated string cstr.
String
operator+(const String &str, const char *cstr)
{
return str + widenCString(cstr);
}
// Return the concatenation of the null-terminated string cstr and str.
String
operator+(const char *cstr, const String &str)
{
String s = widenCString(cstr);
s += str;
return s;
}
// From java.lang.Character:
//
// The character properties are currently encoded into 32 bits in the
// following manner:
//
// 10 bits signed offset used for converting case
// 1 bit if 1, adding the signed offset converts the character to
// lowercase
// 1 bit if 1, subtracting the signed offset converts the character to
// uppercase
// 1 bit if 1, character has a titlecase equivalent (possibly itself)
// 3 bits 0 May not be part of an identifier
// 1 Format control
// 2 May start or continue a JS identifier (includes $ and _)
// 3 May continue a JS identifier
// 4 Behaves like a white space character (but not line break)
// 5 Behaves like a line break character
// 2 bits 0 this character has no numeric property
// 1 adding the digit offset to the character code and then
// masking with 0x1F will produce the desired numeric value
// 2 this character has a "strange" numeric value
// 3 a JS supradecimal digit: adding the digit offset to the
// character code, then masking with 0x1F, then adding 10
// will produce the desired numeric value
// 5 bits digit offset
// 4 bits reserved for future use
// 5 bits character type
// The X table has 1024 entries for a total of 1024 bytes.
const uint8 CharInfo::x[] = {
0, 1, 2, 3, 4, 5, 6, 7, // 0x0000
8, 9, 10, 11, 12, 13, 14, 15, // 0x0200
16, 17, 18, 19, 20, 21, 22, 23, // 0x0400
24, 25, 26, 27, 28, 28, 28, 28, // 0x0600
28, 28, 28, 28, 29, 30, 31, 32, // 0x0800
33, 34, 35, 36, 37, 38, 39, 40, // 0x0A00
41, 42, 43, 44, 45, 46, 28, 28, // 0x0C00
47, 48, 49, 50, 51, 52, 53, 28, // 0x0E00
28, 28, 54, 55, 56, 57, 58, 59, // 0x1000
28, 28, 28, 28, 28, 28, 28, 28, // 0x1200
28, 28, 28, 28, 28, 28, 28, 28, // 0x1400
28, 28, 28, 28, 28, 28, 28, 28, // 0x1600
28, 28, 28, 28, 28, 28, 28, 28, // 0x1800
28, 28, 28, 28, 28, 28, 28, 28, // 0x1A00
28, 28, 28, 28, 28, 28, 28, 28, // 0x1C00
60, 60, 61, 62, 63, 64, 65, 66, // 0x1E00
67, 68, 69, 70, 71, 72, 73, 74, // 0x2000
75, 75, 75, 76, 77, 78, 28, 28, // 0x2200
79, 80, 81, 82, 83, 83, 84, 85, // 0x2400
86, 85, 28, 28, 87, 88, 89, 28, // 0x2600
28, 28, 28, 28, 28, 28, 28, 28, // 0x2800
28, 28, 28, 28, 28, 28, 28, 28, // 0x2A00
28, 28, 28, 28, 28, 28, 28, 28, // 0x2C00
28, 28, 28, 28, 28, 28, 28, 28, // 0x2E00
90, 91, 92, 93, 94, 56, 95, 28, // 0x3000
96, 97, 98, 99, 83, 100, 83, 101, // 0x3200
28, 28, 28, 28, 28, 28, 28, 28, // 0x3400
28, 28, 28, 28, 28, 28, 28, 28, // 0x3600
28, 28, 28, 28, 28, 28, 28, 28, // 0x3800
28, 28, 28, 28, 28, 28, 28, 28, // 0x3A00
28, 28, 28, 28, 28, 28, 28, 28, // 0x3C00
28, 28, 28, 28, 28, 28, 28, 28, // 0x3E00
28, 28, 28, 28, 28, 28, 28, 28, // 0x4000
28, 28, 28, 28, 28, 28, 28, 28, // 0x4200
28, 28, 28, 28, 28, 28, 28, 28, // 0x4400
28, 28, 28, 28, 28, 28, 28, 28, // 0x4600
28, 28, 28, 28, 28, 28, 28, 28, // 0x4800
28, 28, 28, 28, 28, 28, 28, 28, // 0x4A00
28, 28, 28, 28, 28, 28, 28, 28, // 0x4C00
56, 56, 56, 56, 56, 56, 56, 56, // 0x4E00
56, 56, 56, 56, 56, 56, 56, 56, // 0x5000
56, 56, 56, 56, 56, 56, 56, 56, // 0x5200
56, 56, 56, 56, 56, 56, 56, 56, // 0x5400
56, 56, 56, 56, 56, 56, 56, 56, // 0x5600
56, 56, 56, 56, 56, 56, 56, 56, // 0x5800
56, 56, 56, 56, 56, 56, 56, 56, // 0x5A00
56, 56, 56, 56, 56, 56, 56, 56, // 0x5C00
56, 56, 56, 56, 56, 56, 56, 56, // 0x5E00
56, 56, 56, 56, 56, 56, 56, 56, // 0x6000
56, 56, 56, 56, 56, 56, 56, 56, // 0x6200
56, 56, 56, 56, 56, 56, 56, 56, // 0x6400
56, 56, 56, 56, 56, 56, 56, 56, // 0x6600
56, 56, 56, 56, 56, 56, 56, 56, // 0x6800
56, 56, 56, 56, 56, 56, 56, 56, // 0x6A00
56, 56, 56, 56, 56, 56, 56, 56, // 0x6C00
56, 56, 56, 56, 56, 56, 56, 56, // 0x6E00
56, 56, 56, 56, 56, 56, 56, 56, // 0x7000
56, 56, 56, 56, 56, 56, 56, 56, // 0x7200
56, 56, 56, 56, 56, 56, 56, 56, // 0x7400
56, 56, 56, 56, 56, 56, 56, 56, // 0x7600
56, 56, 56, 56, 56, 56, 56, 56, // 0x7800
56, 56, 56, 56, 56, 56, 56, 56, // 0x7A00
56, 56, 56, 56, 56, 56, 56, 56, // 0x7C00
56, 56, 56, 56, 56, 56, 56, 56, // 0x7E00
56, 56, 56, 56, 56, 56, 56, 56, // 0x8000
56, 56, 56, 56, 56, 56, 56, 56, // 0x8200
56, 56, 56, 56, 56, 56, 56, 56, // 0x8400
56, 56, 56, 56, 56, 56, 56, 56, // 0x8600
56, 56, 56, 56, 56, 56, 56, 56, // 0x8800
56, 56, 56, 56, 56, 56, 56, 56, // 0x8A00
56, 56, 56, 56, 56, 56, 56, 56, // 0x8C00
56, 56, 56, 56, 56, 56, 56, 56, // 0x8E00
56, 56, 56, 56, 56, 56, 56, 56, // 0x9000
56, 56, 56, 56, 56, 56, 56, 56, // 0x9200
56, 56, 56, 56, 56, 56, 56, 56, // 0x9400
56, 56, 56, 56, 56, 56, 56, 56, // 0x9600
56, 56, 56, 56, 56, 56, 56, 56, // 0x9800
56, 56, 56, 56, 56, 56, 56, 56, // 0x9A00
56, 56, 56, 56, 56, 56, 56, 56, // 0x9C00
56, 56, 56, 56, 56, 56, 102, 28, // 0x9E00
28, 28, 28, 28, 28, 28, 28, 28, // 0xA000
28, 28, 28, 28, 28, 28, 28, 28, // 0xA200
28, 28, 28, 28, 28, 28, 28, 28, // 0xA400
28, 28, 28, 28, 28, 28, 28, 28, // 0xA600
28, 28, 28, 28, 28, 28, 28, 28, // 0xA800
28, 28, 28, 28, 28, 28, 28, 28, // 0xAA00
56, 56, 56, 56, 56, 56, 56, 56, // 0xAC00
56, 56, 56, 56, 56, 56, 56, 56, // 0xAE00
56, 56, 56, 56, 56, 56, 56, 56, // 0xB000
56, 56, 56, 56, 56, 56, 56, 56, // 0xB200
56, 56, 56, 56, 56, 56, 56, 56, // 0xB400
56, 56, 56, 56, 56, 56, 56, 56, // 0xB600
56, 56, 56, 56, 56, 56, 56, 56, // 0xB800
56, 56, 56, 56, 56, 56, 56, 56, // 0xBA00
56, 56, 56, 56, 56, 56, 56, 56, // 0xBC00
56, 56, 56, 56, 56, 56, 56, 56, // 0xBE00
56, 56, 56, 56, 56, 56, 56, 56, // 0xC000
56, 56, 56, 56, 56, 56, 56, 56, // 0xC200
56, 56, 56, 56, 56, 56, 56, 56, // 0xC400
56, 56, 56, 56, 56, 56, 56, 56, // 0xC600
56, 56, 56, 56, 56, 56, 56, 56, // 0xC800
56, 56, 56, 56, 56, 56, 56, 56, // 0xCA00
56, 56, 56, 56, 56, 56, 56, 56, // 0xCC00
56, 56, 56, 56, 56, 56, 56, 56, // 0xCE00
56, 56, 56, 56, 56, 56, 56, 56, // 0xD000
56, 56, 56, 56, 56, 56, 56, 56, // 0xD200
56, 56, 56, 56, 56, 56, 56, 56, // 0xD400
56, 56, 56, 56, 56, 56, 103, 28, // 0xD600
104, 104, 104, 104, 104, 104, 104, 104, // 0xD800
104, 104, 104, 104, 104, 104, 104, 104, // 0xDA00
104, 104, 104, 104, 104, 104, 104, 104, // 0xDC00
104, 104, 104, 104, 104, 104, 104, 104, // 0xDE00
105, 105, 105, 105, 105, 105, 105, 105, // 0xE000
105, 105, 105, 105, 105, 105, 105, 105, // 0xE200
105, 105, 105, 105, 105, 105, 105, 105, // 0xE400
105, 105, 105, 105, 105, 105, 105, 105, // 0xE600
105, 105, 105, 105, 105, 105, 105, 105, // 0xE800
105, 105, 105, 105, 105, 105, 105, 105, // 0xEA00
105, 105, 105, 105, 105, 105, 105, 105, // 0xEC00
105, 105, 105, 105, 105, 105, 105, 105, // 0xEE00
105, 105, 105, 105, 105, 105, 105, 105, // 0xF000
105, 105, 105, 105, 105, 105, 105, 105, // 0xF200
105, 105, 105, 105, 105, 105, 105, 105, // 0xF400
105, 105, 105, 105, 105, 105, 105, 105, // 0xF600
105, 105, 105, 105, 56, 56, 56, 56, // 0xF800
106, 28, 28, 28, 107, 108, 109, 110, // 0xFA00
56, 56, 56, 56, 111, 112, 113, 114, // 0xFC00
115, 116, 56, 117, 118, 119, 120, 121 // 0xFE00
};
// The Y table has 7808 entries for a total of 7808 bytes.
const uint8 CharInfo::y[] = {
0, 0, 0, 0, 0, 0, 0, 0, // 0
0, 1, 14, 1, 1, 14, 0, 0, // 0
0, 0, 0, 0, 0, 0, 0, 0, // 0
0, 0, 0, 0, 0, 0, 0, 0, // 0
2, 3, 3, 3, 4, 3, 3, 3, // 0
5, 6, 3, 7, 3, 8, 3, 3, // 0
9, 9, 9, 9, 9, 9, 9, 9, // 0
9, 9, 3, 3, 7, 7, 7, 3, // 0
3, 10, 10, 10, 10, 10, 10, 10, // 1
10, 10, 10, 10, 10, 10, 10, 10, // 1
10, 10, 10, 10, 10, 10, 10, 10, // 1
10, 10, 10, 5, 3, 6, 11, 12, // 1
11, 13, 13, 13, 13, 13, 13, 13, // 1
13, 13, 13, 13, 13, 13, 13, 13, // 1
13, 13, 13, 13, 13, 13, 13, 13, // 1
13, 13, 13, 5, 7, 6, 7, 0, // 1
0, 0, 0, 0, 0, 0, 0, 0, // 2
0, 0, 0, 0, 0, 0, 0, 0, // 2
0, 0, 0, 0, 0, 0, 0, 0, // 2
0, 0, 0, 0, 0, 0, 0, 0, // 2
2, 3, 4, 4, 4, 4, 15, 15, // 2
11, 15, 16, 5, 7, 8, 15, 11, // 2
15, 7, 17, 17, 11, 16, 15, 3, // 2
11, 18, 16, 6, 19, 19, 19, 3, // 2
20, 20, 20, 20, 20, 20, 20, 20, // 3
20, 20, 20, 20, 20, 20, 20, 20, // 3
20, 20, 20, 20, 20, 20, 20, 7, // 3
20, 20, 20, 20, 20, 20, 20, 16, // 3
21, 21, 21, 21, 21, 21, 21, 21, // 3
21, 21, 21, 21, 21, 21, 21, 21, // 3
21, 21, 21, 21, 21, 21, 21, 7, // 3
21, 21, 21, 21, 21, 21, 21, 22, // 3
23, 24, 23, 24, 23, 24, 23, 24, // 4
23, 24, 23, 24, 23, 24, 23, 24, // 4
23, 24, 23, 24, 23, 24, 23, 24, // 4
23, 24, 23, 24, 23, 24, 23, 24, // 4
23, 24, 23, 24, 23, 24, 23, 24, // 4
23, 24, 23, 24, 23, 24, 23, 24, // 4
25, 26, 23, 24, 23, 24, 23, 24, // 4
16, 23, 24, 23, 24, 23, 24, 23, // 4
24, 23, 24, 23, 24, 23, 24, 23, // 5
24, 16, 23, 24, 23, 24, 23, 24, // 5
23, 24, 23, 24, 23, 24, 23, 24, // 5
23, 24, 23, 24, 23, 24, 23, 24, // 5
23, 24, 23, 24, 23, 24, 23, 24, // 5
23, 24, 23, 24, 23, 24, 23, 24, // 5
23, 24, 23, 24, 23, 24, 23, 24, // 5
27, 23, 24, 23, 24, 23, 24, 28, // 5
16, 29, 23, 24, 23, 24, 30, 23, // 6
24, 31, 31, 23, 24, 16, 32, 32, // 6
33, 23, 24, 31, 34, 16, 35, 36, // 6
23, 24, 16, 16, 35, 37, 16, 38, // 6
23, 24, 23, 24, 23, 24, 38, 23, // 6
24, 39, 40, 16, 23, 24, 39, 23, // 6
24, 41, 41, 23, 24, 23, 24, 42, // 6
23, 24, 16, 40, 23, 24, 40, 40, // 6
40, 40, 40, 40, 43, 44, 45, 43, // 7
44, 45, 43, 44, 45, 23, 24, 23, // 7
24, 23, 24, 23, 24, 23, 24, 23, // 7
24, 23, 24, 23, 24, 16, 23, 24, // 7
23, 24, 23, 24, 23, 24, 23, 24, // 7
23, 24, 23, 24, 23, 24, 23, 24, // 7
16, 43, 44, 45, 23, 24, 46, 46, // 7
46, 46, 23, 24, 23, 24, 23, 24, // 7
23, 24, 23, 24, 23, 24, 23, 24, // 8
23, 24, 23, 24, 23, 24, 23, 24, // 8
23, 24, 23, 24, 23, 24, 23, 24, // 8
46, 46, 46, 46, 46, 46, 46, 46, // 8
46, 46, 46, 46, 46, 46, 46, 46, // 8
46, 46, 46, 46, 46, 46, 46, 46, // 8
46, 46, 46, 46, 46, 46, 46, 46, // 8
46, 46, 46, 46, 46, 46, 46, 46, // 8
46, 46, 46, 46, 46, 46, 46, 46, // 9
46, 46, 46, 46, 46, 46, 46, 46, // 9
16, 16, 16, 47, 48, 16, 49, 49, // 9
50, 50, 16, 51, 16, 16, 16, 16, // 9
49, 16, 16, 52, 16, 16, 16, 16, // 9
53, 54, 16, 16, 16, 16, 16, 54, // 9
16, 16, 55, 16, 16, 16, 16, 16, // 9
16, 16, 16, 16, 16, 16, 16, 16, // 9
16, 16, 16, 56, 16, 16, 16, 16, // 10
56, 16, 57, 57, 16, 16, 16, 16, // 10
16, 16, 58, 16, 16, 16, 16, 16, // 10
16, 16, 16, 16, 16, 16, 16, 16, // 10
16, 16, 16, 16, 16, 16, 16, 16, // 10
16, 46, 46, 46, 46, 46, 46, 46, // 10
59, 59, 59, 59, 59, 59, 59, 59, // 10
59, 11, 11, 59, 59, 59, 59, 59, // 10
59, 59, 11, 11, 11, 11, 11, 11, // 11
11, 11, 11, 11, 11, 11, 11, 11, // 11
59, 59, 11, 11, 11, 11, 11, 11, // 11
11, 11, 11, 11, 11, 11, 11, 46, // 11
59, 59, 59, 59, 59, 11, 11, 11, // 11
11, 11, 46, 46, 46, 46, 46, 46, // 11
46, 46, 46, 46, 46, 46, 46, 46, // 11
46, 46, 46, 46, 46, 46, 46, 46, // 11
60, 60, 60, 60, 60, 60, 60, 60, // 12
60, 60, 60, 60, 60, 60, 60, 60, // 12
60, 60, 60, 60, 60, 60, 60, 60, // 12
60, 60, 60, 60, 60, 60, 60, 60, // 12
60, 60, 60, 60, 60, 60, 60, 60, // 12
60, 60, 60, 60, 60, 60, 60, 60, // 12
60, 60, 60, 60, 60, 60, 60, 60, // 12
60, 60, 60, 60, 60, 60, 60, 60, // 12
60, 60, 60, 60, 60, 60, 46, 46, // 13
46, 46, 46, 46, 46, 46, 46, 46, // 13
46, 46, 46, 46, 46, 46, 46, 46, // 13
46, 46, 46, 46, 46, 46, 46, 46, // 13
60, 60, 46, 46, 46, 46, 46, 46, // 13
46, 46, 46, 46, 46, 46, 46, 46, // 13
46, 46, 46, 46, 3, 3, 46, 46, // 13
46, 46, 59, 46, 46, 46, 3, 46, // 13
46, 46, 46, 46, 11, 11, 61, 3, // 14
62, 62, 62, 46, 63, 46, 64, 64, // 14
16, 20, 20, 20, 20, 20, 20, 20, // 14
20, 20, 20, 20, 20, 20, 20, 20, // 14
20, 20, 46, 20, 20, 20, 20, 20, // 14
20, 20, 20, 20, 65, 66, 66, 66, // 14
16, 21, 21, 21, 21, 21, 21, 21, // 14
21, 21, 21, 21, 21, 21, 21, 21, // 14
21, 21, 16, 21, 21, 21, 21, 21, // 15
21, 21, 21, 21, 67, 68, 68, 46, // 15
69, 70, 38, 38, 38, 71, 72, 46, // 15
46, 46, 38, 46, 38, 46, 38, 46, // 15
38, 46, 23, 24, 23, 24, 23, 24, // 15
23, 24, 23, 24, 23, 24, 23, 24, // 15
73, 74, 16, 40, 46, 46, 46, 46, // 15
46, 46, 46, 46, 46, 46, 46, 46, // 15
46, 75, 75, 75, 75, 75, 75, 75, // 16
75, 75, 75, 75, 75, 46, 75, 75, // 16
20, 20, 20, 20, 20, 20, 20, 20, // 16
20, 20, 20, 20, 20, 20, 20, 20, // 16
20, 20, 20, 20, 20, 20, 20, 20, // 16
20, 20, 20, 20, 20, 20, 20, 20, // 16
21, 21, 21, 21, 21, 21, 21, 21, // 16
21, 21, 21, 21, 21, 21, 21, 21, // 16
21, 21, 21, 21, 21, 21, 21, 21, // 17
21, 21, 21, 21, 21, 21, 21, 21, // 17
46, 74, 74, 74, 74, 74, 74, 74, // 17
74, 74, 74, 74, 74, 46, 74, 74, // 17
23, 24, 23, 24, 23, 24, 23, 24, // 17
23, 24, 23, 24, 23, 24, 23, 24, // 17
23, 24, 23, 24, 23, 24, 23, 24, // 17
23, 24, 23, 24, 23, 24, 23, 24, // 17
23, 24, 15, 60, 60, 60, 60, 46, // 18
46, 46, 46, 46, 46, 46, 46, 46, // 18
23, 24, 23, 24, 23, 24, 23, 24, // 18
23, 24, 23, 24, 23, 24, 23, 24, // 18
23, 24, 23, 24, 23, 24, 23, 24, // 18
23, 24, 23, 24, 23, 24, 23, 24, // 18
23, 24, 23, 24, 23, 24, 23, 24, // 18
23, 24, 23, 24, 23, 24, 23, 24, // 18
40, 23, 24, 23, 24, 46, 46, 23, // 19
24, 46, 46, 23, 24, 46, 46, 46, // 19
23, 24, 23, 24, 23, 24, 23, 24, // 19
23, 24, 23, 24, 23, 24, 23, 24, // 19
23, 24, 23, 24, 23, 24, 23, 24, // 19
23, 24, 23, 24, 46, 46, 23, 24, // 19
23, 24, 23, 24, 23, 24, 46, 46, // 19
23, 24, 46, 46, 46, 46, 46, 46, // 19
46, 46, 46, 46, 46, 46, 46, 46, // 20
46, 46, 46, 46, 46, 46, 46, 46, // 20
46, 46, 46, 46, 46, 46, 46, 46, // 20
46, 46, 46, 46, 46, 46, 46, 46, // 20
46, 46, 46, 46, 46, 46, 46, 46, // 20
46, 46, 46, 46, 46, 46, 46, 46, // 20
46, 76, 76, 76, 76, 76, 76, 76, // 20
76, 76, 76, 76, 76, 76, 76, 76, // 20
76, 76, 76, 76, 76, 76, 76, 76, // 21
76, 76, 76, 76, 76, 76, 76, 76, // 21
76, 76, 76, 76, 76, 76, 76, 46, // 21
46, 59, 3, 3, 3, 3, 3, 3, // 21
46, 77, 77, 77, 77, 77, 77, 77, // 21
77, 77, 77, 77, 77, 77, 77, 77, // 21
77, 77, 77, 77, 77, 77, 77, 77, // 21
77, 77, 77, 77, 77, 77, 77, 77, // 21
77, 77, 77, 77, 77, 77, 77, 16, // 22
46, 3, 46, 46, 46, 46, 46, 46, // 22
46, 60, 60, 60, 60, 60, 60, 60, // 22
60, 60, 60, 60, 60, 60, 60, 60, // 22
60, 60, 46, 60, 60, 60, 60, 60, // 22
60, 60, 60, 60, 60, 60, 60, 60, // 22
60, 60, 60, 60, 60, 60, 60, 60, // 22
60, 60, 46, 60, 60, 60, 3, 60, // 22
3, 60, 60, 3, 60, 46, 46, 46, // 23
46, 46, 46, 46, 46, 46, 46, 46, // 23
40, 40, 40, 40, 40, 40, 40, 40, // 23
40, 40, 40, 40, 40, 40, 40, 40, // 23
40, 40, 40, 40, 40, 40, 40, 40, // 23
40, 40, 40, 46, 46, 46, 46, 46, // 23
40, 40, 40, 3, 3, 46, 46, 46, // 23
46, 46, 46, 46, 46, 46, 46, 46, // 23
46, 46, 46, 46, 46, 46, 46, 46, // 24
46, 46, 46, 46, 3, 46, 46, 46, // 24
46, 46, 46, 46, 46, 46, 46, 46, // 24
46, 46, 46, 3, 46, 46, 46, 3, // 24
46, 40, 40, 40, 40, 40, 40, 40, // 24
40, 40, 40, 40, 40, 40, 40, 40, // 24
40, 40, 40, 40, 40, 40, 40, 40, // 24
40, 40, 40, 46, 46, 46, 46, 46, // 24
59, 40, 40, 40, 40, 40, 40, 40, // 25
40, 40, 40, 60, 60, 60, 60, 60, // 25
60, 60, 60, 46, 46, 46, 46, 46, // 25
46, 46, 46, 46, 46, 46, 46, 46, // 25
78, 78, 78, 78, 78, 78, 78, 78, // 25
78, 78, 3, 3, 3, 3, 46, 46, // 25
60, 40, 40, 40, 40, 40, 40, 40, // 25
40, 40, 40, 40, 40, 40, 40, 40, // 25
40, 40, 40, 40, 40, 40, 40, 40, // 26
40, 40, 40, 40, 40, 40, 40, 40, // 26
40, 40, 40, 40, 40, 40, 40, 40, // 26
40, 40, 40, 40, 40, 40, 40, 40, // 26
40, 40, 40, 40, 40, 40, 40, 40, // 26
40, 40, 40, 40, 40, 40, 40, 40, // 26
40, 40, 40, 40, 40, 40, 40, 40, // 26
46, 46, 40, 40, 40, 40, 40, 46, // 26
40, 40, 40, 40, 40, 40, 40, 40, // 27
40, 40, 40, 40, 40, 40, 40, 46, // 27
40, 40, 40, 40, 3, 40, 60, 60, // 27
60, 60, 60, 60, 60, 79, 79, 60, // 27
60, 60, 60, 60, 60, 59, 59, 60, // 27
60, 15, 60, 60, 60, 60, 46, 46, // 27
9, 9, 9, 9, 9, 9, 9, 9, // 27
9, 9, 46, 46, 46, 46, 46, 46, // 27
46, 46, 46, 46, 46, 46, 46, 46, // 28
46, 46, 46, 46, 46, 46, 46, 46, // 28
46, 46, 46, 46, 46, 46, 46, 46, // 28
46, 46, 46, 46, 46, 46, 46, 46, // 28
46, 46, 46, 46, 46, 46, 46, 46, // 28
46, 46, 46, 46, 46, 46, 46, 46, // 28
46, 46, 46, 46, 46, 46, 46, 46, // 28
46, 46, 46, 46, 46, 46, 46, 46, // 28
46, 60, 60, 80, 46, 40, 40, 40, // 29
40, 40, 40, 40, 40, 40, 40, 40, // 29
40, 40, 40, 40, 40, 40, 40, 40, // 29
40, 40, 40, 40, 40, 40, 40, 40, // 29
40, 40, 40, 40, 40, 40, 40, 40, // 29
40, 40, 40, 40, 40, 40, 40, 40, // 29
40, 40, 40, 40, 40, 40, 40, 40, // 29
40, 40, 46, 46, 60, 40, 80, 80, // 29
80, 60, 60, 60, 60, 60, 60, 60, // 30
60, 80, 80, 80, 80, 60, 46, 46, // 30
15, 60, 60, 60, 60, 46, 46, 46, // 30
40, 40, 40, 40, 40, 40, 40, 40, // 30
40, 40, 60, 60, 3, 3, 81, 81, // 30
81, 81, 81, 81, 81, 81, 81, 81, // 30
3, 46, 46, 46, 46, 46, 46, 46, // 30
46, 46, 46, 46, 46, 46, 46, 46, // 30
46, 60, 80, 80, 46, 40, 40, 40, // 31
40, 40, 40, 40, 40, 46, 46, 40, // 31
40, 46, 46, 40, 40, 40, 40, 40, // 31
40, 40, 40, 40, 40, 40, 40, 40, // 31
40, 40, 40, 40, 40, 40, 40, 40, // 31
40, 46, 40, 40, 40, 40, 40, 40, // 31
40, 46, 40, 46, 46, 46, 40, 40, // 31
40, 40, 46, 46, 60, 46, 80, 80, // 31
80, 60, 60, 60, 60, 46, 46, 80, // 32
80, 46, 46, 80, 80, 60, 46, 46, // 32
46, 46, 46, 46, 46, 46, 46, 80, // 32
46, 46, 46, 46, 40, 40, 46, 40, // 32
40, 40, 60, 60, 46, 46, 81, 81, // 32
81, 81, 81, 81, 81, 81, 81, 81, // 32
40, 40, 4, 4, 82, 82, 82, 82, // 32
19, 83, 15, 46, 46, 46, 46, 46, // 32
46, 46, 60, 46, 46, 40, 40, 40, // 33
40, 40, 40, 46, 46, 46, 46, 40, // 33
40, 46, 46, 40, 40, 40, 40, 40, // 33
40, 40, 40, 40, 40, 40, 40, 40, // 33
40, 40, 40, 40, 40, 40, 40, 40, // 33
40, 46, 40, 40, 40, 40, 40, 40, // 33
40, 46, 40, 40, 46, 40, 40, 46, // 33
40, 40, 46, 46, 60, 46, 80, 80, // 33
80, 60, 60, 46, 46, 46, 46, 60, // 34
60, 46, 46, 60, 60, 60, 46, 46, // 34
46, 46, 46, 46, 46, 46, 46, 46, // 34
46, 40, 40, 40, 40, 46, 40, 46, // 34
46, 46, 46, 46, 46, 46, 81, 81, // 34
81, 81, 81, 81, 81, 81, 81, 81, // 34
60, 60, 40, 40, 40, 46, 46, 46, // 34
46, 46, 46, 46, 46, 46, 46, 46, // 34
46, 60, 60, 80, 46, 40, 40, 40, // 35
40, 40, 40, 40, 46, 40, 46, 40, // 35
40, 40, 46, 40, 40, 40, 40, 40, // 35
40, 40, 40, 40, 40, 40, 40, 40, // 35
40, 40, 40, 40, 40, 40, 40, 40, // 35
40, 46, 40, 40, 40, 40, 40, 40, // 35
40, 46, 40, 40, 46, 40, 40, 40, // 35
40, 40, 46, 46, 60, 40, 80, 80, // 35
80, 60, 60, 60, 60, 60, 46, 60, // 36
60, 80, 46, 80, 80, 60, 46, 46, // 36
15, 46, 46, 46, 46, 46, 46, 46, // 36
46, 46, 46, 46, 46, 46, 46, 46, // 36
40, 46, 46, 46, 46, 46, 81, 81, // 36
81, 81, 81, 81, 81, 81, 81, 81, // 36
46, 46, 46, 46, 46, 46, 46, 46, // 36
46, 46, 46, 46, 46, 46, 46, 46, // 36
46, 60, 80, 80, 46, 40, 40, 40, // 37
40, 40, 40, 40, 40, 46, 46, 40, // 37
40, 46, 46, 40, 40, 40, 40, 40, // 37
40, 40, 40, 40, 40, 40, 40, 40, // 37
40, 40, 40, 40, 40, 40, 40, 40, // 37
40, 46, 40, 40, 40, 40, 40, 40, // 37
40, 46, 40, 40, 46, 46, 40, 40, // 37
40, 40, 46, 46, 60, 40, 80, 60, // 37
80, 60, 60, 60, 46, 46, 46, 80, // 38
80, 46, 46, 80, 80, 60, 46, 46, // 38
46, 46, 46, 46, 46, 46, 60, 80, // 38
46, 46, 46, 46, 40, 40, 46, 40, // 38
40, 40, 46, 46, 46, 46, 81, 81, // 38
81, 81, 81, 81, 81, 81, 81, 81, // 38
15, 46, 46, 46, 46, 46, 46, 46, // 38
46, 46, 46, 46, 46, 46, 46, 46, // 38
46, 46, 60, 80, 46, 40, 40, 40, // 39
40, 40, 40, 46, 46, 46, 40, 40, // 39
40, 46, 40, 40, 40, 40, 46, 46, // 39
46, 40, 40, 46, 40, 46, 40, 40, // 39
46, 46, 46, 40, 40, 46, 46, 46, // 39
40, 40, 40, 46, 46, 46, 40, 40, // 39
40, 40, 40, 40, 40, 40, 46, 40, // 39
40, 40, 46, 46, 46, 46, 80, 80, // 39
60, 80, 80, 46, 46, 46, 80, 80, // 40
80, 46, 80, 80, 80, 60, 46, 46, // 40
46, 46, 46, 46, 46, 46, 46, 80, // 40
46, 46, 46, 46, 46, 46, 46, 46, // 40
46, 46, 46, 46, 46, 46, 46, 81, // 40
81, 81, 81, 81, 81, 81, 81, 81, // 40
84, 19, 19, 46, 46, 46, 46, 46, // 40
46, 46, 46, 46, 46, 46, 46, 46, // 40
46, 80, 80, 80, 46, 40, 40, 40, // 41
40, 40, 40, 40, 40, 46, 40, 40, // 41
40, 46, 40, 40, 40, 40, 40, 40, // 41
40, 40, 40, 40, 40, 40, 40, 40, // 41
40, 40, 40, 40, 40, 40, 40, 40, // 41
40, 46, 40, 40, 40, 40, 40, 40, // 41
40, 40, 40, 40, 46, 40, 40, 40, // 41
40, 40, 46, 46, 46, 46, 60, 60, // 41
60, 80, 80, 80, 80, 46, 60, 60, // 42
60, 46, 60, 60, 60, 60, 46, 46, // 42
46, 46, 46, 46, 46, 60, 60, 46, // 42
46, 46, 46, 46, 46, 46, 46, 46, // 42
40, 40, 46, 46, 46, 46, 81, 81, // 42
81, 81, 81, 81, 81, 81, 81, 81, // 42
46, 46, 46, 46, 46, 46, 46, 46, // 42
46, 46, 46, 46, 46, 46, 46, 46, // 42
46, 46, 80, 80, 46, 40, 40, 40, // 43
40, 40, 40, 40, 40, 46, 40, 40, // 43
40, 46, 40, 40, 40, 40, 40, 40, // 43
40, 40, 40, 40, 40, 40, 40, 40, // 43
40, 40, 40, 40, 40, 40, 40, 40, // 43
40, 46, 40, 40, 40, 40, 40, 40, // 43
40, 40, 40, 40, 46, 40, 40, 40, // 43
40, 40, 46, 46, 46, 46, 80, 60, // 43
80, 80, 80, 80, 80, 46, 60, 80, // 44
80, 46, 80, 80, 60, 60, 46, 46, // 44
46, 46, 46, 46, 46, 80, 80, 46, // 44
46, 46, 46, 46, 46, 46, 40, 46, // 44
40, 40, 46, 46, 46, 46, 81, 81, // 44
81, 81, 81, 81, 81, 81, 81, 81, // 44
46, 46, 46, 46, 46, 46, 46, 46, // 44
46, 46, 46, 46, 46, 46, 46, 46, // 44
46, 46, 80, 80, 46, 40, 40, 40, // 45
40, 40, 40, 40, 40, 46, 40, 40, // 45
40, 46, 40, 40, 40, 40, 40, 40, // 45
40, 40, 40, 40, 40, 40, 40, 40, // 45
40, 40, 40, 40, 40, 40, 40, 40, // 45
40, 46, 40, 40, 40, 40, 40, 40, // 45
40, 40, 40, 40, 40, 40, 40, 40, // 45
40, 40, 46, 46, 46, 46, 80, 80, // 45
80, 60, 60, 60, 46, 46, 80, 80, // 46
80, 46, 80, 80, 80, 60, 46, 46, // 46
46, 46, 46, 46, 46, 46, 46, 80, // 46
46, 46, 46, 46, 46, 46, 46, 46, // 46
40, 40, 46, 46, 46, 46, 81, 81, // 46
81, 81, 81, 81, 81, 81, 81, 81, // 46
46, 46, 46, 46, 46, 46, 46, 46, // 46
46, 46, 46, 46, 46, 46, 46, 46, // 46
46, 40, 40, 40, 40, 40, 40, 40, // 47
40, 40, 40, 40, 40, 40, 40, 40, // 47
40, 40, 40, 40, 40, 40, 40, 40, // 47
40, 40, 40, 40, 40, 40, 40, 40, // 47
40, 40, 40, 40, 40, 40, 40, 40, // 47
40, 40, 40, 40, 40, 40, 40, 3, // 47
40, 60, 40, 40, 60, 60, 60, 60, // 47
60, 60, 60, 46, 46, 46, 46, 4, // 47
40, 40, 40, 40, 40, 40, 59, 60, // 48
60, 60, 60, 60, 60, 60, 60, 15, // 48
9, 9, 9, 9, 9, 9, 9, 9, // 48
9, 9, 3, 3, 46, 46, 46, 46, // 48
46, 46, 46, 46, 46, 46, 46, 46, // 48
46, 46, 46, 46, 46, 46, 46, 46, // 48
46, 46, 46, 46, 46, 46, 46, 46, // 48
46, 46, 46, 46, 46, 46, 46, 46, // 48
46, 40, 40, 46, 40, 46, 46, 40, // 49
40, 46, 40, 46, 46, 40, 46, 46, // 49
46, 46, 46, 46, 40, 40, 40, 40, // 49
46, 40, 40, 40, 40, 40, 40, 40, // 49
46, 40, 40, 40, 46, 40, 46, 40, // 49
46, 46, 40, 40, 46, 40, 40, 3, // 49
40, 60, 40, 40, 60, 60, 60, 60, // 49
60, 60, 46, 60, 60, 40, 46, 46, // 49
40, 40, 40, 40, 40, 46, 59, 46, // 50
60, 60, 60, 60, 60, 60, 46, 46, // 50
9, 9, 9, 9, 9, 9, 9, 9, // 50
9, 9, 46, 46, 40, 40, 46, 46, // 50
46, 46, 46, 46, 46, 46, 46, 46, // 50
46, 46, 46, 46, 46, 46, 46, 46, // 50
46, 46, 46, 46, 46, 46, 46, 46, // 50
46, 46, 46, 46, 46, 46, 46, 46, // 50
15, 15, 15, 15, 3, 3, 3, 3, // 51
3, 3, 3, 3, 3, 3, 3, 3, // 51
3, 3, 3, 15, 15, 15, 15, 15, // 51
60, 60, 15, 15, 15, 15, 15, 15, // 51
78, 78, 78, 78, 78, 78, 78, 78, // 51
78, 78, 85, 85, 85, 85, 85, 85, // 51
85, 85, 85, 85, 15, 60, 15, 60, // 51
15, 60, 5, 6, 5, 6, 80, 80, // 51
40, 40, 40, 40, 40, 40, 40, 40, // 52
46, 40, 40, 40, 40, 40, 40, 40, // 52
40, 40, 40, 40, 40, 40, 40, 40, // 52
40, 40, 40, 40, 40, 40, 40, 40, // 52
40, 40, 40, 40, 40, 40, 40, 40, // 52
40, 40, 46, 46, 46, 46, 46, 46, // 52
46, 60, 60, 60, 60, 60, 60, 60, // 52
60, 60, 60, 60, 60, 60, 60, 80, // 52
60, 60, 60, 60, 60, 3, 60, 60, // 53
60, 60, 60, 60, 46, 46, 46, 46, // 53
60, 60, 60, 60, 60, 60, 46, 60, // 53
46, 60, 60, 60, 60, 60, 60, 60, // 53
60, 60, 60, 60, 60, 60, 60, 60, // 53
60, 60, 60, 60, 60, 60, 46, 46, // 53
46, 60, 60, 60, 60, 60, 60, 60, // 53
46, 60, 46, 46, 46, 46, 46, 46, // 53
46, 46, 46, 46, 46, 46, 46, 46, // 54
46, 46, 46, 46, 46, 46, 46, 46, // 54
46, 46, 46, 46, 46, 46, 46, 46, // 54
46, 46, 46, 46, 46, 46, 46, 46, // 54
76, 76, 76, 76, 76, 76, 76, 76, // 54
76, 76, 76, 76, 76, 76, 76, 76, // 54
76, 76, 76, 76, 76, 76, 76, 76, // 54
76, 76, 76, 76, 76, 76, 76, 76, // 54
76, 76, 76, 76, 76, 76, 46, 46, // 55
46, 46, 46, 46, 46, 46, 46, 46, // 55
16, 16, 16, 16, 16, 16, 16, 16, // 55
16, 16, 16, 16, 16, 16, 16, 16, // 55
16, 16, 16, 16, 16, 16, 16, 16, // 55
16, 16, 16, 16, 16, 16, 16, 16, // 55
16, 16, 16, 16, 16, 16, 16, 46, // 55
46, 46, 46, 3, 46, 46, 46, 46, // 55
40, 40, 40, 40, 40, 40, 40, 40, // 56
40, 40, 40, 40, 40, 40, 40, 40, // 56
40, 40, 40, 40, 40, 40, 40, 40, // 56
40, 40, 40, 40, 40, 40, 40, 40, // 56
40, 40, 40, 40, 40, 40, 40, 40, // 56
40, 40, 40, 40, 40, 40, 40, 40, // 56
40, 40, 40, 40, 40, 40, 40, 40, // 56
40, 40, 40, 40, 40, 40, 40, 40, // 56
40, 40, 40, 40, 40, 40, 40, 40, // 57
40, 40, 40, 40, 40, 40, 40, 40, // 57
40, 40, 40, 40, 40, 40, 40, 40, // 57
40, 40, 46, 46, 46, 46, 46, 40, // 57
40, 40, 40, 40, 40, 40, 40, 40, // 57
40, 40, 40, 40, 40, 40, 40, 40, // 57
40, 40, 40, 40, 40, 40, 40, 40, // 57
40, 40, 40, 40, 40, 40, 40, 40, // 57
40, 40, 40, 40, 40, 40, 40, 40, // 58
40, 40, 40, 40, 40, 40, 40, 40, // 58
40, 40, 40, 40, 40, 40, 40, 40, // 58
40, 40, 40, 40, 40, 40, 40, 40, // 58
40, 40, 40, 46, 46, 46, 46, 46, // 58
40, 40, 40, 40, 40, 40, 40, 40, // 58
40, 40, 40, 40, 40, 40, 40, 40, // 58
40, 40, 40, 40, 40, 40, 40, 40, // 58
40, 40, 40, 40, 40, 40, 40, 40, // 59
40, 40, 40, 40, 40, 40, 40, 40, // 59
40, 40, 40, 40, 40, 40, 40, 40, // 59
40, 40, 40, 40, 40, 40, 40, 40, // 59
40, 40, 40, 40, 40, 40, 40, 40, // 59
40, 40, 40, 40, 40, 40, 40, 40, // 59
40, 40, 40, 40, 40, 40, 40, 40, // 59
40, 40, 46, 46, 46, 46, 46, 46, // 59
23, 24, 23, 24, 23, 24, 23, 24, // 60
23, 24, 23, 24, 23, 24, 23, 24, // 60
23, 24, 23, 24, 23, 24, 23, 24, // 60
23, 24, 23, 24, 23, 24, 23, 24, // 60
23, 24, 23, 24, 23, 24, 23, 24, // 60
23, 24, 23, 24, 23, 24, 23, 24, // 60
23, 24, 23, 24, 23, 24, 23, 24, // 60
23, 24, 23, 24, 23, 24, 23, 24, // 60
23, 24, 23, 24, 23, 24, 23, 24, // 61
23, 24, 23, 24, 23, 24, 23, 24, // 61
23, 24, 23, 24, 23, 24, 16, 16, // 61
16, 16, 16, 16, 46, 46, 46, 46, // 61
23, 24, 23, 24, 23, 24, 23, 24, // 61
23, 24, 23, 24, 23, 24, 23, 24, // 61
23, 24, 23, 24, 23, 24, 23, 24, // 61
23, 24, 23, 24, 23, 24, 23, 24, // 61
23, 24, 23, 24, 23, 24, 23, 24, // 62
23, 24, 23, 24, 23, 24, 23, 24, // 62
23, 24, 23, 24, 23, 24, 23, 24, // 62
23, 24, 23, 24, 23, 24, 23, 24, // 62
23, 24, 23, 24, 23, 24, 23, 24, // 62
23, 24, 23, 24, 23, 24, 23, 24, // 62
23, 24, 23, 24, 23, 24, 23, 24, // 62
23, 24, 46, 46, 46, 46, 46, 46, // 62
86, 86, 86, 86, 86, 86, 86, 86, // 63
87, 87, 87, 87, 87, 87, 87, 87, // 63
86, 86, 86, 86, 86, 86, 46, 46, // 63
87, 87, 87, 87, 87, 87, 46, 46, // 63
86, 86, 86, 86, 86, 86, 86, 86, // 63
87, 87, 87, 87, 87, 87, 87, 87, // 63
86, 86, 86, 86, 86, 86, 86, 86, // 63
87, 87, 87, 87, 87, 87, 87, 87, // 63
86, 86, 86, 86, 86, 86, 46, 46, // 64
87, 87, 87, 87, 87, 87, 46, 46, // 64
16, 86, 16, 86, 16, 86, 16, 86, // 64
46, 87, 46, 87, 46, 87, 46, 87, // 64
86, 86, 86, 86, 86, 86, 86, 86, // 64
87, 87, 87, 87, 87, 87, 87, 87, // 64
88, 88, 89, 89, 89, 89, 90, 90, // 64
91, 91, 92, 92, 93, 93, 46, 46, // 64
86, 86, 86, 86, 86, 86, 86, 86, // 65
87, 87, 87, 87, 87, 87, 87, 87, // 65
86, 86, 86, 86, 86, 86, 86, 86, // 65
87, 87, 87, 87, 87, 87, 87, 87, // 65
86, 86, 86, 86, 86, 86, 86, 86, // 65
87, 87, 87, 87, 87, 87, 87, 87, // 65
86, 86, 16, 94, 16, 46, 16, 16, // 65
87, 87, 95, 95, 96, 11, 38, 11, // 65
11, 11, 16, 94, 16, 46, 16, 16, // 66
97, 97, 97, 97, 96, 11, 11, 11, // 66
86, 86, 16, 16, 46, 46, 16, 16, // 66
87, 87, 98, 98, 46, 11, 11, 11, // 66
86, 86, 16, 16, 16, 99, 16, 16, // 66
87, 87, 100, 100, 101, 11, 11, 11, // 66
46, 46, 16, 94, 16, 46, 16, 16, // 66
102, 102, 103, 103, 96, 11, 11, 46, // 66
2, 2, 2, 2, 2, 2, 2, 2, // 67
2, 2, 2, 2, 104, 104, 104, 104, // 67
8, 8, 8, 8, 8, 8, 3, 3, // 67
5, 6, 5, 5, 5, 6, 5, 5, // 67
3, 3, 3, 3, 3, 3, 3, 3, // 67
105, 106, 104, 104, 104, 104, 104, 46, // 67
3, 3, 3, 3, 3, 3, 3, 3, // 67
3, 5, 6, 3, 3, 3, 3, 12, // 67
12, 3, 3, 3, 7, 5, 6, 46, // 68
46, 46, 46, 46, 46, 46, 46, 46, // 68
46, 46, 46, 46, 46, 46, 46, 46, // 68
46, 46, 46, 46, 46, 46, 46, 46, // 68
46, 46, 46, 46, 46, 46, 46, 46, // 68
46, 46, 104, 104, 104, 104, 104, 104, // 68
17, 46, 46, 46, 17, 17, 17, 17, // 68
17, 17, 7, 7, 7, 5, 6, 16, // 68
107, 107, 107, 107, 107, 107, 107, 107, // 69
107, 107, 7, 7, 7, 5, 6, 46, // 69
46, 46, 46, 46, 46, 46, 46, 46, // 69
46, 46, 46, 46, 46, 46, 46, 46, // 69
4, 4, 4, 4, 4, 4, 4, 4, // 69
4, 4, 4, 4, 46, 46, 46, 46, // 69
46, 46, 46, 46, 46, 46, 46, 46, // 69
46, 46, 46, 46, 46, 46, 46, 46, // 69
46, 46, 46, 46, 46, 46, 46, 46, // 70
46, 46, 46, 46, 46, 46, 46, 46, // 70
60, 60, 60, 60, 60, 60, 60, 60, // 70
60, 60, 60, 60, 60, 79, 79, 79, // 70
79, 60, 46, 46, 46, 46, 46, 46, // 70
46, 46, 46, 46, 46, 46, 46, 46, // 70
46, 46, 46, 46, 46, 46, 46, 46, // 70
46, 46, 46, 46, 46, 46, 46, 46, // 70
15, 15, 38, 15, 15, 15, 15, 38, // 71
15, 15, 16, 38, 38, 38, 16, 16, // 71
38, 38, 38, 16, 15, 38, 15, 15, // 71
38, 38, 38, 38, 38, 38, 15, 15, // 71
15, 15, 15, 15, 38, 15, 38, 15, // 71
38, 15, 38, 38, 38, 38, 16, 16, // 71
38, 38, 15, 38, 16, 40, 40, 40, // 71
40, 46, 46, 46, 46, 46, 46, 46, // 71
46, 46, 46, 46, 46, 46, 46, 46, // 72
46, 46, 46, 46, 46, 46, 46, 46, // 72
46, 46, 46, 19, 19, 19, 19, 19, // 72
19, 19, 19, 19, 19, 19, 19, 108, // 72
109, 109, 109, 109, 109, 109, 109, 109, // 72
109, 109, 109, 109, 110, 110, 110, 110, // 72
111, 111, 111, 111, 111, 111, 111, 111, // 72
111, 111, 111, 111, 112, 112, 112, 112, // 72
113, 113, 113, 46, 46, 46, 46, 46, // 73
46, 46, 46, 46, 46, 46, 46, 46, // 73
7, 7, 7, 7, 7, 15, 15, 15, // 73
15, 15, 15, 15, 15, 15, 15, 15, // 73
15, 15, 15, 15, 15, 15, 15, 15, // 73
15, 15, 15, 15, 15, 15, 15, 15, // 73
15, 15, 15, 15, 15, 15, 15, 15, // 73
15, 15, 15, 15, 15, 15, 15, 15, // 73
15, 15, 15, 15, 15, 15, 15, 15, // 74
15, 15, 15, 15, 15, 15, 15, 15, // 74
15, 15, 7, 15, 7, 15, 15, 15, // 74
15, 15, 15, 15, 15, 15, 15, 15, // 74
15, 15, 15, 15, 15, 15, 15, 15, // 74
15, 15, 15, 46, 46, 46, 46, 46, // 74
46, 46, 46, 46, 46, 46, 46, 46, // 74
46, 46, 46, 46, 46, 46, 46, 46, // 74
7, 7, 7, 7, 7, 7, 7, 7, // 75
7, 7, 7, 7, 7, 7, 7, 7, // 75
7, 7, 7, 7, 7, 7, 7, 7, // 75
7, 7, 7, 7, 7, 7, 7, 7, // 75
7, 7, 7, 7, 7, 7, 7, 7, // 75
7, 7, 7, 7, 7, 7, 7, 7, // 75
7, 7, 7, 7, 7, 7, 7, 7, // 75
7, 7, 7, 7, 7, 7, 7, 7, // 75
7, 7, 7, 7, 7, 7, 7, 7, // 76
7, 7, 7, 7, 7, 7, 7, 7, // 76
7, 7, 7, 7, 7, 7, 7, 7, // 76
7, 7, 7, 7, 7, 7, 7, 7, // 76
7, 7, 7, 7, 7, 7, 7, 7, // 76
7, 7, 7, 7, 7, 7, 7, 7, // 76
7, 7, 46, 46, 46, 46, 46, 46, // 76
46, 46, 46, 46, 46, 46, 46, 46, // 76
15, 46, 15, 15, 15, 15, 15, 15, // 77
7, 7, 7, 7, 15, 15, 15, 15, // 77
15, 15, 15, 15, 15, 15, 15, 15, // 77
15, 15, 15, 15, 15, 15, 15, 15, // 77
7, 7, 15, 15, 15, 15, 15, 15, // 77
15, 5, 6, 15, 15, 15, 15, 15, // 77
15, 15, 15, 15, 15, 15, 15, 15, // 77
15, 15, 15, 15, 15, 15, 15, 15, // 77
15, 15, 15, 15, 15, 15, 15, 15, // 78
15, 15, 15, 15, 15, 15, 15, 15, // 78
15, 15, 15, 15, 15, 15, 15, 15, // 78
15, 15, 15, 15, 15, 15, 15, 15, // 78
15, 15, 15, 15, 15, 15, 15, 15, // 78
15, 15, 15, 15, 15, 15, 15, 15, // 78
15, 15, 15, 15, 15, 15, 15, 15, // 78
15, 15, 15, 46, 46, 46, 46, 46, // 78
15, 15, 15, 15, 15, 15, 15, 15, // 79
15, 15, 15, 15, 15, 15, 15, 15, // 79
15, 15, 15, 15, 15, 15, 15, 15, // 79
15, 15, 15, 15, 15, 15, 15, 15, // 79
15, 15, 15, 15, 15, 46, 46, 46, // 79
46, 46, 46, 46, 46, 46, 46, 46, // 79
46, 46, 46, 46, 46, 46, 46, 46, // 79
46, 46, 46, 46, 46, 46, 46, 46, // 79
15, 15, 15, 15, 15, 15, 15, 15, // 80
15, 15, 15, 46, 46, 46, 46, 46, // 80
46, 46, 46, 46, 46, 46, 46, 46, // 80
46, 46, 46, 46, 46, 46, 46, 46, // 80
114, 114, 114, 114, 114, 114, 114, 114, // 80
114, 114, 114, 114, 114, 114, 114, 114, // 80
114, 114, 114, 114, 82, 82, 82, 82, // 80
82, 82, 82, 82, 82, 82, 82, 82, // 80
82, 82, 82, 82, 82, 82, 82, 82, // 81
115, 115, 115, 115, 115, 115, 115, 115, // 81
115, 115, 115, 115, 115, 115, 115, 115, // 81
115, 115, 115, 115, 15, 15, 15, 15, // 81
15, 15, 15, 15, 15, 15, 15, 15, // 81
15, 15, 15, 15, 15, 15, 15, 15, // 81
15, 15, 15, 15, 15, 15, 116, 116, // 81
116, 116, 116, 116, 116, 116, 116, 116, // 81
116, 116, 116, 116, 116, 116, 116, 116, // 82
116, 116, 116, 116, 116, 116, 116, 116, // 82
117, 117, 117, 117, 117, 117, 117, 117, // 82
117, 117, 117, 117, 117, 117, 117, 117, // 82
117, 117, 117, 117, 117, 117, 117, 117, // 82
117, 117, 118, 46, 46, 46, 46, 46, // 82
46, 46, 46, 46, 46, 46, 46, 46, // 82
46, 46, 46, 46, 46, 46, 46, 46, // 82
15, 15, 15, 15, 15, 15, 15, 15, // 83
15, 15, 15, 15, 15, 15, 15, 15, // 83
15, 15, 15, 15, 15, 15, 15, 15, // 83
15, 15, 15, 15, 15, 15, 15, 15, // 83
15, 15, 15, 15, 15, 15, 15, 15, // 83
15, 15, 15, 15, 15, 15, 15, 15, // 83
15, 15, 15, 15, 15, 15, 15, 15, // 83
15, 15, 15, 15, 15, 15, 15, 15, // 83
15, 15, 15, 15, 15, 15, 15, 15, // 84
15, 15, 15, 15, 15, 15, 15, 15, // 84
15, 15, 15, 15, 15, 15, 46, 46, // 84
46, 46, 46, 46, 46, 46, 46, 46, // 84
15, 15, 15, 15, 15, 15, 15, 15, // 84
15, 15, 15, 15, 15, 15, 15, 15, // 84
15, 15, 15, 15, 15, 15, 15, 15, // 84
15, 15, 15, 15, 15, 15, 15, 15, // 84
15, 15, 15, 15, 15, 15, 15, 15, // 85
15, 15, 15, 15, 15, 15, 15, 15, // 85
15, 15, 15, 15, 15, 15, 15, 15, // 85
15, 15, 15, 15, 15, 15, 15, 15, // 85
15, 15, 15, 15, 15, 15, 15, 15, // 85
15, 15, 15, 15, 15, 15, 15, 15, // 85
46, 46, 46, 46, 46, 46, 46, 46, // 85
46, 46, 46, 46, 46, 46, 46, 46, // 85
15, 15, 15, 15, 15, 15, 15, 15, // 86
15, 15, 15, 15, 15, 15, 15, 15, // 86
15, 15, 15, 15, 46, 46, 46, 46, // 86
46, 46, 15, 15, 15, 15, 15, 15, // 86
15, 15, 15, 15, 15, 15, 15, 15, // 86
15, 15, 15, 15, 15, 15, 15, 15, // 86
15, 15, 15, 15, 15, 15, 15, 15, // 86
15, 15, 15, 15, 15, 15, 15, 15, // 86
46, 15, 15, 15, 15, 46, 15, 15, // 87
15, 15, 46, 46, 15, 15, 15, 15, // 87
15, 15, 15, 15, 15, 15, 15, 15, // 87
15, 15, 15, 15, 15, 15, 15, 15, // 87
15, 15, 15, 15, 15, 15, 15, 15, // 87
46, 15, 15, 15, 15, 15, 15, 15, // 87
15, 15, 15, 15, 15, 15, 15, 15, // 87
15, 15, 15, 15, 15, 15, 15, 15, // 87
15, 15, 15, 15, 15, 15, 15, 15, // 88
15, 15, 15, 15, 46, 15, 46, 15, // 88
15, 15, 15, 46, 46, 46, 15, 46, // 88
15, 15, 15, 15, 15, 15, 15, 46, // 88
46, 15, 15, 15, 15, 15, 15, 15, // 88
46, 46, 46, 46, 46, 46, 46, 46, // 88
46, 46, 46, 46, 46, 46, 119, 119, // 88
119, 119, 119, 119, 119, 119, 119, 119, // 88
114, 114, 114, 114, 114, 114, 114, 114, // 89
114, 114, 83, 83, 83, 83, 83, 83, // 89
83, 83, 83, 83, 15, 46, 46, 46, // 89
15, 15, 15, 15, 15, 15, 15, 15, // 89
15, 15, 15, 15, 15, 15, 15, 15, // 89
15, 15, 15, 15, 15, 15, 15, 15, // 89
46, 15, 15, 15, 15, 15, 15, 15, // 89
15, 15, 15, 15, 15, 15, 15, 46, // 89
2, 3, 3, 3, 15, 59, 3, 120, // 90
5, 6, 5, 6, 5, 6, 5, 6, // 90
5, 6, 15, 15, 5, 6, 5, 6, // 90
5, 6, 5, 6, 8, 5, 6, 5, // 90
15, 121, 121, 121, 121, 121, 121, 121, // 90
121, 121, 60, 60, 60, 60, 60, 60, // 90
8, 59, 59, 59, 59, 59, 15, 15, // 90
46, 46, 46, 46, 46, 46, 46, 15, // 90
46, 40, 40, 40, 40, 40, 40, 40, // 91
40, 40, 40, 40, 40, 40, 40, 40, // 91
40, 40, 40, 40, 40, 40, 40, 40, // 91
40, 40, 40, 40, 40, 40, 40, 40, // 91
40, 40, 40, 40, 40, 40, 40, 40, // 91
40, 40, 40, 40, 40, 40, 40, 40, // 91
40, 40, 40, 40, 40, 40, 40, 40, // 91
40, 40, 40, 40, 40, 40, 40, 40, // 91
40, 40, 40, 40, 40, 40, 40, 40, // 92
40, 40, 40, 40, 40, 40, 40, 40, // 92
40, 40, 40, 40, 40, 46, 46, 46, // 92
46, 60, 60, 59, 59, 59, 59, 46, // 92
46, 40, 40, 40, 40, 40, 40, 40, // 92
40, 40, 40, 40, 40, 40, 40, 40, // 92
40, 40, 40, 40, 40, 40, 40, 40, // 92
40, 40, 40, 40, 40, 40, 40, 40, // 92
40, 40, 40, 40, 40, 40, 40, 40, // 93
40, 40, 40, 40, 40, 40, 40, 40, // 93
40, 40, 40, 40, 40, 40, 40, 40, // 93
40, 40, 40, 40, 40, 40, 40, 40, // 93
40, 40, 40, 40, 40, 40, 40, 40, // 93
40, 40, 40, 40, 40, 40, 40, 40, // 93
40, 40, 40, 40, 40, 40, 40, 40, // 93
40, 40, 40, 3, 59, 59, 59, 46, // 93
46, 46, 46, 46, 46, 40, 40, 40, // 94
40, 40, 40, 40, 40, 40, 40, 40, // 94
40, 40, 40, 40, 40, 40, 40, 40, // 94
40, 40, 40, 40, 40, 40, 40, 40, // 94
40, 40, 40, 40, 40, 40, 40, 40, // 94
40, 40, 40, 40, 40, 46, 46, 46, // 94
46, 40, 40, 40, 40, 40, 40, 40, // 94
40, 40, 40, 40, 40, 40, 40, 40, // 94
40, 40, 40, 40, 40, 40, 40, 40, // 95
40, 40, 40, 40, 40, 40, 40, 46, // 95
15, 15, 85, 85, 85, 85, 15, 15, // 95
15, 15, 15, 15, 15, 15, 15, 15, // 95
46, 46, 46, 46, 46, 46, 46, 46, // 95
46, 46, 46, 46, 46, 46, 46, 46, // 95
46, 46, 46, 46, 46, 46, 46, 46, // 95
46, 46, 46, 46, 46, 46, 46, 46, // 95
15, 15, 15, 15, 15, 15, 15, 15, // 96
15, 15, 15, 15, 15, 15, 15, 15, // 96
15, 15, 15, 15, 15, 15, 15, 15, // 96
15, 15, 15, 15, 15, 46, 46, 46, // 96
85, 85, 85, 85, 85, 85, 85, 85, // 96
85, 85, 15, 15, 15, 15, 15, 15, // 96
15, 15, 15, 15, 15, 15, 15, 15, // 96
15, 15, 15, 15, 15, 15, 15, 15, // 96
15, 15, 15, 15, 46, 46, 46, 46, // 97
46, 46, 46, 46, 46, 46, 46, 46, // 97
46, 46, 46, 46, 46, 46, 46, 46, // 97
46, 46, 46, 46, 46, 46, 46, 46, // 97
15, 15, 15, 15, 15, 15, 15, 15, // 97
15, 15, 15, 15, 15, 15, 15, 15, // 97
15, 15, 15, 15, 15, 15, 15, 15, // 97
15, 15, 15, 15, 46, 46, 46, 15, // 97
114, 114, 114, 114, 114, 114, 114, 114, // 98
114, 114, 15, 15, 15, 15, 15, 15, // 98
15, 15, 15, 15, 15, 15, 15, 15, // 98
15, 15, 15, 15, 15, 15, 15, 15, // 98
15, 15, 15, 15, 15, 15, 15, 15, // 98
15, 15, 15, 15, 15, 15, 15, 15, // 98
15, 46, 46, 46, 46, 46, 46, 46, // 98
46, 46, 46, 46, 46, 46, 46, 46, // 98
15, 15, 15, 15, 15, 15, 15, 15, // 99
15, 15, 15, 15, 46, 46, 46, 46, // 99
15, 15, 15, 15, 15, 15, 15, 15, // 99
15, 15, 15, 15, 15, 15, 15, 15, // 99
15, 15, 15, 15, 15, 15, 15, 15, // 99
15, 15, 15, 15, 15, 15, 15, 15, // 99
15, 15, 15, 15, 15, 15, 15, 15, // 99
15, 15, 15, 15, 15, 15, 15, 46, // 99
15, 15, 15, 15, 15, 15, 15, 15, // 100
15, 15, 15, 15, 15, 15, 15, 15, // 100
15, 15, 15, 15, 15, 15, 15, 15, // 100
15, 15, 15, 15, 15, 15, 15, 15, // 100
15, 15, 15, 15, 15, 15, 15, 15, // 100
15, 15, 15, 15, 15, 15, 15, 15, // 100
15, 15, 15, 15, 15, 15, 15, 46, // 100
46, 46, 46, 15, 15, 15, 15, 15, // 100
15, 15, 15, 15, 15, 15, 15, 15, // 101
15, 15, 15, 15, 15, 15, 15, 15, // 101
15, 15, 15, 15, 15, 15, 15, 15, // 101
15, 15, 15, 15, 15, 15, 46, 46, // 101
15, 15, 15, 15, 15, 15, 15, 15, // 101
15, 15, 15, 15, 15, 15, 15, 15, // 101
15, 15, 15, 15, 15, 15, 15, 15, // 101
15, 15, 15, 15, 15, 15, 15, 46, // 101
40, 40, 40, 40, 40, 40, 40, 40, // 102
40, 40, 40, 40, 40, 40, 40, 40, // 102
40, 40, 40, 40, 40, 40, 40, 40, // 102
40, 40, 40, 40, 40, 40, 40, 40, // 102
40, 40, 40, 40, 40, 40, 46, 46, // 102
46, 46, 46, 46, 46, 46, 46, 46, // 102
46, 46, 46, 46, 46, 46, 46, 46, // 102
46, 46, 46, 46, 46, 46, 46, 46, // 102
40, 40, 40, 40, 40, 40, 40, 40, // 103
40, 40, 40, 40, 40, 40, 40, 40, // 103
40, 40, 40, 40, 40, 40, 40, 40, // 103
40, 40, 40, 40, 40, 40, 40, 40, // 103
40, 40, 40, 40, 46, 46, 46, 46, // 103
46, 46, 46, 46, 46, 46, 46, 46, // 103
46, 46, 46, 46, 46, 46, 46, 46, // 103
46, 46, 46, 46, 46, 46, 46, 46, // 103
122, 122, 122, 122, 122, 122, 122, 122, // 104
122, 122, 122, 122, 122, 122, 122, 122, // 104
122, 122, 122, 122, 122, 122, 122, 122, // 104
122, 122, 122, 122, 122, 122, 122, 122, // 104
122, 122, 122, 122, 122, 122, 122, 122, // 104
122, 122, 122, 122, 122, 122, 122, 122, // 104
122, 122, 122, 122, 122, 122, 122, 122, // 104
122, 122, 122, 122, 122, 122, 122, 122, // 104
123, 123, 123, 123, 123, 123, 123, 123, // 105
123, 123, 123, 123, 123, 123, 123, 123, // 105
123, 123, 123, 123, 123, 123, 123, 123, // 105
123, 123, 123, 123, 123, 123, 123, 123, // 105
123, 123, 123, 123, 123, 123, 123, 123, // 105
123, 123, 123, 123, 123, 123, 123, 123, // 105
123, 123, 123, 123, 123, 123, 123, 123, // 105
123, 123, 123, 123, 123, 123, 123, 123, // 105
40, 40, 40, 40, 40, 40, 40, 40, // 106
40, 40, 40, 40, 40, 40, 40, 40, // 106
40, 40, 40, 40, 40, 40, 40, 40, // 106
40, 40, 40, 40, 40, 40, 40, 40, // 106
40, 40, 40, 40, 40, 40, 40, 40, // 106
40, 40, 40, 40, 40, 40, 46, 46, // 106
46, 46, 46, 46, 46, 46, 46, 46, // 106
46, 46, 46, 46, 46, 46, 46, 46, // 106
16, 16, 16, 16, 16, 16, 16, 46, // 107
46, 46, 46, 46, 46, 46, 46, 46, // 107
46, 46, 46, 16, 16, 16, 16, 16, // 107
46, 46, 46, 46, 46, 46, 60, 40, // 107
40, 40, 40, 40, 40, 40, 40, 40, // 107
40, 7, 40, 40, 40, 40, 40, 40, // 107
40, 40, 40, 40, 40, 40, 40, 46, // 107
40, 40, 40, 40, 40, 46, 40, 46, // 107
40, 40, 46, 40, 40, 46, 40, 40, // 108
40, 40, 40, 40, 40, 40, 40, 40, // 108
40, 40, 40, 40, 40, 40, 40, 40, // 108
40, 40, 40, 40, 40, 40, 40, 40, // 108
40, 40, 40, 40, 40, 40, 40, 40, // 108
40, 40, 40, 40, 40, 40, 40, 40, // 108
40, 40, 40, 40, 40, 40, 40, 40, // 108
40, 40, 40, 40, 40, 40, 40, 40, // 108
40, 40, 40, 40, 40, 40, 40, 40, // 109
40, 40, 40, 40, 40, 40, 40, 40, // 109
40, 40, 40, 40, 40, 40, 40, 40, // 109
40, 40, 40, 40, 40, 40, 40, 40, // 109
40, 40, 40, 40, 40, 40, 40, 40, // 109
40, 40, 40, 40, 40, 40, 40, 40, // 109
40, 40, 46, 46, 46, 46, 46, 46, // 109
46, 46, 46, 46, 46, 46, 46, 46, // 109
46, 46, 46, 46, 46, 46, 46, 46, // 110
46, 46, 46, 46, 46, 46, 46, 46, // 110
46, 46, 46, 40, 40, 40, 40, 40, // 110
40, 40, 40, 40, 40, 40, 40, 40, // 110
40, 40, 40, 40, 40, 40, 40, 40, // 110
40, 40, 40, 40, 40, 40, 40, 40, // 110
40, 40, 40, 40, 40, 40, 40, 40, // 110
40, 40, 40, 40, 40, 40, 40, 40, // 110
40, 40, 40, 40, 40, 40, 40, 40, // 111
40, 40, 40, 40, 40, 40, 40, 40, // 111
40, 40, 40, 40, 40, 40, 40, 40, // 111
40, 40, 40, 40, 40, 40, 40, 40, // 111
40, 40, 40, 40, 40, 40, 40, 40, // 111
40, 40, 40, 40, 40, 40, 40, 40, // 111
40, 40, 40, 40, 40, 40, 40, 40, // 111
40, 40, 40, 40, 40, 40, 5, 6, // 111
46, 46, 46, 46, 46, 46, 46, 46, // 112
46, 46, 46, 46, 46, 46, 46, 46, // 112
40, 40, 40, 40, 40, 40, 40, 40, // 112
40, 40, 40, 40, 40, 40, 40, 40, // 112
40, 40, 40, 40, 40, 40, 40, 40, // 112
40, 40, 40, 40, 40, 40, 40, 40, // 112
40, 40, 40, 40, 40, 40, 40, 40, // 112
40, 40, 40, 40, 40, 40, 40, 40, // 112
40, 40, 40, 40, 40, 40, 40, 40, // 113
40, 40, 40, 40, 40, 40, 40, 40, // 113
46, 46, 40, 40, 40, 40, 40, 40, // 113
40, 40, 40, 40, 40, 40, 40, 40, // 113
40, 40, 40, 40, 40, 40, 40, 40, // 113
40, 40, 40, 40, 40, 40, 40, 40, // 113
40, 40, 40, 40, 40, 40, 40, 40, // 113
40, 40, 40, 40, 40, 40, 40, 40, // 113
40, 40, 40, 40, 40, 40, 40, 40, // 114
46, 46, 46, 46, 46, 46, 46, 46, // 114
46, 46, 46, 46, 46, 46, 46, 46, // 114
46, 46, 46, 46, 46, 46, 46, 46, // 114
46, 46, 46, 46, 46, 46, 46, 46, // 114
46, 46, 46, 46, 46, 46, 46, 46, // 114
40, 40, 40, 40, 40, 40, 40, 40, // 114
40, 40, 40, 40, 46, 46, 46, 46, // 114
46, 46, 46, 46, 46, 46, 46, 46, // 115
46, 46, 46, 46, 46, 46, 46, 46, // 115
46, 46, 46, 46, 46, 46, 46, 46, // 115
46, 46, 46, 46, 46, 46, 46, 46, // 115
60, 60, 60, 60, 46, 46, 46, 46, // 115
46, 46, 46, 46, 46, 46, 46, 46, // 115
3, 8, 8, 12, 12, 5, 6, 5, // 115
6, 5, 6, 5, 6, 5, 6, 5, // 115
6, 5, 6, 5, 6, 46, 46, 46, // 116
46, 3, 3, 3, 3, 12, 12, 12, // 116
3, 3, 3, 46, 3, 3, 3, 3, // 116
8, 5, 6, 5, 6, 5, 6, 3, // 116
3, 3, 7, 8, 7, 7, 7, 46, // 116
3, 4, 3, 3, 46, 46, 46, 46, // 116
40, 40, 40, 46, 40, 46, 40, 40, // 116
40, 40, 40, 40, 40, 40, 40, 40, // 116
40, 40, 40, 40, 40, 40, 40, 40, // 117
40, 40, 40, 40, 40, 40, 40, 40, // 117
40, 40, 40, 40, 40, 40, 40, 40, // 117
40, 40, 40, 40, 40, 40, 40, 40, // 117
40, 40, 40, 40, 40, 40, 40, 40, // 117
40, 40, 40, 40, 40, 40, 40, 40, // 117
40, 40, 40, 40, 40, 40, 40, 40, // 117
40, 40, 40, 40, 40, 46, 46, 104, // 117
46, 3, 3, 3, 4, 3, 3, 3, // 118
5, 6, 3, 7, 3, 8, 3, 3, // 118
9, 9, 9, 9, 9, 9, 9, 9, // 118
9, 9, 3, 3, 7, 7, 7, 3, // 118
3, 10, 10, 10, 10, 10, 10, 10, // 118
10, 10, 10, 10, 10, 10, 10, 10, // 118
10, 10, 10, 10, 10, 10, 10, 10, // 118
10, 10, 10, 5, 3, 6, 11, 12, // 118
11, 13, 13, 13, 13, 13, 13, 13, // 119
13, 13, 13, 13, 13, 13, 13, 13, // 119
13, 13, 13, 13, 13, 13, 13, 13, // 119
13, 13, 13, 5, 7, 6, 7, 46, // 119
46, 3, 5, 6, 3, 3, 40, 40, // 119
40, 40, 40, 40, 40, 40, 40, 40, // 119
59, 40, 40, 40, 40, 40, 40, 40, // 119
40, 40, 40, 40, 40, 40, 40, 40, // 119
40, 40, 40, 40, 40, 40, 40, 40, // 120
40, 40, 40, 40, 40, 40, 40, 40, // 120
40, 40, 40, 40, 40, 40, 40, 40, // 120
40, 40, 40, 40, 40, 40, 59, 59, // 120
40, 40, 40, 40, 40, 40, 40, 40, // 120
40, 40, 40, 40, 40, 40, 40, 40, // 120
40, 40, 40, 40, 40, 40, 40, 40, // 120
40, 40, 40, 40, 40, 40, 40, 46, // 120
46, 46, 40, 40, 40, 40, 40, 40, // 121
46, 46, 40, 40, 40, 40, 40, 40, // 121
46, 46, 40, 40, 40, 40, 40, 40, // 121
46, 46, 40, 40, 40, 46, 46, 46, // 121
4, 4, 7, 11, 15, 4, 4, 46, // 121
7, 7, 7, 7, 7, 15, 15, 46, // 121
46, 46, 46, 46, 46, 46, 46, 46, // 121
46, 46, 46, 46, 46, 15, 46, 46 // 121
};
// The A table has 124 entries for a total of 496 bytes.
const uint32 CharInfo::a[] = {
0x0000000F, // 0 Cc
0x0004000F, // 1 Cc, whitespace
0x0004000C, // 2 Zs, whitespace
0x00000018, // 3 Po
0x0002001A, // 4 Sc, currency
0x00000015, // 5 Ps
0x00000016, // 6 Pe
0x00000019, // 7 Sm
0x00000014, // 8 Pd
0x00036009, // 9 Nd, identifier part, decimal 16
0x0822FE01, // 10 Lu, hasLower (add 32), identifier start, supradecimal 31
0x0000001B, // 11 Sk
0x00020017, // 12 Pc, underscore
0x0812FE02, // 13 Ll, hasUpper (subtract 32), identifier start, supradecimal 31
0x0005000F, // 14 Cc, break
0x0000001C, // 15 So
0x00020002, // 16 Ll, identifier start
0x0000600B, // 17 No, decimal 16
0x0000500B, // 18 No, decimal 8
0x0000800B, // 19 No, strange
0x08220001, // 20 Lu, hasLower (add 32), identifier start
0x08120002, // 21 Ll, hasUpper (subtract 32), identifier start
0xE1D20002, // 22 Ll, hasUpper (subtract -121), identifier start
0x00620001, // 23 Lu, hasLower (add 1), identifier start
0x00520002, // 24 Ll, hasUpper (subtract 1), identifier start
0xCE620001, // 25 Lu, hasLower (add -199), identifier start
0x3A120002, // 26 Ll, hasUpper (subtract 232), identifier start
0xE1E20001, // 27 Lu, hasLower (add -121), identifier start
0x4B120002, // 28 Ll, hasUpper (subtract 300), identifier start
0x34A20001, // 29 Lu, hasLower (add 210), identifier start
0x33A20001, // 30 Lu, hasLower (add 206), identifier start
0x33620001, // 31 Lu, hasLower (add 205), identifier start
0x32A20001, // 32 Lu, hasLower (add 202), identifier start
0x32E20001, // 33 Lu, hasLower (add 203), identifier start
0x33E20001, // 34 Lu, hasLower (add 207), identifier start
0x34E20001, // 35 Lu, hasLower (add 211), identifier start
0x34620001, // 36 Lu, hasLower (add 209), identifier start
0x35620001, // 37 Lu, hasLower (add 213), identifier start
0x00020001, // 38 Lu, identifier start
0x36A20001, // 39 Lu, hasLower (add 218), identifier start
0x00020005, // 40 Lo, identifier start
0x36620001, // 41 Lu, hasLower (add 217), identifier start
0x36E20001, // 42 Lu, hasLower (add 219), identifier start
0x00AA0001, // 43 Lu, hasLower (add 2), hasTitle, identifier start
0x007A0003, // 44 Lt, hasUpper (subtract 1), hasLower (add 1), hasTitle, identifier start
0x009A0002, // 45 Ll, hasUpper (subtract 2), hasTitle, identifier start
0x00000000, // 46 unassigned
0x34920002, // 47 Ll, hasUpper (subtract 210), identifier start
0x33920002, // 48 Ll, hasUpper (subtract 206), identifier start
0x33520002, // 49 Ll, hasUpper (subtract 205), identifier start
0x32920002, // 50 Ll, hasUpper (subtract 202), identifier start
0x32D20002, // 51 Ll, hasUpper (subtract 203), identifier start
0x33D20002, // 52 Ll, hasUpper (subtract 207), identifier start
0x34520002, // 53 Ll, hasUpper (subtract 209), identifier start
0x34D20002, // 54 Ll, hasUpper (subtract 211), identifier start
0x35520002, // 55 Ll, hasUpper (subtract 213), identifier start
0x36920002, // 56 Ll, hasUpper (subtract 218), identifier start
0x36520002, // 57 Ll, hasUpper (subtract 217), identifier start
0x36D20002, // 58 Ll, hasUpper (subtract 219), identifier start
0x00020004, // 59 Lm, identifier start
0x00030006, // 60 Mn, identifier part
0x09A20001, // 61 Lu, hasLower (add 38), identifier start
0x09620001, // 62 Lu, hasLower (add 37), identifier start
0x10220001, // 63 Lu, hasLower (add 64), identifier start
0x0FE20001, // 64 Lu, hasLower (add 63), identifier start
0x09920002, // 65 Ll, hasUpper (subtract 38), identifier start
0x09520002, // 66 Ll, hasUpper (subtract 37), identifier start
0x10120002, // 67 Ll, hasUpper (subtract 64), identifier start
0x0FD20002, // 68 Ll, hasUpper (subtract 63), identifier start
0x0F920002, // 69 Ll, hasUpper (subtract 62), identifier start
0x0E520002, // 70 Ll, hasUpper (subtract 57), identifier start
0x0BD20002, // 71 Ll, hasUpper (subtract 47), identifier start
0x0D920002, // 72 Ll, hasUpper (subtract 54), identifier start
0x15920002, // 73 Ll, hasUpper (subtract 86), identifier start
0x14120002, // 74 Ll, hasUpper (subtract 80), identifier start
0x14220001, // 75 Lu, hasLower (add 80), identifier start
0x0C220001, // 76 Lu, hasLower (add 48), identifier start
0x0C120002, // 77 Ll, hasUpper (subtract 48), identifier start
0x00034009, // 78 Nd, identifier part, decimal 0
0x00000007, // 79 Me
0x00030008, // 80 Mc, identifier part
0x00037409, // 81 Nd, identifier part, decimal 26
0x00005A0B, // 82 No, decimal 13
0x00006E0B, // 83 No, decimal 23
0x0000740B, // 84 No, decimal 26
0x0000000B, // 85 No
0xFE120002, // 86 Ll, hasUpper (subtract -8), identifier start
0xFE220001, // 87 Lu, hasLower (add -8), identifier start
0xED920002, // 88 Ll, hasUpper (subtract -74), identifier start
0xEA920002, // 89 Ll, hasUpper (subtract -86), identifier start
0xE7120002, // 90 Ll, hasUpper (subtract -100), identifier start
0xE0120002, // 91 Ll, hasUpper (subtract -128), identifier start
0xE4120002, // 92 Ll, hasUpper (subtract -112), identifier start
0xE0920002, // 93 Ll, hasUpper (subtract -126), identifier start
0xFDD20002, // 94 Ll, hasUpper (subtract -9), identifier start
0xEDA20001, // 95 Lu, hasLower (add -74), identifier start
0xFDE20001, // 96 Lu, hasLower (add -9), identifier start
0xEAA20001, // 97 Lu, hasLower (add -86), identifier start
0xE7220001, // 98 Lu, hasLower (add -100), identifier start
0xFE520002, // 99 Ll, hasUpper (subtract -7), identifier start
0xE4220001, // 100 Lu, hasLower (add -112), identifier start
0xFE620001, // 101 Lu, hasLower (add -7), identifier start
0xE0220001, // 102 Lu, hasLower (add -128), identifier start
0xE0A20001, // 103 Lu, hasLower (add -126), identifier start
0x00010010, // 104 Cf, ignorable
0x0005000D, // 105 Zl, break
0x0005000E, // 106 Zp, break
0x0000400B, // 107 No, decimal 0
0x0000440B, // 108 No, decimal 2
0x0422420A, // 109 Nl, hasLower (add 16), identifier start, decimal 1
0x0422800A, // 110 Nl, hasLower (add 16), identifier start, strange
0x0412620A, // 111 Nl, hasUpper (subtract 16), identifier start, decimal 17
0x0412800A, // 112 Nl, hasUpper (subtract 16), identifier start, strange
0x0002800A, // 113 Nl, identifier start, strange
0x0000420B, // 114 No, decimal 1
0x0000720B, // 115 No, decimal 25
0x06A0001C, // 116 So, hasLower (add 26)
0x0690001C, // 117 So, hasUpper (subtract 26)
0x00006C0B, // 118 No, decimal 22
0x0000560B, // 119 No, decimal 11
0x0002720A, // 120 Nl, identifier start, decimal 25
0x0002400A, // 121 Nl, identifier start, decimal 0
0x00000013, // 122 Cs
0x00000012 // 123 Co
};
// Return c converted to upper case. If c cannot be converted to upper case,
// return c unchanged.
char16
toUpper(char16 c)
{
CharInfo ci(c);
if (ci.info & 0x00100000)
c = static_cast<char16>(static_cast<int32>(c) -
(static_cast<int32>(ci.info) >> 22));
return c;
}
// Return c converted to lower case. If c cannot be converted to lower case,
// return c unchanged.
char16
toLower(char16 c)
{
CharInfo ci(c);
if (ci.info & 0x00200000)
c = static_cast<char16>(static_cast<int32>(c) +
(static_cast<int32>(ci.info) >> 22));
return c;
}
// Return true if c is an ASCII hexadecimal digit, in which case store the
// digit's numeric value in d.
bool
isASCIIHexDigit(char16 c, uint &digit)
{
uint cv = c;
if (cv < '0')
return false;
if (cv <= '9') {
digit = cv - '0';
return true;
}
cv |= 0x20;
if (cv >= 'a' && cv <= 'f') {
digit = cv - 'a' + 10;
return true;
}
return false;
}
// Return str advanced past white space characters, but no further than strEnd.
const char16 *
skipWhiteSpace(const char16 *str, const char16 *strEnd)
{
while (str != strEnd && isSpace(*str))
str++;
return str;
}
// Allocate a String in the Arena and register that String so that it is
// deallocated at the same time as the Arena.
// DO NOT CALL DELETE ON THE RESULT!
String &
newArenaString(Arena &arena)
{
String *s = new(arena) String();
arena.registerDestructor(s);
return *s;
}
String &
newArenaString(Arena &arena, const String &str)
{
String *s = new(arena) String(str);
arena.registerDestructor(s);
return *s;
}
}