diff --git a/deps/ada/ada.cpp b/deps/ada/ada.cpp index 80bec6c67f313a..fd558881bf0530 100644 --- a/deps/ada/ada.cpp +++ b/deps/ada/ada.cpp @@ -1,4 +1,4 @@ -/* auto-generated on 2026-03-23 17:52:13 -0400. Do not edit! */ +/* auto-generated on 2026-07-27 16:10:09 -0400. Do not edit! */ /* begin file src/ada.cpp */ #include "ada.h" /* begin file src/checkers.cpp */ @@ -34,7 +34,7 @@ ada_really_inline constexpr bool is_ipv4(std::string_view view) noexcept { size_t last_dot = view.rfind('.'); if (last_dot != std::string_view::npos) { // We have at least one dot. - view = view.substr(last_dot + 1); + view.remove_prefix(last_dot + 1); } /** Optimization opportunity: we have basically identified the last number of the ipv4 if we return true here. We might as well parse it and have at @@ -110,6 +110,7 @@ ada_really_inline constexpr uint8_t path_signature( ada_really_inline constexpr bool verify_dns_length( std::string_view input) noexcept { + if (input.empty()) return false; if (input.back() == '.') { if (input.size() > 254) return false; } else if (input.size() > 253) @@ -129,6 +130,7 @@ ada_really_inline constexpr bool verify_dns_length( return true; } + } // namespace ada::checkers /* end file src/checkers.cpp */ /* begin file src/unicode.cpp */ @@ -136,10 +138,30 @@ ada_really_inline constexpr bool verify_dns_length( ADA_PUSH_DISABLE_ALL_WARNINGS /* begin file src/ada_idna.cpp */ -// NOLINTBEGIN: this is an auto-generated file -/* auto-generated on 2026-01-30 12:00:02 -0500. Do not edit! */ +/* auto-generated on 2026-07-12 20:34:08 -0400. Do not edit! */ /* begin file src/idna.cpp */ /* begin file src/unicode_transcoding.cpp */ +/* begin file include/ada/idna/unicode_transcoding.h */ +#ifndef ADA_IDNA_UNICODE_TRANSCODING_H +#define ADA_IDNA_UNICODE_TRANSCODING_H + +#include +#include + +namespace ada::idna { + +size_t utf8_to_utf32(const char* buf, size_t len, char32_t* utf32_output); + +size_t utf8_length_from_utf32(const char32_t* buf, size_t len); + +size_t utf32_length_from_utf8(const char* buf, size_t len); + +size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output); + +} // namespace ada::idna + +#endif // ADA_IDNA_UNICODE_TRANSCODING_H +/* end file include/ada/idna/unicode_transcoding.h */ #include #include @@ -323,2496 +345,4791 @@ size_t utf32_to_utf8(const char32_t* buf, size_t len, char* utf8_output) { } // namespace ada::idna /* end file src/unicode_transcoding.cpp */ /* begin file src/mapping.cpp */ +/* begin file include/ada/idna/mapping.h */ +#ifndef ADA_IDNA_MAPPING_H +#define ADA_IDNA_MAPPING_H + +#include +#include + +namespace ada::idna { + +// If the input is ascii, then the mapping is just -> lower case. +void ascii_map(char* input, size_t length); +// Map the characters according to IDNA, returning the empty string on error. +std::u32string map(std::u32string_view input); +// Map into an existing buffer (cleared on entry). Returns false if any code +// point is disallowed. Reusing the buffer avoids repeated heap allocations +// when called in a loop over multiple labels. +bool map(std::u32string_view input, std::u32string& out); + +} // namespace ada::idna + +#endif +/* end file include/ada/idna/mapping.h */ -#include #include +#include +#include #include +/* begin file src/table_store.hpp */ +// Runtime store for compressed Unicode/IDNA tables. +// Large tables are DEFLATE-compressed (read-only) and expanded once on first +// use into a heap buffer so the working set does not bloat the on-disk binary. +// Hot-path lookups use the same O(1) multi-stage layout as the pre-compression +// code; compression only affects on-disk size and one-time init. +// +// Thread-safe without mutex: atomic CAS + spin-wait. ensure_tables() returns +// false if initialization fails (OOM, corrupt blob); callers must treat that +// as a hard error and not touch table pointers. + +/* begin file src/raw_inflate.hpp */ +// Minimal raw DEFLATE inflater (RFC 1951), enough for zlib raw streams. +// Returns number of output bytes written, or 0 on failure. +#include +#include + +namespace ada::idna::deflate { + +struct BitReader { + const uint8_t* p; + const uint8_t* end; + uint32_t acc = 0; + int bits = 0; + + explicit BitReader(const uint8_t* data, size_t len) + : p(data), end(data + len) {} + + bool ensure(int n) { + while (bits < n) { + if (p >= end) return false; + acc |= uint32_t(*p++) << bits; + bits += 8; + } + return true; + } + uint32_t get(int n) { + if (!ensure(n)) return UINT32_MAX; + uint32_t v = acc & ((1u << n) - 1); + acc >>= n; + bits -= n; + return v; + } + void align_byte() { + acc >>= (bits & 7); + bits -= (bits & 7); + } +}; + +struct Huff { + // canonical codes: for each length, list of symbols + // Fast path: table for codes up to max_bits + static constexpr int MAXBITS = 15; + uint8_t lengths[288]{}; + int counts[MAXBITS + 1]{}; + int first_code[MAXBITS + 1]{}; + int16_t symbols[288]{}; + int nsymbols = 0; + int max_bits = 0; + + // Base index into symbols[] for each code length (used by decode). + int base_idx[MAXBITS + 1]{}; + + bool build(const uint8_t* lens, int n) { + std::memset(counts, 0, sizeof(counts)); + std::memset(first_code, 0, sizeof(first_code)); + std::memset(base_idx, 0, sizeof(base_idx)); + nsymbols = n; + max_bits = 0; + for (int i = 0; i < n; i++) { + lengths[i] = lens[i]; + if (lens[i]) { + counts[lens[i]]++; + if (lens[i] > max_bits) max_bits = lens[i]; + } + } + // Canonical first code for each bit length (RFC 1951). + int code = 0; + for (int bits = 1; bits <= MAXBITS; bits++) { + code = (code + counts[bits - 1]) << 1; + first_code[bits] = code; + } + int idx = 0; + for (int bits = 1; bits <= max_bits; bits++) { + base_idx[bits] = idx; + // assign symbols in symbol order for codes of this length + for (int sym = 0; sym < n; sym++) { + if (lengths[sym] == bits) { + symbols[idx++] = static_cast(sym); + } + } + } + return true; + } + + int decode(BitReader& br) const { + if (max_bits == 0) return -1; + int code = 0; + for (int len = 1; len <= max_bits; len++) { + uint32_t b = br.get(1); + if (b == UINT32_MAX) return -1; + code = (code << 1) | int(b); + int first = first_code[len]; + int cnt = counts[len]; + if (cnt && code - first < cnt) { + return symbols[base_idx[len] + (code - first)]; + } + } + return -1; + } +}; + +// Fixed Huffman tables are built once at dynamic initialization (before main / +// single-threaded), so concurrent first-use of inflate cannot race. +inline Huff make_fixed_litlen_huff() { + Huff h; + uint8_t lens[288]; + // Fixed Huffman: 0-143:8, 144-255:9, 256-279:7, 280-287:8 + for (int i = 0; i <= 143; i++) lens[i] = 8; + for (int i = 144; i <= 255; i++) lens[i] = 9; + for (int i = 256; i <= 279; i++) lens[i] = 7; + for (int i = 280; i <= 287; i++) lens[i] = 8; + h.build(lens, 288); + return h; +} + +inline Huff make_fixed_dist_huff() { + Huff h; + uint8_t lens[32]; + for (int i = 0; i < 32; i++) lens[i] = 5; + h.build(lens, 32); + return h; +} + +// NOLINTNEXTLINE(cert-err58-cpp) -- intentional process-lifetime tables +inline const Huff kFixedLitLenHuff = make_fixed_litlen_huff(); +// NOLINTNEXTLINE(cert-err58-cpp) +inline const Huff kFixedDistHuff = make_fixed_dist_huff(); + +inline int fixed_litlen(BitReader& br) { return kFixedLitLenHuff.decode(br); } + +inline int fixed_dist(BitReader& br) { return kFixedDistHuff.decode(br); } + +// length and distance base tables +static const uint16_t len_base[29] = { + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, + 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258}; +static const uint8_t len_extra[29] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 0}; +static const uint16_t dist_base[30] = { + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, + 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, + 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; +static const uint8_t dist_extra[30] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, + 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, + 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + +inline size_t inflate_raw(const uint8_t* src, size_t src_len, uint8_t* dst, + size_t dst_cap) { + BitReader br(src, src_len); + size_t out = 0; + for (;;) { + uint32_t bfinal = br.get(1); + uint32_t btype = br.get(2); + if (bfinal == UINT32_MAX || btype == UINT32_MAX) return 0; + if (btype == 0) { + // stored + br.align_byte(); + if (!br.ensure(16)) return 0; + // read 16+16 from bit buffer awkwardly - use byte path + // Align: bits is multiple of 8 + // Get len from remaining bits then bytes + uint32_t len = br.get(16); + uint32_t nlen = br.get(16); + if (len == UINT32_MAX || nlen == UINT32_MAX) return 0; + if ((len ^ 0xFFFF) != nlen) return 0; + // After get, may have bits in acc from previous - for stored, should be + // byte aligned Copy len bytes from p + if (br.bits != 0) { + // leftover bits should be 0 if aligned + } + if (size_t(br.end - br.p) < len) return 0; + if (out + len > dst_cap) return 0; + std::memcpy(dst + out, br.p, len); + br.p += len; + out += len; + } else if (btype == 1 || btype == 2) { + Huff lit, dist; + if (btype == 1) { + // use fixed via functions + } else { + // dynamic + uint32_t hlit = br.get(5); + if (hlit == UINT32_MAX) return 0; + hlit += 257; + uint32_t hdist = br.get(5); + if (hdist == UINT32_MAX) return 0; + hdist += 1; + uint32_t hclen = br.get(4); + if (hclen == UINT32_MAX) return 0; + hclen += 4; + static const int order[19] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, + 11, 4, 12, 3, 13, 2, 14, 1, 15}; + uint8_t clen[19]{}; + for (uint32_t i = 0; i < hclen; i++) { + uint32_t v = br.get(3); + if (v == UINT32_MAX) return 0; + clen[order[i]] = uint8_t(v); + } + Huff cl; + if (!cl.build(clen, 19)) return 0; + uint8_t lens[288 + 32]{}; + uint32_t n = hlit + hdist; + for (uint32_t i = 0; i < n;) { + int sym = cl.decode(br); + if (sym < 0) return 0; + if (sym < 16) { + lens[i++] = uint8_t(sym); + } else if (sym == 16) { + uint32_t rep = br.get(2); + if (rep == UINT32_MAX) return 0; + rep += 3; + if (i == 0) return 0; + uint8_t v = lens[i - 1]; + while (rep--) lens[i++] = v; + } else if (sym == 17) { + uint32_t rep = br.get(3); + if (rep == UINT32_MAX) return 0; + rep += 3; + while (rep--) lens[i++] = 0; + } else if (sym == 18) { + uint32_t rep = br.get(7); + if (rep == UINT32_MAX) return 0; + rep += 11; + while (rep--) lens[i++] = 0; + } else + return 0; + } + if (!lit.build(lens, int(hlit))) return 0; + if (!dist.build(lens + hlit, int(hdist))) return 0; + } + for (;;) { + int sym; + if (btype == 1) + sym = fixed_litlen(br); + else + sym = lit.decode(br); + if (sym < 0) return 0; + if (sym < 256) { + if (out >= dst_cap) return 0; + dst[out++] = uint8_t(sym); + } else if (sym == 256) { + break; + } else { + int len_code = sym - 257; + if (len_code < 0 || len_code > 28) return 0; + uint32_t extra = br.get(len_extra[len_code]); + if (len_extra[len_code] && extra == UINT32_MAX) return 0; + uint32_t length = + len_base[len_code] + (len_extra[len_code] ? extra : 0); + int dsym; + if (btype == 1) + dsym = fixed_dist(br); + else + dsym = dist.decode(br); + if (dsym < 0 || dsym > 29) return 0; + uint32_t dextra = br.get(dist_extra[dsym]); + if (dist_extra[dsym] && dextra == UINT32_MAX) return 0; + uint32_t distance = dist_base[dsym] + (dist_extra[dsym] ? dextra : 0); + if (distance > out || out + length > dst_cap) return 0; + for (uint32_t k = 0; k < length; k++) { + dst[out] = dst[out - distance]; + out++; + } + } + } + } else { + return 0; // reserved + } + if (bfinal) break; + } + return out; +} + +} // namespace ada::idna::deflate +/* end file src/raw_inflate.hpp */ +/* begin file src/table_blob.inc */ +// Auto-generated by scripts/pack_tables.py - do not edit. +// Compressed Unicode/IDNA tables (raw DEFLATE). +// clang-format off +#ifndef ADA_IDNA_TABLE_BLOB_H +#define ADA_IDNA_TABLE_BLOB_H +#include +#include +namespace ada::idna::table_blob { +constexpr size_t uncompressed_size = 224608; +constexpr size_t compressed_size = 62377; +constexpr uint32_t uncompressed_crc32 = 0x6F4A6B2Eu; +constexpr size_t decomposition_block_rows = 67; +constexpr size_t decomposition_block_cols = 257; +constexpr size_t ccc_block_rows = 67; +constexpr size_t ccc_block_cols = 256; +constexpr size_t composition_block_rows = 67; +constexpr size_t composition_block_cols = 257; +constexpr size_t id_continue_count = 1418; +constexpr size_t id_start_count = 776; +constexpr size_t dir_table_count = 1449; +constexpr size_t combining_range_count = 290; +// Offsets into the decompressed buffer: +constexpr size_t off_idna_stage1 = 0; +constexpr size_t count_idna_stage1 = 3282; +constexpr size_t off_idna_stage2 = 6564; +constexpr size_t count_idna_stage2 = 11456; +constexpr size_t off_idna_bool_blocks = 29480; +constexpr size_t count_idna_bool_blocks = 225; +constexpr size_t off_idna_utf8_mappings = 31280; +constexpr size_t count_idna_utf8_mappings = 17383; +constexpr size_t off_decomposition_index = 48663; +constexpr size_t count_decomposition_index = 4352; +constexpr size_t off_decomposition_block = 53016; +constexpr size_t count_decomposition_block = 17219; +constexpr size_t off_decomposition_data = 87456; +constexpr size_t count_decomposition_data = 9102; +constexpr size_t off_ccc_index = 123864; +constexpr size_t count_ccc_index = 4352; +constexpr size_t off_ccc_block = 128216; +constexpr size_t count_ccc_block = 17152; +constexpr size_t off_composition_index = 145368; +constexpr size_t count_composition_index = 4352; +constexpr size_t off_composition_block = 149720; +constexpr size_t count_composition_block = 17219; +constexpr size_t off_composition_data = 184160; +constexpr size_t count_composition_data = 1883; +constexpr size_t off_id_continue_flat = 191692; +constexpr size_t count_id_continue_flat = 2836; +constexpr size_t off_id_start_flat = 203036; +constexpr size_t count_id_start_flat = 1552; +constexpr size_t off_dir_start = 209244; +constexpr size_t count_dir_start = 1449; +constexpr size_t off_dir_final = 215040; +constexpr size_t count_dir_final = 1449; +constexpr size_t off_dir_value = 220836; +constexpr size_t count_dir_value = 1449; +constexpr size_t off_combining_flat = 222288; +constexpr size_t count_combining_flat = 580; +alignas(8) inline constexpr uint8_t compressed[] = { +0xec,0x9c,0x09,0x40,0x53,0xc7,0xda,0xfe,0x5f,0x08,0x98,0x28,0x4b,0x4c,0xc2,0x12, +0x14,0x09,0x12,0x42,0x12,0x76,0x12,0x20,0xec,0x09,0xd0,0xdd,0x56,0xdb,0xda,0xdd, +0x5b,0x5b,0x97,0x6a,0xdd,0xad,0xb6,0xda,0xc5,0x96,0x23,0xbb,0xa2,0xe0,0xbe,0xb0, +0x8a,0xa8,0xa8,0x88,0x08,0xa8,0xec,0xcb,0x2d,0x2a,0x62,0xad,0x88,0xa8,0xdd,0xeb, +0x56,0x36,0x6d,0x6b,0x5b,0xdb,0xda,0xd6,0x96,0xfc,0x9f,0x73,0x12,0xd4,0xb6,0xf6, +0xb6,0xb7,0xcb,0xfd,0xbe,0xfb,0xfd,0x9b,0xe1,0x37,0x33,0xe7,0x9c,0x99,0x79,0xde, +0x79,0xcf,0x9c,0x73,0x66,0x4e,0x00,0x62,0x88,0x0c,0xc4,0x50,0x33,0x91,0x85,0xc1, +0x82,0xb1,0x68,0xb6,0x20,0x4b,0x83,0x25,0x63,0x49,0x4c,0xb3,0x25,0xf1,0x0c,0x3c, +0x86,0xd7,0xcc,0x23,0x2b,0x83,0x15,0x63,0xd5,0x6c,0x45,0xd6,0x16,0x8c,0x25,0x63, +0xb0,0x26,0x86,0xc7,0x58,0x31,0xd6,0xcc,0x20,0x86,0xcf,0x08,0x98,0xc1,0xcc,0x10, +0xc6,0x86,0x21,0x86,0xb1,0xb6,0x65,0x9a,0xad,0x69,0x90,0x61,0x90,0x1d,0x63,0xcf, +0x08,0x19,0x66,0xd0,0x50,0x46,0xc4,0x88,0x19,0x09,0xe3,0xc0,0x38,0x32,0x4e,0x8c, +0x33,0x23,0x65,0x5c,0x98,0xe6,0x41,0xc3,0x18,0xe2,0x1b,0xf8,0x0c,0xbf,0x99,0x4f, +0x82,0xe1,0xa8,0x47,0x8c,0x41,0xc0,0x08,0xa0,0x27,0x20,0x6e,0xcb,0x95,0x19,0xc1, +0xb8,0x31,0x32,0xc6,0x9d,0x19,0xc9,0xd0,0x60,0xd3,0xbe,0x1f,0x07,0x0f,0x46,0xce, +0x78,0x32,0x0a,0xc6,0x30,0xd8,0x8b,0x61,0x06,0xcb,0x19,0x25,0xa3,0x62,0xd4,0x8c, +0x37,0xe3,0xc3,0xf8,0x32,0x7e,0x8c,0x3f,0x13,0xc0,0x04,0xa2,0x54,0x10,0xd0,0x30, +0x5a,0x26,0x98,0x69,0x1e,0x1c,0xc2,0xd0,0x10,0xc3,0x10,0x66,0x08,0x54,0x86,0x90, +0x8d,0xc1,0x86,0xb1,0x69,0xb6,0x21,0x5b,0x83,0x2d,0x63,0xdb,0x6c,0x4b,0x76,0x06, +0xbb,0x50,0x86,0xb1,0x6b,0xb6,0x23,0x7b,0xd8,0x62,0x6f,0xd2,0x60,0xcc,0xa9,0x8e, +0x69,0xb6,0x27,0xa1,0x41,0x78,0x2b,0x3b,0x6e,0x15,0x18,0x61,0x33,0x5b,0x76,0x28, +0x31,0x61,0xa6,0xbe,0x0d,0x65,0x86,0x36,0x0f,0x25,0x51,0x38,0x63,0x10,0x45,0x30, +0x91,0xd8,0x13,0xc5,0x30,0xa2,0x66,0x11,0x89,0x0d,0x62,0x46,0xdc,0x2c,0x26,0x49, +0x34,0x63,0x90,0x30,0x92,0x66,0x09,0x39,0x18,0x1c,0x62,0x18,0xc6,0xa1,0xd9,0x81, +0x1c,0x0d,0x8e,0x8c,0x63,0xb3,0x23,0x39,0x19,0x9c,0x7e,0xab,0xee,0xdf,0xe1,0xef, +0xf0,0x77,0xf8,0x6b,0x82,0x9e,0x31,0x5c,0xcf,0xc7,0x32,0x8c,0x53,0xb3,0x53,0x1c, +0x43,0xce,0x06,0x67,0xc6,0xb9,0xd9,0x39,0x9e,0x41,0x9e,0xb9,0x0d,0xdc,0x0e,0xee, +0x60,0xee,0x64,0xee,0x42,0x7a,0x37,0x73,0x0f,0x43,0x52,0x83,0x74,0xd4,0xdf,0xde, +0xfb,0x0b,0xc3,0xbd,0xcc,0x7d,0xcc,0xe8,0xbf,0x03,0x17,0x18,0x69,0xb3,0x94,0x5c, +0x0c,0x2e,0x8c,0x4b,0xb3,0x0b,0x0d,0x33,0x0c,0x63,0x86,0x35,0x0f,0xa3,0xe1,0x86, +0xe1,0xcc,0xf0,0xe6,0xe1,0xe4,0x6a,0x70,0x65,0x5c,0x9b,0x5d,0x69,0x84,0x61,0x04, +0x33,0xa2,0x79,0x04,0xb9,0x19,0xdc,0x18,0xb7,0x66,0x37,0x92,0x19,0x64,0x63,0x98, +0xfb,0xe1,0xc9,0x07,0x98,0x07,0x11,0x8f,0x65,0x1e,0xe2,0xda,0x7a,0x98,0x79,0x84, +0x79,0x94,0x79,0x8c,0x79,0x9c,0x79,0x82,0x61,0x64,0x78,0x66,0xca,0xc8,0x7d,0x1c, +0x63,0x70,0x67,0xdc,0xff,0x71,0xdd,0xf7,0x77,0x32,0x4f,0x32,0xcd,0xee,0xa3,0x99, +0xf1,0xcc,0x53,0xcc,0xd3,0xcc,0x04,0x66,0x22,0x33,0x89,0x99,0xcc,0x3c,0xc3,0x4c, +0x61,0xa6,0x32,0xcf,0x32,0xd3,0x98,0xe9,0xcc,0x0c,0x66,0x26,0xda,0x22,0x66,0x16, +0x43,0x23,0x67,0x33,0x73,0x18,0xc3,0xc8,0xb9,0x5c,0xeb,0xcf,0x31,0xf3,0x98,0xf9, +0xcc,0x38,0xe6,0x79,0xe6,0x05,0x66,0x01,0x8e,0x2f,0x64,0x5e,0x64,0x5e,0x62,0x5e, +0x66,0x5e,0x41,0x7e,0x11,0xf3,0x2a,0xf3,0x1a,0x93,0xc0,0x30,0xcc,0x62,0x26,0x91, +0x49,0x62,0x92,0xb1,0x2f,0x05,0xa4,0x72,0x35,0xd3,0xf0,0xec,0x24,0x26,0x9d,0x59, +0xc2,0x2c,0x65,0x32,0x98,0x65,0xdc,0xbe,0xe5,0x6c,0xdf,0x47,0x66,0x32,0x59,0xcc, +0x0a,0x66,0x25,0xb3,0x0a,0xc7,0x57,0x33,0x6b,0x30,0x3f,0x58,0xcb,0xac,0xc3,0x91, +0xf5,0xcc,0x06,0x66,0x23,0x93,0x8d,0x5c,0x0e,0x93,0xcb,0xe4,0x31,0xf9,0x66,0x6f, +0x15,0x30,0x9b,0x98,0x42,0x66,0x33,0x53,0xf4,0x2f,0xc7,0xd7,0x24,0xce,0xfe,0x2d, +0xe6,0xad,0xad,0x7f,0xfa,0x39,0xdb,0xc6,0x14,0xff,0xea,0x18,0xdf,0xce,0xec,0xf8, +0x1f,0xbc,0xc2,0x1e,0xb8,0xc5,0xbe,0x65,0xff,0x27,0xaf,0x9f,0x25,0xbf,0xb3,0xde, +0x4f,0xbd,0x23,0x67,0x76,0x32,0x25,0xcc,0x2e,0xe4,0x4a,0x99,0xdd,0xb7,0x54,0x68, +0x1e,0x49,0x1e,0x65,0x38,0xbe,0x87,0x29,0x67,0x2a,0xfe,0x3f,0xb9,0x53,0x57,0x32, +0x7b,0x39,0x5f,0x15,0xff,0x7d,0xa7,0xfe,0x51,0xd8,0x77,0xdd,0x43,0xfb,0x99,0xaa, +0x9b,0xfc,0xb5,0xfc,0x4f,0x53,0x20,0xa6,0x9a,0x31,0x78,0xfc,0xcf,0xf5,0xd0,0xbc, +0x2a,0xf2,0xb8,0x79,0x34,0xd4,0x30,0xb5,0x4c,0x1d,0x37,0xa7,0xda,0x6a,0xde,0xa3, +0x62,0xea,0x99,0x66,0x0f,0x92,0x1b,0xe4,0xc4,0x34,0xa0,0x56,0x23,0xf6,0x35,0x99, +0x9e,0x6b,0xf2,0x66,0x39,0x79,0x1a,0x3c,0x19,0xcf,0x66,0x4f,0x52,0x18,0x14,0x8c, +0xa2,0x59,0x41,0x5e,0x06,0x2f,0xc6,0xab,0xd9,0x8b,0x94,0x06,0xe5,0xad,0x46,0x5b, +0xf3,0x6f,0xb0,0xeb,0x9f,0x03,0xcf,0x4d,0x65,0xb3,0xf2,0x75,0xa4,0x2d,0xcc,0x81, +0xeb,0xc7,0x0e,0x32,0x87,0x7e,0x52,0xba,0xd5,0x9c,0x1e,0x36,0xa7,0x6d,0xe6,0xf4, +0x88,0x59,0xf1,0x0d,0x86,0x54,0x47,0x7f,0x41,0xe9,0x4d,0xe6,0x18,0xe2,0x76,0xf3, +0x96,0x41,0xc5,0xa8,0x9a,0x55,0xc7,0xaf,0x1f,0xf5,0x41,0xed,0x0e,0xe6,0x04,0x43, +0x6a,0x83,0x9a,0x51,0x77,0x32,0xcd,0x6a,0xf2,0xbe,0xd5,0x7d,0xe5,0xc7,0xe1,0xa4, +0x39,0x3d,0xc5,0x9c,0x66,0xde,0x62,0xde,0x66,0xde,0xb9,0xe9,0xd8,0xbb,0xcc,0x7b, +0xcc,0xfb,0x5c,0xee,0x03,0xc6,0xe0,0xfd,0xef,0xde,0xbf,0xfe,0x0e,0x7f,0x87,0xbf, +0xc3,0xdf,0xe1,0xef,0xf0,0xaf,0xc2,0xb3,0xff,0x6b,0x2c,0xf9,0xf0,0xbf,0xd0,0x7b, +0x75,0xff,0xdf,0x8c,0x93,0x33,0xb7,0xd8,0x17,0xf5,0xe7,0xae,0xfb,0xbd,0x9b,0xbd, +0xc9,0xc7,0xe0,0xc3,0xf8,0x34,0xfb,0x90,0xaf,0xc1,0x97,0xf1,0xfd,0x63,0xeb,0x97, +0xff,0x3d,0xe1,0xec,0xdf,0xf7,0x19,0x2e,0x2c,0x61,0x8c,0x46,0x0b,0xe2,0x91,0x35, +0xf1,0x69,0x30,0xd9,0x90,0x1d,0x09,0x49,0x44,0x12,0x72,0x24,0x67,0x72,0xa1,0xe1, +0x34,0x82,0x64,0x34,0x92,0xe4,0xa4,0x20,0x25,0xa9,0xc9,0x87,0xfc,0x28,0x80,0x82, +0x48,0x4b,0xc6,0x3f,0xed,0xd3,0xff,0x07,0x43,0xc8,0x4f,0x6c,0xd1,0x11,0xdb,0x23, +0x36,0x47,0x88,0x23,0xb9,0x9c,0x9e,0x62,0x29,0x9e,0xee,0xe4,0xf2,0xf7,0xd0,0x68, +0xf4,0xca,0x68,0xbc,0x9f,0x1e,0xa1,0x7f,0x20,0x9d,0x48,0xcf,0xd0,0xb3,0x34,0x83, +0x66,0xd3,0x73,0xf4,0x3c,0x2d,0xa4,0x97,0xe9,0x55,0x38,0x26,0x89,0x52,0x69,0x09, +0x2d,0xa3,0x2c,0x5a,0x45,0x6b,0x69,0x03,0xe5,0x50,0x3e,0x15,0xd2,0x16,0x94,0x2f, +0xa6,0x9d,0x54,0x4a,0x7b,0xa8,0x92,0xf6,0x53,0xcd,0x9f,0xe0,0x87,0x7a,0xb4,0xd1, +0x04,0x5e,0x07,0x07,0xc1,0x61,0xf0,0x06,0x38,0x06,0x3a,0xc0,0x49,0xf0,0x16,0x78, +0x17,0x7c,0x00,0xce,0x82,0x0b,0xa0,0x1b,0xf4,0x81,0x8f,0xc1,0x65,0xf0,0x05,0xf8, +0x0a,0x7c,0x03,0xae,0x81,0x7e,0xd6,0x0f,0x16,0x46,0xa3,0x15,0x10,0x58,0x08,0x2c, +0x6c,0x90,0xda,0x5b,0xb0,0x8a,0x22,0xc4,0x0e,0xc0,0x19,0x0c,0xb3,0x18,0x66,0xe1, +0x86,0x74,0x24,0xf0,0x04,0x4a,0xe0,0x6d,0xe1,0x8f,0x38,0x08,0x04,0x03,0x1d,0x88, +0x00,0xd1,0xc0,0x00,0xe2,0xc1,0x1d,0xe0,0x6e,0x70,0x2f,0x18,0x03,0x1e,0x04,0x0f, +0x83,0xc7,0xc0,0x38,0x30,0x1e,0x4c,0x00,0x93,0xc1,0x54,0x30,0x1d,0xcc,0x02,0x73, +0xc1,0x7c,0x8b,0x05,0x88,0x5f,0x02,0x8b,0x80,0x02,0x56,0x26,0x58,0x24,0x22,0x97, +0x02,0xd2,0x2d,0x32,0x10,0x67,0x5a,0xac,0xb4,0x58,0xc3,0x59,0xba,0xde,0x22,0xdb, +0x22,0xcf,0x62,0x13,0xf2,0x45,0x16,0xdb,0x10,0xef,0xb0,0xd8,0x65,0x51,0x66,0x61, +0xf2,0x5b,0x85,0xc5,0x3e,0xe4,0xaa,0x2d,0xea,0x10,0x37,0x82,0x7f,0x82,0x03,0x16, +0xad,0x88,0x8f,0x70,0x25,0xde,0x44,0x7c,0xdc,0xa2,0x13,0xf1,0x69,0x8b,0x77,0x2c, +0xde,0x47,0x7a,0x06,0x9c,0xb7,0xe8,0x32,0xd7,0xef,0xb5,0xf8,0xf1,0x79,0xb8,0x64, +0xc1,0x86,0xcb,0x5c,0xf8,0x82,0x0b,0x5f,0xa1,0xc4,0x37,0xe0,0x1a,0xe8,0x07,0x16, +0x96,0xf0,0x26,0xe0,0x83,0x21,0x96,0x6c,0x1d,0x3b,0xc4,0x43,0x81,0x04,0x38,0x01, +0x17,0xe0,0x0a,0x64,0xc0,0x03,0x28,0xb8,0x52,0x2a,0x4b,0x36,0xf8,0x20,0xef,0x6f, +0x19,0x64,0x19,0x8c,0x54,0x07,0x22,0x40,0x34,0x30,0x80,0x78,0x70,0x07,0xb8,0x1b, +0xdc,0x0b,0xc6,0x80,0x07,0xc1,0xc3,0xe0,0x31,0x30,0x0e,0x8c,0x07,0x13,0xc0,0x64, +0x30,0x15,0x4c,0x07,0xb3,0xc0,0x5c,0x30,0x1f,0x2c,0x00,0x2f,0x81,0x45,0x20,0x01, +0x24,0x82,0x14,0x90,0x0e,0x32,0x2c,0x7f,0xdc,0xd7,0x4c,0xcb,0x55,0xd8,0xb3,0xd6, +0x72,0x03,0xb7,0x3f,0x17,0x71,0x81,0xe5,0x66,0xcb,0xad,0x96,0xdb,0x91,0x2b,0x01, +0xbb,0x41,0x39,0xd8,0x6b,0x69,0xfc,0xaf,0xff,0x08,0xa9,0xca,0x52,0x82,0x3b,0x58, +0xad,0x65,0x83,0x65,0xb3,0xa5,0x1f,0xee,0x5e,0x7f,0xac,0xbd,0x16,0xcb,0x56,0xcb, +0x37,0x2c,0xdb,0x2d,0x3b,0x2d,0xdf,0xe2,0xbc,0xb3,0xcd,0xc2,0x19,0x77,0xc7,0x00, +0x7a,0xef,0x77,0xfa,0xea,0x43,0xcb,0x73,0xa8,0xf9,0x91,0x65,0x8f,0xe5,0xc7,0xb7, +0x68,0x81,0xfe,0xf0,0x1d,0xe6,0x32,0x5a,0xfd,0x02,0x7c,0x05,0xbe,0xb1,0x34,0xdd, +0x6f,0xaf,0x0d,0x28,0x59,0x5a,0xf0,0x06,0xee,0xa3,0xf1,0x64,0xc5,0x1b,0xc2,0xb3, +0xe3,0x0d,0xe5,0x49,0x78,0x4e,0xd8,0xeb,0x02,0x5c,0x79,0x32,0x1e,0x46,0x32,0x4f, +0xc1,0x53,0xf1,0x7c,0x78,0xfe,0xbc,0x20,0x5e,0x30,0x4f,0xc7,0xfb,0xd8,0x32,0x82, +0x17,0xcd,0xbb,0x93,0x0c,0xbc,0x78,0xde,0x1d,0xbc,0xbb,0x79,0xf7,0xa2,0xe4,0x18, +0xde,0x83,0xbc,0x87,0x79,0x8f,0xf1,0xc6,0xf1,0xc6,0xf3,0x26,0xf0,0x26,0xf3,0xa6, +0xf2,0xfe,0x9c,0xb3,0x37,0x1d,0xda,0x3a,0xb4,0xec,0x8a,0x16,0x1f,0x83,0x16,0xc6, +0x3c,0x98,0x0b,0xe6,0x83,0x05,0xe0,0x25,0xb0,0x08,0x24,0x80,0x44,0x90,0x02,0xd2, +0x41,0x06,0xc8,0x04,0x11,0xb0,0x6f,0x0c,0x52,0x1d,0xec,0x37,0x1a,0x57,0x82,0x31, +0xbc,0x35,0x9c,0x75,0xeb,0x79,0xd9,0xbc,0x3c,0xde,0x26,0x5e,0x11,0x6f,0x1b,0x6f, +0x07,0x6f,0x17,0xaf,0x8c,0x57,0xc1,0xdb,0xc7,0xab,0xe6,0xd5,0xf1,0x1a,0x79,0xff, +0xe4,0x1d,0xe0,0xb5,0xf2,0x8e,0xf0,0xde,0xe4,0x1d,0xe7,0x75,0xf2,0x4e,0xf3,0xde, +0xe1,0xbd,0xcf,0x3b,0xc3,0x3b,0xcf,0xeb,0xe2,0xf5,0xf2,0x2e,0xf1,0x3e,0xe5,0x7d, +0xce,0xfb,0x92,0x77,0x95,0xf7,0x1d,0xef,0x07,0x1e,0xdc,0x66,0x35,0xc8,0x6a,0xb0, +0x95,0xad,0x95,0xd0,0x4a,0x6c,0xe5,0x68,0x25,0xb5,0x1a,0x6e,0xe5,0x66,0x35,0xd2, +0xca,0xd3,0x4a,0x69,0xe5,0x6d,0xe5,0x67,0xf5,0x57,0x8f,0xef,0x40,0x28,0x68,0x41, +0x28,0x08,0x07,0x51,0x40,0x0f,0xe2,0xc0,0xed,0xe0,0x2e,0x30,0x0a,0x8c,0x06,0x0f, +0x80,0x87,0xc0,0xa3,0xe0,0x09,0xf0,0x24,0x78,0xfa,0x16,0x16,0x4e,0xc2,0xbe,0x29, +0x60,0x1a,0x98,0x09,0xe6,0x80,0x79,0xe0,0x05,0xf0,0x22,0x78,0x05,0xbc,0x06,0x16, +0x83,0x64,0x90,0x06,0x96,0x82,0xe5,0x60,0x05,0x58,0x0d,0xd6,0x81,0x8d,0x20,0x17, +0x14,0x80,0xcd,0x60,0x2b,0xd8,0x0e,0x4a,0xc0,0x6e,0x50,0x0e,0xf6,0x5a,0x55,0x21, +0xae,0x05,0x0d,0xa0,0x19,0xb4,0x80,0x43,0xa0,0x8d,0xb3,0xec,0x28,0xe2,0x76,0x70, +0x02,0x9c,0x02,0x6f,0x83,0xf7,0xc0,0x87,0xe0,0x1c,0xf8,0x08,0xf4,0x80,0x8b,0xe0, +0x13,0xf0,0x19,0xb8,0x02,0xbe,0x06,0xdf,0x82,0xef,0xd9,0x56,0x80,0xa5,0xb5,0xd1, +0x68,0x0d,0x04,0xc0,0x06,0xd8,0x03,0x11,0x70,0x00,0xce,0x60,0x18,0x18,0x01,0xdc, +0x81,0x1c,0x78,0x01,0x35,0xf0,0x05,0x01,0x40,0x03,0x42,0x40,0x18,0x88,0x04,0x31, +0x20,0x16,0xdc,0x06,0xee,0x04,0xf7,0x80,0xfb,0xc0,0xfd,0x60,0x2c,0x78,0x04,0x3c, +0x6e,0xcd,0x5e,0x6f,0xff,0xb0,0x7e,0xca,0x7a,0xa2,0xf5,0x33,0xd6,0xcf,0x5a,0xcf, +0xb0,0x9e,0x6d,0xfd,0x9c,0xf5,0xf3,0xd6,0x0b,0xad,0x5f,0xb6,0x7e,0xd5,0x9a,0xb1, +0x4e,0xb2,0x4e,0xb5,0x5e,0x62,0xbd,0xcc,0x3a,0xcb,0x7a,0x95,0xf5,0x5a,0xeb,0x0d, +0xd6,0x39,0xd6,0xf9,0xd6,0x85,0xd6,0x5b,0xac,0x8b,0xad,0x77,0x5a,0x97,0x5a,0xef, +0xb1,0xae,0xb4,0xde,0x6f,0x5d,0x63,0x5d,0x6f,0xdd,0x64,0xfd,0xba,0xf5,0x41,0xeb, +0xc3,0xd6,0x6f,0x58,0xb3,0x57,0xea,0x5f,0xf9,0x39,0x66,0x7d,0x63,0x56,0x36,0x90, +0xfb,0xbf,0xf2,0xe9,0xb4,0x7e,0xdb,0xfa,0x03,0xeb,0xf3,0xd6,0x7f,0xac,0x95,0x1e, +0xeb,0x4f,0xad,0xbf,0xb2,0xfe,0xde,0x9a,0x37,0x68,0xc8,0x20,0xd1,0x20,0xe9,0xa0, +0x3f,0x77,0x26,0xfc,0x63,0xdf,0xff,0x7c,0x76,0x7c,0x63,0x8f,0x6c,0x90,0xd7,0xa0, +0x7e,0xa3,0xdf,0xa0,0x9f,0xd6,0xfe,0x7d,0x9a,0x3f,0x3d,0xcf,0x37,0xf4,0xfe,0xfd, +0x96,0xfb,0x6f,0xb1,0x1d,0x3c,0x88,0x8d,0x23,0x07,0xdd,0xdc,0x62,0xff,0xaf,0xea, +0xfd,0xb4,0xcf,0xa6,0x10,0x37,0xe8,0xee,0x41,0xf7,0x0f,0x62,0xf7,0x3e,0x3a,0xe8, +0xa7,0xde,0xf9,0xf7,0x57,0x1b,0xff,0xca,0xff,0xb7,0x2a,0x39,0xb0,0x35,0x7e,0xd0, +0x33,0x83,0xfa,0x6f,0xe9,0xc9,0xdf,0x6f,0xc1,0x5f,0xf7,0x99,0x39,0xc8,0xf8,0x0b, +0xe7,0xb7,0xff,0xfa,0x39,0xea,0xff,0x17,0xe7,0xf0,0xb7,0x9d,0xf5,0x5f,0xae,0x35, +0x7f,0xd0,0xbf,0x1e,0x7d,0xbf,0xd4,0x42,0xff,0x2f,0xfa,0xf0,0xe5,0x41,0x8b,0x07, +0xfd,0x19,0xeb,0xc7,0x5f,0xfa,0xa4,0x0f,0xfa,0x4f,0xde,0x9b,0x96,0x0d,0xfa,0x79, +0x8f,0x57,0x5f,0xdf,0x97,0x7d,0x3d,0x57,0x78,0x3d,0xb7,0xfd,0x17,0xed,0x2b,0x1b, +0xf4,0xf3,0x6b,0x6a,0x3f,0xf6,0x35,0x0c,0x3a,0x30,0xe8,0x8d,0x41,0xa7,0x06,0xbd, +0xff,0x93,0x9a,0xdd,0xbf,0xa1,0xa7,0x9f,0xdc,0xc2,0xbe,0x2f,0xaf,0xef,0xbb,0x76, +0x3d,0x67,0xc9,0x1f,0xc8,0x0d,0xe6,0xff,0x52,0x5b,0x43,0xf9,0x7f,0xe6,0x93,0xc5, +0x99,0x3f,0x9c,0x2f,0xe3,0xcb,0xf9,0x4a,0xbe,0x0f,0x3f,0x80,0xaf,0xe5,0xeb,0xf8, +0x91,0x7c,0x3d,0x3f,0x9e,0x7f,0x27,0x7f,0x14,0x7f,0x0c,0x7f,0x2c,0xff,0x51,0xfe, +0x38,0xfe,0x53,0xfc,0x49,0xfc,0xa9,0xfc,0x19,0xfc,0x39,0xfc,0xf9,0xfc,0x85,0xfc, +0x57,0xf8,0x09,0xfc,0x24,0x7e,0x1a,0x3f,0x83,0x9f,0xc5,0x5f,0xcd,0x5f,0xcf,0xcf, +0xe1,0x17,0xf0,0x8b,0xf8,0xc5,0xfc,0x12,0x7e,0xbf,0xb1,0x8c,0x7f,0x63,0x64,0x54, +0xf2,0xff,0xca,0xab,0xb3,0x8a,0xff,0x67,0xb4,0x42,0x44,0x64,0xfc,0xaf,0xf9,0xb0, +0xfe,0xac,0xe3,0x37,0xf1,0x5b,0xf8,0xad,0xfc,0x37,0xf8,0xed,0xfc,0xfe,0xff,0xe0, +0xec,0xe2,0xdf,0xf3,0x14,0x5d,0xff,0xfc,0xda,0x3d,0xfc,0x8f,0x7e,0x4e,0x63,0x65, +0xf1,0x1d,0x8f,0x5d,0x43,0x0c,0xc2,0xba,0x41,0x6b,0xd5,0xc9,0x7f,0x8b,0x7f,0xb3, +0xc2,0x7b,0xfc,0x33,0xfc,0x0b,0xfc,0x1e,0xfe,0x25,0xfe,0x65,0xfe,0x15,0xfe,0x55, +0xfe,0x35,0xbe,0x91,0xcf,0x13,0xf0,0x05,0x55,0x7c,0x1b,0x81,0x50,0x20,0x11,0x38, +0x0b,0x86,0x0b,0x64,0x02,0xb9,0x40,0x29,0xf0,0x11,0x04,0x08,0xb4,0x02,0x9d,0x20, +0x52,0xa0,0x17,0xc4,0x0b,0xee,0x14,0x8c,0x12,0x8c,0x11,0x8c,0x15,0x3c,0x2a,0x18, +0x27,0x78,0x4a,0x30,0x49,0x30,0x55,0x30,0x43,0x30,0x47,0x30,0x5f,0xb0,0x50,0xf0, +0x8a,0x20,0x41,0xc0,0xb6,0x9c,0x24,0x48,0x13,0x64,0x08,0xfe,0x2a,0x7f,0x5b,0xd0, +0xf3,0xc4,0x83,0xf7,0xd8,0xf7,0x8a,0xeb,0x2d,0x7e,0xfa,0x5e,0x11,0x73,0x6d,0x9a, +0x6f,0x29,0xc3,0xba,0x9c,0x7d,0xaf,0xe8,0x47,0x16,0x94,0x25,0x58,0x25,0x58,0x2b, +0xe0,0x71,0xef,0x21,0xd9,0xb7,0x3e,0x1b,0x05,0x76,0x28,0xe5,0x88,0xd2,0xfe,0x16, +0x23,0x28,0xdd,0x22,0x57,0xb0,0x49,0x20,0xe3,0x4a,0x6f,0x11,0x54,0x58,0xf8,0xd0, +0x76,0x81,0x69,0x55,0xca,0xae,0x39,0x45,0x68,0x87,0x7d,0x3b,0xc9,0xee,0xb9,0x97, +0xdb,0xf3,0xcb,0x76,0x5d,0xfd,0x53,0x56,0xa6,0xbb,0x04,0xd6,0x54,0x26,0x58,0x45, +0x1b,0x05,0x36,0x54,0x21,0xd8,0x27,0xa8,0x16,0xec,0xb2,0xd8,0x61,0x51,0x27,0x68, +0x14,0xbc,0x2e,0x38,0x28,0x38,0x2c,0x38,0x2a,0x68,0x17,0x9c,0x10,0xec,0xb3,0x38, +0x25,0x78,0x5b,0x50,0x6d,0xf1,0x9e,0xe0,0x43,0xc1,0x11,0x8b,0x73,0x82,0xcd,0x96, +0xa7,0x2d,0x3e,0x12,0xbc,0x63,0xb1,0xd5,0x52,0x4b,0xbd,0x82,0x4b,0x82,0xf3,0x16, +0x3a,0xde,0xa7,0x38,0x03,0x5f,0x80,0xaf,0xc1,0x77,0xa0,0x1f,0x58,0x0e,0x36,0x1a, +0x07,0x81,0x21,0xc0,0x1e,0x88,0x81,0x13,0x18,0x06,0xdc,0x80,0x07,0xf0,0x02,0xde, +0xc0,0x1f,0x68,0x40,0x28,0x88,0x00,0x31,0x20,0x0e,0xdc,0x01,0xee,0x01,0xa3,0xc1, +0x83,0xe0,0x11,0xf0,0x04,0x18,0x0f,0x26,0x82,0x29,0x60,0x3a,0x98,0x0d,0xe6,0x81, +0x05,0xe0,0x65,0xf0,0x1a,0x48,0x04,0xa9,0x60,0x29,0xc8,0x04,0xab,0xc0,0x3a,0x90, +0x0d,0xf2,0xc1,0x66,0xb0,0x0d,0xec,0x04,0xbb,0x41,0x05,0xd8,0x0f,0x6a,0x41,0x23, +0x78,0x1d,0x1c,0x02,0x47,0xc0,0x31,0x70,0x02,0x9c,0x06,0xef,0x82,0x0f,0xc1,0x79, +0xd0,0x0d,0x2e,0x82,0x4f,0xc1,0x17,0xe0,0x6b,0xf0,0x1d,0xe8,0x07,0x96,0x43,0xd0, +0x7f,0x30,0x04,0xd8,0x03,0x31,0x70,0x1a,0x72,0xc3,0xfb,0xc3,0x86,0xb0,0xaa,0xf0, +0x05,0xf6,0x8d,0x04,0x0a,0xa0,0x06,0x7e,0x20,0x08,0x84,0x80,0x70,0x10,0x0d,0x62, +0xc1,0xed,0xe0,0x6e,0x70,0x1f,0x78,0x00,0x3c,0x0c,0x1e,0x07,0x4f,0x82,0x09,0xe0, +0x19,0x30,0x0d,0xcc,0x02,0xcf,0x81,0x17,0xc0,0x4b,0xe0,0x55,0xb0,0x18,0xa4,0x80, +0x25,0x60,0x39,0x58,0x09,0xd6,0x82,0x8d,0x20,0x0f,0x14,0x82,0xad,0x60,0x07,0x28, +0x05,0xe5,0x60,0x1f,0xa8,0x01,0x0d,0xe0,0x9f,0xe0,0x20,0x68,0x03,0x6f,0x82,0x0e, +0x70,0x0a,0xbc,0x03,0x3e,0x18,0xf2,0xf3,0x91,0x75,0x6e,0x48,0xd7,0x90,0xbe,0x21, +0x9f,0x0c,0xf9,0x7c,0xc8,0x57,0x43,0xbe,0x1d,0xf2,0xc3,0x90,0x9f,0xde,0x77,0x2c, +0x6c,0xac,0x6d,0x06,0xdb,0xd8,0xd9,0x88,0x6c,0x1c,0x6d,0x6e,0x75,0xff,0x71,0xb1, +0x19,0x61,0x33,0xd2,0x46,0x61,0xa3,0xb6,0xf1,0xb3,0x09,0xb2,0x09,0xb1,0xf9,0xe9, +0xf1,0x70,0x9b,0x68,0x9b,0x58,0x9b,0xdb,0x6d,0xee,0xb6,0xb9,0xcf,0xe6,0x01,0x9b, +0x87,0x6d,0x7e,0xda,0xfe,0xe3,0x36,0x4f,0xda,0x4c,0xb0,0x79,0xc6,0x66,0x9a,0xcd, +0xac,0x5b,0xb6,0xdf,0x6f,0x7c,0x0e,0xfb,0x5f,0x00,0x2f,0x81,0x57,0x7f,0xd6,0xfe, +0x62,0x9b,0x14,0x9b,0x25,0x36,0xcb,0x6d,0x56,0xda,0xac,0xb5,0xd9,0x68,0x93,0x87, +0xe3,0x43,0x70,0xc5,0x0d,0x05,0x12,0xe0,0x04,0x5c,0x80,0x2b,0x90,0x71,0xef,0x9e, +0x0a,0x6d,0x8a,0x6d,0x4a,0x6d,0x2a,0x6d,0x6a,0x6c,0x9a,0x6c,0x0e,0xda,0xbc,0x61, +0xf3,0xd3,0xed,0x0e,0x9b,0xb7,0x6c,0x3e,0xb0,0xb9,0x60,0xd3,0x67,0x73,0xd9,0xe6, +0x2b,0x9b,0x6b,0x3f,0xdb,0xb6,0xb0,0xe5,0xdb,0xda,0xd9,0x4a,0x6c,0x5d,0x6c,0x65, +0xb6,0x0a,0x5b,0x1f,0xdb,0x9f,0x6e,0xb3,0x36,0x05,0xd9,0xea,0x6c,0xa3,0x6c,0xd9, +0xbe,0xc4,0xda,0xde,0x69,0x3b,0xca,0x76,0x8c,0xed,0x10,0x9e,0xce,0x76,0xac,0xed, +0xc7,0x96,0x63,0x6d,0x1f,0xb5,0x1d,0x67,0x3b,0xc1,0x76,0xaa,0xed,0x4c,0xee,0xf8, +0x73,0xb6,0x0b,0x6d,0x87,0xf2,0x5e,0xb1,0x95,0xf0,0xa6,0xda,0x26,0xd8,0xa6,0xd8, +0x66,0xd8,0x9a,0x7a,0xb5,0xd2,0x76,0xc0,0x17,0x6b,0x6c,0x37,0xd8,0xe6,0xda,0xb2, +0x6f,0xc8,0x36,0xd9,0x6e,0xb3,0xdd,0x65,0x3e,0x5e,0x61,0x3b,0xd0,0xff,0x7d,0xb6, +0x35,0xb6,0x0d,0xb6,0xae,0xbc,0x7f,0xda,0x1e,0xb4,0xb5,0xe2,0xbd,0xc1,0xd5,0x7b, +0xd3,0xb6,0xd3,0xf6,0x6d,0xae,0xfd,0x0f,0x6c,0x2f,0xd8,0xba,0xf0,0x7a,0x6c,0x65, +0xbc,0x4e,0xdb,0x78,0xba,0x64,0xcb,0x7e,0x7f,0x71,0xab,0x60,0x7a,0xee,0x98,0x34, +0x2f,0xdb,0xde,0xf0,0xee,0x15,0xdb,0x7f,0xbd,0xae,0x30,0xfe,0xc2,0xb7,0x23,0x57, +0x6d,0xfb,0x51,0x53,0x60,0x27,0xb4,0xbb,0x3e,0x4e,0x90,0x73,0xb5,0xfb,0x69,0x2b, +0xee,0x76,0x72,0x3b,0x2f,0xbb,0x5f,0xbe,0xef,0xa9,0x7f,0x72,0x2c,0xe4,0xc6,0x83, +0x92,0x6e,0xa8,0xde,0xb4,0x93,0x42,0xed,0x44,0xdc,0x91,0x30,0xbb,0x08,0xbb,0x28, +0xbb,0x18,0x3b,0x83,0x5d,0x9c,0xdd,0x6d,0x76,0x77,0xd8,0xdd,0x63,0x77,0xaf,0xdd, +0x68,0xbb,0xe1,0x38,0x3e,0x9a,0xd8,0xef,0x67,0x6e,0x7d,0x1c,0xe3,0x1d,0xcf,0x83, +0x11,0x14,0x80,0x67,0x82,0xf0,0xfa,0xd3,0x43,0xc6,0x7d,0x1f,0x75,0xeb,0xe7,0xef, +0xfd,0x76,0xff,0xde,0x9d,0x7c,0xac,0xdd,0xa3,0x76,0xd6,0x34,0x0e,0xb5,0x9e,0xb2, +0x9b,0x64,0x97,0xc7,0x7e,0x63,0x61,0xc7,0x3e,0xad,0x4c,0xe1,0x2b,0x3c,0xb5,0x44, +0x50,0x75,0x86,0x1f,0x87,0xd3,0x0c,0xae,0x6d,0xd3,0x37,0x62,0x6c,0x60,0xb7,0x66, +0xdb,0x3d,0x67,0xf7,0x02,0xf6,0xb3,0xdf,0x89,0x4d,0xe0,0x99,0x52,0x47,0x7a,0x8e, +0xfb,0x4e,0x0d,0xb3,0x60,0xee,0x5b,0xb5,0x17,0xed,0x5c,0xd0,0x87,0x45,0x76,0x09, +0x76,0x89,0x76,0x29,0xf0,0x07,0x56,0x17,0x76,0x77,0xe3,0x59,0xa5,0xe2,0xdd,0xcd, +0x5b,0x76,0xdd,0x5e,0x3e,0xf7,0xec,0x63,0x9f,0x92,0x37,0xdb,0xb7,0xc2,0x6e,0x9d, +0x5d,0xae,0x5d,0x91,0xdd,0x0e,0xbb,0x32,0xbb,0x7d,0x76,0x75,0x76,0xff,0xb4,0x6b, +0xb5,0x7b,0xd3,0xae,0xd3,0xee,0x1d,0xbb,0x33,0x76,0x5d,0x76,0x97,0xd0,0xda,0x67, +0x76,0x57,0xec,0xae,0xda,0xf9,0xd0,0x77,0x76,0x3f,0xd8,0x59,0xd8,0x0f,0xb2,0x0f, +0xa0,0xc1,0xf6,0xb6,0xf6,0xce,0xdc,0x77,0x7a,0x2e,0xf4,0x6b,0xc7,0xcd,0x73,0x72, +0xfb,0x1b,0x8a,0x0e,0xf6,0x3f,0x5d,0x3d,0xfc,0x37,0x7e,0x86,0xd9,0x8f,0x44,0x3f, +0x7c,0xec,0x35,0xf6,0xff,0x69,0xe5,0x28,0x7b,0xc3,0x1f,0xd6,0xfc,0xed,0xeb,0xd7, +0x5b,0x5c,0x3d,0xf6,0x77,0xda,0xdf,0x63,0x7f,0x9f,0xfd,0xfd,0xf6,0x63,0xed,0x1f, +0xb1,0x7f,0xdc,0xfe,0x1f,0xf6,0x4f,0xd9,0x4f,0xb4,0x7f,0xc6,0x7e,0x9a,0xfd,0x2c, +0xfb,0xe7,0xec,0x5f,0xb0,0x7f,0xc9,0xfe,0x55,0xfb,0xc5,0xf6,0x29,0xf6,0x4b,0xec, +0x33,0xed,0x57,0xdb,0x6f,0xb0,0xcf,0xb3,0xdf,0x6c,0x5f,0x6c,0xbf,0xcb,0xbe,0xdc, +0x7e,0xbf,0x7d,0x9d,0xfd,0x6f,0xd5,0x6d,0xb6,0x3f,0x60,0x7f,0xd8,0xfe,0xa8,0xfd, +0x71,0xfb,0x93,0xf6,0x6f,0xdb,0xbf,0x6f,0x7f,0xd6,0xfe,0x23,0xfb,0x5e,0xfb,0x8f, +0xed,0x3f,0xb3,0xff,0xd2,0xfe,0x1b,0xfb,0xef,0xed,0x49,0x68,0x25,0x14,0x08,0x6d, +0x85,0x43,0x85,0x0e,0x42,0xa9,0xd0,0x55,0xe8,0x2e,0xf4,0x14,0xfe,0x9e,0x6f,0x9a, +0x7f,0x4f,0x9d,0x50,0xbb,0x3f,0x7e,0x16,0x55,0x42,0xe3,0xff,0xa9,0x4f,0x88,0x30, +0x5c,0x18,0xf5,0x27,0xf6,0xc9,0xf0,0x27,0xb5,0x75,0x87,0xf0,0x1e,0xe1,0x68,0xe1, +0x83,0xc2,0x47,0x84,0x4f,0x08,0xc7,0x0b,0x27,0x0a,0xa7,0x08,0xa7,0x0b,0x67,0x0b, +0xe7,0x09,0x17,0x08,0x5f,0x16,0xbe,0x26,0x4c,0x14,0xa6,0x0a,0x97,0x0a,0x33,0x85, +0xab,0x84,0xeb,0x84,0xd9,0xc2,0x7c,0xe1,0x66,0xe1,0x36,0xe1,0x4e,0xe1,0x6e,0x61, +0x85,0x70,0xbf,0xb0,0x56,0xd8,0x28,0x7c,0x5d,0x78,0x48,0x78,0x44,0x78,0x4c,0x78, +0x42,0x78,0x5a,0xf8,0xae,0xf0,0x43,0xe1,0x79,0x61,0xb7,0xf0,0xa2,0xf0,0x53,0xe1, +0x17,0xc2,0xaf,0x85,0xdf,0x09,0xfb,0x85,0x96,0x43,0xff,0x6a,0xbf,0x0e,0x82,0xc2, +0x90,0xa1,0x76,0x43,0x45,0x9c,0x92,0x03,0x62,0x29,0x70,0x05,0xab,0xb0,0x06,0xc8, +0x12,0xec,0xc2,0x7c,0xde,0x9d,0x3b,0xe6,0xf9,0x23,0x5b,0x24,0x18,0xaf,0xaa,0xa1, +0x3e,0x43,0xfd,0xb1,0x57,0x03,0x42,0x41,0x04,0x88,0x01,0x71,0xe0,0x0e,0x70,0x0f, +0x18,0x0d,0x1e,0x04,0x8f,0x80,0x27,0xc0,0x78,0x30,0x11,0x4c,0x01,0xd3,0xc1,0x6c, +0x30,0x0f,0x2c,0x00,0x2f,0x83,0xd7,0x40,0x22,0x48,0x05,0x4b,0x41,0x26,0x6b,0x09, +0x58,0x07,0xb2,0x41,0x3e,0xd8,0x0c,0xb6,0x81,0x9d,0x60,0x37,0xa8,0x00,0xfb,0x41, +0x2d,0x68,0x04,0xaf,0x83,0x43,0xe0,0x08,0x38,0x06,0x4e,0x80,0xd3,0xe0,0x5d,0xf0, +0x21,0x38,0x0f,0xba,0xc1,0x45,0xf0,0x29,0xf8,0xe2,0x67,0x5e,0xfe,0x1a,0x7b,0xbe, +0xbb,0xbe,0xb7,0x7f,0xa8,0xf1,0x3f,0xf6,0xbe,0xf3,0xc7,0x77,0x29,0x4b,0x91,0xf1, +0x77,0xbd,0xfd,0xfb,0xad,0x6f,0xb8,0x07,0x89,0xfe,0x3b,0xae,0xfe,0x21,0xa2,0x5f, +0xf2,0x80,0xbd,0x48,0x2c,0x72,0x12,0x0d,0x13,0xb9,0x89,0x3c,0x44,0x5e,0x22,0x6f, +0x91,0xbf,0x48,0x23,0x0a,0x15,0x45,0x88,0x62,0x44,0x71,0xa2,0x3b,0x44,0xf7,0x88, +0x46,0x8b,0x1e,0x14,0x3d,0x22,0x7a,0x42,0x34,0x5e,0x34,0x51,0x34,0x45,0x34,0x5d, +0x34,0x5b,0x34,0x4f,0xb4,0x40,0xf4,0xb2,0xe8,0x35,0x51,0xa2,0x28,0x55,0xb4,0x54, +0x94,0x29,0x5a,0x25,0x5a,0x27,0xca,0x16,0xe5,0x8b,0x36,0x8b,0xb6,0x89,0x76,0x8a, +0x76,0x8b,0x2a,0x44,0xfb,0x45,0xb5,0xa2,0x46,0xd1,0xeb,0xa2,0x43,0xa2,0x23,0xa2, +0x63,0xa2,0x13,0xa2,0xd3,0xa2,0x77,0x45,0x1f,0x8a,0xce,0x8b,0xba,0x45,0x17,0x45, +0x9f,0x8a,0xbe,0x10,0x7d,0x2d,0xfa,0x4e,0xd4,0x2f,0xb2,0x14,0x0f,0x12,0x0f,0x11, +0xdb,0x8b,0xc5,0x62,0x27,0xf1,0x30,0xb1,0x9b,0xd8,0x43,0xec,0x25,0xf6,0x16,0xfb, +0x8b,0x35,0xe2,0x50,0x71,0x84,0x38,0x46,0x1c,0x27,0xbe,0x43,0x7c,0x8f,0x78,0xb4, +0xf8,0x41,0xf1,0x23,0xe2,0x27,0xc4,0xe3,0xc5,0x13,0xc5,0x53,0xc4,0xd3,0xc5,0xb3, +0xc5,0xf3,0xc4,0x0b,0xc4,0x2f,0x8b,0x5f,0x13,0x27,0x8a,0x53,0xc5,0x4b,0xc5,0x99, +0xe2,0x55,0xe2,0x75,0xe2,0x6c,0x71,0xbe,0x78,0xb3,0x78,0x9b,0x78,0xa7,0x78,0xb7, +0xb8,0x42,0xbc,0x5f,0x5c,0x2b,0x6e,0x14,0xbf,0x2e,0x3e,0x24,0x3e,0x22,0x3e,0x26, +0x3e,0x21,0x3e,0x2d,0x7e,0x57,0xfc,0xa1,0xf8,0xbc,0xb8,0x5b,0x7c,0x51,0xfc,0xa9, +0xf8,0x0b,0xf1,0xd7,0xe2,0xef,0xc4,0xfd,0x62,0x4b,0xc9,0x20,0xc9,0x10,0x89,0xbd, +0x44,0x2c,0x71,0x92,0x0c,0x93,0xb8,0x49,0x3c,0x24,0x5e,0x12,0x6f,0x89,0xbf,0x44, +0x23,0x09,0x95,0x44,0x48,0x62,0x24,0x71,0x92,0x3b,0x24,0xf7,0x48,0x46,0x4b,0x1e, +0x94,0x3c,0x22,0x79,0x42,0x32,0x5e,0x32,0x51,0x32,0x45,0x32,0x5d,0x32,0x5b,0x32, +0x4f,0xb2,0x40,0xf2,0xb2,0xe4,0x35,0x49,0xa2,0x24,0x55,0xb2,0x54,0x92,0x29,0x59, +0x25,0x59,0x27,0xc9,0x96,0xe4,0x4b,0x36,0x4b,0xb6,0x49,0x76,0x4a,0x76,0x4b,0x2a, +0x24,0xfb,0x25,0xb5,0x92,0x46,0xc9,0xeb,0x92,0x43,0x92,0x23,0x92,0x63,0x92,0x13, +0x92,0xd3,0x92,0x77,0x25,0x1f,0x4a,0xce,0x4b,0xba,0x25,0x17,0x25,0x9f,0x4a,0xbe, +0x90,0x7c,0x2d,0xf9,0x4e,0xd2,0x2f,0xb1,0x74,0x18,0xe4,0x30,0xc4,0xc1,0xde,0x41, +0xec,0xe0,0xe4,0x30,0xcc,0xc1,0xcd,0xc1,0xc3,0xc1,0xcb,0xc1,0xdb,0xc1,0xdf,0x41, +0xe3,0x10,0xea,0x10,0xe1,0x10,0xe3,0x10,0xe7,0x70,0x87,0xc3,0x3d,0x0e,0xa3,0x1d, +0x1e,0x74,0x78,0xc4,0xe1,0x09,0x87,0xf1,0x0e,0x13,0x1d,0xfa,0x8d,0x7f,0x7e,0x60, +0x57,0x08,0x53,0x1c,0xfe,0x33,0xa3,0xf0,0x59,0xe8,0x4c,0x17,0xcd,0x74,0x98,0xeb, +0xf0,0x47,0xae,0x6e,0xf6,0xf3,0xbc,0xc3,0x4b,0x5c,0x1b,0xaf,0x39,0xfc,0x77,0x3f, +0x95,0x53,0x1c,0xfe,0xea,0xfb,0x62,0xbf,0x71,0x99,0xc3,0x0a,0x87,0x35,0x0e,0x1b, +0x1c,0x72,0x1d,0x36,0x39,0x6c,0x71,0xd8,0xee,0xb0,0xcb,0x61,0x8f,0xc3,0x5e,0x87, +0x6a,0x87,0x7a,0x87,0x66,0x87,0x03,0x0e,0x87,0x1d,0x8e,0x3a,0x1c,0x77,0x38,0xe9, +0xf0,0xb6,0xc3,0xfb,0x0e,0x67,0x1d,0x3e,0x72,0xe8,0x75,0xf8,0xd8,0xe1,0x33,0x87, +0x2f,0x1d,0xbe,0x71,0xf8,0xde,0x81,0x1c,0xad,0x1c,0x05,0x8e,0xb6,0x8e,0x43,0x1d, +0x1d,0x1c,0xa5,0x8e,0xae,0x8e,0xee,0x8e,0x9e,0x8e,0x2a,0x47,0x5f,0xc7,0x40,0xc7, +0x60,0xc7,0x30,0xc7,0x28,0x47,0x83,0xe3,0x6d,0x8e,0x77,0x39,0xde,0xeb,0x78,0xbf, +0xe3,0x43,0x8e,0x44,0x8f,0x39,0xfe,0xc3,0xf1,0x69,0xc7,0xc9,0x8e,0xcf,0x3a,0xce, +0x74,0x9c,0xeb,0xf8,0xbc,0xe3,0x8b,0x8e,0x8b,0x1c,0x19,0xc7,0x64,0xc7,0x74,0xc7, +0x65,0x8e,0x2b,0x1c,0xd7,0x38,0x6e,0x70,0xcc,0x75,0xdc,0xe4,0xb8,0xc5,0x71,0xbb, +0xe3,0x2e,0xc7,0x3d,0x8e,0x7b,0x1d,0xab,0x1d,0xeb,0x1d,0x9b,0x1d,0x0f,0x38,0x1e, +0x76,0x3c,0xea,0x78,0xdc,0xf1,0xa4,0xe3,0xdb,0x8e,0xef,0x3b,0x9e,0x75,0xfc,0xc8, +0xb1,0xd7,0xf1,0x63,0xc7,0xcf,0x1c,0xbf,0x74,0xfc,0xc6,0xf1,0x7b,0x47,0x93,0x57, +0xec,0x71,0x67,0x22,0x27,0x2b,0x27,0x81,0x93,0xad,0xd3,0x50,0x27,0x07,0x27,0x37, +0x91,0xd4,0xc9,0xd5,0xc9,0xdd,0xc9,0xd3,0xc9,0xff,0x0f,0xdf,0x7f,0x55,0x4e,0xfe, +0x4e,0xc1,0x4e,0x11,0x4e,0x06,0xa7,0x3b,0x9c,0xee,0x75,0x7a,0xd0,0xe9,0x31,0xa7, +0xf1,0x4e,0x93,0x9d,0xa6,0x3b,0xcd,0x75,0x5a,0xe0,0xb4,0xc8,0x29,0xd1,0x29,0xdd, +0x29,0xd3,0x69,0x8d,0x53,0xb6,0xd3,0x26,0xa7,0x6d,0x4e,0xbb,0x9c,0x2a,0x9c,0xaa, +0x9d,0x1a,0x9d,0x0e,0x38,0x1d,0x71,0x3a,0xee,0x74,0xda,0xe9,0x8c,0x53,0xbf,0xb1, +0xd7,0xe9,0x53,0xa7,0x2f,0x9d,0xbe,0x73,0x22,0xe7,0x41,0xce,0xb6,0xce,0x62,0x67, +0xa9,0xb3,0x9b,0xb3,0xa7,0xb3,0xb7,0x73,0xa0,0x73,0xa8,0x73,0x94,0x73,0x9c,0xf3, +0x5d,0xce,0xa3,0x9d,0x1f,0x72,0x7e,0xc2,0xf9,0x69,0xe7,0x29,0xce,0x33,0x9d,0xe7, +0x39,0xbf,0xe8,0xfc,0x9a,0x73,0xb2,0xf3,0x52,0xe7,0x15,0xce,0xeb,0x9c,0x73,0x9d, +0x37,0x3b,0x6f,0x77,0xde,0xed,0xbc,0xd7,0xb9,0xd6,0xb9,0xd9,0xf9,0x80,0xb3,0x93, +0xf8,0xb0,0xf3,0x4f,0xed,0x3b,0xea,0x7c,0xdc,0xb9,0xd3,0xf9,0xb4,0xf3,0x3b,0xce, +0xef,0x3b,0x9f,0x71,0x3e,0xef,0xdc,0xe5,0xdc,0xeb,0x7c,0xc9,0xf9,0x53,0xe7,0xcf, +0x9d,0xbf,0x74,0xbe,0xea,0xfc,0x9d,0xf3,0x32,0x9c,0xd9,0x2d,0x38,0xa7,0xec,0x59, +0x7c,0x9f,0x3b,0x7f,0x37,0xce,0xde,0x0f,0xce,0x16,0x52,0x6b,0xe9,0x60,0xa9,0x9d, +0x54,0x24,0x75,0x94,0xba,0x48,0x47,0x48,0x47,0x4a,0x15,0x52,0xb5,0xd4,0x4f,0x1a, +0x24,0x0d,0x91,0x46,0x49,0xe3,0xa5,0x37,0x7c,0x7b,0xa7,0x74,0x94,0x74,0x8c,0x34, +0x42,0x34,0x56,0x3a,0x5d,0xa4,0xc1,0xbd,0x76,0x3c,0xee,0xc2,0xdb,0x24,0x4b,0x45, +0xde,0xe2,0x47,0xa5,0xe3,0xa4,0x4f,0x49,0x27,0x49,0xa7,0x4a,0x67,0x48,0xe7,0x48, +0xe7,0x4b,0x17,0x4a,0x5f,0x91,0x6e,0x16,0x25,0x48,0x93,0xa4,0x69,0xd2,0x0c,0x69, +0x96,0x74,0xb5,0x74,0xbd,0x34,0x47,0x6a,0x3a,0x37,0x05,0xd2,0x22,0x69,0xb1,0xb4, +0x44,0x5a,0x26,0xad,0x94,0x56,0x49,0xeb,0xa4,0x4d,0xd2,0x16,0x69,0xab,0xf4,0x88, +0xf4,0x4d,0xe9,0x71,0x69,0xa7,0xf4,0xb4,0xf4,0x1d,0xe9,0xfb,0xd2,0x33,0xd2,0xf3, +0xd2,0x2e,0x69,0xaf,0xf4,0x92,0xf4,0x53,0xe9,0xe7,0xd2,0x2f,0xa5,0xdf,0x4a,0xfb, +0xa5,0x3c,0x17,0x81,0x8b,0x9d,0x8b,0xd8,0xc5,0xd9,0xc5,0xd5,0x65,0xa4,0x8b,0xd2, +0xc5,0xcf,0x45,0xeb,0x12,0xea,0x12,0xe1,0x12,0xed,0x12,0xeb,0x72,0xbb,0xcb,0xdd, +0x2e,0xf7,0xb9,0x3c,0xe0,0xf2,0xb0,0xcb,0xe3,0x2e,0x4f,0xba,0x4c,0x70,0x79,0xc6, +0x65,0x9a,0xcb,0x2c,0x97,0xe7,0x5c,0x5e,0x70,0x79,0xc9,0xe5,0x55,0x97,0xc5,0x2e, +0x29,0x2e,0x4b,0x5c,0x96,0xbb,0xac,0x74,0x59,0xeb,0xb2,0xd1,0x25,0xcf,0xa5,0xd0, +0x65,0xab,0xcb,0x0e,0x97,0x52,0x97,0x72,0x97,0x7d,0x2e,0x35,0x2e,0x0d,0x2e,0xff, +0x74,0x39,0xe8,0xd2,0xe6,0xf2,0xa6,0x4b,0x87,0xcb,0x29,0x97,0x77,0x5c,0x3e,0x70, +0x39,0xe7,0xd2,0xe5,0xd2,0xe7,0xf2,0x89,0xcb,0xe7,0x2e,0x5f,0xb9,0x7c,0xeb,0xf2, +0x83,0x8b,0xd5,0x30,0xd1,0x30,0xb7,0x61,0x3e,0xc3,0x42,0x86,0xc5,0x0d,0xbb,0x77, +0xd8,0x23,0xc3,0xa6,0x0c,0x9b,0x3f,0xec,0xd5,0x61,0x69,0xc3,0x56,0x0e,0xcb,0x1f, +0x56,0x32,0x6c,0xdf,0xb0,0xa6,0x61,0x87,0x86,0x1d,0x1f,0xf6,0xc1,0xb0,0x8b,0xc3, +0x3e,0x1f,0x66,0x31,0xdc,0x61,0xb8,0xe7,0x70,0xff,0xe1,0x31,0xc3,0x47,0x0f,0x1f, +0x37,0xfc,0x99,0xe1,0x73,0x86,0xbf,0x34,0x3c,0x75,0xf8,0xba,0xe1,0x45,0xc3,0x4b, +0x87,0x57,0x0d,0xff,0xe7,0xf0,0xc3,0xc3,0xdb,0x87,0x9f,0x1e,0xfe,0xc1,0xf0,0x9e, +0xe1,0x9f,0x0f,0xb7,0x70,0xb5,0x71,0x95,0xba,0xaa,0x5c,0x35,0xae,0xe1,0xae,0x06, +0xd7,0xfb,0x5d,0x9f,0x74,0x9d,0xe5,0xba,0xd0,0x35,0xcd,0x35,0xd3,0x75,0x83,0xeb, +0x66,0xd7,0x5d,0xae,0xfb,0x5d,0x9b,0x5d,0xdf,0x74,0x7d,0xcb,0xf5,0x43,0xd7,0x5e, +0xd7,0x2f,0x5c,0xbf,0x77,0x1d,0x3c,0x42,0x32,0x62,0xc4,0x08,0xe5,0x08,0xdd,0x88, +0xdb,0x46,0x8c,0x1a,0x31,0x6e,0xc4,0xc4,0x11,0x73,0x46,0x2c,0x1a,0x91,0x3a,0x62, +0xc5,0x88,0xec,0x11,0xc5,0x23,0x76,0x8f,0xa8,0x1e,0x71,0x70,0xc4,0xd1,0x11,0xef, +0x8f,0xe8,0x1e,0x71,0x69,0xc4,0x67,0x23,0xbe,0x1a,0xf1,0xdd,0x08,0xe3,0x08,0x2b, +0xb7,0xc1,0x6e,0xf6,0x6e,0x12,0x37,0xa9,0x9b,0x9b,0x9b,0xa7,0x9b,0xb7,0x5b,0xa0, +0x5b,0xa8,0x5b,0x94,0x5b,0x9c,0xdb,0x5d,0x6e,0xa3,0xdd,0x1e,0x72,0x7b,0xc2,0xed, +0x69,0xb7,0x29,0x6e,0x33,0xdd,0xe6,0xb9,0x2d,0x70,0x7b,0xc9,0x6d,0x91,0x1b,0xe3, +0x96,0xe4,0x96,0xea,0xb6,0xc4,0x6d,0xb9,0xdb,0x4a,0xb7,0x35,0x6e,0x39,0x6e,0x9b, +0xdd,0x76,0xb8,0xed,0x71,0x6b,0x70,0x6b,0x76,0x6b,0x71,0x6b,0x75,0x3b,0xe2,0xf6, +0xa6,0xdb,0x71,0xb7,0x4e,0xb7,0xd3,0x6e,0xef,0xba,0x9d,0x71,0x3b,0xef,0xd6,0xe5, +0xd6,0xe7,0xf6,0x89,0xdb,0x67,0x6e,0x57,0xdc,0xbe,0x76,0xfb,0xce,0xad,0xdf,0xcd, +0x52,0x36,0x48,0x36,0x44,0x66,0x27,0x1b,0x2a,0x93,0xc8,0x9c,0x64,0x2e,0xb2,0x11, +0x32,0x77,0x99,0x5c,0xe6,0x25,0xf3,0x96,0xf9,0xcb,0x82,0x64,0x21,0xb2,0x70,0x59, +0xb4,0xcc,0x20,0xbb,0x4d,0x76,0x8f,0xac,0xc1,0xed,0x01,0xd9,0xc3,0xb2,0xc7,0x65, +0x4f,0xca,0x26,0xc8,0xa6,0xc9,0xe6,0xc9,0x5e,0x90,0xbd,0x28,0x5b,0x24,0x4b,0x90, +0x25,0xca,0x52,0x64,0x4b,0x64,0xcb,0x40,0x96,0x6c,0x95,0x6c,0xad,0x6c,0xa3,0x2c, +0x17,0x14,0xc8,0x8a,0x64,0xfd,0xc6,0x62,0xd9,0x4e,0x59,0xa9,0x6c,0x0f,0x72,0x55, +0xb2,0x5a,0x59,0x83,0xac,0x59,0xd6,0x22,0x3b,0x84,0xf6,0xdb,0x64,0x47,0x65,0xed, +0xb2,0x13,0xb2,0xd3,0xb2,0xe3,0x6e,0xef,0xc8,0x3e,0x90,0x9d,0x43,0x89,0x8f,0x64, +0xbd,0xb2,0x4b,0xb2,0x4f,0x65,0x9f,0xcb,0xbe,0x94,0x7d,0x27,0x23,0x77,0x6b,0xf7, +0x21,0xee,0x42,0x77,0x07,0x77,0x17,0x77,0x37,0x77,0xb9,0xbb,0xca,0xdd,0xcf,0x5d, +0xeb,0x1e,0xee,0xae,0x77,0xbf,0xdd,0x7d,0x94,0xfb,0x03,0xee,0x8f,0xba,0x3f,0xe9, +0x3e,0xc9,0x7d,0x9a,0xfb,0x1c,0xf7,0x17,0xdc,0x5f,0x71,0x5f,0xec,0x9e,0xe6,0xbe, +0xdc,0x7d,0xb5,0xfb,0x46,0xf7,0x02,0xf7,0xad,0xee,0x25,0xee,0xe5,0xee,0xfb,0xdc, +0x8d,0xc6,0x1a,0xd0,0x00,0xfe,0x09,0x0e,0x82,0x4e,0xbe,0xd1,0xd8,0x86,0xf4,0x4d, +0xd0,0x01,0x4e,0x81,0x77,0xc0,0x07,0xe0,0x1c,0xe8,0x02,0x7d,0xe0,0x13,0xf0,0x39, +0xf8,0x0a,0x7c,0x0b,0x7e,0x00,0x16,0x23,0x8d,0x46,0x6b,0x30,0x78,0xe4,0x6f,0xbb, +0xff,0xd8,0xa1,0x9c,0x08,0x38,0x02,0x17,0x30,0x02,0x8c,0x04,0x0a,0xa0,0x06,0x7e, +0x20,0x08,0x84,0x80,0x70,0x10,0x0d,0x62,0x81,0x9b,0x95,0xa7,0xd5,0xff,0x96,0xa7, +0xd8,0xed,0xb0,0xe7,0x6e,0x70,0x1f,0x78,0x00,0x3c,0x0c,0x1e,0x07,0x4f,0x9a,0x7d, +0x30,0x01,0xe9,0x33,0x60,0x1a,0x98,0x05,0x9e,0x03,0x2f,0x80,0x97,0xc0,0xab,0x60, +0x31,0x48,0x01,0x4b,0xc0,0x72,0xb0,0x12,0xac,0x05,0x1b,0x41,0x1e,0x28,0x04,0x5b, +0xc1,0x0e,0x50,0x0a,0xca,0xc1,0x3e,0x50,0x03,0x1a,0xc0,0x3f,0xc1,0x41,0xd0,0x06, +0xde,0x04,0x1d,0xe0,0x14,0x78,0xc7,0xcc,0x8f,0x3f,0x1f,0x60,0xcf,0x39,0xd0,0x35, +0xb2,0x0f,0xf1,0x27,0xe0,0x73,0xf0,0x15,0xf8,0xf6,0x7a,0xd9,0x1f,0x90,0xab,0xe6, +0xbe,0x1b,0xb3,0xf0,0xc0,0xf9,0xf4,0x30,0x7f,0xa7,0x8d,0xd4,0x0e,0x88,0x80,0x23, +0x70,0x01,0x23,0xc0,0x48,0xa0,0x00,0x6a,0xe0,0x07,0xaa,0x2c,0x37,0x0a,0xf6,0x09, +0x82,0x3c,0xea,0xd0,0x42,0xb0,0x87,0xce,0xe3,0x75,0x41,0x84,0x47,0x0c,0xf6,0xc7, +0x81,0x3b,0xc0,0x3d,0x60,0x34,0x78,0x10,0x3c,0x02,0x9e,0x00,0xe3,0x3d,0x3e,0x14, +0x4c,0xf4,0x98,0x82,0xdc,0x74,0x30,0xdb,0xe3,0x39,0xc4,0x2f,0x80,0x97,0xc0,0xab, +0x60,0x31,0x48,0x01,0x4b,0xc0,0x72,0xb0,0xd2,0xe3,0xb7,0xce,0xf0,0x14,0x64,0x4d, +0x36,0x34,0x92,0xd6,0x70,0xbd,0xf8,0x8a,0x22,0x2c,0xfe,0x8c,0x73,0x7e,0xdf,0xc8, +0x0d,0x1e,0x43,0x86,0xe6,0x7a,0xfc,0xfc,0xc8,0x26,0x8f,0x9b,0xd7,0x61,0x45,0x1e, +0xc5,0x1e,0x25,0x1e,0x65,0x1e,0x95,0x1e,0x55,0x1e,0x75,0x1e,0x4d,0x1e,0x2d,0x1e, +0xad,0x1e,0x6f,0x78,0xb4,0x7b,0x74,0x7a,0xbc,0xe5,0xf1,0x9e,0xc7,0x19,0x8f,0x0b, +0x1e,0x3d,0x1e,0x97,0x3c,0x2e,0x7b,0x5c,0xf1,0xb8,0xea,0x71,0xcd,0xc3,0xe8,0xc1, +0x93,0xf3,0xe5,0x36,0x72,0xa1,0x5c,0x22,0x77,0x96,0x0f,0x97,0xcb,0xe4,0x72,0xb9, +0x52,0xee,0x23,0x0f,0x90,0x6b,0xe5,0x3a,0x79,0xa4,0x5c,0x2f,0x8f,0x97,0xdf,0x29, +0x1f,0x25,0x1f,0x23,0x1f,0x2b,0x7f,0x54,0x3e,0x4e,0xfe,0x94,0x7c,0x92,0x7c,0xaa, +0x7c,0x86,0x7c,0x8e,0x7c,0xbe,0x7c,0xa1,0xfc,0x15,0x79,0x82,0x3c,0x49,0x9e,0x26, +0xcf,0x90,0x67,0xc9,0x57,0xcb,0xd7,0xcb,0x73,0xe4,0x05,0xf2,0x22,0x79,0xb1,0xbc, +0x44,0x5e,0x26,0xaf,0x94,0x57,0xc9,0xeb,0xe4,0x4d,0xf2,0x16,0x79,0xab,0xfc,0x0d, +0x79,0xbb,0xbc,0x53,0xfe,0x96,0xfc,0x3d,0xf9,0x19,0xf9,0x05,0x79,0x8f,0x3c,0x55, +0x72,0x49,0x7e,0x59,0x7e,0x45,0x7e,0x55,0x3e,0x1e,0xf3,0xec,0x6b,0xf2,0x6d,0x12, +0xa3,0x9c,0xe7,0xc9,0xf7,0xb4,0xf1,0x14,0x7a,0x4a,0x3c,0x9d,0x3d,0x87,0x7b,0xca, +0x3c,0xe5,0x9e,0x4a,0x4f,0x1f,0xcf,0x00,0x4f,0xad,0xa7,0xce,0x33,0xd2,0x53,0xef, +0x19,0xef,0x79,0xa7,0xe7,0x28,0xcf,0x31,0x9e,0x63,0x3d,0x1f,0xf5,0x1c,0xe7,0xf9, +0x94,0xe7,0x24,0xcf,0xa9,0x9e,0x33,0x3c,0xe7,0x78,0xce,0xf7,0x5c,0xe8,0xf9,0x8a, +0x67,0x82,0x67,0x92,0x67,0x9a,0x67,0x86,0x67,0x96,0xe7,0x6a,0xcf,0xf5,0x9e,0x39, +0x9e,0x05,0x9e,0xfd,0xe2,0x22,0xcf,0x62,0xcf,0x12,0xcf,0x32,0xcf,0x4a,0xcf,0x2a, +0xcf,0x3a,0xcf,0x26,0xcf,0x16,0xcf,0x56,0xcf,0x37,0x3c,0x3d,0x1c,0xda,0x3d,0x3b, +0x3d,0xdf,0xf2,0x7c,0xcf,0xf3,0x8c,0xe7,0x05,0xcf,0x1e,0xcf,0x4b,0x9e,0x97,0x3d, +0xaf,0x78,0x5e,0xf5,0xbc,0xe6,0x69,0xf4,0xe4,0x29,0xf8,0x0a,0x1b,0x85,0x50,0x21, +0x51,0x38,0x2b,0x86,0x2b,0x64,0x0a,0xb9,0x42,0xa9,0xf0,0x51,0x04,0x28,0xb4,0x0a, +0x9d,0x42,0xee,0x19,0xa9,0xd0,0x2b,0xe2,0x15,0x77,0x2a,0x46,0x29,0xc6,0x28,0xc6, +0x2a,0x1e,0x55,0x8c,0x53,0x3c,0xa5,0x98,0xa4,0x98,0xaa,0x98,0xa1,0x98,0xa3,0x98, +0xaf,0x58,0xa8,0x78,0x45,0x91,0xa0,0x48,0x52,0xa4,0x29,0x32,0x25,0x19,0x8a,0x2c, +0xc5,0x6a,0xc5,0x7a,0x45,0x8e,0xa2,0x40,0x51,0xa4,0x28,0x56,0x94,0x28,0xca,0x14, +0x95,0x8a,0x2a,0x45,0x9d,0xa2,0x49,0xd1,0xa2,0xd8,0x2c,0x6a,0x55,0xbc,0xa1,0x68, +0x57,0x74,0x2a,0xde,0x52,0xbc,0xa7,0x38,0xa3,0xb8,0xa0,0x78,0x44,0xd4,0xa3,0xb8, +0xa4,0xb8,0xac,0xb8,0xa2,0xb8,0xaa,0xb8,0xa6,0x30,0x2a,0x78,0x5e,0x7c,0x2f,0x1b, +0x2f,0xa1,0x97,0xc4,0xcb,0xd9,0x6b,0xb8,0x97,0xcc,0x4b,0xee,0xa5,0xf4,0xf2,0xf1, +0x0a,0xf0,0xd2,0x7a,0xe9,0xbc,0x22,0xbd,0x92,0x14,0x7a,0xaf,0x78,0xaf,0x3b,0xbd, +0x46,0x79,0x8d,0xf1,0x1a,0xeb,0xf5,0xa8,0xd7,0x38,0xaf,0x78,0xc5,0x53,0x5e,0x93, +0xbc,0xa6,0x7a,0xcd,0xf0,0x9a,0xe3,0x35,0xdf,0x6b,0xa1,0xd7,0x2b,0x5e,0x09,0x5e, +0x49,0x5e,0x69,0x5e,0x19,0x5e,0x59,0x5e,0xab,0xbd,0xd6,0x7b,0xe5,0x78,0x15,0x78, +0x15,0x79,0x15,0x7b,0x95,0x78,0xc9,0x3d,0xcb,0xbc,0x2a,0xbd,0xaa,0xbc,0xea,0xbc, +0x9e,0x70,0x68,0xf2,0x6a,0xf1,0x6a,0xf5,0x7a,0xc3,0xab,0xdd,0xab,0xd3,0xeb,0x2d, +0xaf,0xf7,0xbc,0xce,0x78,0x5d,0xf0,0xea,0xf1,0xba,0xe4,0x35,0x4a,0x7a,0xd9,0xeb, +0x8a,0xd7,0x55,0xaf,0x6b,0x5e,0x46,0x2f,0x9e,0x92,0xaf,0xb4,0x51,0x0a,0x95,0xa3, +0x14,0x12,0xa5,0xb3,0x72,0xb8,0x52,0xa6,0x94,0x2b,0x95,0x4a,0x1f,0x65,0x80,0x52, +0xab,0xd4,0x29,0x23,0x95,0x7a,0x65,0xbc,0x72,0xb3,0xe4,0x4e,0xe5,0x28,0xe5,0x18, +0xe5,0x58,0xe5,0xa3,0xca,0x71,0xca,0xa7,0x94,0x93,0x94,0x53,0x95,0x33,0x94,0x73, +0x94,0xf3,0x95,0x0b,0x95,0x1f,0x8a,0x5f,0x51,0x26,0x28,0x93,0x94,0x69,0xca,0x0c, +0x65,0x96,0x72,0xb5,0x72,0xbd,0x32,0x47,0x59,0xa0,0x2c,0x52,0x16,0x2b,0x4b,0x94, +0x65,0xca,0x4a,0x65,0x95,0xf2,0x1e,0x49,0x9d,0xf2,0x11,0x49,0x93,0xb2,0x45,0xd9, +0xaa,0x64,0xc7,0xf1,0x1b,0x88,0xdb,0xb9,0x5c,0xa7,0xf2,0x2d,0xe5,0x7b,0xca,0x33, +0xca,0x0b,0xca,0x1e,0xe5,0x25,0xe5,0x65,0xe5,0x15,0xe5,0x77,0x62,0xa3,0xf1,0x2a, +0x8e,0x5d,0xe3,0x8e,0x1b,0x95,0x3c,0x95,0xf9,0x4d,0xbe,0xca,0x46,0x25,0x54,0x49, +0x54,0xce,0xaa,0xe1,0x2a,0x99,0x4a,0xae,0x52,0xaa,0x7c,0x54,0x01,0x2a,0xad,0x4a, +0xa7,0x8a,0x54,0xe9,0x55,0xf1,0xaa,0x3b,0x55,0xa3,0x54,0x8d,0xa2,0x31,0xaa,0xb1, +0xaa,0x47,0x55,0xe3,0x54,0x4f,0xa9,0x26,0xa9,0xa6,0xaa,0x66,0xa8,0xe6,0xa8,0xe6, +0xab,0x16,0xaa,0x5e,0x51,0x25,0xa8,0x92,0x54,0x69,0xaa,0xa7,0xa4,0x19,0xaa,0x2c, +0xd5,0x6a,0xd5,0x7a,0xd5,0x1c,0x69,0x8e,0xaa,0x40,0x55,0xa4,0x2a,0x56,0x95,0xa8, +0x24,0x5e,0x65,0xaa,0x4a,0x55,0x95,0xaa,0x4e,0xd5,0xa4,0x6a,0x41,0x68,0x55,0xbd, +0xa1,0x6a,0x57,0x75,0xaa,0xde,0x52,0xbd,0xa7,0x3a,0xa3,0xba,0xa0,0x32,0x2a,0x7b, +0x54,0x97,0x54,0x97,0x55,0x57,0x54,0x57,0x55,0xdf,0xab,0xb8,0xef,0x62,0xd4,0x56, +0x6a,0x81,0xda,0x56,0x3d,0x54,0xed,0xa0,0x96,0xaa,0x5d,0xd5,0x3a,0x95,0xbb,0xda, +0x53,0xad,0x52,0xbf,0xa1,0xf4,0x55,0x07,0xaa,0x83,0xd5,0x61,0xea,0x28,0xb5,0x41, +0x7d,0x9b,0xfa,0x2e,0xf5,0xbd,0xea,0xfb,0xd5,0x0f,0xa9,0x1f,0x53,0x3f,0xaa,0xfa, +0x87,0x7a,0x9c,0xea,0x69,0xf5,0x64,0xf5,0xb3,0xea,0x99,0xea,0xb9,0xea,0x76,0xe5, +0x42,0xcf,0xe7,0xd5,0x2f,0xaa,0xe3,0xc4,0x69,0x8a,0x4e,0xaf,0x45,0x6a,0x46,0xbd, +0x50,0x95,0xac,0x7e,0x45,0x95,0xae,0x5e,0xa6,0x5e,0xa1,0x7e,0x4b,0xb9,0x46,0xbd, +0x41,0x9d,0xab,0xde,0xa4,0xde,0xa2,0x7e,0x4f,0xb9,0x5d,0xbd,0x4b,0xbd,0x47,0xbd, +0x57,0x5d,0xad,0xae,0x57,0x97,0xa8,0x9a,0xd5,0x07,0xd4,0x12,0xaf,0xc3,0xea,0x3a, +0xd5,0x51,0xf5,0x71,0xf5,0x49,0xf5,0xdb,0xea,0xf7,0xd5,0xed,0xaa,0xb3,0xea,0x6b, +0xca,0x8f,0xd4,0x9d,0xaa,0x48,0x45,0xaf,0xfa,0x2d,0xd5,0xc7,0xea,0x33,0xaa,0xcf, +0xd4,0x5f,0xaa,0xbf,0x51,0x7f,0xaf,0x26,0xef,0x1e,0xd5,0x65,0xa5,0x95,0xf7,0x25, +0x95,0xc0,0xfb,0xb2,0xca,0xd6,0x7b,0xbc,0xc3,0x50,0x6f,0x47,0xef,0x61,0xde,0x32, +0x6f,0xb9,0xb7,0xd2,0xdb,0xc7,0x3b,0xd0,0x3b,0xc4,0x3b,0xc2,0x3b,0xc6,0xfb,0xcf, +0x5c,0xff,0xc6,0x79,0xdf,0xee,0x7d,0x97,0xf7,0x28,0xef,0x31,0xde,0x63,0x11,0x7e, +0xa9,0xd4,0x23,0xde,0xe3,0xbc,0x9f,0xf6,0x7e,0xc6,0x7b,0xfa,0x4d,0x25,0xe6,0x78, +0x63,0x1d,0xea,0xfd,0x92,0xf7,0x22,0xbb,0x14,0xbb,0x45,0xde,0x09,0xde,0x89,0xde, +0x29,0xde,0xe9,0xde,0x19,0xde,0xb7,0xd9,0x65,0x7a,0xaf,0xf6,0xde,0xe0,0x5d,0xe0, +0xbd,0xcd,0xbb,0xc4,0x7b,0x8f,0xf7,0x3e,0xef,0x5a,0xef,0x26,0xef,0x03,0xde,0x6d, +0xde,0xc7,0x50,0xbb,0xd3,0xfb,0x6d,0xef,0x0f,0xbc,0xcf,0x7b,0xf7,0x20,0xff,0x31, +0xf8,0xdc,0xfb,0x6b,0xc4,0xd7,0xbc,0xc9,0xa7,0xdf,0x68,0xed,0x33,0xc4,0x47,0xe8, +0xe3,0xe0,0xe3,0xe2,0xe3,0xe6,0x23,0xf7,0x51,0xf9,0xf8,0xf9,0x68,0x7c,0x74,0x08, +0x11,0xe6,0x10,0x6d,0x0e,0x06,0x73,0x88,0x37,0x87,0x3b,0xcc,0xe1,0x6e,0x73,0xb8, +0xd7,0x1c,0xc6,0x98,0xc3,0x83,0xe6,0xf0,0xb0,0x39,0x3c,0x66,0x0e,0xe3,0xcc,0x61, +0x3c,0xc2,0x04,0x84,0xc9,0x08,0x53,0x11,0xa6,0x23,0xcc,0x42,0x98,0x6b,0x0e,0xf3, +0xcd,0x61,0x81,0x39,0xbc,0x64,0x0e,0x8b,0x10,0x12,0xcc,0x21,0x11,0x21,0xc5,0x1c, +0xd2,0xcd,0x21,0x03,0x21,0x13,0xe1,0x8f,0x3f,0x6d,0x56,0xfa,0x98,0xc2,0x1a,0x84, +0xf5,0x08,0xd9,0x08,0x1f,0x58,0xe7,0xf9,0xe4,0xf9,0x6c,0x42,0x28,0x42,0xd8,0x66, +0x0e,0x3b,0x10,0x76,0x21,0x94,0x23,0xec,0x47,0xa8,0x43,0x68,0x46,0x38,0x88,0x70, +0x84,0x0b,0xed,0x5c,0x38,0x69,0x0e,0x6f,0xf9,0xbc,0xef,0x73,0x0e,0xdb,0xdd,0x3e, +0x97,0x7c,0x3e,0xf3,0xf9,0xca,0xe7,0x3b,0x1f,0xa3,0x8f,0x95,0xef,0x60,0x5f,0x7b, +0x5f,0x89,0xaf,0xd4,0x77,0x84,0xaf,0x87,0xaf,0xd2,0xd7,0xd7,0x37,0xc8,0x37,0xd4, +0x37,0xd2,0xd7,0xe0,0x7b,0xbb,0xef,0x3d,0xbe,0x63,0x7c,0x1f,0xf2,0x7d,0xdc,0x77, +0xbc,0xef,0x24,0xdf,0x67,0x7d,0x67,0xf9,0xce,0xf3,0x5d,0xe8,0xbb,0xc8,0x77,0xb1, +0x6f,0xaa,0x6f,0x86,0xef,0x0a,0xdf,0xb5,0xbe,0xd9,0xbe,0x05,0xbe,0x5b,0x7c,0x77, +0xf8,0xee,0xf6,0xad,0xf4,0xad,0xf6,0x6d,0xf0,0x7d,0xdd,0xb7,0xd5,0xf7,0xa8,0x6f, +0x87,0xef,0x69,0xdf,0xf7,0x7c,0xcf,0xfa,0x76,0xf9,0x5e,0xf4,0xbd,0xec,0xfb,0xa5, +0xef,0xb7,0xbe,0xfd,0xbe,0x3c,0x3f,0x81,0x9f,0x9d,0x9f,0xd8,0xcf,0xd9,0xcf,0xd5, +0x6f,0xa4,0x9f,0x97,0x9f,0x8f,0x5f,0xa0,0x5f,0x88,0x5f,0x84,0x9f,0xde,0xef,0x36, +0xbf,0xbb,0xfd,0x46,0xfb,0x8d,0xf5,0x7b,0xcc,0xef,0x49,0xbf,0x89,0x7e,0x53,0xfd, +0x66,0xfa,0x3d,0xe7,0xb7,0xc0,0xef,0x15,0x3f,0xc6,0x2f,0xc5,0x6f,0xa9,0x5f,0x96, +0xdf,0x1a,0xbf,0x8d,0x7e,0xf9,0x7e,0x45,0x7e,0xdb,0xfd,0x76,0xfb,0xed,0xf5,0xab, +0xf5,0x6b,0xf6,0x3b,0xe4,0x77,0xd4,0xaf,0xc3,0xef,0x9c,0xcf,0x69,0x3f,0xb6,0x27, +0xef,0xf9,0x9d,0xf5,0xfb,0xce,0xa7,0xcb,0x8f,0xed,0xc9,0x45,0xbf,0xcb,0x7e,0x52, +0xdf,0x2f,0xfd,0xd8,0x9e,0x7c,0xeb,0xd7,0xef,0xe7,0xeb,0xcb,0xf3,0x67,0x7b,0xc3, +0x5a,0x65,0xb2,0x68,0xc0,0x16,0x93,0x15,0x02,0xff,0x08,0x3f,0x3b,0x7f,0xb1,0xff, +0x63,0x7e,0xce,0xfe,0xac,0x7a,0x91,0x9f,0xab,0xff,0x48,0xff,0xa5,0x7e,0x5e,0xfe, +0xac,0x2e,0xeb,0x2d,0x1f,0xff,0x73,0x3e,0x81,0xfe,0x03,0xde,0x0a,0xf1,0x1f,0xf0, +0x55,0x84,0xbf,0xef,0x4d,0x3e,0xba,0xd9,0x43,0x7a,0xff,0x9b,0x7d,0xf4,0x73,0x0f, +0xb1,0xde,0xb9,0xe1,0x97,0x01,0x9f,0xdc,0xe6,0x3f,0xe0,0x91,0x01,0x6f,0xdc,0xed, +0xcf,0xfa,0x62,0xb4,0xff,0x80,0x27,0xc6,0x72,0x96,0xb0,0x36,0x98,0xd4,0x1f,0xf3, +0x9f,0xe5,0xfb,0xa4,0xff,0x44,0xff,0xa9,0xfe,0x6c,0x3b,0xae,0x5c,0x0d,0xb6,0xd4, +0x4c,0xff,0xf9,0xfe,0x2f,0xfb,0x2f,0xf6,0x4f,0xf5,0xcf,0xf0,0x5f,0xe1,0xbf,0xd6, +0x3f,0xdb,0xbf,0xc0,0x7f,0x8b,0xff,0x0e,0xff,0xdd,0xfe,0x95,0xfe,0xd5,0xfe,0x0d, +0xfe,0xaf,0xfb,0xb7,0xfa,0x1f,0xf5,0xef,0xf0,0x3f,0xed,0xff,0x9e,0xff,0x59,0xff, +0x2e,0xff,0x8b,0xfe,0x97,0xd1,0xca,0x97,0xfe,0xdf,0xfa,0xf7,0xfb,0xf3,0x02,0x7e, +0x6f,0xbd,0x81,0xed,0x27,0x61,0xcf,0x5a,0xb3,0x37,0x4c,0xfb,0xd8,0x51,0x22,0x08, +0x10,0x04,0xfc,0xa6,0xf5,0x41,0x80,0x03,0xc2,0xf0,0x00,0x8f,0x00,0x75,0x40,0x60, +0x80,0x2e,0x20,0x06,0xe1,0xf6,0x80,0x7b,0x03,0xc6,0x06,0x3c,0x11,0x30,0x21,0xe0, +0x59,0x84,0x39,0x01,0x0b,0x10,0x5e,0x45,0x48,0x0e,0xc8,0x40,0x58,0x15,0xb0,0x11, +0x61,0x13,0x42,0x71,0xc0,0x6e,0x84,0x7d,0x08,0xf5,0x01,0x2d,0x01,0x47,0x02,0x3a, +0x10,0xde,0x0e,0x38,0x13,0xd0,0x1d,0xf0,0x49,0xc0,0x97,0x08,0xd7,0x02,0x2c,0x03, +0x07,0x07,0x0e,0x0d,0x74,0x0e,0xc4,0xd2,0x31,0x50,0x81,0xe0,0x8b,0xa0,0x0d,0x8c, +0x08,0x8c,0x0d,0xbc,0x2b,0x70,0x4c,0xe0,0x23,0x81,0x4f,0x06,0xb2,0x36,0x4c,0x0e, +0x9c,0x11,0x38,0x2f,0xf0,0xa5,0x40,0x26,0x30,0x0d,0x21,0x33,0x70,0x6d,0x60,0x6e, +0x60,0x11,0xc2,0xce,0xc0,0xf2,0xc0,0xea,0xc0,0xa6,0xc0,0x43,0x81,0x6f,0x06,0x9e, +0x0c,0x7c,0x2f,0xf0,0x7c,0x60,0x5f,0xe0,0x67,0x81,0x57,0x03,0xfb,0x03,0xad,0x83, +0x6c,0x83,0x24,0x41,0xc3,0x82,0x46,0x06,0xa9,0x82,0x02,0x82,0x42,0x83,0xa2,0x83, +0xae,0x05,0x0c,0x0e,0xbc,0x2d,0x68,0x54,0xd0,0x83,0x41,0x8f,0x07,0x3d,0x1d,0x34, +0x15,0x3c,0x18,0x34,0x3b,0xe8,0x85,0xa0,0x45,0x41,0x49,0x41,0x4b,0xb1,0x7d,0x04, +0xd6,0xaf,0x0c,0xda,0x10,0xf4,0xfb,0xbf,0x09,0xbd,0x75,0x28,0x08,0xda,0x16,0x54, +0x1a,0xb4,0x3f,0xa8,0x29,0xe8,0x70,0x50,0x47,0xd0,0xbb,0x41,0x17,0x82,0x3e,0x0e, +0xba,0x12,0xe4,0xa8,0x51,0x68,0x7e,0xfa,0x9b,0x7e,0xb7,0xfe,0xf8,0x6b,0x02,0x35, +0xfd,0xc6,0x60,0x8d,0xd1,0x32,0x54,0x13,0xa6,0x89,0xd0,0xc4,0x68,0xfe,0xbd,0x6f, +0x10,0xf0,0x84,0xd1,0xdc,0xa1,0xb9,0x07,0x81,0xfd,0x7d,0x86,0x7b,0x35,0xa3,0x35, +0xf7,0x6b,0x1e,0xd2,0x3c,0xa6,0xf9,0x87,0xe6,0x69,0xcd,0x64,0x0d,0xfb,0x5d,0xf1, +0xb3,0x9a,0x99,0x9a,0xb9,0x9a,0xe7,0x39,0x7b,0x5e,0xd4,0xbc,0xac,0x71,0xb5,0x33, +0x85,0x7b,0xb8,0x5a,0x26,0x7d,0xe8,0x58,0x06,0x43,0x3f,0x54,0x13,0xf7,0xa3,0x76, +0x16,0x69,0x5e,0xd3,0x30,0x9a,0xdb,0xec,0x12,0x35,0xc9,0x9a,0x54,0xcd,0x3d,0x76, +0xfd,0xc6,0x74,0xcd,0x52,0xcd,0x32,0x4d,0xe6,0x75,0x2b,0x57,0x68,0xd6,0x68,0x36, +0xa2,0xed,0x3c,0xec,0x29,0xd4,0x6c,0xd5,0xec,0xd4,0xec,0xd6,0x54,0x6a,0xaa,0x34, +0xf5,0x9a,0x66,0xcd,0x41,0x4d,0x9b,0xe6,0x98,0xa6,0x03,0xe1,0x24,0xc2,0x5b,0x08, +0xef,0x22,0x7c,0x60,0x0e,0x67,0x11,0x2e,0x98,0x43,0x37,0x42,0x9f,0x39,0x7c,0x6c, +0x0e,0x97,0xcd,0xe1,0x0b,0x73,0xf8,0xca,0x1c,0xbe,0x41,0xb8,0x86,0xd0,0x8f,0x60, +0xa1,0xb5,0xd0,0x5a,0x99,0x03,0xdf,0x1c,0x86,0x98,0x83,0x9d,0x39,0x0c,0x35,0x07, +0x89,0x39,0x38,0x99,0x83,0x8b,0x39,0xb8,0x9a,0x83,0xcc,0x1c,0x3c,0xcc,0x41,0x61, +0x0e,0x2a,0x73,0xf0,0x31,0x07,0x7f,0x73,0x08,0x42,0x60,0x9f,0x06,0xc1,0x5a,0x53, +0xd0,0x21,0x44,0x21,0xc4,0x22,0xdc,0x81,0x60,0xfa,0x4d,0x95,0x7e,0x63,0xa8,0x66, +0x94,0x76,0x11,0xe7,0xb5,0xd7,0x34,0xf7,0x69,0x59,0xef,0xb2,0x1e,0xf5,0xd7,0x24, +0x6a,0xa6,0x38,0x8c,0xd1,0xde,0xea,0xf7,0x53,0xd8,0xd1,0x90,0x0c,0x6f,0xa7,0xe2, +0x8c,0x64,0x6a,0x7e,0xcf,0x37,0xd4,0x2f,0x6a,0xd2,0x71,0xa6,0x1f,0xd0,0xde,0xa3, +0x79,0xc3,0xf6,0xf7,0xd4,0xbf,0x57,0x33,0x56,0x3b,0x5a,0xf3,0xb0,0xf6,0x51,0xed, +0x38,0xed,0x14,0x07,0x76,0x04,0x05,0x6a,0x9e,0xd2,0x7e,0xeb,0x32,0x49,0x3b,0x55, +0x3b,0x43,0x3b,0x47,0x3b,0x5f,0xbb,0x50,0xfb,0x8a,0x36,0x41,0x9b,0xa4,0x4d,0xd3, +0xfe,0x55,0x6f,0xd0,0x32,0xb4,0x59,0xda,0xd5,0x5a,0xa2,0x3f,0xf2,0x7e,0xd9,0x34, +0x46,0x6f,0x7e,0xcb,0xcc,0x6e,0xdf,0xfc,0xa6,0x99,0xdd,0xbe,0xf9,0x6d,0x33,0xbb, +0x6d,0x7a,0xe3,0x6c,0xaa,0xbb,0x5e,0x9b,0xad,0xcd,0xd3,0x46,0xd2,0x26,0x6d,0x91, +0x76,0x1b,0xce,0xe9,0x4e,0xed,0x6e,0x6d,0x85,0x76,0xbf,0xb6,0x56,0xdb,0xa8,0x7d, +0x5d,0xfb,0xeb,0xf7,0x87,0x43,0xda,0x37,0xb4,0xc7,0xb5,0xa7,0xb4,0xef,0x6a,0xcf, +0x68,0x3f,0xd2,0xf6,0x69,0x3f,0xd5,0x5e,0xd1,0x7e,0xa3,0xfd,0x41,0x6b,0x19,0xcc, +0x0f,0xb6,0x0d,0x16,0x05,0x3b,0x05,0x0f,0x0f,0x76,0x0f,0x56,0x04,0x7b,0x07,0x07, +0x04,0x07,0x07,0x87,0x07,0xc7,0x04,0xc7,0x07,0xdf,0x15,0x7c,0x5f,0xf0,0x83,0xc1, +0x8f,0x06,0xff,0x23,0x78,0x42,0xf0,0x94,0xe0,0x19,0xc1,0x73,0x83,0x5f,0x08,0x7e, +0x39,0x38,0x21,0x38,0x39,0x78,0x49,0xf0,0x7f,0xfa,0xf7,0xa9,0x7f,0xed,0x3b,0xd0, +0xcc,0xe0,0xd5,0xc1,0x1b,0x82,0xf3,0x82,0x37,0x07,0x17,0x07,0xef,0x0a,0x2e,0x0f, +0xde,0x1f,0x5c,0x17,0xdc,0x1c,0x7c,0x30,0xf8,0x48,0x70,0x7b,0xf0,0xc9,0xe0,0x77, +0x82,0x3f,0x0c,0xbe,0x10,0xdc,0x1b,0xfc,0x49,0xf0,0x17,0xc1,0x57,0x83,0xbf,0x0f, +0xb6,0x08,0x19,0x14,0x62,0x13,0x32,0x34,0xc4,0x31,0x64,0x58,0x88,0x2c,0xc4,0x33, +0x44,0x1d,0xe2,0x1f,0xa2,0x0d,0x09,0x0b,0x89,0x0e,0xf9,0xb3,0xbf,0xa5,0xf8,0xab, +0xda,0xfb,0xe9,0xdd,0x39,0x2e,0xe4,0xce,0x90,0x7b,0x43,0x1e,0x08,0x79,0x24,0x64, +0x5c,0xc8,0xd3,0x21,0xcf,0x84,0x4c,0x0f,0x99,0x13,0xf2,0x3c,0x7a,0xf3,0x52,0xc8, +0x6b,0x21,0x49,0x21,0xe9,0x21,0xcb,0x43,0x56,0x85,0xac,0x0f,0xc9,0x0d,0x29,0x0c, +0xd9,0x16,0x52,0x12,0xb2,0x27,0x64,0x5f,0x48,0x6d,0x48,0x13,0x8e,0x1f,0x08,0x69, +0x0b,0x39,0x16,0xd2,0x19,0xf2,0x76,0xc8,0x07,0x21,0xe7,0xb1,0xdd,0x13,0xf2,0x71, +0x48,0xff,0xaf,0x7e,0x1f,0xfc,0xdb,0x8e,0xf7,0xff,0xe8,0x37,0xf6,0x3e,0x0f,0xf9, +0x32,0xe4,0x79,0xba,0x1a,0x92,0x60,0xd1,0x6f,0xfc,0x2e,0xe4,0x87,0x10,0x8b,0x50, +0xab,0x50,0xf6,0x6f,0xe0,0xf9,0xa1,0x36,0xa1,0xf6,0xa1,0xa2,0xd0,0xd9,0x1e,0x0e, +0xa1,0x45,0x16,0xce,0xa1,0x5f,0xd1,0xb0,0xd0,0x11,0xa1,0xee,0xa1,0xf2,0x50,0xaf, +0xd0,0x20,0x0f,0x75,0xa8,0x7f,0xa8,0x26,0x34,0x24,0x34,0x22,0x34,0x3a,0xb4,0x98, +0xe2,0x42,0x6f,0x0f,0x1d,0x49,0x77,0x85,0x8e,0x0a,0x15,0x0d,0xbd,0x3f,0xf4,0x80, +0xc5,0xd8,0xd0,0x47,0x42,0x1f,0x0f,0x7d,0x32,0xf4,0xb8,0xc5,0xd3,0xa1,0xfd,0xc6, +0xc9,0xa1,0x53,0x43,0xa7,0x87,0xce,0x0a,0x9d,0x1b,0x3a,0x3f,0x74,0x41,0xe8,0x4b, +0xa1,0xaf,0x85,0xde,0xf0,0x50,0x52,0x68,0x7a,0xe8,0xf2,0xd0,0x55,0xa1,0xeb,0x43, +0x73,0x43,0x0b,0x43,0xb7,0x85,0x96,0x84,0xee,0x09,0xdd,0x17,0x5a,0x1b,0xda,0x14, +0x7a,0x20,0xb4,0x2d,0xf4,0x58,0x68,0x67,0xe8,0xdb,0xa1,0x1f,0x84,0x9e,0x0f,0xed, +0x09,0xfd,0x38,0xf4,0xf3,0xd0,0xaf,0x43,0xaf,0x85,0x92,0xce,0x5a,0x37,0x44,0x27, +0xd4,0x39,0xe8,0x5c,0x74,0x6e,0x3a,0xb9,0x4e,0xa5,0xf3,0xd3,0x69,0x74,0x3a,0x5d, +0x94,0x2e,0x56,0x77,0x87,0x6e,0x94,0xee,0x7e,0xdd,0xc3,0xba,0x27,0x74,0x4f,0xe9, +0x26,0xeb,0xa6,0xe9,0x66,0xeb,0xe6,0xeb,0x5e,0xd4,0xbd,0xaa,0xfb,0xfd,0xdf,0xc0, +0x27,0xea,0xd2,0x74,0xcb,0x74,0x2b,0x75,0xeb,0x74,0x39,0xba,0x4d,0xba,0xad,0xba, +0x9d,0xba,0x32,0xdd,0x5e,0x5d,0x8d,0xae,0x51,0xd7,0xa2,0x3b,0xac,0x7b,0x53,0x77, +0x42,0xf7,0x96,0xee,0x7d,0xdd,0x39,0x5d,0xb7,0xee,0x92,0xee,0xf7,0x8c,0xa8,0x3f, +0x3a,0xbf,0xf8,0x4c,0xf7,0x95,0xee,0x3b,0x9d,0x51,0x67,0x15,0x36,0x38,0xcc,0x3e, +0x4c,0x12,0x26,0x0d,0x1b,0x11,0xe6,0x11,0xa6,0x0c,0xf3,0x0d,0x0b,0x0a,0x0b,0x0d, +0x8b,0x0c,0x33,0x84,0xdd,0x1e,0x76,0x4f,0xd8,0x98,0xb0,0x87,0xc2,0x1e,0x0f,0x1b, +0x1f,0x36,0x29,0xec,0xd9,0xb0,0x59,0x61,0xf3,0xc2,0x16,0x86,0x2d,0x0a,0x5b,0x1c, +0x96,0x1a,0x96,0x11,0xb6,0x22,0x6c,0x6d,0x58,0x76,0x58,0x41,0xd8,0x96,0xb0,0x1d, +0x61,0xbb,0xc3,0x2a,0xc3,0xaa,0xc3,0x1a,0xc2,0x5e,0x0f,0x6b,0x0d,0x3b,0x1a,0xd6, +0x11,0x76,0x3a,0xec,0xbd,0xb0,0xb3,0x61,0x5d,0x61,0x17,0xc3,0x2e,0x87,0x7d,0x19, +0xf6,0x6d,0x58,0x7f,0x18,0x2f,0x5c,0x10,0x6e,0x17,0x2e,0x0e,0x77,0x0e,0x77,0x0d, +0x1f,0x19,0xee,0x15,0xee,0x13,0xfe,0x3f,0xf7,0x97,0x1c,0xa6,0x10,0x18,0x1e,0x12, +0x1e,0x11,0xae,0x0f,0xbf,0x2d,0xfc,0xee,0xf0,0xd1,0xe1,0x63,0xc3,0x1f,0x0b,0x7f, +0x32,0x7c,0x62,0xf8,0xd4,0xf0,0x99,0xe1,0xcf,0x85,0x2f,0x08,0x7f,0x25,0x9c,0x09, +0x4f,0x09,0x5f,0x1a,0x9e,0x15,0xbe,0x26,0x7c,0x63,0x78,0x7e,0x78,0x51,0xf8,0xf6, +0xf0,0x5f,0x3b,0x47,0xbf,0x3e,0x3e,0x6e,0xde,0xff,0xf3,0xdf,0x3e,0xfd,0x73,0xfe, +0xfe,0xeb,0xd6,0x7f,0xd3,0xf0,0x7b,0x7e,0x17,0xed,0xe7,0xf3,0x87,0x1f,0xff,0xc6, +0xee,0xef,0xff,0x94,0x86,0xef,0x0f,0x6f,0x0a,0x3f,0x1a,0xfe,0x4e,0x78,0x77,0xf8, +0x95,0xf0,0xdf,0xf6,0xf7,0x2c,0xbf,0xfc,0x57,0x2d,0xff,0xc9,0x0f,0x45,0x0c,0x8e, +0x10,0x47,0xc8,0x22,0x7c,0x23,0xc2,0x23,0xfe,0xfa,0xdf,0x02,0xfa,0x57,0xe1,0x3f, +0xf5,0x3b,0x89,0x7f,0xbc,0x4e,0xbf,0xf1,0x7f,0x97,0x6d,0xfd,0x46,0xb6,0x0e,0xeb, +0x43,0x3b,0x2e,0x66,0xeb,0xb0,0xe9,0x40,0x1d,0xf6,0x9b,0x87,0x5b,0xeb,0xf4,0x1b, +0x6d,0xc0,0x8f,0x75,0xfa,0x8d,0xff,0xf3,0xbe,0xee,0x37,0xde,0xf0,0xb5,0xa9,0x3f, +0x37,0xd7,0xf9,0x69,0x7f,0x7e,0xff,0xd8,0xb9,0x59,0xe7,0x46,0x9d,0x7e,0xe3,0x08, +0x1a,0xf8,0xc6,0xe6,0xcf,0xd1,0xf9,0xbb,0xce,0xdf,0x75,0xfe,0x53,0x75,0xee,0x88, +0xb8,0x3b,0x82,0x1d,0xbb,0xbf,0xfe,0xdf,0x62,0x74,0xbc,0x1f,0xff,0xb7,0x98,0x7b, +0x23,0x7e,0xbd,0xce,0x98,0x9f,0xd4,0xb9,0x3f,0xc2,0x1f,0xe5,0x22,0xb0,0x7d,0x2f, +0x8e,0xff,0xad,0xf9,0x7f,0x4b,0x73,0x3e,0x02,0x3b,0x96,0x6e,0x35,0x77,0xfa,0xb3, +0xf7,0xfd,0x7b,0x2b,0xb9,0x5b,0xaf,0xba,0xfb,0x7f,0x56,0xf7,0xc6,0xfc,0xe2,0xe7, +0xff,0x3f,0xc8,0xf4,0xdf,0x83,0x6e,0xfd,0xbf,0x83,0x46,0x72,0xff,0x35,0x68,0xc4, +0xc8,0xb7,0xad,0x2a,0x78,0xd5,0xbc,0xcf,0xac,0x36,0x5a,0xed,0xb5,0xba,0x75,0x0b, +0x6c,0x7d,0xde,0x8f,0xea,0xb2,0xff,0x75,0x68,0x26,0xea,0x95,0xf1,0xde,0xe4,0xad, +0xb6,0xea,0x70,0xcf,0xb5,0xfa,0x2d,0xf3,0x9f,0x87,0x22,0x1e,0x8f,0x18,0x1f,0x31, +0x29,0xe2,0xd9,0x88,0x59,0x11,0xf3,0x22,0x16,0x46,0x2c,0x8a,0x58,0x1c,0x91,0x1a, +0x91,0x11,0xb1,0x22,0x62,0x6d,0x44,0x76,0x44,0x41,0xc4,0x96,0x88,0x1d,0x11,0xbb, +0x23,0x2a,0x23,0xaa,0x23,0x1a,0x22,0x5e,0x8f,0x68,0x8d,0x38,0x1a,0xd1,0x11,0x71, +0x3a,0xe2,0xbd,0x88,0xb3,0x11,0x5d,0x11,0x17,0x23,0x2e,0x47,0x7c,0x19,0xf1,0xed, +0x1f,0x9a,0xc1,0xb1,0xef,0x18,0x2f,0x6b,0xbe,0xd1,0xf4,0x1b,0x83,0xb4,0x16,0xda, +0x2f,0x34,0x43,0xb5,0xc1,0xdc,0xbb,0x3d,0xf6,0x7d,0x9e,0x95,0xd6,0x49,0xeb,0xaa, +0x1d,0xa2,0x95,0x69,0xfb,0x35,0x7c,0x2d,0xfb,0xe6,0xf1,0x2b,0xcd,0x35,0x8d,0x9d, +0x56,0xa2,0x75,0xd1,0xf6,0x47,0x2c,0xf2,0xb1,0x88,0xb4,0x8a,0xec,0x37,0xb2,0xf5, +0xfb,0x8d,0xfe,0xdc,0xbb,0x9e,0x2f,0xd8,0x77,0xb5,0xb7,0xaa,0x6f,0x1c,0xa8,0x8f, +0xd9,0x0a,0xb6,0x5c,0x7e,0xf4,0x66,0xe8,0xf2,0xf5,0xb7,0xa5,0xa6,0xfa,0x78,0x02, +0x03,0x53,0xfd,0x7e,0xe3,0x40,0x7d,0xf6,0xf8,0xcd,0xf5,0x17,0xf9,0xf4,0x1b,0x7f, +0xae,0x6f,0xb2,0xbf,0xdf,0xf8,0xaf,0xf4,0x4d,0xf6,0xe3,0xb9,0x8e,0xda,0x03,0xfd, +0x67,0xdf,0x57,0x0e,0xf4,0x9f,0xd5,0xff,0xd5,0xfe,0x5f,0xb7,0xfe,0xe7,0xfe,0xfb, +0xf7,0xea,0xf3,0x23,0x87,0x44,0xda,0x45,0x0e,0x8d,0x94,0x44,0x3a,0x45,0xba,0x44, +0xba,0x46,0xca,0x22,0x3d,0x22,0x6f,0x9c,0x9f,0xdf,0xf3,0x77,0x3e,0x8a,0x48,0x6b, +0x3c,0x21,0x4a,0x65,0x7e,0x91,0xbf,0x6f,0xcd,0x14,0x18,0xb9,0x44,0xa6,0x8d,0x0c, +0x8d,0x0c,0x8f,0x8c,0x8e,0xfc,0x5d,0x7f,0x9b,0x12,0x19,0x1f,0x79,0x47,0xe4,0x9f, +0xb3,0x92,0xb8,0x3b,0xf2,0xaf,0x5d,0x85,0xdc,0x1b,0x39,0x36,0x72,0x9a,0xcb,0x2f, +0x1f,0x1f,0x22,0x7e,0x22,0x72,0x7c,0xe4,0xc4,0x48,0x2f,0xd1,0x94,0xc8,0xe9,0x91, +0xee,0x4e,0xb3,0x23,0xe7,0x45,0x2e,0x88,0x2c,0xf1,0x7a,0x39,0xf2,0xb5,0xc8,0xc4, +0xc8,0xd4,0xc8,0xa5,0x91,0x99,0x91,0xd9,0xe2,0x55,0x91,0xeb,0x22,0xb3,0x23,0xf3, +0x23,0x37,0x47,0x6e,0x8b,0xb4,0x17,0x91,0xd3,0xce,0xc8,0x02,0xa9,0xad,0x53,0x91, +0x74,0x77,0xe4,0xcb,0x92,0x8a,0xc8,0xfd,0x91,0xb5,0x91,0x8d,0x91,0xaf,0x47,0x8e, +0x93,0x6a,0xc4,0x87,0x22,0x8f,0x44,0x1e,0x8b,0x3c,0x11,0x39,0xd0,0xfe,0xe9,0xc8, +0xb3,0x91,0x17,0x23,0xbf,0x8c,0xec,0x8f,0x14,0x44,0x89,0xa3,0x5c,0xa3,0xbc,0xa2, +0x7e,0xac,0x1f,0x18,0x15,0x1c,0xf5,0x5b,0xd7,0xcf,0x7f,0xf5,0xfa,0xfb,0xf7,0x7c, +0x6e,0x7d,0xcf,0xbf,0xa1,0x1f,0x16,0x15,0x15,0x65,0x88,0xba,0x2d,0xea,0xee,0x28, +0x99,0xea,0xbe,0xa8,0x07,0xa2,0x1e,0x8e,0x7a,0x3c,0x4a,0xae,0x7a,0x32,0x6a,0x42, +0xd4,0x33,0x51,0x4a,0xd5,0xf4,0xa8,0xd9,0x51,0xf3,0xa2,0x16,0x44,0xbd,0x12,0x95, +0x10,0x95,0x18,0x99,0x14,0x95,0x1e,0xb5,0x2c,0x6a,0x45,0xd4,0x9a,0x28,0x2b,0xf5, +0x86,0xa8,0xd1,0xa2,0xbc,0xa8,0xc2,0xa8,0xad,0x51,0x3b,0xa2,0x8e,0x44,0x96,0x46, +0x95,0x47,0x49,0xd5,0xec,0x6f,0x79,0xb8,0xaa,0xf7,0x45,0xd5,0x44,0x8d,0x55,0x34, +0x44,0x69,0x55,0xff,0x8c,0x3a,0x18,0xd5,0x16,0xf5,0x26,0x17,0x3a,0xa2,0x4e,0x47, +0xbd,0x1b,0xf5,0x61,0xd4,0xf9,0xa8,0x9e,0xa8,0x4b,0x51,0x97,0xa3,0xae,0x44,0x5d, +0x8d,0xba,0x16,0x65,0x8c,0xe2,0x45,0xf3,0xa3,0x6d,0xa2,0x85,0xd1,0x92,0x68,0x67, +0x04,0x4f,0xf5,0xf0,0x68,0x59,0xb4,0x3c,0x5a,0x19,0x1d,0xa9,0xf2,0x89,0x0e,0x88, +0xd6,0x46,0xe7,0x28,0x75,0xd1,0x91,0xd1,0xfa,0xe8,0xf8,0xe8,0x3b,0xa3,0x47,0x45, +0x8f,0x89,0x1e,0x1b,0xfd,0x68,0xf4,0x3f,0xa2,0x9f,0x8e,0x9e,0x1c,0x3d,0x25,0xf2, +0xd9,0xe8,0x99,0xd1,0x73,0xa3,0x5f,0x88,0x7e,0x39,0xfa,0xb5,0xe8,0xc4,0xe8,0xd4, +0xe8,0xa5,0xd1,0x99,0xd1,0xab,0xa2,0xd7,0x45,0x67,0x23,0xe4,0x47,0x17,0x45,0x17, +0x47,0xc7,0x2b,0x4a,0xa2,0xcb,0xa2,0xf7,0x46,0x57,0x47,0xd7,0x47,0xef,0x17,0x35, +0x47,0x1f,0x88,0x6e,0x14,0x1d,0x8e,0x3e,0x1a,0x7d,0x3c,0xfa,0x54,0xf4,0x3b,0xd1, +0x1f,0x46,0x9f,0x8f,0xee,0x8e,0xbe,0x18,0xfd,0x69,0xf4,0x17,0xd1,0x5f,0x47,0x7f, +0x17,0xdd,0x1f,0x6d,0x19,0x33,0x28,0x66,0x48,0x8c,0x30,0x46,0x12,0xe3,0x1c,0x33, +0x3c,0x66,0xbe,0xa7,0x2c,0xa6,0x5b,0xe4,0x19,0xe3,0x19,0xa3,0x8e,0xf1,0x43,0x08, +0x8a,0x09,0x89,0x89,0x88,0xd1,0xc7,0xc4,0xc7,0xdc,0x19,0x33,0x2a,0x66,0x4c,0xcc, +0xd8,0x98,0x47,0x63,0xc6,0xc5,0x3c,0x15,0x33,0x29,0x66,0x8c,0x6a,0x6a,0xcc,0xcc, +0x98,0xb9,0x31,0xcf,0xc7,0x3c,0xa4,0x7e,0x3e,0xe6,0xc5,0x98,0x47,0x55,0x8b,0x62, +0x98,0x98,0xe4,0x98,0xf4,0x98,0x71,0x2a,0xbe,0xe7,0xb2,0x98,0x15,0x31,0x6b,0x62, +0x36,0xc4,0xe4,0xc6,0x6c,0x8a,0xd9,0x12,0xb3,0x23,0xa6,0x34,0xa6,0x3c,0x66,0x5f, +0x4c,0x4d,0x4c,0x43,0xcc,0xeb,0x31,0x87,0x62,0x8e,0xc4,0x1c,0x8b,0x39,0x11,0x73, +0x3a,0xe6,0xdd,0x98,0x0f,0x63,0xce,0xc7,0x3c,0xa5,0xea,0x8e,0xb9,0x18,0x73,0x39, +0xe6,0x4a,0xcc,0xd5,0x98,0x6b,0x31,0x53,0x55,0xc6,0x18,0x9e,0x9e,0xaf,0xb7,0xd1, +0x0b,0xf5,0x12,0xbd,0xb3,0x7e,0xb8,0x9e,0xfd,0x5d,0x14,0x99,0x5e,0xae,0x57,0xea, +0x7d,0xf4,0x81,0xfa,0x60,0x7d,0x98,0x3e,0x4a,0x3f,0x43,0x65,0xd0,0xdf,0xae,0xbf, +0x5b,0x7f,0x9f,0x5e,0xe6,0xfd,0x80,0xfe,0x61,0xfd,0xe3,0xfa,0x27,0xf5,0x13,0xf4, +0x53,0xf4,0xd3,0xf5,0xb3,0xf5,0xf3,0xf4,0x0b,0xf5,0xaf,0xe8,0x13,0xf4,0x49,0xfa, +0x34,0x45,0x9a,0x3e,0x43,0xbf,0x42,0xbf,0x56,0x9f,0xad,0xcf,0xd7,0x17,0xe9,0x8b, +0xf5,0x25,0xfa,0x32,0x7d,0xa5,0x7e,0x8e,0xaa,0xd3,0xab,0x4a,0x5f,0xa7,0x6f,0xd2, +0xb7,0xe8,0x0f,0xeb,0x8f,0xea,0x8f,0xeb,0x4f,0xea,0x19,0xf5,0xdb,0xfa,0xf7,0xf5, +0xe7,0xf4,0x5d,0xfa,0x3e,0xfd,0xa7,0xfa,0x2b,0xfa,0xab,0xfa,0x64,0xf5,0x35,0xbd, +0x51,0xcf,0x33,0xf0,0x0d,0x36,0x06,0xa1,0x41,0x62,0x90,0x1a,0x5c,0x0d,0x23,0x0d, +0x0a,0x83,0xb7,0x61,0x99,0xda,0xdf,0xa0,0x31,0xe8,0x0c,0x91,0x06,0xbd,0xe1,0x36, +0xc3,0xdd,0x86,0xfb,0x0c,0x0f,0x18,0x1e,0x36,0x3c,0x8e,0xf0,0xa4,0x61,0x82,0x61, +0x8d,0xfa,0x19,0xc3,0x34,0xc3,0x2c,0xc3,0x73,0x86,0x17,0x0c,0x2f,0x1b,0x5e,0x33, +0x8c,0x51,0x24,0x19,0xd2,0x0d,0xcb,0x0c,0x2b,0x0d,0xeb,0x0c,0x39,0x86,0x02,0xc3, +0x2e,0x75,0x91,0x61,0xbb,0xa1,0xd4,0x50,0x61,0xa8,0x32,0xd4,0x21,0xec,0x51,0x2b, +0xbd,0x9b,0x0c,0x2d,0x86,0x56,0xc3,0x1b,0x86,0xe3,0x86,0x3a,0xcf,0x6a,0xf5,0x49, +0xc3,0xdb,0x86,0xf5,0xaa,0x0f,0x0c,0xe7,0x0d,0x97,0x94,0x3d,0x86,0x4b,0x86,0x22, +0xd5,0x65,0xc3,0x15,0xc3,0x55,0xc3,0xf7,0x08,0x16,0xb1,0xd6,0xb1,0x83,0x63,0xed, +0x63,0xc5,0xb1,0x4e,0xb1,0xc3,0x62,0x65,0xb1,0xf2,0x58,0x65,0xac,0x4f,0x6c,0x40, +0xac,0x36,0x36,0x2c,0x36,0x2a,0xd6,0x10,0x7b,0x5b,0xec,0x5d,0xb1,0xf7,0xc6,0xde, +0x1f,0xfb,0x70,0xec,0x13,0xb1,0xe3,0x63,0x27,0xc5,0x4e,0x8d,0x9d,0x19,0x3b,0x37, +0xb6,0x4e,0xf5,0x7c,0xec,0x4b,0xb1,0xaf,0xc5,0x26,0xc6,0xa6,0xc5,0x66,0xc4,0xae, +0x88,0x5d,0x13,0xbb,0x21,0x36,0x37,0x76,0x53,0xec,0x96,0xd8,0xed,0xb1,0xa5,0xb1, +0x15,0xb1,0x55,0xb1,0xea,0x98,0xfa,0xd8,0xe6,0xd8,0x03,0xb1,0x87,0x63,0x8f,0xc6, +0x1e,0x8f,0x3d,0x19,0xfb,0x76,0xec,0xfb,0xb1,0x67,0x63,0x3f,0x8a,0xed,0x8d,0x5d, +0xad,0xf8,0x24,0xf6,0xf3,0xd8,0xaf,0x62,0xbf,0x8d,0xfd,0x21,0xd6,0x22,0xae,0x55, +0x65,0x1d,0x37,0x38,0xce,0x2e,0x4e,0x14,0xe7,0x18,0x37,0x2c,0x4e,0x16,0xe7,0x19, +0xa7,0x8a,0xf3,0x8d,0x0b,0x8c,0x0b,0x8e,0x0b,0x8f,0x8b,0x8e,0x8b,0x8b,0xbb,0x23, +0xee,0x9e,0xb8,0x31,0x71,0x0f,0xc5,0x3d,0x16,0x57,0xec,0xf9,0x8f,0xb8,0xa7,0xe3, +0x26,0xc7,0x3d,0x1b,0x37,0x33,0x6e,0x6e,0xdc,0x49,0xf5,0xf3,0x71,0x2f,0xc6,0x2d, +0x8a,0x63,0xe2,0x92,0xe3,0xd2,0xe3,0x96,0xc5,0xad,0x88,0x1b,0x2d,0x59,0x13,0xb7, +0x31,0x2e,0x2f,0xae,0x30,0x6e,0x6b,0xdc,0x8e,0xb8,0xd2,0xb8,0x8a,0xb8,0xaa,0xb8, +0xba,0xb8,0xa6,0xb8,0x5e,0xf5,0xc7,0xea,0xe9,0x92,0x96,0xb8,0xc3,0x71,0x47,0xe3, +0x8e,0xc7,0x9d,0x8c,0x7b,0x3b,0xee,0x83,0xb8,0xf3,0x71,0xdd,0x71,0x17,0xe3,0x3e, +0x8d,0xbb,0x12,0xf7,0x99,0xfa,0x6a,0xdc,0xf7,0x71,0x16,0xf1,0xd6,0xf1,0x83,0xe3, +0xed,0xe2,0xc5,0xf1,0x4e,0xf1,0xc3,0xe2,0xdd,0xe2,0x3d,0xe2,0xbd,0xe2,0xbd,0xe3, +0xfd,0xe3,0xb5,0xf1,0xba,0xf8,0xc8,0x78,0x7d,0xfc,0x6d,0xf1,0x77,0xc5,0xdf,0x1b, +0x7f,0x7f,0xfc,0x43,0xf1,0x8f,0xc7,0x8f,0x8f,0x9f,0x18,0x3f,0x25,0x7e,0x7a,0xfc, +0x9c,0xf8,0xf9,0xf1,0x02,0x6f,0x81,0xf7,0x8b,0xf1,0x8b,0xe2,0x17,0xc7,0xa7,0xc4, +0x2f,0x89,0x5f,0x1e,0xbf,0x32,0x7e,0x6d,0xfc,0xc6,0xf8,0xbc,0x78,0x5b,0xef,0xcd, +0xf1,0xdb,0xe2,0x77,0xc6,0xef,0x8e,0xaf,0x88,0xdf,0x1f,0x5f,0x17,0xdf,0x14,0x7f, +0x20,0xbe,0x2d,0xde,0xdb,0xe1,0x58,0x7c,0x84,0xc3,0x89,0xf8,0xd3,0xf1,0xef,0xc6, +0x7f,0x18,0x3f,0xda,0xe1,0x7c,0xfc,0x9f,0xf1,0xfb,0x47,0x3f,0x7a,0x1b,0xc7,0xe6, +0xd2,0x64,0xd4,0x6c,0x34,0x5e,0x36,0xef,0x39,0xc3,0xc5,0x7a,0xf3,0x56,0xcf,0xcd, +0x77,0x36,0x1e,0xfd,0x68,0xaf,0xde,0x98,0x80,0x78,0x8c,0x91,0xfb,0xbf,0x42,0xcc, +0xf5,0x52,0xd7,0xd8,0xff,0x20,0x50,0xf0,0xad,0xd1,0xf8,0xc3,0xc1,0x2b,0x9f,0x36, +0x61,0xeb,0x87,0x4f,0xae,0x34,0x45,0x5a,0x50,0xbb,0x91,0xd7,0xff,0x29,0xb7,0xff, +0x93,0x2b,0x1f,0xb7,0x46,0x9f,0x96,0xb6,0x1a,0x5b,0x5a,0xa3,0x17,0xb3,0xda,0x7c, +0xe3,0x99,0x1f,0xb0,0xdf,0x78,0xe5,0x4c,0xf4,0xd3,0xba,0x76,0xb6,0x2d,0x6e,0xfb, +0x32,0xbb,0x3d,0xb7,0xdd,0x68,0x4f,0xdc,0x36,0x6b,0xdc,0x0f,0x9f,0x19,0xdb,0x91, +0x7e,0x6a,0x4c,0xf8,0x1e,0x4a,0x01,0x09,0xc9,0x4f,0x19,0x9b,0x8d,0xae,0xac,0x5d, +0x42,0xae,0x5f,0x67,0x8c,0x7c,0x2e,0x8d,0x4e,0x88,0xe6,0x2a,0x70,0x31,0xbb,0x91, +0x60,0xb6,0x2e,0xda,0x78,0x53,0x1f,0x64,0x6c,0xa7,0xcc,0x33,0x69,0xd9,0xcd,0xaf, +0x5d,0xd1,0x39,0x18,0x91,0x40,0x6c,0xb3,0xc6,0x33,0xec,0xff,0x85,0x41,0x6f,0x79, +0xa6,0xb2,0xc6,0xeb,0xff,0x47,0x49,0xcf,0xee,0x4f,0x30,0x0a,0x8d,0xc2,0xcf,0xb9, +0x4d,0x99,0xc9,0x3f,0x42,0xae,0xd5,0x56,0x73,0xa1,0x76,0x73,0xca,0x1a,0x50,0xc0, +0xb5,0xa1,0x37,0x7b,0x4f,0xc8,0xd9,0x7b,0xd3,0x47,0xf8,0x99,0x39,0xf3,0x8d,0xf1, +0xc2,0x4d,0xe7,0x07,0x8a,0x26,0xcf,0x9b,0xfe,0xcb,0x34,0x4e,0x03,0xdd,0xdc,0x74, +0x93,0x3b,0xd7,0x3c,0x25,0x98,0x3f,0xd7,0x8d,0xe3,0xde,0x51,0xdf,0xf8,0x70,0xd6, +0x9a,0x7b,0x99,0x70,0xf3,0xfb,0x58,0xe1,0xf5,0xf1,0x60,0x4a,0x65,0x46,0x9e,0xbe, +0xd9,0xdc,0x57,0xa3,0x90,0xe1,0xf6,0x34,0x19,0x5b,0xcc,0x7d,0x30,0xd5,0xd6,0x1b, +0xaf,0x98,0xfe,0x83,0x00,0x7d,0xc3,0x6e,0xbf,0xf6,0xda,0x6b,0x74,0x43,0xd9,0x54, +0x57,0xc8,0xfe,0xa7,0xe5,0x6f,0x06,0x14,0xcc,0x6f,0x81,0x2f,0x73,0x8d,0x54,0xa1, +0x8c,0xfe,0xa6,0x71,0xc8,0x4f,0xe3,0x92,0x2c,0xf6,0xa0,0xcc,0xe2,0xc6,0xfb,0x62, +0xfd,0x0d,0x8b,0xb9,0xbe,0x73,0x7f,0x01,0x2c,0x3c,0x7b,0xfd,0x1c,0xb0,0x71,0x93, +0xc9,0xe5,0xfa,0x1b,0xb5,0xe8,0x46,0xc7,0xb8,0x5e,0x63,0xbf,0x9e,0x1b,0x3e,0x4d, +0x2b,0xcd,0xc5,0xb9,0x4e,0x30,0xc6,0x81,0x37,0xd3,0xba,0x6f,0x4c,0xe2,0xc6,0x24, +0x93,0x77,0xaf,0xdb,0x85,0xf3,0xf1,0x3d,0x97,0x99,0xf3,0xd9,0x65,0xb8,0x52,0x9f, +0x86,0x91,0x61,0x71,0xf3,0x1b,0x6e,0xae,0xa1,0x6f,0x06,0xbc,0xa9,0xef,0x37,0x99, +0xcc,0x9a,0xc5,0x73,0xa3,0x7e,0x1c,0xb7,0xb8,0xf9,0xed,0x37,0xff,0x7b,0xb3,0x7d, +0xf0,0xef,0x8f,0xde,0x8c,0x9b,0x3c,0x17,0xc9,0xa3,0xef,0x4d,0x35,0xbe,0xbf,0x7e, +0x96,0x07,0xac,0xe1,0xce,0x11,0xeb,0x77,0xf6,0x90,0x7e,0xe0,0x62,0x3b,0xc3,0x27, +0x6e,0xb4,0xf2,0xae,0x5f,0xba,0x74,0xe3,0xec,0xb2,0xef,0x37,0x4d,0x57,0xa3,0xb9, +0x19,0x7c,0x12,0x1a,0xe0,0x80,0x81,0xff,0x47,0xc4,0x37,0xf2,0x4c,0xd7,0xe9,0x27, +0xd7,0x0a,0xc2,0x17,0x9f,0x6d,0x97,0xa1,0xfc,0x28,0xce,0x4f,0xc6,0xad,0x57,0x9b, +0x2c,0x06,0x99,0x94,0x2f,0xb3,0x75,0x59,0x9b,0x6f,0xf4,0x43,0xcf,0xb6,0xcc,0x43, +0x34,0xe0,0x27,0xee,0xca,0x10,0x9a,0x8e,0xf7,0xb0,0x67,0x29,0xe1,0xc7,0x6f,0xfd, +0xcd,0x7f,0xb9,0xcd,0x67,0x12,0xbe,0x98,0xc3,0xb6,0xff,0x6d,0x02,0x5d,0x37,0x89, +0xcc,0x2e,0xfe,0x5e,0x66,0xd2,0x31,0xde,0xf8,0xef,0x14,0x37,0x19,0xce,0x1d,0x33, +0xb5,0xc7,0x63,0xb5,0x7f,0x30,0x5d,0x52,0x37,0xc6,0x34,0x1a,0xe9,0xc7,0x35,0xc0, +0x75,0x37,0x61,0x2f,0x6b,0x6f,0x13,0x5b,0x26,0xe1,0xda,0x80,0x77,0x84,0x03,0x6d, +0x99,0xae,0x6f,0xae,0x81,0x56,0xd3,0x10,0x1e,0xf8,0x98,0xaf,0x2f,0x23,0xcf,0xe4, +0xdf,0x04,0x19,0x09,0x6f,0xf9,0xfd,0x05,0x9f,0x06,0x46,0x80,0xf9,0xaa,0x32,0x19, +0xd3,0x72,0xbd,0x40,0x02,0xa7,0xa9,0xd7,0x63,0x1e,0x68,0xbc,0x06,0x93,0xce,0x1a, +0xaf,0x8f,0x35,0x53,0x8b,0xc6,0x34,0x73,0x49,0xe6,0xc6,0x37,0x25,0x32,0x4a,0x20, +0xf3,0x65,0xcb,0x18,0x6f,0xb8,0x10,0x9f,0xcb,0x73,0x4c,0xaa,0x56,0xc8,0x2b,0xe9, +0xb3,0xeb,0x57,0xcd,0xc0,0xb5,0x21,0xfc,0xde,0x74,0x7d,0x58,0xd0,0xcd,0xf7,0xee, +0x84,0x7e,0x73,0x6b,0x66,0x5d,0xf3,0x15,0x69,0xea,0xbf,0x90,0xbe,0xe9,0x37,0xfd, +0xaf,0xe7,0x84,0xb3,0xac,0x07,0x98,0x9b,0x7a,0x29,0x43,0x0b,0x2d,0x37,0x8f,0xce, +0xeb,0xbd,0x4f,0xa2,0x1f,0xdf,0x81,0xd2,0x4c,0x63,0xd7,0x34,0x9a,0x13,0xe6,0x18, +0x13,0x0a,0xcc,0x66,0xc3,0xdb,0x2d,0x37,0xff,0x9f,0x16,0xd3,0x47,0x36,0x90,0x33, +0x9b,0xc5,0x33,0xd9,0x94,0x30,0x30,0x2f,0x37,0xed,0x6e,0x36,0x95,0xf9,0x1c,0x76, +0x98,0xee,0xcf,0x42,0x0b,0x1a,0x18,0x41,0xec,0x79,0xbd,0x7e,0x8d,0xe3,0x0e,0xca, +0x33,0x5f,0x61,0xdc,0x1e,0x0c,0xcb,0x81,0xbb,0x6e,0xc2,0x39,0xdc,0x6b,0xd9,0xab, +0xd5,0x78,0xf5,0xfa,0xed,0xef,0xc6,0x77,0x6a,0x37,0xee,0xe1,0x34,0x81,0x26,0xd2, +0x24,0x9a,0x4c,0xcf,0xd0,0x14,0x9a,0x4a,0xcf,0xd2,0x34,0x9a,0x4e,0x33,0x68,0x26, +0xcd,0xa2,0xd9,0x34,0x87,0xe6,0xd2,0x73,0x34,0x8f,0xe6,0xd3,0xf3,0xf4,0x02,0x2d, +0xa0,0x85,0xf4,0x22,0xbd,0x44,0x2f,0x93,0x3b,0xb9,0x1f,0x4d,0x07,0xc9,0xa4,0xc1, +0xd2,0xd1,0xfd,0xe8,0x62,0x3a,0x56,0x8f,0xa4,0x18,0x2b,0xc9,0xa0,0xf3,0x8b,0x93, +0x83,0xb9,0x18,0x87,0xb8,0x7c,0xcb,0x26,0x6a,0x29,0xa4,0x96,0xcd,0xd4,0x52,0x44, +0x2d,0x5b,0xa8,0x65,0x2b,0xb5,0x6c,0xa3,0x96,0x62,0x6a,0xd9,0x4e,0x2d,0x3b,0xa8, +0x65,0x27,0xb5,0x94,0x50,0xcb,0x2e,0x6a,0x29,0xa5,0x96,0xdd,0xd4,0x52,0x46,0x2d, +0x7b,0xa8,0xa5,0x9c,0x5a,0x2a,0xa8,0xa5,0x92,0x5a,0xf6,0x52,0xcb,0x3e,0x6a,0xd9, +0x4f,0x2d,0xd5,0xd4,0x52,0x43,0x2d,0xb5,0xd4,0x52,0x47,0x2d,0xf5,0xd4,0xd2,0x40, +0x2d,0x8d,0x74,0x60,0x31,0x1d,0x48,0xa2,0x03,0x29,0x74,0x20,0x8d,0x0e,0x2c,0xa1, +0x03,0x19,0x74,0x60,0x39,0x1d,0xc8,0xa2,0x03,0x2b,0xe9,0xc0,0x6a,0x3a,0xb0,0x96, +0x0e,0xac,0xa7,0x03,0x1b,0xe9,0x40,0x0e,0x1d,0xc8,0xa3,0x03,0x05,0x74,0xa0,0x90, +0x0e,0x14,0xd1,0x81,0xad,0x74,0xa0,0x98,0x0e,0xec,0xa0,0x03,0x25,0x74,0xa0,0x94, +0x0e,0x94,0xd1,0xb4,0xa3,0x69,0x34,0x6d,0x3a,0x1d,0xd8,0x47,0x07,0xaa,0xe8,0x40, +0x2d,0x1d,0xa8,0xa7,0x03,0x8d,0x34,0xf3,0xf5,0x2a,0x3a,0x98,0x48,0x07,0x93,0xe9, +0x60,0x2a,0x1d,0x4c,0xa7,0x23,0xf5,0xb3,0xe9,0x60,0x06,0x1d,0x5c,0x4e,0x07,0xb3, +0xe8,0xe0,0x4a,0x3a,0xb8,0x9a,0x0e,0xae,0xa5,0x83,0xeb,0xe9,0xe0,0x46,0x3a,0x98, +0x43,0x07,0xf3,0xe8,0x60,0x01,0x1d,0x2c,0xa4,0x83,0x45,0x74,0x70,0x2b,0x1d,0x2c, +0xa6,0x83,0x3b,0xe8,0x60,0x09,0x1d,0x2c,0xa5,0x83,0x65,0x74,0xb0,0x9c,0x0e,0x56, +0xd2,0xc1,0x7d,0x74,0xb0,0x8a,0x5a,0x9a,0xe8,0x60,0x2d,0x1d,0xac,0xa7,0x83,0x8d, +0xd4,0xb6,0x9a,0x0e,0x25,0xd1,0xa1,0x14,0x6a,0x5b,0x43,0x87,0xd2,0xa9,0x6d,0x1d, +0xb5,0xad,0xa7,0x43,0xcb,0xa8,0x35,0x8f,0xda,0x36,0x52,0x5b,0x0e,0x1d,0x5a,0x45, +0x6d,0x9b,0xa8,0xad,0x88,0xda,0x76,0x50,0xdb,0x76,0x3a,0x84,0x9d,0x65,0xd4,0x56, +0x41,0x6d,0xfb,0xe8,0x50,0x21,0x1d,0x2a,0xa2,0x43,0x5b,0xe9,0x08,0x43,0x87,0xb6, +0xd3,0x11,0xb4,0x53,0x4a,0x47,0xd2,0xe9,0xd0,0x1e,0x3a,0xb2,0x94,0x8e,0x64,0xd0, +0xa1,0xbd,0x74,0x68,0x3f,0x1d,0x59,0x45,0x87,0x6a,0xe8,0x50,0x03,0x4d,0x86,0xde, +0xcc,0xe9,0x34,0x7b,0x3a,0xb5,0x66,0x52,0xeb,0x0a,0x6a,0x5d,0x45,0xad,0x6b,0xa8, +0x75,0x1d,0xb5,0x6e,0xa0,0xd6,0x6c,0x6a,0xcd,0xa5,0xd6,0x02,0x6a,0x2d,0xa4,0xd6, +0x22,0x6a,0xdd,0x4a,0xad,0xc5,0xd4,0xba,0x83,0x5a,0x4b,0xa8,0xb5,0x94,0x5a,0xcb, +0x68,0xf2,0xcb,0xd4,0x0a,0xc9,0xb5,0x74,0xa8,0x89,0x5a,0x6b,0xa8,0xb5,0x8e,0x5a, +0x1b,0xa8,0xb5,0x89,0x0e,0x2f,0xa6,0xc3,0x49,0x74,0x38,0x85,0x0e,0xa7,0xd1,0xe1, +0x25,0x74,0x38,0x83,0x0e,0x2f,0xa7,0xc3,0x59,0x74,0x78,0x25,0x1d,0x5e,0x4d,0x87, +0xd7,0xd2,0xe1,0xf5,0x74,0x78,0x23,0x1d,0xce,0xa1,0xc3,0x79,0x74,0xb8,0x80,0x0e, +0xe5,0xd3,0xe1,0x22,0x3a,0xbc,0x95,0x0e,0x17,0xd3,0xe1,0x1d,0x74,0xb8,0x84,0x0e, +0x97,0xd2,0xe1,0x32,0x3a,0x5c,0x4e,0x87,0x2b,0xe9,0x7c,0x39,0x0e,0xd4,0xd3,0xa1, +0x6c,0xe4,0xb6,0x51,0x5b,0x22,0x1d,0x62,0xe8,0xc8,0x12,0x3a,0xb2,0x8c,0xda,0xd2, +0xa8,0x6d,0x09,0xb5,0x65,0x50,0xdb,0x72,0x6a,0xcb,0xa2,0x36,0x1c,0xad,0xa1,0xb6, +0x3a,0x3a,0xb2,0x18,0x03,0x2f,0x15,0xa4,0x81,0xa5,0x60,0x3b,0x48,0x02,0x19,0x74, +0x64,0x2d,0x1d,0x65,0x08,0x83,0xf3,0xe8,0x6a,0x3a,0x9a,0xce,0x0e,0xd2,0x1a,0x7a, +0xb3,0x9c,0xde,0xac,0xa4,0x23,0xc8,0x54,0x91,0x3b,0xb6,0x23,0xa9,0xbd,0x92,0x1d, +0xcc,0xec,0xd1,0x5d,0x84,0x33,0x7e,0xac,0x94,0x8e,0xed,0xa6,0x63,0x65,0xd4,0xbe, +0x8c,0xda,0x97,0x53,0x7b,0x26,0x1d,0x2b,0xa7,0x63,0x15,0x74,0xac,0x92,0x8e,0xed, +0xa5,0x63,0xfb,0xe8,0xd8,0x7e,0x3a,0x86,0x62,0xd5,0x74,0xac,0x96,0x8e,0xd5,0xd1, +0xb1,0x06,0x3a,0xd6,0x48,0xc7,0x9a,0xa8,0x9d,0xa1,0xf6,0xc5,0xd4,0x9e,0x44,0xed, +0xc9,0xd4,0x9e,0x42,0xed,0xa9,0xd4,0x9e,0x46,0xed,0xe9,0xd4,0xbe,0x84,0xda,0x97, +0x52,0x7b,0x06,0xb5,0xaf,0xa7,0xf6,0x8d,0xd4,0x9e,0x43,0xed,0x79,0xd4,0x5e,0x40, +0xed,0x85,0xd4,0x5e,0x44,0xed,0x5b,0xa9,0xbd,0x98,0xda,0x77,0x50,0x7b,0x09,0xb5, +0x97,0x52,0x3b,0x74,0xab,0xa9,0xbd,0x8e,0xde,0xc4,0x4f,0x3d,0xbd,0xd9,0x40,0x1d, +0x2b,0xa8,0x63,0x25,0x75,0xac,0xa2,0x8e,0xd5,0xd4,0xb1,0x86,0x3a,0xd6,0x52,0xc7, +0x3a,0xea,0x58,0x4f,0x1d,0x1b,0xa8,0x63,0x23,0x75,0x64,0x53,0x47,0x0e,0x75,0xe4, +0x52,0x47,0x1e,0x75,0xe4,0x53,0x47,0x01,0x1d,0xdf,0x43,0xc7,0xcb,0xe9,0x78,0x05, +0x1d,0xaf,0xa4,0xe3,0x7b,0xe9,0xf8,0x3e,0x3a,0xbe,0x9f,0x8e,0x57,0xd1,0xf1,0x6a, +0x3a,0x5e,0x43,0xc7,0x6b,0xe9,0x78,0x1d,0x1d,0xaf,0xa7,0xe3,0x0d,0x74,0xbc,0x91, +0x8e,0x37,0x51,0x07,0x43,0x1d,0x8b,0xa9,0x23,0x91,0x3a,0x92,0xa8,0x23,0x99,0x3a, +0x52,0xa8,0x23,0x95,0x3a,0xd2,0xa8,0x23,0x9d,0x3a,0x96,0x50,0xc7,0x52,0xea,0xc8, +0xa0,0x8e,0x65,0xd4,0xb1,0x9c,0x3a,0x32,0xa9,0x23,0x8b,0x3a,0x0a,0xa9,0xa3,0x88, +0x3a,0xb6,0x52,0x47,0x31,0x75,0xec,0xa0,0x8e,0x12,0xea,0x28,0xa5,0x8e,0x32,0xea, +0x28,0xa7,0x8e,0x4a,0xea,0xd8,0x47,0x1d,0x55,0xd4,0x51,0x43,0x1d,0x75,0xd4,0x01, +0xe3,0x9b,0xe8,0xc4,0x62,0x3a,0x91,0x41,0x27,0x96,0xd3,0x89,0x2c,0x3a,0xb1,0x92, +0x4e,0xac,0xa6,0x13,0x6b,0xe9,0xc4,0x7a,0x3a,0xb1,0x91,0x4e,0xe4,0xd0,0x89,0x3c, +0x3a,0x51,0x40,0x27,0x0a,0xe9,0x44,0x11,0x9d,0xd8,0x4a,0x27,0x8a,0xe9,0xc4,0x0e, +0x3a,0x51,0x42,0x27,0x4a,0xe9,0x44,0x19,0x9d,0x28,0xa7,0x13,0x95,0x74,0x62,0x1f, +0x9d,0xa8,0xa2,0x13,0x35,0x74,0xa2,0x8e,0x4e,0x34,0xd0,0x89,0x26,0xea,0xcc,0xa2, +0xce,0x44,0xea,0x4c,0xa6,0xce,0x54,0xea,0x4c,0xa7,0xce,0xa5,0xd4,0xb9,0x8c,0x3a, +0x33,0xa9,0x73,0x25,0x75,0xae,0xa6,0xce,0xb5,0xd4,0xb9,0x9e,0x3a,0x37,0x52,0x67, +0x0e,0x75,0xe6,0x51,0x67,0x01,0x75,0x16,0x52,0x67,0x11,0x75,0x6e,0xa5,0xce,0x62, +0xea,0xdc,0x41,0x9d,0x25,0xd4,0x59,0x4a,0x9d,0x65,0xd4,0x59,0x4e,0x9d,0x95,0xd4, +0xb9,0x8f,0x3a,0xab,0xa8,0xb3,0x86,0x3a,0xeb,0xa8,0xb3,0x81,0x3a,0x9b,0xe8,0xe4, +0x62,0x3a,0x99,0x44,0x27,0x53,0xe8,0x64,0x1a,0x9d,0x5c,0x42,0x27,0x33,0xe8,0xe4, +0x72,0x3a,0x99,0x45,0x27,0x57,0xd2,0xc9,0xd5,0x74,0x72,0x2d,0x9d,0x5c,0x4f,0x27, +0x37,0xd2,0xc9,0x1c,0x3a,0x99,0x47,0x27,0x0b,0xe8,0x64,0x21,0x9d,0x2c,0xa2,0x93, +0x5b,0xe9,0x64,0x31,0x9d,0xdc,0x41,0x27,0x4b,0xe8,0x64,0x29,0x9d,0x2c,0xa3,0x53, +0x85,0x74,0x6a,0x33,0x9d,0x2a,0xa2,0x53,0x5b,0xe8,0xd4,0x56,0x3a,0xb5,0x8d,0x4e, +0x15,0xd3,0xa9,0xed,0x74,0x6a,0x07,0x9d,0xda,0x49,0xa7,0x4a,0xe8,0xd4,0x2e,0x3a, +0x55,0x4a,0xa7,0x76,0xd3,0x29,0x14,0xde,0x43,0xa7,0xca,0xe9,0x54,0x05,0x9d,0xaa, +0xa4,0x53,0x7b,0xe9,0xd4,0x3e,0x3a,0xb5,0x9f,0x4e,0x55,0xd1,0xa9,0x6a,0x3a,0x55, +0x43,0xa7,0x6a,0xe9,0x54,0x1d,0x9d,0xaa,0xa7,0x53,0x0d,0x74,0xaa,0x91,0x4e,0x35, +0xd1,0x69,0x86,0x4e,0x2f,0xa6,0xd3,0x89,0x74,0x3a,0x89,0x4e,0x27,0xd3,0xe9,0x14, +0x3a,0x9d,0x0a,0x15,0xec,0x78,0xbb,0xf8,0x9d,0xbd,0xf4,0x4e,0x3a,0xa2,0xf7,0xd2, +0xd8,0xdc,0x52,0x44,0x67,0xb7,0xac,0x3d,0xbb,0xa5,0x1e,0xc9,0x3a,0x53,0xb2,0xde, +0x94,0xe4,0x9a,0x92,0x42,0x53,0xb2,0xd9,0x94,0x94,0x98,0x92,0x32,0x2e,0xd9,0x56, +0x78,0x76,0x1b,0x9b,0x6c,0x36,0x25,0x65,0x5c,0xb2,0xbd,0xe2,0xec,0x76,0x36,0xa9, +0x36,0x25,0xeb,0x4c,0xc9,0x7a,0x53,0x92,0x6b,0x4a,0x4a,0xb8,0x64,0x57,0xe1,0xd9, +0x5d,0x6c,0xb2,0x99,0x4b,0x6a,0x96,0x9f,0xad,0xae,0xa0,0xb3,0x75,0xcb,0xcf,0xd6, +0x22,0xa9,0x2d,0x39,0x5b,0xbb,0xd1,0x94,0x14,0xd2,0xd9,0xfa,0x0c,0x3a,0xdb,0x90, +0x78,0xb6,0xb1,0x0a,0xc9,0x32,0x53,0xb2,0xd2,0x94,0xac,0x33,0x25,0x39,0xa6,0x84, +0x39,0xdb,0xb8,0x0f,0x49,0xf9,0xd9,0x86,0x0a,0x53,0x82,0xce,0x35,0x56,0x9c,0x6d, +0x64,0xb8,0x04,0x3b,0xb8,0x5c,0xe5,0x40,0x62,0xde,0x31,0xb0,0x7f,0x15,0xd7,0x48, +0x63,0xae,0x29,0x29,0x34,0x25,0xdb,0x4c,0x49,0x89,0x29,0x59,0xc1,0x0a,0x9c,0xdf, +0xcb,0x80,0xc5,0x20,0x11,0x24,0x81,0x64,0x90,0x02,0x52,0x41,0x1a,0x48,0x07,0x4b, +0xc0,0x52,0x90,0x01,0x96,0x81,0xe5,0x20,0x13,0x64,0x81,0x15,0x60,0x25,0x58,0x05, +0x56,0x83,0x35,0x60,0x2d,0x58,0x07,0xd6,0x83,0x0d,0x60,0x23,0xc0,0xad,0x6e,0x6f, +0x0e,0xc8,0x05,0x79,0x20,0x1f,0x14,0x80,0x4d,0xa0,0x10,0x6c,0x06,0x45,0x60,0x0b, +0xd8,0x0a,0x8a,0x41,0x29,0x9d,0x4b,0xca,0xa5,0x73,0x59,0x7b,0x40,0x39,0xa8,0x00, +0x95,0x60,0x2f,0xd8,0x47,0x17,0x37,0x66,0xd0,0xb9,0x8a,0xa5,0x28,0xb3,0x02,0xac, +0x04,0xab,0xc0,0x6a,0xb0,0x06,0xac,0x05,0xeb,0xc0,0x7a,0xb0,0x01,0x6c,0x04,0xd9, +0x20,0x07,0xe4,0x81,0x7c,0x50,0x00,0x36,0x81,0x42,0xb0,0x19,0x14,0x81,0x2d,0x60, +0x2b,0xd8,0x06,0x8a,0xc1,0x76,0xb0,0x03,0xec,0x04,0x25,0x60,0x17,0x60,0xed,0xda, +0x0d,0xca,0x00,0x6c,0x4b,0x82,0x6d,0x49,0xb0,0x2d,0x09,0xb6,0x25,0xc1,0xb6,0xa4, +0x7d,0x60,0x3f,0xa8,0x02,0xd5,0xa0,0x06,0xd4,0x82,0x06,0xd0,0x08,0x9a,0xa8,0x6d, +0x05,0xb5,0xc1,0x62,0x78,0xbd,0x0d,0x1d,0x84,0xb3,0xce,0xc1,0x59,0xe7,0xe0,0x98, +0x73,0xe8,0x7c,0x1b,0x9e,0x85,0x6b,0xa9,0xad,0x80,0xda,0x0a,0xa9,0x0d,0x9b,0x90, +0xde,0x87,0x27,0x00,0x1e,0x95,0x10,0xde,0x9f,0x42,0x47,0x70,0xa4,0x9c,0xda,0xf6, +0x50,0x5b,0x25,0xb5,0xed,0xa5,0xb6,0x6a,0x3a,0x82,0x27,0x08,0x8c,0x83,0x73,0x8f, +0xac,0xa0,0x23,0x68,0xb8,0x7a,0x31,0x48,0x02,0x29,0x20,0x0d,0x2c,0x01,0x70,0x57, +0xf5,0x72,0x90,0x05,0xd8,0x32,0x70,0x55,0x35,0xdc,0x54,0x0d,0xe5,0x6a,0xb8,0xa7, +0x1a,0xae,0xa9,0x86,0x05,0xd5,0x70,0x4b,0x35,0x5c,0x52,0x0d,0x77,0x54,0xc3,0x15, +0xd5,0x70,0x43,0x35,0x5c,0x50,0x0d,0x85,0x6a,0x58,0x50,0x8d,0x6e,0x57,0xa3,0xcb, +0xd5,0xe8,0x6e,0x35,0xba,0x5a,0x8d,0x6e,0x56,0xa3,0x8b,0xd5,0x75,0x00,0x5d,0xac, +0x6e,0xa2,0x73,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4,0x6b,0xa0,0x5f,0x03,0xfd,0x1a, +0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4,0x6b,0xa0,0x5f, +0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81,0x7e,0x0d,0xf4, +0x6b,0xa0,0x5f,0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0x35,0xd0,0xaf,0x81, +0x7e,0x0d,0xf4,0x6b,0xa0,0x5f,0x03,0xfd,0x1a,0xe8,0xd7,0x40,0xbf,0x06,0xfa,0xb5, +0xd0,0xaf,0x85,0x7e,0x2d,0xf4,0x6b,0xa1,0x5f,0x0b,0xfd,0x5a,0xe8,0xd7,0x42,0xbf, +0x16,0xfa,0xb5,0xd0,0xaf,0x85,0x7e,0xed,0x5a,0x9a,0x70,0xa4,0x91,0x5a,0x20,0x89, +0x8b,0xf3,0x5c,0x2d,0x24,0x6b,0x21,0x59,0x0b,0xc9,0x5a,0x48,0xd6,0x42,0xb2,0x16, +0x92,0xb5,0x90,0xac,0x85,0x64,0x2d,0x24,0x6b,0x21,0x59,0x0b,0xc9,0x5a,0x48,0xd6, +0x42,0xb2,0x16,0x92,0xb5,0x90,0xac,0x83,0x64,0x1d,0x24,0xeb,0x20,0x59,0x07,0xc9, +0x3a,0x48,0xd6,0x41,0xb2,0x0e,0x92,0x75,0x90,0xac,0x83,0x64,0x1d,0x24,0xeb,0xd0, +0xe5,0x3a,0x74,0xb9,0x0e,0x5d,0xae,0x43,0x97,0xeb,0xd0,0xe5,0x3a,0xe8,0xd7,0x41, +0xbf,0x0e,0xfa,0x75,0xd0,0xaf,0x83,0x7e,0x1d,0xf4,0xeb,0xa0,0x5f,0x07,0xfd,0x3a, +0xe8,0xd7,0x41,0xbf,0x0e,0xfa,0x75,0xd0,0xaf,0x83,0x7e,0x1d,0xf4,0xeb,0xa0,0x5f, +0x07,0xfd,0x3a,0xe8,0xd7,0x33,0x00,0x36,0xd4,0x27,0x02,0xd8,0x51,0x9f,0x0c,0x60, +0x4b,0x7d,0x2a,0x80,0x3d,0xf5,0xb8,0x4a,0xea,0x61,0x43,0x3d,0xae,0x92,0x7a,0xd8, +0x51,0x8f,0xab,0xa4,0x1e,0xb6,0xd4,0xe3,0x0a,0xa8,0x87,0x76,0x3d,0xae,0x80,0x7a, +0xe8,0xd7,0xe3,0x0a,0xa8,0x87,0x0d,0xf5,0xb8,0x02,0xea,0x61,0x47,0x3d,0x46,0x78, +0x3d,0xb4,0xeb,0x31,0xc2,0xeb,0xa1,0x5f,0x8f,0x11,0x5e,0x0f,0x1b,0xea,0x31,0xc2, +0xeb,0x61,0x47,0x03,0x74,0x1b,0xa0,0xdb,0x00,0xdd,0x06,0xe8,0x36,0x40,0xb7,0x01, +0xba,0x0d,0xd0,0x6a,0x80,0x4e,0x03,0x34,0x1a,0xd0,0xdf,0x06,0xe8,0x34,0x40,0xa7, +0x01,0x3a,0x0d,0xd0,0x69,0x80,0x4e,0x03,0x74,0x1a,0xa0,0xd3,0xc0,0xea,0x30,0x98, +0xa7,0xa0,0x07,0x5c,0x9c,0xc8,0xc5,0x49,0x5c,0x9c,0xcc,0xc5,0x29,0x5c,0x9c,0xca, +0xc5,0x69,0x5c,0xbc,0x89,0x8b,0x0b,0xb9,0x78,0x33,0x17,0x17,0x71,0xf1,0x16,0x2e, +0xde,0xca,0xc5,0xdb,0xb8,0xb8,0x98,0x8d,0x1b,0xb8,0xf2,0x0d,0x5c,0xf9,0x06,0xae, +0x7c,0x03,0x57,0xbe,0x81,0x2b,0xdf,0xc0,0x95,0x6f,0xe0,0xca,0x37,0x98,0xca,0xef, +0x41,0x7c,0xac,0x9c,0x8d,0x76,0xb1,0xdb,0x8d,0xfb,0xb9,0x18,0xde,0x68,0x2c,0x67, +0x8f,0x62,0x3a,0xb5,0x9a,0xdc,0xdf,0x4c,0x64,0xa7,0x55,0x6f,0xb2,0x7d,0xdf,0xcb, +0x16,0xad,0x62,0xa3,0xdd,0x6c,0xc9,0x26,0xce,0x56,0xdc,0xbd,0x71,0x84,0x2d,0x8b, +0x39,0x1a,0x1b,0xb3,0xf3,0xb8,0xd5,0x28,0x7f,0x0c,0xa7,0xa3,0x89,0x85,0x75,0xd3, +0x7e,0xec,0x5c,0xc3,0x15,0x58,0xc3,0x15,0x58,0xc3,0x16,0x80,0x52,0x13,0x7c,0xd6, +0xc4,0xfa,0x0c,0x77,0x8f,0xa6,0xad,0xdc,0x04,0x8e,0xa1,0xa7,0xb1,0x5d,0x8f,0xb6, +0xdb,0x97,0xb0,0x51,0x26,0xa7,0xc5,0xd9,0xd6,0x50,0xcd,0x1e,0x61,0xab,0xd3,0x79, +0x66,0x05,0x52,0x4c,0x34,0x99,0x0a,0xfc,0x98,0x13,0x53,0x6e,0x1f,0x7e,0xcc,0x09, +0x9b,0x1b,0x39,0x12,0x05,0x53,0x88,0x5d,0xc2,0x8e,0xa4,0x91,0xfa,0x1b,0x45,0xd9, +0xd2,0x81,0x14,0x4c,0x21,0x14,0x4a,0x3a,0x0a,0xa3,0x70,0xf2,0xa1,0xf3,0xe9,0xab, +0x28,0x9a,0x54,0xa4,0xa6,0x79,0xf3,0x69,0x42,0xc0,0x24,0x30,0x9f,0x5e,0xdf,0x33, +0x89,0x26,0x05,0xcc,0x01,0x2f,0x20,0x3f,0x85,0x66,0xcf,0xa1,0xf9,0xb3,0xe8,0xf9, +0x67,0x66,0xd2,0xf3,0xb3,0xe8,0x7c,0x4a,0x26,0xbd,0xb5,0x82,0xde,0x5a,0x49,0x6f, +0xad,0xa2,0xb7,0x56,0xd3,0x94,0x09,0x2f,0xa2,0x95,0x95,0xdc,0xca,0x49,0xc7,0xc5, +0xe1,0x5c,0x1c,0x14,0xc8,0x25,0x5a,0xd2,0x70,0x31,0x9b,0x0f,0xe1,0xf2,0x21,0xdc, +0xf2,0x2a,0x84,0x82,0xb9,0x98,0xdd,0x1f,0x4a,0x21,0x5c,0xcc,0xe6,0xc3,0xb8,0xa3, +0x61,0xdc,0x9e,0x30,0xd2,0x71,0x31,0xbb,0x9f,0xa6,0x4d,0xc3,0x0f,0x58,0x40,0x0b, +0xa6,0xe1,0x87,0x03,0x9b,0x2f,0xd2,0x8b,0xd3,0xf0,0x33,0x8d,0xce,0xa7,0x26,0x53, +0x20,0x27,0x75,0x3e,0xbd,0x04,0x3f,0xe6,0xc4,0x94,0xdb,0x8d,0x1f,0x73,0xc2,0xe6, +0x2e,0x30,0xe9,0x60,0x09,0xb1,0x36,0x62,0xe5,0xa7,0xa1,0x20,0x18,0x88,0xc5,0x1f, +0xcc,0x81,0x15,0xe8,0x05,0x34,0xc3,0x49,0x13,0x48,0xaa,0x20,0x35,0xa9,0x34,0x40, +0x0b,0x82,0x41,0x08,0x08,0x05,0x3a,0x10,0x06,0xc2,0x41,0x50,0x20,0x1b,0xb1,0x25, +0x83,0xd8,0xa2,0x41,0x6c,0xd9,0x20,0xb6,0x70,0x10,0x5b,0x3a,0x88,0x2d,0x1e,0xc4, +0x96,0x0f,0x62,0x2b,0x04,0xb1,0x35,0x34,0x6c,0x8d,0x09,0x60,0x22,0x98,0x04,0x26, +0x83,0x67,0xc0,0x14,0x30,0x15,0x3c,0x0b,0xa6,0x81,0xe9,0x60,0x06,0x98,0x09,0x66, +0x81,0xd9,0x60,0x0e,0x98,0x0b,0x9e,0x03,0xf3,0xc0,0x7c,0xf0,0x3c,0x78,0x01,0x2c, +0x00,0x0b,0xc1,0x8b,0xe0,0x25,0xf0,0xb2,0xfa,0x86,0x1b,0x58,0x4f,0x44,0x44,0x44, +0x53,0x34,0xfb,0x13,0x4d,0xe7,0x4b,0xf2,0x8e,0x56,0xd3,0xf9,0x3d,0x7b,0x40,0x39, +0xc0,0x48,0xda,0x83,0xe1,0xb5,0x67,0x2f,0xc0,0x70,0xda,0xb3,0x1f,0x54,0x01,0xb6, +0x4c,0x0d,0xa8,0x05,0x75,0xa0,0x1e,0x34,0x80,0x46,0xd0,0x84,0xd5,0x0e,0xa6,0x1b, +0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e, +0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba, +0x51,0x8e,0xe9,0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9, +0x46,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0x86, +0x7a,0x39,0xa6,0x1b,0xe5,0x98,0x6e,0x94,0x63,0xba,0x51,0x8e,0xe9,0x46,0x39,0xa6, +0x1b,0xe5,0xec,0xca,0x0a,0xd3,0x8d,0x72,0x4c,0x37,0xca,0x31,0xdd,0x28,0xc7,0x74, +0xa3,0x1c,0xd3,0x8d,0x72,0x3c,0x51,0x71,0x4f,0xdd,0xd7,0x40,0x6d,0xb0,0xaa,0x7c, +0x3b,0xd8,0x09,0x76,0x01,0x76,0x55,0xb6,0x9f,0x0e,0xe3,0xd9,0x0c,0x1b,0x2b,0x60, +0x63,0x05,0xec,0xab,0x80,0x6d,0x15,0xb0,0xab,0x02,0x36,0x55,0xc0,0x9e,0x0a,0xd8, +0x52,0x01,0x3b,0x2a,0x60,0x43,0x05,0xf4,0x2b,0xa0,0x5d,0x01,0xdd,0x0a,0x68,0x56, +0x40,0xaf,0x02,0x5a,0x15,0xd0,0xa9,0xc0,0x94,0xa6,0x02,0xd3,0x99,0x0a,0x4c,0x65, +0x2a,0x30,0x95,0xa9,0xd8,0x01,0x30,0xb4,0x2a,0x4a,0x41,0x19,0x80,0x0f,0x2b,0xa0, +0x58,0x01,0xdf,0x55,0xc0,0x6f,0x15,0xf0,0x59,0x05,0xfc,0x55,0x01,0xab,0x2a,0xe0, +0xa7,0x4a,0xe8,0x57,0x42,0xbf,0x12,0xfa,0x95,0xd0,0xaf,0x84,0x7e,0x25,0xf4,0x2b, +0xa1,0x5f,0x09,0xfd,0x4a,0xe8,0x57,0x42,0xbf,0x12,0xfa,0x95,0xd0,0xaf,0x84,0x7e, +0x25,0xf4,0x2b,0xa1,0x5f,0x09,0xfd,0x4a,0xe8,0x57,0x42,0xbf,0x12,0x3d,0xab,0xc4, +0x58,0xae,0x84,0xd6,0xbe,0x42,0xea,0x2e,0x5b,0x4e,0x7d,0x8d,0x05,0xf4,0x51,0x35, +0x03,0xb6,0x83,0xfd,0xa0,0x89,0x3e,0xc2,0xf3,0xf7,0x23,0x3c,0x2b,0x3f,0xaa,0x5d, +0x06,0x36,0x81,0x5a,0xea,0x4a,0x6e,0xa2,0xae,0x94,0xad,0xa0,0x84,0xba,0x52,0x13, +0xc1,0x3a,0x80,0x7c,0xda,0x26,0xb0,0x8f,0xba,0xd2,0x19,0xea,0x5a,0x9a,0x43,0x5d, +0x19,0x35,0xd4,0xb5,0x6c,0x2d,0xc8,0x06,0xd5,0xd4,0xb5,0x7c,0x31,0xc8,0x05,0x3b, +0xa8,0x2b,0x13,0xf5,0x32,0xf7,0x53,0x57,0x56,0x3a,0x28,0xa2,0xae,0x9c,0xf5,0xd4, +0x95,0x5b,0x40,0x5d,0x45,0x68,0x67,0x0b,0x8e,0x6d,0x59,0x0a,0x50,0x77,0x4b,0x31, +0x75,0x6d,0xad,0xa4,0xae,0xd2,0x15,0xd4,0xb5,0x1b,0xed,0x96,0xa1,0x9d,0x3d,0x59, +0x60,0x33,0x40,0xbe,0x7c,0x37,0x28,0xa7,0xae,0x2a,0xe8,0x55,0xc1,0xa6,0x2a,0x36, +0xdf,0x48,0x5d,0x35,0x15,0x00,0xb6,0xe2,0x99,0xdf,0x55,0xb7,0x17,0x60,0x1f,0x66, +0xd8,0x5d,0x78,0xc0,0x75,0x35,0xa0,0x2d,0x3c,0x70,0xba,0x1a,0xd0,0x6e,0x53,0x12, +0x75,0xa7,0xa7,0x83,0xfd,0xd4,0xbd,0x24,0x83,0xba,0xd7,0x94,0x81,0xbd,0xd4,0xbd, +0x2e,0x0d,0xac,0x07,0x5b,0x40,0x0d,0x75,0xaf,0xdf,0x04,0xb6,0x52,0x77,0xce,0x1e, +0xea,0xce,0x45,0xf9,0xdc,0xed,0xd4,0xbd,0x0b,0xfb,0x4a,0x37,0x03,0x1c,0xdf,0x5d, +0x09,0x1f,0xa2,0x7e,0xd9,0x1a,0x90,0x43,0xdd,0xb0,0xb1,0x7b,0x0f,0xf2,0xb8,0x0e, +0x7a,0x16,0x97,0x50,0x4f,0xfa,0x4e,0xb0,0x1f,0xd4,0x81,0x26,0xea,0x59,0x92,0x06, +0x36,0x82,0x1c,0xea,0x59,0xba,0x8b,0x7a,0x32,0x93,0xc1,0x12,0xea,0x59,0x9d,0x0b, +0xb6,0x51,0xcf,0x9a,0x0d,0xa0,0x00,0x6c,0x07,0x7b,0xa8,0x67,0x5d,0x06,0x58,0x45, +0x3d,0x1b,0xd1,0xc6,0xc6,0x06,0xea,0xc9,0xde,0x0d,0xd0,0x4e,0x0e,0xd2,0x02,0xb4, +0x51,0xb0,0x19,0x54,0x52,0xcf,0x96,0x5a,0xea,0xd9,0x56,0x0d,0x1a,0xa9,0x67,0x07, +0xb4,0x4b,0x50,0xaf,0xa4,0x86,0x7a,0x30,0x8a,0x7b,0x2a,0xb1,0x1f,0x0f,0xe7,0x1e, +0x3c,0x80,0x7b,0x1a,0x97,0x82,0x06,0xea,0x65,0x16,0x83,0x65,0x60,0x15,0xa8,0xa4, +0xde,0xc5,0x4d,0xd4,0x9b,0xb8,0x84,0x7a,0xd3,0x8a,0xc0,0x4e,0x80,0x7d,0x69,0xf5, +0xd4,0x9b,0x8e,0x32,0xe9,0x39,0xa0,0x80,0x7a,0x97,0xec,0x06,0x15,0xa0,0x9a,0x7a, +0x37,0x2e,0x07,0x25,0xd4,0x5b,0xc8,0x00,0x94,0x29,0x44,0xbd,0xad,0x8d,0xd4,0xbb, +0x2d,0x83,0x7a,0x8b,0xd1,0xe6,0x76,0xec,0xc7,0xf5,0xdf,0x8b,0xeb,0xb8,0x17,0xd7, +0x63,0x6f,0x39,0xea,0xe0,0x5a,0xe8,0xdd,0xb7,0x05,0xec,0xa1,0xde,0xfd,0x68,0x1f, +0x93,0xa9,0xde,0xba,0xa5,0xd4,0xdb,0x88,0xf6,0xf1,0x18,0xed,0xc5,0xf2,0xa3,0x2f, +0x71,0x25,0xf5,0xa5,0x2c,0xa1,0xbe,0xb4,0x54,0xb0,0x0c,0x60,0x7b,0x6d,0x15,0xf5, +0xad,0x63,0xa8,0x6f,0x43,0x2e,0xf5,0x65,0xef,0x07,0x35,0xd4,0x97,0xb3,0x9d,0xfa, +0xf2,0x70,0x2c,0x2f,0x1f,0x6c,0x06,0x3b,0xa8,0xaf,0x20,0x03,0x94,0x82,0x4a,0xea, +0xdb,0xb4,0x98,0xfa,0x36,0xa3,0x4c,0x51,0x0e,0x28,0xa0,0xbe,0x6d,0xeb,0xc0,0x46, +0xb0,0x8b,0xfa,0x76,0x62,0x7f,0xc9,0x06,0x80,0xfd,0xbb,0xb6,0x82,0x32,0x50,0x01, +0xea,0xa9,0xaf,0x34,0x9b,0xfa,0x2a,0xb1,0x0f,0xf3,0xc8,0x3e,0x8c,0xa1,0x3e,0x4c, +0xfe,0xfa,0x30,0xa9,0xeb,0xc3,0x44,0xae,0x0f,0x13,0xb7,0x3e,0x4c,0xda,0xfa,0x30, +0xd1,0xea,0xc3,0x24,0xab,0xaf,0x3e,0x13,0xac,0x06,0x9b,0x00,0xca,0x34,0x2c,0x05, +0xab,0x70,0x3d,0xb1,0xd7,0x14,0x6c,0x6d,0xdc,0x44,0xfe,0x78,0x4e,0xac,0xc2,0xc8, +0x4f,0x06,0x29,0xe4,0x7e,0x21,0x71,0x23,0x1b,0x65,0xd3,0x85,0xc4,0xf4,0x0b,0x89, +0x4b,0x91,0x54,0x5e,0x48,0x4a,0xa7,0x73,0xc9,0x98,0x32,0x25,0x63,0xca,0x94,0x8a, +0x99,0x7d,0x32,0xa6,0x0e,0xa9,0x58,0x54,0xa4,0x62,0x9a,0x97,0x8c,0xe9,0x53,0x32, +0xa6,0x4f,0xc9,0x98,0x3e,0xa5,0xe2,0xf1,0x9f,0x8a,0x89,0x46,0x2a,0x26,0x10,0xa9, +0x98,0x76,0xa5,0x62,0xda,0x95,0x8a,0x69,0x57,0x32,0x16,0x31,0xc9,0x98,0xd2,0x25, +0x63,0x4a,0x97,0xcc,0xb6,0x85,0xe9,0x41,0x32,0xa6,0x9a,0xc9,0x58,0x08,0x25,0x63, +0xba,0x99,0xbc,0x0c,0x60,0xca,0x99,0x9c,0x09,0x30,0xed,0x4c,0xc6,0x1c,0x23,0x19, +0x73,0x8c,0x64,0x4c,0xfb,0x52,0x50,0x36,0x05,0xd3,0xaf,0x14,0x4c,0xbf,0x52,0x30, +0xfd,0xc2,0xd5,0x7d,0x2e,0x05,0xd3,0xaf,0x14,0x4c,0xbf,0x52,0xb0,0xd0,0x49,0xc1, +0x94,0x33,0x05,0x36,0xe1,0x8a,0x3f,0x97,0x02,0x9b,0x52,0x60,0x53,0x0a,0x16,0x3a, +0x29,0x98,0x7e,0xa6,0xc0,0x9e,0x14,0xd8,0x93,0x02,0x7b,0x52,0x60,0x4f,0x0a,0xec, +0x49,0x61,0xed,0xc1,0x34,0x32,0x19,0x53,0xbc,0x34,0xd8,0x93,0x06,0x7b,0x70,0x16, +0xcf,0xa5,0x41,0x3b,0x0d,0x53,0xbf,0x34,0x4c,0xfb,0xd2,0x30,0xcd,0x4d,0xc6,0x1a, +0x27,0x0d,0xd3,0xdc,0x34,0x4c,0x73,0x93,0x91,0x26,0x63,0xf1,0x95,0x8c,0xa9,0x4d, +0x32,0x6c,0x49,0x86,0x2d,0xc9,0xd0,0x4f,0x86,0x76,0x32,0x74,0x93,0xa1,0x9b,0xcc, +0xfa,0x02,0xba,0xc9,0xd0,0x4d,0x86,0x5e,0x32,0xa6,0x9a,0x29,0xf0,0x59,0x0a,0x34, +0x52,0xd8,0xf6,0x61,0x47,0x1a,0x6b,0x07,0xda,0x4f,0xc1,0xe2,0x2e,0x05,0x1a,0x78, +0x9e,0x9f,0x4b,0x65,0xfd,0x06,0x1b,0x52,0xd1,0xdf,0x54,0xf4,0x37,0x15,0xb6,0xa5, +0x42,0x2b,0xb5,0x10,0x77,0xb9,0x25,0xb8,0xfb,0xe4,0x20,0x5d,0x0a,0x4a,0x01,0xae, +0x98,0x35,0x15,0x48,0x71,0xe7,0xc3,0x6a,0xa9,0x6b,0x0b,0xee,0x56,0xb9,0x7b,0x48, +0x85,0x93,0xa3,0x66,0xe3,0x44,0x2e,0x4e,0xe2,0xe2,0x14,0x2e,0x4e,0xe5,0xe2,0x34, +0x2e,0x5e,0xc2,0xc5,0x19,0x5c,0xbc,0x8c,0x8b,0x33,0xb9,0x38,0x8b,0x8b,0x57,0x70, +0xf1,0x4a,0x2e,0x5e,0x85,0xf8,0xe2,0x1e,0xb6,0xcd,0x4b,0x89,0x1b,0xd8,0x38,0x63, +0x0b,0x1b,0xe7,0xd5,0xb3,0x71,0x71,0x3a,0x1b,0xef,0x59,0x83,0xf8,0xe3,0xc4,0x5d, +0x6c,0xbc,0x36,0x99,0x8d,0xf3,0xd9,0x16,0x3e,0xde,0xb3,0x9d,0x8d,0x6b,0xf6,0x22, +0xfe,0x24,0x89,0x6d,0xe1,0x93,0x65,0xac,0xd6,0x27,0x6b,0xd9,0x76,0x3e,0x2e,0x62, +0x5b,0xf8,0x78,0xc3,0x96,0x8f,0x37,0x25,0x9b,0x32,0x9f,0xe4,0xb0,0x19,0xdc,0xda, +0xd9,0xb8,0x76,0x19,0x97,0x67,0xed,0x44,0xb7,0xb9,0x3d,0xac,0x4a,0x57,0x4a,0x29, +0xb7,0x3f,0x89,0xcb,0x97,0xb0,0xf9,0x9a,0x3c,0x36,0xbf,0x7c,0x31,0x62,0xdc,0xf2, +0x10,0xe3,0x46,0xc6,0xe6,0xf7,0xec,0xe5,0xf6,0xb0,0x36,0xe0,0xb2,0x64,0xcb,0xe4, +0x16,0xb0,0x7b,0xd6,0x6f,0x65,0xe3,0x4d,0x3b,0xb9,0xa3,0x6c,0xfb,0x3d,0x5b,0x1a, +0xd9,0xa3,0x2b,0x96,0xb3,0xf9,0x25,0x35,0x88,0x7b,0x2b,0x0a,0xd9,0xfc,0x56,0xae, +0xe5,0xa5,0x6c,0x3b,0x1f,0xd5,0x15,0xb1,0xf9,0x95,0xac,0xcd,0x5d,0xa5,0xdb,0xd8, +0xa3,0x39,0xec,0x9e,0x8f,0xea,0x59,0xdd,0xde,0xca,0x34,0xce,0x86,0x35,0x5c,0x2d, +0xce,0xc2,0x7a,0x56,0x11,0xb7,0x26,0x2e,0xae,0x54,0x53,0xd7,0x5a,0x3c,0x0d,0x6a, +0xea,0xa9,0x67,0x77,0x16,0xcd,0x7d,0xfe,0x19,0xd2,0x04,0x91,0x46,0x43,0x1a,0xcc, +0x17,0x83,0x49,0x83,0x99,0x62,0x28,0x69,0x74,0xa4,0x09,0x23,0x4d,0x38,0x69,0x03, +0x49,0x1b,0x44,0x5a,0x0d,0x69,0xb5,0xa4,0x0d,0x26,0x6d,0x08,0xc1,0xff,0x04,0xef, +0x13,0x7c,0x4f,0xf0,0x3c,0xc1,0xef,0x04,0xaf,0x13,0x7c,0x4e,0xf0,0x38,0xc1,0xdf, +0x04,0x6f,0x13,0x7c,0x4d,0xf0,0x34,0xc1,0xcf,0x04,0x2f,0x63,0x5f,0xf5,0xc5,0xca, +0x4d,0x04,0x57,0x7f,0x9c,0x87,0xad,0xec,0x3d,0x78,0x30,0xae,0xc1,0x03,0x91,0x1d, +0x3e,0x49,0x78,0x68,0xe6,0x11,0xfc,0x80,0x87,0x04,0x6e,0xe8,0x5b,0xf0,0xe0,0x59, +0xb1,0x1c,0x37,0xfa,0x1a,0xdc,0xf8,0x0a,0x09,0x7d,0xc7,0xc3,0x11,0x37,0xe6,0x62, +0xf6,0x06,0x8f,0x1b,0xda,0x62,0x0c,0xaf,0xe4,0x9d,0xb8,0x2d,0xe0,0xc1,0x52,0x89, +0x1b,0xd2,0x26,0x3c,0x6c,0xb1,0x1a,0xeb,0x4a,0xdd,0x88,0x07,0x0b,0x1e,0x8c,0x55, +0xdb,0xf0,0x80,0xc4,0x83,0x6a,0x59,0x1d,0x1e,0x80,0x78,0x48,0x96,0xe2,0xe1,0x90, +0x53,0x84,0x32,0xb8,0x71,0x63,0x02,0x00,0xdf,0x60,0x88,0xe6,0x92,0x36,0x94,0xb4, +0x3a,0xd2,0x62,0xda,0x1b,0x4e,0xc1,0x98,0x9d,0x07,0x51,0xb0,0x86,0x82,0xb5,0x14, +0x1c,0x4c,0xc1,0x98,0x23,0x87,0x52,0xb0,0x8e,0x82,0xc3,0x28,0x38,0x9c,0x42,0x30, +0x59,0x65,0x1f,0x61,0x1a,0x36,0xd2,0xb2,0x51,0x30,0x1b,0x85,0xb0,0x51,0x28,0x1b, +0xe9,0xd8,0x28,0x8c,0x8d,0xc2,0xd9,0x28,0x28,0x90,0x8b,0xb9,0x3a,0x41,0x5c,0xa5, +0x67,0xa7,0xd2,0x33,0xf3,0xc0,0x02,0x9a,0xf9,0xfc,0x64,0xdc,0xbb,0x36,0x83,0x2d, +0x60,0x1b,0xd8,0x0e,0x76,0x82,0x12,0x50,0x0a,0xca,0x40,0x39,0x7b,0x7f,0x03,0xfb, +0x40,0x15,0xa8,0x01,0x75,0xa0,0x01,0x34,0xd1,0x85,0xa4,0xc5,0x20,0x19,0xa4,0x12, +0x7b,0x13,0xbc,0x90,0x84,0xfb,0x61,0x52,0x06,0x58,0x06,0x96,0x83,0x4c,0x90,0x05, +0x56,0x81,0xb5,0x60,0x03,0xc8,0x01,0xf9,0xa0,0x00,0x6c,0x02,0x85,0x00,0x76,0x24, +0xc1,0x8e,0x24,0xd8,0x91,0x04,0x3b,0x92,0x76,0x00,0xd8,0x92,0x04,0x5b,0x92,0x76, +0x01,0xd8,0x93,0x04,0x7b,0x92,0xf6,0x00,0xd8,0x94,0x84,0x8b,0xbc,0x6e,0x4b,0xd7, +0xaa,0x65,0x6c,0x17,0x2e,0x24,0xad,0xbc,0x90,0x54,0xcf,0xe9,0xb3,0x1b,0x25,0x50, +0xba,0x90,0x58,0x68,0xda,0xc0,0xbd,0x39,0xdb,0xd4,0xcb,0xcd,0x5c,0x19,0xb6,0x6f, +0x5b,0x60,0x22,0x7b,0x24,0x71,0x8f,0x69,0xa3,0x92,0xeb,0x46,0xe2,0xb6,0x0b,0x89, +0x3b,0xb0,0xc1,0x3a,0x02,0xfd,0x44,0xf7,0xb9,0x0a,0x4b,0xb8,0x6d,0xe4,0x12,0xd1, +0x6e,0x3d,0xeb,0x21,0xae,0x6a,0x8d,0x29,0x57,0xcf,0xf5,0x00,0x87,0xd8,0x76,0x38, +0xdf,0xc1,0xf4,0x0b,0x49,0x49,0x26,0x63,0xb0,0x51,0x8a,0xdd,0xa6,0x7a,0xbb,0xb8, +0x8d,0x4a,0x53,0xae,0x92,0xf3,0x40,0xe2,0x6e,0x6c,0x70,0x09,0x6b,0x10,0x5b,0x08, +0x25,0xb6,0x5e,0xaf,0xb1,0x9b,0xeb,0x0b,0x73,0xfd,0x48,0xa9,0x39,0x81,0xe1,0x9c, +0xca,0xa6,0x81,0xed,0xa4,0x42,0x53,0xff,0x4d,0xdd,0x33,0xed,0x2a,0xbb,0x6e,0xc5, +0x8d,0xc2,0xe6,0x1c,0x57,0x92,0x35,0xa4,0x8c,0x15,0x48,0xac,0xe7,0x8c,0x2f,0x35, +0x6d,0x97,0x72,0x2d,0x2d,0x67,0xcf,0x3c,0xd7,0xe9,0x1a,0xd3,0xf3,0xad,0x84,0x3b, +0xb3,0x6c,0x0e,0x47,0xf3,0xd8,0xf1,0xc0,0x56,0xe2,0x1a,0xe0,0x36,0x38,0x1f,0x5e, +0x77,0x47,0x15,0xd7,0x05,0xb3,0x83,0xeb,0xae,0x3b,0xd8,0x94,0x63,0x47,0x09,0x33, +0xd0,0x76,0x52,0x1a,0x37,0xac,0x92,0x96,0x98,0xce,0xb4,0xc9,0xae,0xa4,0xa5,0xa6, +0x71,0x93,0x39,0xd0,0x85,0xa4,0x2c,0xce,0x44,0x76,0x9c,0x71,0x67,0xfa,0xa6,0x96, +0x4c,0x67,0x9e,0x3d,0xb2,0x82,0xcb,0xed,0x32,0x35,0xb4,0x86,0x3d,0xdf,0x38,0x89, +0x66,0x9f,0xb0,0xdb,0x65,0xd7,0x73,0xac,0xc4,0x6a,0xd3,0x16,0x3b,0x50,0x06,0xce, +0xd8,0x12,0xd3,0x76,0xd1,0xc0,0x58,0x4a,0x5a,0xc7,0xee,0x46,0x67,0x12,0x8b,0x07, +0x0a,0x27,0x99,0x06,0x48,0xd2,0x06,0xb6,0xb9,0xc4,0xa6,0x81,0x11,0xc5,0x0e,0xb1, +0x06,0x2e,0x61,0xcf,0xe3,0x2a,0xae,0x00,0xeb,0xb2,0x64,0xd3,0x3e,0xd3,0x70,0x61, +0x73,0x30,0xbd,0x1a,0xb9,0x8d,0x5c,0x8e,0xbd,0x7c,0xf2,0x06,0x06,0x20,0xab,0x97, +0xcb,0x55,0x62,0x73,0x39,0x26,0x99,0x3c,0xee,0xd0,0x12,0xd3,0x0e,0xb3,0x94,0x29, +0xc7,0x1e,0xcd,0x1f,0x38,0x05,0xa5,0x03,0x1b,0x5c,0x81,0x7c,0xae,0x33,0x59,0xa6, +0x5c,0x09,0x77,0x15,0xb3,0xb9,0x4a,0xee,0xb4,0x14,0x9b,0xaa,0x16,0x0c,0x9c,0x6b, +0xd3,0x06,0x77,0xa5,0x15,0x70,0x27,0x6d,0xc5,0x75,0xa1,0x42,0x6e,0x6c,0x72,0xc9, +0xf5,0x13,0x73,0xf3,0x38,0x4b,0xda,0x32,0x70,0x7d,0x98,0x73,0xec,0xbe,0x6d,0xa6, +0x8b,0x8e,0xb8,0xb6,0x92,0xae,0x17,0xdd,0x69,0xba,0xa0,0x4b,0x58,0xf7,0xb3,0xa3, +0x99,0xcd,0xd5,0x73,0x0e,0xe6,0xae,0x6f,0xd3,0x6d,0xc0,0x74,0x59,0x60,0x4e,0x55, +0x61,0x6a,0x61,0x60,0x04,0x07,0xf6,0xc0,0x7d,0x41,0x6c,0xa4,0x61,0x23,0x2d,0x1b, +0x05,0xb3,0x51,0x08,0x1b,0x85,0xb2,0x91,0x8e,0x8d,0xc2,0xd8,0x28,0x9c,0x2b,0x6c, +0xaa,0xc2,0xd5,0x09,0xe2,0x2a,0x05,0x71,0xb5,0x82,0xb8,0x6a,0x41,0x5c,0xbd,0x20, +0xae,0x62,0x10,0x57,0x33,0x88,0xab,0x1a,0xc4,0xd5,0xd5,0x70,0x75,0x35,0x26,0x3d, +0xae,0xae,0x86,0xab,0xab,0xe1,0xea,0x3e,0x3b,0x77,0x02,0x4d,0x9e,0x40,0x13,0x5e, +0xa0,0x89,0x13,0xe6,0xd1,0x9c,0x05,0x34,0x77,0x12,0x4d,0x9e,0x85,0x1f,0x0d,0xd0, +0xd2,0xb4,0x17,0xf0,0x3c,0xab,0xec,0x4e,0x5f,0x41,0xdd,0x1b,0x4a,0xd9,0xbb,0x13, +0xd6,0x40,0xec,0x93,0xa0,0x7b,0x43,0x66,0x37,0x56,0x82,0x78,0xb0,0x74,0xd5,0x67, +0x7d,0x54,0x9f,0xcd,0x3e,0x59,0xd0,0xd2,0xec,0x09,0x74,0xac,0x7e,0x02,0xcd,0x9a, +0x40,0x33,0xf0,0x33,0x91,0x66,0x4d,0xa4,0xa9,0x13,0x69,0xd2,0x84,0x99,0x34,0x83, +0x8d,0xe6,0x4e,0xa1,0xd9,0x53,0x50,0x82,0x65,0x2a,0xcd,0x9a,0x4a,0x33,0xa6,0xd2, +0xb3,0x2f,0xd3,0x0c,0x30,0x0b,0x4c,0x05,0xcf,0x83,0x63,0xf5,0x33,0x69,0xd6,0x4c, +0x9a,0x8c,0x5a,0x33,0x69,0xca,0x2c,0x9a,0x3d,0x0b,0xbb,0x66,0xd1,0xac,0x59,0x34, +0x69,0x16,0xcd,0x60,0x33,0x1a,0xe4,0x34,0x84,0x9f,0x19,0x6c,0x02,0x3b,0x27,0x01, +0xfc,0xcc,0x60,0x93,0xf3,0xe9,0x6b,0xe7,0x9b,0x62,0x1c,0x87,0x51,0xb3,0xc0,0x54, +0x30,0x6f,0xc2,0x64,0x16,0xee,0xb0,0x39,0xd5,0xd0,0xdc,0xf9,0x34,0x7b,0x3e,0x9a, +0x47,0x8d,0xf9,0x34,0x77,0x01,0xcd,0x5e,0x80,0x8d,0x05,0x34,0x6b,0x01,0xcd,0x80, +0x2f,0x16,0xd2,0xec,0x85,0xd8,0x5e,0x48,0xb3,0x16,0xd2,0x0c,0xfc,0xb4,0x2f,0xa1, +0x59,0x60,0xe2,0x73,0x34,0x69,0x12,0x4d,0x9a,0x4c,0x93,0xd0,0x08,0xfa,0x30,0x19, +0xdd,0x7c,0x89,0x9e,0x9d,0x00,0x6f,0xd2,0xb4,0xd9,0x34,0x63,0x06,0xcd,0x78,0x9e, +0x66,0xce,0xa2,0x99,0xb3,0x69,0xe6,0x9c,0xa9,0x34,0xf3,0x45,0x9a,0x35,0x0d,0x5d, +0x9a,0x03,0x0f,0x3c,0x4b,0x73,0xe7,0xce,0xa2,0xb9,0xf3,0x68,0x3e,0x7e,0x16,0xd0, +0xc2,0x89,0xb4,0x00,0x6d,0xcc,0xa2,0x09,0x5c,0x1c,0xc4,0x2e,0xeb,0x34,0x6c,0xa4, +0x65,0xa3,0x60,0x36,0x0a,0x61,0xa3,0x50,0x36,0xd2,0xb1,0x51,0x18,0x1b,0x85,0xb3, +0x11,0x9e,0x85,0x6c,0xcc,0xd5,0x09,0xe2,0x2a,0x05,0x71,0xb5,0x82,0xb8,0x6a,0x41, +0x5c,0xbd,0x20,0xae,0x62,0x10,0x57,0x33,0x88,0xab,0x1a,0xc4,0xd5,0xd5,0x70,0x75, +0x35,0x26,0x3d,0xae,0xae,0x86,0xab,0xab,0xe1,0xea,0x6a,0xb8,0xba,0x1a,0xae,0xae, +0x86,0xab,0xab,0xe1,0xea,0x6a,0xb8,0xba,0x5a,0xae,0xae,0x96,0xab,0x3b,0x15,0x67, +0xf5,0xe2,0xc6,0xc5,0x20,0x09,0xa4,0x80,0x34,0xb0,0x04,0x2c,0x07,0x59,0x60,0x25, +0x58,0x0d,0xd6,0x82,0xf5,0x60,0x23,0xc8,0x01,0x79,0xa0,0x00,0x14,0x82,0x22,0xb0, +0x15,0x14,0x83,0x1d,0xa0,0x04,0x94,0xd2,0xc5,0x6c,0xb4,0x9b,0x8d,0x76,0xb3,0xd1, +0x6e,0x36,0xda,0xcd,0x46,0xbb,0xd9,0x19,0x00,0x6d,0x67,0xa3,0xed,0x6c,0xb4,0x9d, +0x8d,0xb6,0xb3,0xd1,0x76,0x36,0xda,0xce,0x46,0xdb,0xd9,0x68,0x3b,0x17,0xed,0xe5, +0xa2,0xbd,0x5c,0xb4,0x97,0x8b,0xf6,0x72,0xd1,0x5e,0x2e,0xda,0xcb,0x2d,0x03,0x95, +0x60,0x1f,0xa8,0x02,0x35,0xa0,0x0e,0x34,0x80,0x26,0xba,0x98,0x07,0xbd,0x3c,0xe8, +0xe5,0x41,0x2f,0x0f,0x7a,0x79,0xd0,0xcb,0x83,0x5e,0x1e,0xf4,0xf2,0xa0,0x87,0xa5, +0xdd,0xc5,0x3c,0xe8,0xe5,0x41,0x2f,0x0f,0x7a,0x79,0xd0,0xcb,0x83,0x5e,0x1e,0xfa, +0x92,0x87,0xbe,0xe4,0xa1,0x2f,0x79,0xd0,0xce,0x83,0x76,0x1e,0xb4,0xb1,0xfc,0xbb, +0x98,0x07,0xed,0x3c,0x68,0xe7,0x41,0x3b,0xaf,0x16,0xd4,0xd3,0xb9,0x7d,0xd0,0xcd, +0x83,0x5e,0x3e,0xf4,0xf2,0xa1,0x97,0x0f,0xbd,0x7c,0xe8,0xe5,0x2f,0x03,0xd0,0xc8, +0x87,0x46,0x3e,0xda,0xcf,0x47,0xfb,0xf9,0x68,0x3f,0x1f,0xed,0xe7,0xa3,0xfd,0x7c, +0xb4,0x9f,0x8f,0xf6,0xf3,0xd1,0x7e,0x3e,0xda,0xcf,0xdf,0x41,0x6d,0xbb,0xe8,0x48, +0x3e,0x1d,0x41,0xe5,0x52,0xb6,0x12,0x3a,0x96,0x8f,0x8e,0xe5,0x43,0x20,0x1f,0x1d, +0xcb,0x47,0xc7,0xf2,0x21,0x54,0x00,0xa1,0x02,0x56,0x08,0x2b,0x8d,0xfd,0x99,0xc8, +0xa7,0x83,0xa5,0xd4,0xb6,0x05,0x09,0xfa,0x56,0x80,0xbe,0x15,0x40,0xb7,0x00,0x4d, +0x14,0xa0,0x6f,0x05,0xd0,0x2e,0x80,0x36,0x96,0xf2,0x87,0x20,0x5f,0xb0,0x9f,0x2e, +0xee,0x42,0xab,0xa5,0xab,0xe8,0x08,0x96,0x6c,0x99,0x58,0x12,0x65,0x62,0x89,0x96, +0x89,0x65,0x51,0x26,0x96,0x45,0x99,0x58,0xa2,0x65,0x62,0x89,0x96,0x89,0x25,0x5a, +0x26,0x96,0x48,0x99,0x58,0xa2,0x65,0x62,0x99,0x94,0x89,0x25,0x5a,0x26,0x96,0x4a, +0x99,0x58,0x2a,0x65,0x62,0xa9,0x94,0x89,0xa5,0x52,0x26,0x96,0x4a,0x99,0x58,0xa2, +0x65,0x62,0x69,0x94,0x89,0xa5,0x51,0x26,0x96,0x68,0x99,0x58,0xa2,0x65,0x62,0x89, +0x96,0x89,0xe5,0x53,0x66,0x15,0xa8,0x06,0x35,0xa0,0x16,0xd4,0x01,0x78,0x2c,0xb3, +0x01,0x34,0x82,0x26,0x3a,0x97,0x85,0x25,0x56,0x16,0x96,0xa5,0x59,0x58,0x92,0x66, +0x61,0x29,0x9a,0x85,0x25,0x55,0x16,0x96,0x54,0x59,0x58,0x6e,0x66,0x61,0xe9,0x95, +0x85,0xa5,0x55,0x16,0x96,0x9a,0x59,0x58,0x6a,0x66,0x61,0xa9,0x99,0x85,0xa5,0x58, +0x16,0xec,0xce,0xc2,0x72,0x2f,0x0b,0x4b,0xcd,0x2c,0x2c,0x35,0xb3,0xb0,0xf4,0xca, +0xc2,0xd2,0x2b,0x0b,0xcb,0xbf,0x2c,0x38,0x25,0x0b,0x4b,0xc3,0xac,0x75,0x00,0x4b, +0xb5,0x2c,0x2c,0xd5,0xb2,0xb0,0x54,0xcb,0xc2,0x12,0x36,0x2b,0x07,0xb0,0xdf,0xed, +0x61,0x39,0x98,0x85,0x25,0x5a,0x16,0x96,0x86,0x59,0xe8,0x7f,0x16,0xfa,0x9f,0x85, +0xfe,0x67,0xa1,0xff,0x59,0xe8,0x7f,0x16,0xfa,0x9f,0x85,0xfe,0x67,0xa1,0xff,0x59, +0xe8,0x7f,0x16,0xfa,0x9f,0x85,0xfe,0x67,0xa1,0xff,0x59,0xe8,0x7f,0x16,0xfa,0x9f, +0x85,0xfe,0x67,0x95,0x51,0x6f,0x79,0x3a,0x75,0xe7,0xec,0xc5,0x7c,0x19,0x29,0x16, +0xee,0x1f,0x55,0x57,0x60,0x4e,0xbd,0x95,0xba,0xb6,0x62,0x9e,0xbd,0x0e,0x73,0xe8, +0xad,0xd8,0x9f,0xc6,0xbe,0x58,0xd9,0x41,0x3d,0x8d,0x29,0xd4,0xbb,0xa1,0x89,0x7a, +0xf3,0x6b,0xa9,0xb7,0xa8,0x9a,0xfa,0x12,0xb3,0xa8,0x7b,0x7b,0x22,0x75,0xef,0xcd, +0xa1,0x9e,0xa4,0x8d,0xd4,0x03,0x9b,0x7a,0x57,0x60,0xd1,0x8f,0xe5,0x70,0x5f,0x71, +0x39,0xe6,0xfd,0x89,0x98,0x83,0xef,0xa3,0xee,0x5d,0xc9,0xd4,0xc3,0xbe,0x20,0xd9, +0x50,0x4a,0x7d,0xd5,0xf9,0xd4,0xb5,0x0f,0xf7,0xef,0xa6,0x12,0xea,0x5d,0xbf,0x9c, +0x7a,0xb7,0x6e,0xa1,0xee,0x0c,0xf6,0xa5,0xca,0x06,0xea,0xdd,0x54,0x40,0x5d,0x75, +0x4b,0xb1,0x36,0x58,0x4f,0xdd,0xfb,0x76,0x52,0x4f,0x46,0x3d,0xf5,0x61,0xa6,0xf2, +0x51,0x63,0x2a,0xe6,0xfc,0x55,0xd4,0x95,0x91,0x4f,0xdd,0xab,0x93,0xa9,0xbb,0x64, +0x35,0xda,0x5b,0x81,0xb9,0x7e,0x31,0xda,0x4c,0xa5,0xde,0x8d,0xb9,0xd4,0x5b,0x55, +0x46,0x7d,0xb9,0x15,0xd4,0x57,0x8a,0xb4,0xaa,0x96,0x7a,0x36,0x2f,0xc3,0x7a,0xa2, +0x89,0x7a,0xf6,0x6f,0xa2,0x5e,0xf8,0xbf,0x6f,0x59,0x32,0xf5,0x96,0xac,0xa3,0xae, +0x22,0x68,0xd4,0xc3,0x9e,0x72,0xec,0x5f,0xdc,0x88,0xb5,0xc7,0x66,0xea,0x29,0x5a, +0x8a,0xfe,0x27,0x52,0x5f,0x0e,0x34,0x8a,0x36,0x50,0x57,0xf9,0x66,0xf4,0x6b,0x35, +0x75,0x57,0x65,0x53,0x77,0x7d,0x16,0xf5,0xec,0x2d,0xa3,0x9e,0x6a,0xac,0x47,0x36, +0x66,0xc0,0x86,0x55,0xd4,0x9b,0x88,0x34,0x2d,0x17,0x40,0x63,0x7b,0x2e,0x34,0x1a, +0xa1,0x51,0x8e,0xe3,0xfb,0xa8,0x77,0x37,0x83,0xfe,0x64,0x41,0xab,0x11,0xbe,0xac, +0xa1,0xae,0xb2,0x62,0xea,0x66,0x56,0x51,0x4f,0x66,0x1a,0xf5,0xac,0xdd,0x83,0xb5, +0xca,0x7a,0xe8,0xd5,0xa1,0x4f,0x4d,0xd4,0xd5,0xb8,0x03,0x65,0x96,0x63,0x6d,0xb3, +0x8c,0xba,0xd7,0x56,0x43,0x67,0x33,0x7c,0x9f,0x44,0x5d,0x85,0xf9,0xd4,0x93,0x8b, +0x35,0xcc,0x4a,0xf8,0x65,0x27,0xd6,0x4a,0xbb,0x6b,0xa9,0xbb,0x02,0xe7,0x21,0x03, +0x3a,0x19,0x5b,0xa9,0x1b,0x63,0xbe,0x67,0xed,0x56,0xf8,0x77,0x37,0xd6,0x55,0x58, +0x23,0xa5,0x2d,0xa1,0xee,0xcd,0x8b,0xa9,0xa7,0x12,0xfe,0x58,0x82,0x73,0x5a,0xb2, +0x8a,0xfa,0xd2,0xb0,0xf4,0xcb,0xd8,0x47,0x5d,0x2b,0x71,0x0e,0xea,0x76,0x51,0xf7, +0xfa,0x14,0xf8,0x1c,0xfd,0xdd,0x82,0x73,0xb3,0x0e,0xe7,0x61,0x07,0xd2,0xda,0xf5, +0xd4,0x57,0x97,0x89,0xf3,0x9f,0x8a,0xf5,0x54,0x15,0xf5,0x36,0x40,0x1f,0xab,0xb9, +0xee,0x54,0x9c,0x9f,0x74,0xf4,0x63,0x15,0xdb,0xff,0x22,0xea,0x49,0xc1,0x5a,0x6d, +0x15,0x28,0x5e,0x4a,0x3d,0x55,0x18,0x2b,0x8b,0xa1,0x51,0xbf,0x8d,0x7a,0x57,0xef, +0xa6,0x3e,0xa6,0x88,0xfa,0x96,0x2f,0xa5,0xae,0x74,0xac,0xbf,0x96,0x62,0x4d,0xb6, +0xaa,0x01,0x63,0x21,0x1d,0xe3,0x83,0xd5,0x5d,0x42,0x5d,0x4d,0x38,0xff,0xcb,0xf1, +0x68,0xde,0xbd,0x9b,0x7a,0xf6,0x40,0x1f,0xe3,0x01,0x2b,0x0b,0xea,0xca,0x81,0x6f, +0xf6,0xa3,0x5f,0x0c,0xfc,0x87,0x6b,0xaf,0x67,0x25,0x3b,0xbe,0xb2,0xd1,0x76,0x2a, +0xf5,0xa5,0xef,0xc5,0xb9,0xd8,0x4f,0x7d,0x79,0xe9,0x58,0xf3,0x6d,0x80,0xaf,0x32, +0xa8,0x67,0x1b,0xb4,0x52,0xb1,0x3f,0xbb,0x9a,0xba,0xb1,0xa2,0xf9,0xa8,0x16,0x63, +0x22,0x29,0x1b,0xfe,0x85,0x0f,0xf6,0x34,0x51,0xf7,0x3a,0x8c,0xbf,0xb4,0x4c,0x8c, +0xd3,0x44,0xd8,0x85,0x71,0xb3,0xb8,0x9e,0xba,0xb3,0x51,0x7f,0x03,0x8e,0x2f,0x85, +0x7f,0xf2,0x60,0x43,0x41,0x25,0xc6,0xd5,0x62,0xea,0xae,0x85,0xe6,0x0a,0xf4,0x67, +0x2d,0xea,0x14,0x96,0xc0,0xef,0x2b,0xa8,0x0f,0x3e,0xef,0x4e,0x87,0xc6,0xc6,0x6a, +0xea,0x62,0x4a,0xa8,0x6b,0x2f,0xd6,0x98,0x55,0x3b,0xd1,0x4f,0xac,0x3f,0xa1,0xdf, +0x9d,0x82,0x71,0xb7,0x09,0xfe,0xca,0x86,0x6e,0x3a,0x7c,0xbe,0x02,0xfe,0x2d,0xc7, +0xb9,0xd8,0x80,0x71,0x92,0x07,0x1f,0x6e,0xde,0x8e,0xf3,0xb8,0x15,0xed,0xa6,0x52, +0xcf,0x7a,0x8c,0xa9,0x06,0xac,0x69,0x8b,0x30,0x0e,0x8a,0x0a,0xd1,0x17,0xf8,0x75, +0x19,0x6c,0x64,0x5f,0x10,0xaf,0xc8,0x83,0x9d,0x18,0xbb,0xab,0x30,0xde,0xd7,0xd7, +0xfe,0x3f,0xf6,0xde,0x06,0xa8,0xa9,0x6b,0xed,0xfb,0x5e,0x51,0x50,0xa2,0x50,0x82, +0x82,0x82,0x82,0x05,0x25,0x0a,0x96,0x40,0x52,0x93,0x96,0x20,0xb4,0xa0,0xa0,0x04, +0x12,0xbe,0xa3,0x44,0x41,0xa1,0x05,0x4c,0x20,0x91,0x04,0x12,0x20,0x90,0x40,0x02, +0x49,0x48,0x42,0x62,0x49,0x05,0x0a,0x2d,0xb4,0xa0,0xa0,0x60,0xc1,0x8a,0x10,0x05, +0x0b,0x56,0xee,0x91,0xe7,0x96,0x3e,0x32,0x23,0x33,0x72,0x17,0x5a,0x79,0x47,0x4e, +0x09,0xc2,0x3d,0xf2,0x0e,0xcc,0xc8,0x8c,0xcc,0xc8,0xcc,0xbb,0x56,0xd8,0xf6,0xf5, +0x9c,0xe7,0x9c,0xfb,0x7c,0xf5,0x9c,0xe7,0x7c,0x90,0x5f,0xd7,0x7f,0xed,0xf5,0xb1, +0xf7,0x5e,0xeb,0xba,0xae,0xb5,0xf6,0x8e,0x61,0xa6,0xf0,0x7a,0xd0,0x7e,0xdd,0xf0, +0xba,0x77,0xbe,0x02,0xb3,0x70,0x97,0x9d,0xbd,0x5d,0x05,0xd7,0x42,0x3b,0x78,0xd6, +0x09,0x7d,0x7c,0x13,0xc6,0x4d,0x95,0x02,0x3c,0x2b,0x6f,0x00,0x73,0x5d,0xd0,0x0e, +0xdf,0x2a,0xc0,0x9c,0xe1,0x16,0xbc,0x3f,0xbc,0x8e,0x16,0xae,0xcd,0x3b,0x57,0x60, +0x4c,0xc0,0xb5,0xd0,0x03,0xe3,0xfa,0x3a,0xf4,0x6f,0x2f,0x9c,0xc3,0xe7,0xd0,0x3f, +0xe8,0x1f,0xda,0xe0,0x13,0xcf,0xf2,0xed,0x45,0x18,0x1f,0x0a,0x60,0xf9,0x0c,0xa6, +0x16,0xe8,0xcb,0x86,0x5e,0x18,0x2b,0x30,0xb6,0x0c,0x70,0x6d,0x7d,0x01,0x7d,0xd9, +0x3a,0x00,0xd7,0x08,0x2c,0xb7,0xc1,0x71,0x5f,0xf9,0x04,0xda,0xbb,0x0e,0xde,0x13, +0xc6,0x58,0x3d,0x8c,0xf1,0xaf,0xe1,0xfa,0x56,0xc0,0x54,0x01,0xd7,0xf3,0x65,0xb8, +0xa6,0x2e,0x43,0x9b,0xb6,0xc2,0xef,0xe0,0xb7,0xa0,0x0f,0xe0,0x77,0xab,0xf9,0xcf, +0x6f,0x43,0xbf,0x40,0xdb,0x56,0x5c,0x85,0xf7,0x80,0xf7,0x82,0x6b,0xd8,0x52,0x05, +0xfd,0x6a,0x44,0xfb,0x06,0xfc,0x1e,0x0f,0xd7,0xa5,0xa5,0xa1,0x1d,0xde,0x17,0xde, +0x1b,0xda,0xc6,0xd2,0x0d,0xd7,0x79,0x79,0x0d,0xb4,0x23,0xb4,0x93,0x06,0xda,0xab, +0xf2,0x26,0x8c,0x79,0xb8,0x7f,0x40,0x5b,0xcd,0xc2,0x27,0xe7,0xec,0x25,0x38,0x7e, +0xf3,0x6d,0x30,0xdb,0x87,0x62,0x0e,0xda,0x4f,0x0d,0xe3,0x45,0x0b,0x7d,0x53,0x0d, +0x8f,0x2f,0x99,0xe0,0x18,0xa1,0xbf,0xe0,0x5e,0xf4,0xac,0x0d,0xda,0xae,0x0d,0x8e, +0xf3,0x8a,0x11,0x26,0xe8,0xef,0x0e,0x68,0x9f,0x6b,0x30,0xf6,0xbf,0x81,0x79,0x1f, +0xec,0xd3,0x0f,0x8f,0x07,0x6f,0x82,0x39,0x05,0xdc,0xab,0x2a,0xbb,0xe0,0x7a,0x80, +0x7e,0x30,0x7d,0x06,0xe6,0x5a,0xab,0xc1,0xdc,0x95,0x3a,0x30,0xd7,0x09,0xd7,0x55, +0x27,0xac,0xeb,0xb9,0x08,0xe6,0x7a,0x61,0x9c,0xde,0x85,0x71,0xf6,0x05,0xf4,0xc1, +0x57,0xdf,0xc1,0x58,0x83,0x31,0xa2,0x34,0x83,0xc5,0xd6,0xaa,0xeb,0x60,0x4e,0x0b, +0x0d,0xde,0x77,0x05,0x6e,0x3c,0x70,0x11,0xc1,0x41,0xcf,0xdc,0x85,0x13,0x51,0xab, +0x61,0x19,0xe6,0x55,0xd0,0xf8,0x55,0xd0,0x09,0xb5,0xb5,0x70,0xb2,0x0d,0xd0,0xc0, +0xd0,0xc1,0x97,0x7a,0xe0,0x66,0xa9,0x82,0xa9,0x06,0x58,0x3a,0x60,0xb9,0x13,0x4e, +0xfa,0xdb,0x4f,0x61,0x82,0xed,0x83,0x30,0x60,0xee,0x76,0xc1,0xc0,0xad,0x87,0x06, +0x80,0x93,0x57,0xc1,0xc5,0xac,0x6e,0x86,0x01,0x07,0x17,0x1b,0x7c,0x60,0xcc,0x56, +0x37,0x82,0x59,0xd3,0xa7,0xd0,0x20,0x75,0x70,0xf3,0xfb,0x02,0x06,0x14,0xcc,0xbf, +0x85,0xf9,0xb7,0x30,0xf0,0x15,0xd0,0x41,0xf0,0xf1,0xfa,0x4c,0x6b,0x06,0xcf,0xf4, +0x70,0x23,0x32,0x75,0x83,0x67,0x35,0x30,0xc8,0x6a,0xbe,0x05,0xcf,0xea,0x61,0x30, +0xd5,0x7f,0x05,0x9d,0x09,0x37,0x60,0xb8,0x89,0x3f,0x6b,0x82,0x4e,0x6d,0x82,0x86, +0xb8,0x0c,0x37,0xa6,0x6b,0xb0,0x5f,0x37,0xec,0x63,0x86,0x6d,0x03,0xd0,0xa9,0x46, +0xe8,0x54,0xb4,0xe1,0x37,0xc1,0xc9,0xb7,0x41,0x23,0x5c,0x81,0x1b,0xe7,0x35,0xb8, +0x99,0x7f,0x0d,0x03,0xee,0x6b,0x68,0xa8,0xeb,0x70,0x13,0x1c,0x80,0x0e,0x57,0xc2, +0x4d,0x54,0xd3,0x00,0xe6,0x75,0xd0,0x30,0x0d,0xd0,0xe9,0xf0,0xb1,0x3b,0xdf,0x5c, +0x05,0xe6,0x3b,0x3f,0x05,0x8b,0x97,0x5a,0xf4,0x48,0x54,0x60,0xf1,0x32,0x7c,0x46, +0xfd,0x7c,0xbd,0x09,0xcc,0x28,0xa0,0x99,0x14,0xfd,0x60,0xb1,0x4d,0xa7,0x83,0xd2, +0x53,0x0d,0x16,0xaf,0xc2,0xb0,0x9b,0x1f,0xac,0x00,0xf3,0x77,0x2f,0x80,0xac,0x2c, +0x90,0xc5,0x03,0x59,0xf0,0xbd,0x19,0x65,0x30,0xcf,0x17,0x83,0xf1,0x5e,0xf4,0xc7, +0x4b,0xbd,0xe8,0x8f,0x9e,0x7a,0xd1,0xdf,0x39,0xdd,0x5d,0x2b,0x76,0x81,0x1f,0x1a, +0xfe,0xab,0x17,0xfc,0x70,0xf3,0xbf,0x6e,0x83,0x1f,0x2e,0x81,0x1f,0x6a,0xc0,0x0f, +0x5f,0x80,0x1f,0x1a,0xc1,0x0f,0x4d,0xe0,0x87,0x76,0xf0,0xc3,0x35,0xf0,0x43,0xc7, +0x0f,0x4a,0x24,0xe5,0x50,0xfe,0x6b,0xc0,0x7a,0x0c,0x33,0x58,0xaa,0x46,0x67,0x54, +0xff,0x57,0x1f,0x92,0x01,0xf0,0x83,0x09,0xc9,0xa7,0x48,0x2e,0x22,0xa9,0x41,0x52, +0x8b,0xa4,0x0e,0x49,0x3d,0x92,0x06,0x24,0x9f,0x23,0xf9,0x02,0x49,0x23,0x92,0x2f, +0x91,0x34,0x23,0x69,0x41,0x72,0x19,0x49,0x2b,0x92,0x2b,0x48,0xae,0x22,0x69,0x47, +0xd2,0x81,0xe4,0xda,0xda,0x45,0xfb,0xd1,0xdd,0xbe,0x43,0x57,0xf9,0x0e,0x75,0x86, +0x52,0x0d,0x47,0x3c,0xd9,0x0d,0x26,0xbf,0x05,0x93,0x77,0xc1,0x8f,0x0a,0x30,0x79, +0x07,0x4c,0x7e,0x07,0x26,0xfb,0xc1,0x8f,0xad,0xe0,0xc7,0x2b,0xe0,0x47,0x15,0xf8, +0xb1,0x02,0xfc,0xa8,0x01,0x3f,0x56,0x82,0x1f,0x8d,0xe0,0x47,0x03,0xf8,0xf1,0x02, +0xf8,0x51,0x0b,0x7e,0xac,0x07,0x3f,0x9a,0xc0,0x8f,0x1d,0xe0,0xc7,0x6f,0xc0,0x8f, +0x3d,0xe0,0xc7,0x6e,0xf0,0xe3,0x1d,0xf0,0xe3,0xb7,0xe0,0x27,0x05,0xf8,0x49,0x09, +0x7e,0xbc,0x0b,0x7e,0xfa,0x14,0xfc,0x74,0x11,0xfc,0xd8,0x05,0x7e,0xaa,0x04,0x3f, +0x69,0xc0,0x4f,0x5a,0xf0,0x53,0x15,0xf8,0x49,0x0d,0x7e,0xd2,0x81,0x9f,0xaa,0xc1, +0xa4,0x0e,0x4c,0x5c,0x99,0xb8,0x0a,0xe5,0xa7,0x5a,0x28,0x93,0x5a,0x74,0x54,0x89, +0x44,0x83,0xc4,0x5a,0xac,0x46,0x0d,0xb0,0xb7,0x01,0x75,0xed,0x44,0xd2,0x85,0x6a, +0xd4,0x48,0xf4,0x60,0xa2,0x1d,0xd5,0xb5,0xa3,0xba,0xf6,0x89,0xeb,0x50,0x50,0x43, +0x3b,0xba,0x6e,0x3b,0x6a,0xbd,0x86,0x5a,0xaf,0xa1,0xd6,0x6b,0xa8,0xf5,0x1a,0x6a, +0xbd,0x86,0x5a,0xaf,0xa1,0xd6,0xaf,0x51,0xeb,0xd7,0xa8,0xee,0x6b,0x54,0xf7,0x35, +0xaa,0xeb,0x44,0x9d,0x3b,0x51,0x5d,0x17,0x6a,0xed,0x42,0x47,0xd7,0xd1,0xd1,0x75, +0xd4,0x70,0x1d,0x15,0x7b,0x50,0xb1,0x07,0x15,0x7b,0xd0,0x45,0x7b,0x50,0x9d,0x19, +0x15,0xcd,0xe8,0xe8,0x16,0x6a,0xbd,0x85,0x8a,0xb7,0x50,0xeb,0x2d,0x54,0x77,0x1b, +0x15,0x6f,0xa3,0xa3,0x3e,0x24,0xfd,0xa8,0x4b,0x3f,0x3a,0xba,0x83,0x8e,0xee,0xc0, +0xa3,0x49,0x25,0x3c,0x82,0xd2,0x85,0xe4,0x3a,0x14,0x6b,0x1d,0x1c,0x15,0x14,0x3d, +0x98,0x2c,0x47,0x0d,0xe5,0xa8,0xae,0x1c,0xd5,0x95,0xa3,0xba,0x0a,0x68,0x38,0x28, +0x9d,0x48,0xba,0x90,0xc0,0xd3,0x2a,0x26,0x55,0x48,0xd4,0x48,0x74,0x48,0x60,0x3f, +0x15,0xea,0xa2,0x42,0x5d,0x54,0xa8,0x8b,0x0a,0xb5,0xaa,0x50,0xab,0x0a,0xb5,0xaa, +0x51,0xab,0x1a,0xb5,0xaa,0x51,0xab,0x1a,0xb5,0xaa,0x51,0xab,0x1a,0xb5,0x6a,0x50, +0xab,0x06,0xb5,0x6a,0x50,0xab,0x06,0xb5,0x6a,0x50,0xab,0x06,0xb5,0x56,0xa2,0xd6, +0x4a,0x54,0x57,0x89,0xea,0x2a,0x51,0x9d,0x1e,0xd5,0xe9,0xd1,0x19,0x7a,0x74,0x86, +0x1e,0xb5,0xea,0x51,0xab,0x1e,0x59,0xf7,0xc6,0xe4,0x0d,0x30,0xd1,0x0d,0x65,0x52, +0x07,0xc5,0x73,0xd2,0x30,0x69,0x82,0x6a,0xb4,0xea,0x05,0xab,0x7e,0x62,0xd5,0x6a, +0xab,0x9a,0x50,0xef,0x2b,0x13,0xdd,0x48,0x6e,0x22,0x7f,0x6b,0x90,0x97,0xbb,0x91, +0xdc,0x44,0x0e,0xd6,0x20,0xb7,0x76,0x23,0xb9,0x89,0x3c,0xaa,0x41,0x1e,0xed,0x46, +0x72,0x13,0x39,0x53,0x83,0xa6,0x74,0x15,0x8d,0xbc,0x1b,0xc9,0x4d,0x34,0x68,0x0d, +0x1a,0x56,0x37,0x92,0x9b,0x68,0x44,0x28,0xca,0x90,0x93,0xae,0x4c,0x56,0xa2,0xeb, +0x55,0xa2,0xab,0x54,0x22,0x67,0x5a,0xed,0x54,0x89,0xce,0xa8,0x44,0xf3,0xba,0x81, +0x3a,0x57,0xa2,0x8b,0x56,0x22,0x7f,0x43,0xe9,0x45,0xde,0xeb,0x45,0xad,0x0a,0xeb, +0xc0,0x61,0xf6,0xc9,0x5a,0x86,0x86,0x0e,0x7d,0xad,0x43,0xa2,0x47,0x6e,0xd6,0x21, +0xd1,0x23,0x37,0xeb,0x90,0xe8,0xd1,0x15,0x74,0x48,0xf4,0xe8,0x0a,0x3a,0x24,0x7a, +0x14,0x68,0x3a,0x24,0x28,0x02,0xd1,0x51,0x27,0x3a,0xba,0x8e,0x8e,0xae,0xa3,0x23, +0x33,0x3a,0x32,0xa3,0xa3,0x5b,0xe8,0xe8,0x96,0xf5,0x5c,0x14,0x3b,0xbd,0x28,0xb2, +0x7a,0xd1,0x1c,0x7a,0xd1,0xd4,0x7b,0x90,0x98,0x91,0xdc,0x42,0x72,0x75,0xb2,0xca, +0xba,0x06,0xac,0x61,0xbf,0x16,0xd0,0xd7,0xd6,0x42,0xfa,0xda,0x5a,0x28,0x5f,0xb3, +0xfa,0xdf,0x9a,0x75,0xad,0x65,0xd7,0xad,0xd1,0x8f,0x4a,0x5d,0xd6,0x10,0xb0,0x66, +0x3a,0x6b,0xbc,0xaf,0x85,0x7d,0xe7,0x5a,0xe0,0x77,0xae,0xcd,0xc1,0xda,0xb3,0x67, +0xed,0x2a,0x3d,0xd6,0xe8,0x41,0x4b,0x01,0x5b,0x0c,0x56,0x1b,0xad,0xdd,0xaf,0x77, +0x6d,0x46,0xbd,0x6b,0x77,0xe8,0x5d,0x6b,0xbb,0xb5,0x36,0xeb,0x5b,0x6b,0x63,0xb9, +0xbd,0x76,0xb1,0xdb,0x6b,0x6d,0xb7,0xd7,0xee,0xde,0xbf,0x36,0xf8,0xfe,0xb5,0xca, +0xfe,0xb5,0xb1,0xdc,0x59,0x2b,0xdd,0x59,0xeb,0x72,0x67,0x2d,0x5e,0x95,0xd6,0xab, +0xa0,0x45,0x82,0xad,0x15,0x6b,0x9c,0x5b,0xef,0x6e,0xcd,0xf4,0x6b,0x99,0xce,0xba, +0x20,0xd6,0x96,0xc4,0xf5,0xb5,0xa5,0x80,0x45,0x7f,0x17,0xb6,0x12,0xac,0x2b,0x60, +0xed,0x04,0xb5,0x75,0xb6,0x28,0x5b,0xab,0xbc,0xbe,0xd6,0xe5,0xfa,0x5a,0xa9,0x13, +0x85,0x49,0xe5,0xda,0x0a,0xaa,0x5c,0xbb,0x9f,0x66,0xed,0x74,0xcd,0xda,0x8d,0x34, +0x6b,0xe7,0x69,0xac,0xc6,0x42,0x8b,0xc7,0xba,0xa4,0xd6,0x86,0xab,0x5f,0x9b,0x43, +0xfb,0x9a,0x7f,0xaf,0xad,0x99,0xe7,0xda,0x9a,0x59,0xaf,0xbd,0xae,0xbc,0xbe,0xb6, +0x55,0x59,0xa7,0x79,0x6d,0x6d,0xee,0x9d,0x6b,0xa5,0xce,0x35,0xd3,0x75,0xbe,0x76, +0x8e,0xb5,0xa7,0x79,0x2d,0x80,0x7a,0xd7,0xb2,0x5b,0xaf,0x27,0xdd,0x69,0xcd,0xd6, +0xee,0xae,0x5f,0xab,0xd4,0xaf,0x55,0xea,0xd7,0x2a,0xd5,0x6b,0x59,0xf9,0xeb,0x35, +0xdf,0xb5,0x16,0xb8,0xd6,0x52,0xc5,0x2f,0x1b,0x01,0xb6,0x47,0xbc,0xbe,0xa6,0x7a, +0xad,0x4d,0xbd,0x36,0x16,0xbd,0x75,0xbf,0xc4,0x6c,0x86,0x32,0xe5,0xda,0x38,0xdb, +0xd7,0xda,0x7a,0xd6,0xce,0xd3,0xac,0x4d,0xd3,0x3c,0xa9,0x82,0xcf,0x05,0x78,0x3f, +0x94,0xc1,0x20,0x55,0x59,0x17,0x1b,0x3c,0xa8,0xb0,0x2e,0xef,0x35,0x27,0x4c,0x7c, +0x63,0xed,0xb8,0xb6,0x4f,0x76,0xc3,0xe0,0xd2,0xc2,0xbd,0x0d,0x96,0x54,0xd6,0xa5, +0x38,0xa9,0x85,0x35,0x2a,0x6b,0xb8,0x59,0x37,0xb3,0xb5,0xcc,0xf3,0xf5,0xc5,0x3c, +0x5f,0x77,0xf4,0xfc,0xff,0x3b,0x76,0x4e,0xaa,0x3c,0x91,0x58,0xfb,0xc0,0xdb,0x75, +0xff,0x64,0x40,0x87,0xc0,0x0f,0xfc,0xac,0x50,0x82,0x20,0xe0,0x05,0x3e,0x84,0x47, +0x75,0x30,0x7d,0x06,0x7e,0xa3,0x40,0x7f,0x56,0x75,0x11,0x9c,0x05,0x25,0x40,0x0e, +0x6b,0x6a,0x60,0x82,0x2f,0x0e,0x8a,0x6a,0x98,0x4c,0x30,0xe9,0x61,0xaa,0x82,0xc9, +0x00,0x93,0x11,0xa6,0x0b,0x30,0x7d,0x02,0x4e,0x83,0x54,0xb0,0x0f,0xec,0x07,0x07, +0x01,0x09,0x04,0x83,0x0f,0x40,0x0a,0xf0,0x06,0x44,0x10,0x0a,0x77,0xb2,0x2a,0xb4, +0x33,0x54,0xa1,0x0d,0x0f,0x6d,0x77,0x68,0xb3,0xb3,0x6e,0x1c,0x68,0xbf,0xb3,0x6e, +0x1d,0x68,0xcb,0xb3,0x6e,0x1e,0x68,0xd7,0x43,0x07,0x68,0xfb,0xfb,0x14,0x1d,0x40, +0x03,0xb5,0x80,0x89,0x4b,0x60,0xe2,0x32,0x98,0x68,0x05,0x13,0x6d,0x70,0xb3,0x02, +0xe8,0x89,0xd9,0x0e,0x26,0x3a,0x60,0x50,0xc0,0x3d,0x09,0x58,0x9f,0x53,0x00,0xad, +0x2b,0x68,0x32,0xb4,0xbf,0x02,0xb4,0x01,0xf6,0xc0,0x40,0x80,0x66,0x81,0x71,0x00, +0x17,0x13,0x7c,0xf0,0x40,0xdb,0xc1,0xb5,0x02,0x1d,0x03,0x0d,0x0f,0x5d,0x07,0xd0, +0x93,0x02,0x05,0x27,0xb0,0x5a,0x13,0xac,0xb9,0xf5,0x12,0x92,0xcb,0x48,0xda,0x90, +0x5c,0x05,0x7b,0xc1,0x01,0x10,0x00,0xce,0x00,0x19,0x28,0x05,0xbf,0xb9,0xa2,0x86, +0x09,0xfd,0xa2,0x83,0x7e,0xe9,0x41,0x3f,0xa4,0x5c,0x86,0xa9,0x0d,0xa6,0xab,0x30, +0xa1,0x7f,0xc8,0x85,0xe5,0x0a,0x58,0x86,0xef,0xd6,0x3f,0x57,0x54,0x80,0xb5,0x7f, +0xd2,0x45,0x3f,0x28,0x34,0x00,0xf4,0xc3,0xf8,0x7f,0x5c,0x02,0xff,0x71,0x19,0xfc, +0x47,0x27,0xf8,0x8f,0x2b,0xe0,0x3f,0xda,0xc0,0x6f,0xe0,0x29,0xbf,0xa9,0x29,0x07, +0xbf,0x81,0x5f,0xdb,0x7e,0xa3,0x31,0xc1,0xf4,0x29,0x4c,0x17,0xc1,0x6f,0xea,0x9a, +0xc1,0x6f,0x3e,0xab,0x02,0x8b,0xd5,0xd5,0xed,0x48,0x3a,0x90,0x5c,0x43,0xf2,0x35, +0x92,0x4e,0x24,0x5d,0x48,0xae,0x23,0xf9,0x06,0xc9,0x0d,0x24,0xdd,0x48,0x6e,0x22, +0xe9,0x41,0xd2,0x8b,0xc4,0x8c,0xe4,0x16,0x92,0xdb,0x48,0xfa,0x90,0xf4,0x23,0xb9, +0x83,0xe4,0x5b,0x24,0x03,0x48,0x06,0x91,0xdc,0x45,0xf2,0x1d,0x14,0x93,0x02,0x89, +0x12,0x49,0x39,0x92,0x0a,0x24,0x2a,0x24,0x6a,0x24,0x1a,0x24,0x95,0x48,0xb4,0x48, +0x74,0x48,0xf4,0x48,0xd0,0x98,0x4d,0x06,0x24,0x46,0x24,0x17,0x90,0x7c,0x02,0xe5, +0x62,0x3d,0x92,0x06,0x24,0x9f,0x23,0xf9,0x02,0x49,0x23,0x92,0x26,0x24,0x5f,0x22, +0xf9,0x0a,0x49,0x33,0x92,0x16,0x24,0x97,0x90,0x5c,0x46,0xd2,0x8a,0xa4,0x0d,0xc9, +0x15,0x24,0x57,0x91,0x20,0xbb,0x5c,0x44,0x76,0xb9,0x88,0xec,0x72,0x11,0xd9,0xe5, +0x22,0xb2,0xcb,0x45,0x64,0x97,0x8b,0xc8,0x2e,0x17,0x91,0x5d,0x2e,0x22,0xbb,0x5c, +0x44,0x76,0xb9,0x88,0xec,0x72,0x11,0xd9,0xe5,0x22,0xb2,0xcb,0x45,0x64,0x97,0x8b, +0xc8,0x2e,0x17,0x91,0x5d,0x2e,0x22,0xbb,0x5c,0x44,0x76,0xb9,0x88,0xec,0x72,0x11, +0xd9,0xa5,0xee,0x33,0x24,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0, +0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75,0x68,0xe0,0x75, +0x68,0xe0,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68, +0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc, +0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75,0x68,0xcc,0x75, +0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68,0xb8,0x75,0x68, +0xb8,0x75,0x68,0xb8,0x75,0xd6,0x91,0x0e,0x80,0xff,0x5d,0x0d,0xfe,0xb7,0x09,0x7c, +0xdf,0x00,0xbe,0xbf,0x0c,0xfe,0xbb,0xeb,0x0a,0xf8,0xbe,0x0d,0x7c,0xdf,0x0a,0xa6, +0x6f,0x99,0xc0,0x48,0x3d,0x18,0xf9,0x12,0x7c,0xdf,0x01,0x46,0x2e,0x81,0xef,0xbf, +0x00,0xdf,0x37,0x82,0x91,0xab,0xe0,0x7b,0x15,0xf8,0xfe,0x1a,0xf8,0x1e,0x0e,0xa1, +0x69,0x40,0x05,0xfe,0xfb,0xcb,0x0b,0x60,0xe4,0x3a,0x3a,0x56,0x83,0xef,0x2f,0xa0, +0x5c,0x03,0x46,0x6e,0x81,0x91,0xdb,0x60,0xe4,0x0e,0x2a,0x69,0xc1,0xc8,0x5d,0xf0, +0x7d,0x3b,0xf8,0xfe,0x0a,0xbc,0x36,0x3c,0xf9,0x2a,0xf8,0x4d,0x77,0x37,0xf8,0xfe, +0x13,0xf0,0x7d,0x0b,0xf8,0x1e,0x5e,0xb5,0x1e,0xfc,0xa7,0x02,0xfc,0xa7,0x12,0xfc, +0x67,0x39,0xea,0xad,0x47,0x82,0x0c,0xd3,0x83,0x82,0xa8,0x07,0x05,0x51,0x0f,0x0a, +0xa2,0x1e,0x14,0x44,0x3d,0x28,0x88,0x7a,0x50,0x10,0xf5,0xa0,0x20,0xea,0x41,0x41, +0xd4,0x83,0x82,0xa8,0x07,0x05,0x51,0x0f,0x0a,0xa2,0x1e,0x14,0x44,0x3d,0x28,0x88, +0x7a,0x50,0x10,0xf5,0xa0,0x20,0xea,0x41,0x41,0x84,0xbe,0xa2,0x54,0xf7,0x98,0x90, +0x7c,0x8a,0xe4,0x22,0x92,0x1a,0x24,0xb5,0x48,0xea,0x90,0x20,0x9f,0xf5,0x20,0x9f, +0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5,0x20,0x9f,0xf5, +0x58,0x87,0x86,0x7c,0xd6,0x83,0x7c,0xd6,0x83,0x7c,0xd6,0x83,0x82,0xad,0x07,0x39, +0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae, +0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07, +0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x39,0xae,0x07,0x05,0x9b,0x19,0x15, +0xcd,0xa8,0x68,0xb6,0x16,0x91,0x33,0xcd,0xc8,0x99,0x66,0xe4,0x4c,0x33,0x72,0xa6, +0x19,0x39,0xd3,0x8c,0x9c,0x69,0x46,0xce,0x34,0xa3,0xd8,0x33,0x23,0x8f,0x9a,0xd1, +0x9a,0x34,0xa3,0x35,0x69,0x46,0x6b,0xd2,0x8c,0xd6,0xe4,0x2d,0x64,0xce,0x5b,0xc8, +0x9c,0xb7,0x90,0x39,0x6f,0x21,0x73,0xde,0x42,0xe6,0xbc,0x05,0xcd,0x69,0xba,0xac, +0x40,0xa2,0x44,0x52,0x8e,0xa4,0x02,0x89,0x0a,0x89,0xb5,0x55,0x83,0xa4,0x12,0x89, +0x16,0x89,0x0e,0x89,0x1e,0x49,0x15,0x12,0x03,0x12,0x23,0x92,0x0b,0x48,0x3e,0x41, +0x52,0x8d,0xc4,0x84,0xe4,0x53,0x24,0x17,0x91,0xd4,0x20,0xa9,0x45,0x52,0x87,0xe4, +0x33,0x24,0xf5,0x48,0x1a,0x90,0x7c,0x8e,0xe4,0x0b,0x24,0x8d,0x48,0x9a,0x90,0x7c, +0x89,0x04,0x1a,0xbb,0xae,0xbf,0x19,0x49,0x0b,0x92,0x4b,0x48,0x2e,0x23,0x69,0x45, +0xd2,0x86,0xe4,0x0a,0x92,0xab,0x48,0xda,0x91,0x74,0x20,0xb9,0x86,0xe4,0x6b,0x24, +0x9d,0x48,0xba,0x90,0x5c,0x47,0xf2,0x0d,0x92,0x1b,0x48,0xba,0x91,0xdc,0x44,0xd2, +0x83,0xa4,0x17,0x89,0x19,0xc9,0x2d,0x24,0xb7,0x91,0xf4,0x21,0xe9,0x47,0x72,0x07, +0xc9,0xb7,0x48,0x06,0x90,0x0c,0x22,0xb9,0x8b,0x04,0x5a,0xb7,0xee,0x0e,0x6a,0xb8, +0x83,0x1a,0xee,0xa0,0x86,0x3b,0xa8,0xe1,0x0e,0x6a,0xf8,0x56,0x81,0x44,0x89,0xa4, +0x1c,0x49,0x05,0x12,0x15,0x12,0x35,0x12,0x0d,0x92,0x4a,0x24,0x5a,0x24,0x3a,0x24, +0x7a,0x24,0x55,0x48,0x0c,0x48,0x8c,0x48,0x2e,0x20,0xf9,0x04,0x49,0x35,0x12,0x13, +0x92,0x4f,0x91,0x40,0xc3,0x36,0xa9,0x3f,0x83,0xa9,0x0d,0x1d,0xd4,0xff,0xd6,0x01, +0x4c,0xd7,0xdf,0x2c,0x7c,0xf3,0x66,0xe1,0xc6,0x9b,0x85,0xee,0x37,0x0b,0xd0,0x20, +0x4d,0x9a,0x7e,0xec,0x4a,0x9a,0x3b,0xaf,0x0f,0xfa,0xdf,0xb8,0xe4,0x5a,0xed,0xeb, +0x42,0xff,0x1b,0xd7,0xff,0xa5,0xe5,0x1b,0x70,0xbf,0x1b,0x3c,0xb8,0x0d,0x7e,0xa3, +0xad,0x84,0x09,0xce,0xfd,0xcb,0xd6,0x4b,0x48,0x2e,0x23,0x69,0x45,0xd2,0x86,0xe4, +0x0a,0x92,0xab,0x48,0xda,0x91,0x74,0x20,0xb9,0x86,0xe4,0x6b,0x24,0x9d,0x48,0xba, +0x90,0x5c,0x47,0xf2,0x0d,0x92,0x1b,0x48,0xba,0x91,0xdc,0x44,0xd2,0x83,0xa4,0x17, +0x89,0x19,0xc9,0x2d,0x24,0xb7,0x91,0xf4,0x21,0xe9,0x47,0x72,0x07,0xc9,0xb7,0x48, +0x06,0x90,0x0c,0x22,0xb9,0x8b,0x04,0x3a,0xe8,0xcb,0x36,0x05,0x12,0x25,0x12,0x34, +0xc8,0x36,0xf8,0x60,0xbf,0x0e,0x7e,0x6c,0x01,0x93,0xdf,0x00,0xb2,0x1f,0xa0,0xf8, +0x81,0x77,0xfd,0xc0,0x21,0x3f,0x40,0xf5,0x03,0x34,0x3f,0xf0,0x9e,0x1f,0x78,0xdf, +0x0f,0x04,0xfa,0x01,0x3a,0x7a,0xe9,0xa9,0xc9,0x47,0x2f,0x35,0x85,0xc5,0x80,0x5b, +0x00,0xf2,0x33,0x40,0x7e,0x3e,0x10,0x0a,0x0b,0x40,0xe1,0xc7,0x40,0x00,0xff,0xcb, +0x00,0x82,0x3c,0x90,0x91,0x0d,0x7e,0x56,0x7e,0xfb,0xb3,0xb2,0xca,0xfa,0x1b,0x7f, +0x39,0xfa,0x9b,0xcd,0xcf,0x80,0xe5,0x13,0xf4,0x47,0x1c,0x95,0xc0,0xd2,0xfa,0x39, +0x98,0xbb,0x7a,0x19,0xcc,0xdc,0x69,0x05,0xb3,0xf5,0xcd,0xe0,0x99,0xaa,0x05,0x58, +0x74,0x46,0x60,0xb9,0x6b,0x00,0x16,0x8d,0x11,0xcc,0xc2,0xad,0xdc,0xa2,0x6d,0x02, +0xcf,0xcc,0xe5,0x60,0xee,0x66,0x07,0xb0,0x5c,0x86,0x65,0xf8,0xf4,0x9d,0x1d,0xa8, +0x01,0xb3,0xfa,0x5a,0x30,0x6b,0xac,0x05,0xf3,0x4a,0x3d,0x98,0x35,0x54,0x82,0x59, +0xdd,0x45,0xf0,0xec,0x8a,0x12,0x3c,0xeb,0x40,0xff,0xd4,0xa8,0x05,0xb3,0x77,0x14, +0xe0,0x59,0x0d,0xbc,0x9f,0xee,0x26,0xb0,0xc0,0x9d,0x7f,0x5e,0x8d,0xde,0xb2,0x6a, +0x66,0x1b,0x3b,0xd7,0xde,0xc3,0x6a,0x66,0xfa,0x74,0xaf,0x8f,0xee,0x18,0xb0,0x23, +0xcb,0xf5,0xd7,0x75,0xcf,0xca,0xfb,0xb1,0x23,0x78,0xe1,0xd7,0x75,0x5f,0x7c,0xf6, +0xba,0x5f,0x55,0xd3,0xeb,0xd6,0x5a,0x6b,0x9d,0xe5,0x2e,0x9a,0xd5,0x37,0x60,0xa6, +0x6f,0x10,0xa6,0x3e,0x30,0xd3,0x0f,0xed,0xd9,0xac,0xba,0x04,0x66,0x06,0x9b,0xc1, +0xcc,0xdd,0x6f,0x81,0x45,0x51,0x0e,0x2c,0x4a,0x38,0x34,0xf8,0x26,0x63,0x41,0xbf, +0xa1,0x7f,0x0a,0x57,0x76,0x73,0x3d,0xac,0x50,0xa3,0x3f,0x11,0x6a,0x85,0x09,0xfa, +0xac,0xb9,0xa6,0x11,0xb6,0xf4,0xc3,0x02,0x0c,0x88,0xe6,0xda,0x2a,0x68,0x05,0x78, +0x5d,0x4d,0x2b,0x98,0xf9,0x16,0x59,0x04,0x06,0x43,0x47,0xe5,0x57,0xd0,0x24,0xf0, +0xcd,0xe8,0x22,0xca,0xe1,0x75,0x75,0x1a,0x98,0x6e,0x83,0x9f,0x6b,0xd0,0x9f,0xd4, +0xaa,0x61,0x82,0x65,0xa3,0x0e,0xa6,0xcf,0x61,0x82,0xd3,0x37,0x0e,0xc2,0x04,0xdd, +0xdc,0xdc,0xde,0x09,0x9e,0x29,0xa1,0xfd,0x3e,0xd1,0xc3,0x04,0x77,0x94,0x66,0xf4, +0x77,0x44,0x9f,0x7c,0x0d,0x53,0x37,0x34,0x18,0x3c,0x0b,0x8e,0xc8,0x02,0xdf,0x6f, +0x2c,0xf0,0x9d,0xc4,0x62,0x6a,0x87,0xe5,0x4b,0xc0,0x02,0x9f,0xf0,0x96,0x9a,0x6a, +0x60,0xa9,0xbd,0x08,0x13,0xec,0x5f,0xa7,0x82,0x09,0x9e,0x03,0x9f,0xac,0x96,0xcf, +0xe0,0x8c,0x1a,0xeb,0x60,0x82,0x43,0x6c,0x30,0xc1,0xd4,0x0b,0x1d,0x74,0x1d,0x58, +0xbe,0xba,0x00,0x13,0x3c,0x6e,0x86,0x8e,0xfc,0x12,0x4e,0xa1,0x19,0x3a,0xa0,0x19, +0xde,0xe3,0x12,0x1c,0x7e,0x0b,0x7c,0x19,0xb1,0x5c,0x86,0x15,0x97,0x6f,0x43,0xef, +0xc3,0x9b,0xc2,0x25,0x61,0x69,0x83,0xcb,0xa2,0xe5,0x73,0x18,0xfd,0x2d,0x5f,0x5c, +0x03,0x96,0xab,0x9d,0xc0,0xd2,0xfe,0x05,0x4c,0x57,0xe1,0x71,0x3d,0xb0,0x74,0x5c, +0x01,0x3f,0x7f,0x71,0x1d,0xa6,0x01,0x60,0xe9,0x84,0x43,0xeb,0x84,0x81,0xdb,0x72, +0x15,0x1e,0x7c,0x53,0x01,0x13,0xec,0xf0,0x0d,0x5c,0x00,0x2d,0x9d,0xe8,0xe0,0x3b, +0x60,0xb9,0x01,0xaf,0x39,0x78,0x11,0xfc,0xfc,0xa5,0x12,0x58,0xba,0x9b,0x81,0x05, +0x3e,0x43,0x2d,0x37,0xe1,0x06,0xd2,0x72,0x1b,0xde,0xd8,0x5c,0x81,0x0e,0xae,0xc0, +0x03,0x38,0x4c,0x33,0x9c,0x06,0x7c,0x4c,0x58,0x6e,0xc3,0x98,0xbb,0x7d,0x09,0xfc, +0xdc,0xfc,0x0d,0xcc,0xa1,0xb1,0xfa,0xe0,0xd4,0xa1,0x17,0x2d,0x70,0x0f,0xfd,0xb9, +0x05,0x8e,0xec,0x92,0x06,0x5a,0xbb,0x05,0x76,0xbc,0x03,0x8d,0x77,0x07,0xce,0xfb, +0x0e,0x5c,0x61,0xd7,0x2e,0xa0,0x7f,0x13,0x34,0x74,0x83,0x39,0x2d,0xbc,0xd1,0x00, +0x3c,0x1d,0x3d,0x1c,0x2e,0xeb,0xe1,0x92,0xbb,0x52,0x09,0x2d,0x8f,0x7e,0x4f,0x18, +0xfc,0x1a,0xd6,0x42,0x9b,0xdd,0x85,0xe5,0xef,0xa0,0x2d,0xbe,0x83,0x76,0xfa,0x0e, +0x06,0x6f,0xb9,0x12,0xfc,0x0c,0x57,0xe4,0xcf,0xad,0x70,0x97,0xbf,0xf4,0x05,0x8c, +0x64,0xb8,0x12,0x66,0xd5,0xe8,0xdf,0x45,0x0d,0x30,0xdd,0x01,0xb3,0x9a,0x9b,0x30, +0xc1,0x15,0xa1,0xf9,0x06,0xcc,0x56,0xa2,0x7f,0x9c,0x47,0x3f,0x4a,0x7c,0x01,0x23, +0xbc,0x09,0x46,0x7d,0x37,0x98,0xad,0x82,0xe7,0x18,0xe1,0x2e,0x78,0xa9,0x13,0x9e, +0x60,0x18,0x84,0x15,0x03,0xb0,0xa2,0x1d,0xcc,0x5e,0xa8,0x00,0xb3,0x9f,0xc0,0x9d, +0xe5,0xd2,0x37,0xb0,0x57,0xf5,0x25,0x58,0x50,0xc3,0x4a,0x38,0x8f,0xf6,0xeb,0x60, +0xd6,0xd4,0x01,0xd3,0x5d,0x30,0xfb,0x29,0xbc,0x8a,0x09,0x06,0x4c,0x47,0x27,0x98, +0xad,0x85,0x2e,0xb9,0x0c,0xbf,0x8a,0xcc,0x7e,0x76,0x19,0xcc,0x7e,0xd1,0x07,0x66, +0x1b,0x74,0xe0,0xe7,0x4e,0xf8,0xae,0x0d,0x0d,0xfd,0xf3,0xd7,0xd0,0x62,0xf0,0x85, +0xda,0xa2,0x81,0x0b,0xad,0x51,0x01,0x66,0x3f,0x6f,0x04,0x73,0xe5,0x5d,0x60,0xe6, +0x93,0x06,0x58,0x6e,0x01,0xb3,0x4d,0x70,0x68,0x4d,0x17,0xd1,0x3f,0x88,0x42,0x03, +0x75,0xe9,0xc0,0xec,0x57,0x70,0xec,0x5f,0xc2,0x3b,0xb6,0x40,0xdb,0x5c,0x36,0x75, +0x81,0xd9,0x4b,0x17,0xc0,0x6c,0xf3,0x57,0x60,0xb6,0x15,0x0e,0x18,0xee,0x2d,0xb3, +0x57,0xe0,0x5d,0xae,0x5e,0x03,0xb3,0xd7,0xa0,0xaf,0x2f,0x7f,0x0e,0x0b,0x5f,0x7f, +0x01,0x7e,0xbe,0x51,0x0f,0x66,0x3b,0xe1,0x73,0xed,0xf2,0xa5,0xab,0x60,0xb6,0x0b, +0x7e,0x4d,0xea,0x86,0x67,0x75,0x41,0x13,0x5c,0x87,0x67,0x5e,0x87,0x9b,0xd6,0xe5, +0x6b,0xc8,0x7f,0xbd,0xf0,0x79,0x70,0xf9,0x6b,0x78,0x07,0xd8,0xbc,0x78,0xf9,0x26, +0x9c,0xf1,0xcd,0xef,0xc0,0x2c,0x7c,0xc3,0x99,0xed,0x86,0xe7,0xf5,0xd6,0xc1,0x04, +0x27,0x67,0x86,0x93,0x84,0xef,0x03,0xb3,0xe8,0x91,0x7e,0x19,0xfd,0x28,0xd0,0xdb, +0x0b,0x66,0xfb,0xa0,0x1d,0xe1,0x83,0xef,0xe7,0xde,0x1e,0x30,0x8b,0x1e,0x35,0x97, +0xe1,0xd3,0x63,0xf6,0x36,0xf4,0xc4,0x20,0xdc,0x53,0x2f,0x0f,0xc2,0x85,0x78,0xf9, +0x2e,0xbc,0xe7,0x77,0x1a,0xf0,0x4c,0xd1,0x0f,0x13,0x1c,0xd4,0xad,0x3a,0xb8,0x58, +0xf4,0x30,0x0d,0xc2,0x74,0x1b,0x3c,0x83,0xf3,0x86,0x8b,0xb3,0x0d,0x3c,0x53,0xc3, +0x0b,0xb7,0xea,0x2e,0x83,0x67,0x1a,0xe8,0xbd,0xd6,0x0b,0xe8,0x6f,0xb8,0xdb,0xc1, +0x33,0x1d,0xf4,0x46,0x6b,0xbd,0x16,0x3c,0xd3,0xc3,0x4d,0x07,0x6e,0x4c,0x8b,0xad, +0x8d,0xe8,0x1f,0xd3,0x9b,0x6b,0xc0,0x33,0xe3,0x1d,0xf0,0xec,0x02,0xdc,0xfd,0xee, +0xa0,0x3f,0xe7,0x86,0xdf,0x6c,0xee,0xf4,0x81,0x67,0xf0,0xd5,0xff,0x99,0xa9,0x11, +0x3c,0xfb,0x54,0x0d,0x9e,0x5d,0x84,0x5f,0x04,0x07,0xbe,0x80,0x5b,0x15,0xf4,0x5b, +0xeb,0x8d,0x5b,0xf0,0x00,0xc6,0x77,0xeb,0x4d,0x14,0x5e,0x9a,0xaf,0xc0,0xb3,0x7a, +0x74,0xe5,0xbb,0x2d,0x48,0x60,0x6c,0xb5,0x29,0x55,0xe0,0xe7,0xef,0x06,0xc0,0x8c, +0x02,0x3e,0x2c,0xdb,0xe0,0x17,0x23,0x28,0xf0,0x19,0xd0,0xa6,0x6a,0x40,0xd2,0x03, +0x9e,0x35,0xa2,0xdf,0xcf,0xe0,0x69,0x70,0xdd,0xcd,0x28,0x35,0x60,0xa6,0x1c,0xbe, +0x67,0xb4,0xa1,0x1f,0x5e,0x5a,0x2e,0x80,0x19,0xf8,0xe5,0x6a,0xb1,0xad,0x1e,0x3e, +0x6f,0xda,0x3e,0x87,0xaf,0x1a,0x6d,0x5f,0xc0,0xbb,0x5f,0xfd,0x1a,0xcc,0xa8,0xbe, +0x81,0x9b,0x26,0x9c,0x6b,0x07,0x7c,0xba,0xb6,0xb5,0xc1,0x07,0x44,0xdb,0xb5,0xab, +0xe0,0xd9,0xd7,0xd7,0xc1,0x0c,0x7a,0x68,0xb5,0x5d,0x87,0x73,0xfc,0x06,0x9a,0xe6, +0x1b,0x1d,0xac,0x80,0xdb,0x52,0xdb,0x4d,0x38,0x47,0xf8,0x02,0x39,0xa3,0x87,0x1b, +0x36,0x7c,0xb5,0x7b,0x06,0xdf,0xfb,0x9e,0xf5,0xc2,0x67,0x48,0xdb,0x5d,0xd8,0xcb, +0x0c,0x77,0x73,0x03,0xdc,0x85,0x6f,0xc3,0x29,0xf6,0x95,0x83,0x67,0xfd,0x6a,0x58, +0x86,0x0f,0xa7,0x2b,0xd0,0x4c,0x8b,0x57,0x74,0x95,0x60,0xc6,0x08,0xc7,0x7a,0xa5, +0xaa,0x01,0x3c,0x1b,0x84,0x4f,0xa5,0x2b,0x86,0xbb,0xe0,0xd9,0xdd,0x5a,0xf0,0xec, +0x3b,0x54,0x40,0xdf,0x6d,0xae,0xd4,0x5c,0x06,0x73,0x4a,0xf8,0xb2,0x73,0x05,0xbe, +0xef,0xcf,0xc1,0x0d,0x6b,0xf1,0xb2,0xf1,0x2b,0x18,0x74,0xb5,0x30,0xf8,0x6e,0x82, +0x39,0x55,0x05,0x98,0xa9,0xae,0x82,0xf9,0x5d,0x60,0xb9,0x06,0x6d,0x7c,0xe5,0xcb, +0xab,0x48,0xe0,0xd1,0xe5,0x0b,0x28,0x16,0x2f,0xc0,0x20,0xd5,0xaa,0xc0,0xdc,0xdd, +0x2f,0xc1,0x8c,0xe9,0x6b,0x30,0xa7,0x37,0xc1,0x04,0xfb,0xeb,0xd1,0x1f,0x58,0xf6, +0xc0,0x1c,0x2e,0x59,0x6b,0x3e,0x08,0xe6,0xaa,0xa0,0x29,0xae,0x74,0x0e,0x80,0x39, +0x43,0x13,0x98,0x33,0xc2,0xdb,0x5e,0xe8,0x82,0xc7,0x28,0x87,0x8d,0x9f,0x5c,0x85, +0x75,0x17,0x61,0xae,0x87,0xc9,0x00,0x13,0xf4,0xf7,0x15,0xe8,0x9f,0xc5,0x2b,0x70, +0xe3,0x58,0xbc,0x02,0x5f,0x99,0x67,0x6a,0xe0,0xf5,0xe1,0x77,0xa3,0x39,0xf8,0xad, +0x68,0xae,0x06,0x1a,0xfa,0x2a,0xea,0x5b,0x0b,0xfd,0x78,0x65,0xa0,0x13,0xcc,0xd4, +0x36,0xc1,0x04,0x1d,0x77,0xe5,0x2e,0x7c,0x54,0x5f,0xad,0x80,0x06,0xab,0x85,0xfd, +0x1b,0xaa,0x61,0x82,0x97,0x6e,0xe8,0x00,0x73,0x9f,0xa3,0xa4,0x05,0x73,0x8d,0x17, +0xc0,0xdc,0x17,0x97,0x60,0x0e,0x27,0xdc,0x04,0xfb,0x7c,0x09,0x1d,0xf7,0xd9,0x67, +0x60,0xee,0xab,0x16,0x30,0xd7,0xac,0x84,0xc7,0xfd,0x60,0xae,0x05,0x5a,0xe4,0x2a, +0x3a,0x11,0xbe,0x34,0xce,0xc1,0xb7,0xc2,0x99,0x7a,0x33,0xcc,0xe1,0x2e,0xf2,0x29, +0x5c,0x21,0x57,0x2f,0xc1,0x40,0xbe,0xda,0x76,0x05,0xcc,0x7c,0x7e,0x17,0xcc,0x7c, +0x51,0x09,0xe6,0xae,0xa1,0xee,0x37,0xe1,0xf5,0x6e,0xc2,0xeb,0xc1,0xaf,0x10,0x73, +0xbd,0x5f,0x80,0x39,0xf4,0xb6,0x7c,0x75,0x00,0xbe,0x42,0x34,0x37,0x43,0x0b,0xa1, +0x9f,0xdb,0x6e,0xc1,0xc9,0xdf,0x86,0x26,0x6e,0x86,0x57,0x9c,0xfb,0x16,0xbe,0x9d, +0xb6,0x7f,0xf6,0x29,0x92,0x2e,0x30,0x5f,0x5e,0x03,0xe6,0x2b,0xba,0xc1,0xbc,0x0a, +0xbe,0x69,0xb5,0x37,0x5e,0x87,0x07,0x5f,0x80,0x79,0x6d,0x1f,0x98,0xaf,0xfa,0x0c, +0xa6,0x7a,0x30,0xaf,0x1b,0x00,0xf3,0x9f,0xf4,0x83,0xf9,0x6a,0x18,0xee,0xed,0xdf, +0xdc,0x01,0xf3,0x75,0x30,0xe6,0xae,0xc0,0x07,0x32,0xfa,0x86,0xd5,0x0e,0xef,0x35, +0x73,0xf5,0x0a,0x98,0xff,0x02,0x6e,0xd2,0xb7,0x6e,0x82,0xf9,0x46,0x18,0x7b,0x1d, +0x68,0xf1,0x74,0x68,0x3f,0x07,0x33,0x1d,0x30,0xb8,0x3a,0xe0,0x33,0xf9,0x2b,0x38, +0xcc,0x8e,0x6a,0x3d,0x98,0xb9,0x06,0xa3,0xb8,0xe3,0xd3,0x3a,0x30,0xdf,0x0c,0xdf, +0x7f,0x3a,0xd0,0xe3,0xfa,0x32,0x7c,0x76,0x76,0xf6,0x80,0x79,0xf8,0x42,0x34,0x7f, +0xe5,0x2a,0x98,0xbf,0x5a,0x0e,0x13,0x9c,0xdd,0x37,0x70,0xf9,0x77,0x74,0xde,0x00, +0xf3,0xdd,0x0a,0x30,0xdf,0x03,0x9f,0xb6,0xf0,0xfb,0xcd,0x0c,0xfc,0x22,0x31,0x6f, +0x86,0x81,0x70,0x0d,0xfd,0x66,0xde,0x03,0x17,0xca,0x35,0x15,0xbc,0xd5,0x35,0x2d, +0xec,0x7b,0x0d,0x46,0xc0,0x8c,0x19,0x5e,0xf9,0xdb,0xbb,0x60,0x1e,0x7e,0x3f,0x9b, +0x1f,0xf8,0x04,0x26,0xe8,0xad,0x6b,0xf5,0x0a,0x00,0x70,0x1b,0x36,0xda,0xd8,0x6e, +0xda,0xbc,0xd9,0x0e,0xbf,0x65,0xab,0xbd,0xc3,0x5b,0x8e,0x9b,0x7f,0xf9,0x10,0x36, +0x3b,0x6d,0xdb,0xee,0xec,0xb2,0x63,0xa7,0xab,0xb5,0xe8,0xb6,0x79,0xd7,0x6e,0x77, +0x8f,0x3d,0x6f,0x7b,0x7a,0x6d,0xfe,0xbb,0x7f,0xf6,0xee,0x83,0xe2,0xfd,0xab,0x5e, +0x92,0xb8,0xff,0x80,0x8f,0xef,0xc1,0x77,0xb0,0x92,0xdf,0xeb,0x6a,0x92,0xff,0xe6, +0x00,0x32,0x05,0x1e,0xbc,0xbb,0xf9,0x9f,0xf3,0x73,0x68,0x33,0x95,0xf6,0xde,0xfb, +0x81,0xaf,0x8b,0xf4,0x37,0xdb,0x82,0x0e,0x6f,0x0e,0x0e,0xf9,0xe0,0x75,0xe9,0xc3, +0xcd,0xff,0xc6,0x9f,0xd0,0xb0,0x23,0x9b,0xd7,0x3f,0xeb,0x9f,0xf5,0xcf,0xfa,0x67, +0xfd,0xb3,0xfe,0x59,0xff,0xac,0x7f,0xd6,0x3f,0xeb,0x9f,0xf5,0xcf,0xfa,0x67,0xfd, +0xf3,0xef,0xf3,0x01,0x36,0xeb,0xfc,0x55,0xd8,0x02,0xbb,0xdf,0x02,0x0f,0x08,0xc0, +0x09,0x38,0x63,0xb8,0x00,0x77,0x88,0x07,0xf0,0x02,0x44,0x40,0x02,0x64,0x08,0x05, +0xd0,0x41,0x08,0x08,0x05,0x61,0x80,0x05,0x38,0x20,0x03,0xc2,0x07,0x62,0x20,0x03, +0x2a,0x60,0x00,0x35,0x90,0x46,0xd0,0x0a,0x3a,0x41,0x2f,0x18,0x00,0xf7,0xc1,0x43, +0xf0,0x18,0x3c,0x81,0xcc,0x80,0xe7,0xe0,0x05,0x78,0x05,0x6c,0x70,0xf6,0x56,0x9c, +0x71,0xee,0x38,0x6f,0x9c,0x1f,0x8e,0x6a,0x25,0x18,0x17,0x8e,0x63,0xe2,0x92,0x70, +0x29,0xb8,0x0c,0x08,0x1f,0x27,0xc6,0xc9,0x70,0x2a,0x9c,0x01,0x57,0x83,0x6b,0xc4, +0xb5,0xe2,0x3a,0x21,0xbd,0xb8,0x01,0xdc,0x7d,0xdc,0x43,0xdc,0x63,0xdc,0x13,0x2b, +0x33,0xb8,0xe7,0xb8,0x17,0xb8,0x57,0x38,0x9b,0x0d,0x36,0x1b,0xec,0x21,0xce,0x1b, +0xdc,0x37,0x78,0x6f,0xf0,0xdb,0x40,0xdd,0x10,0xbc,0x21,0x7c,0x03,0x73,0x43,0xd2, +0x86,0x94,0x0d,0x19,0x1b,0xf8,0x1b,0xc4,0x1b,0x64,0x1b,0x54,0x1b,0x0c,0x56,0x6a, +0x36,0x34,0x6e,0x68,0xdd,0xd0,0xb9,0xa1,0x77,0xc3,0xc0,0x86,0xfb,0x1b,0x1e,0x6e, +0x78,0xbc,0xe1,0xc9,0x86,0x99,0x0d,0xcf,0x37,0xbc,0xd8,0xf0,0x6a,0x83,0xcd,0x46, +0xfb,0x8d,0xce,0x1b,0xdd,0x37,0x7a,0x6f,0xf4,0xb3,0x42,0xdd,0x18,0xbc,0x31,0x7c, +0x23,0x73,0x63,0xd2,0xc6,0x94,0x8d,0x19,0x1b,0xf9,0x1b,0xc5,0x1b,0x25,0x1b,0xe5, +0x1b,0x55,0x1b,0x0d,0x1b,0x6b,0x36,0x36,0x6e,0x6c,0x85,0x74,0x6e,0xec,0xdd,0x38, +0xb0,0xf1,0xfe,0xc6,0x87,0x1b,0xc7,0x37,0x4e,0x6d,0x9c,0xb1,0xf2,0x7c,0xe3,0x8b, +0x8d,0xaf,0x36,0xda,0xd8,0xd8,0xdb,0xb8,0xd8,0xb8,0x5b,0xf1,0xb6,0xf1,0xb3,0xa1, +0xda,0x04,0xdb,0x84,0xdb,0x30,0xad,0x24,0xd9,0xa4,0xd8,0x64,0xd8,0xf0,0x6d,0xc4, +0x36,0x32,0x1b,0x95,0x8d,0xc1,0xa6,0xc6,0xa6,0xd1,0xa6,0xd5,0xa6,0xd3,0xa6,0xd7, +0x66,0xc0,0xe6,0xbe,0xcd,0x43,0x9b,0xc7,0x36,0x4f,0xac,0xcc,0xd8,0x3c,0xb7,0x79, +0x61,0xf3,0xca,0xc6,0xc6,0xd6,0xde,0xd6,0xd9,0xd6,0xdd,0xd6,0xdb,0xd6,0xcf,0x96, +0x6a,0x1b,0x6c,0x1b,0x6e,0xcb,0xb4,0x4d,0xb2,0x4d,0xb1,0xcd,0xb0,0xe5,0xdb,0x8a, +0x6d,0x65,0xb6,0x2a,0x5b,0x83,0x6d,0xad,0x6d,0xfd,0x5f,0x4d,0xb3,0x6d,0xfb,0xff, +0xc0,0x0d,0xdb,0xbe,0x3f,0x89,0x7e,0xdb,0x61,0xdb,0x31,0xdb,0x29,0x5b,0x8b,0xed, +0x82,0xed,0xb2,0xed,0xaa,0xad,0xed,0x26,0xfb,0x4d,0xce,0x9b,0xdc,0x37,0x79,0x6f, +0xf2,0xdb,0x44,0xdd,0x14,0xbc,0x29,0x7c,0x13,0x73,0x53,0xf2,0xa6,0x8c,0x4d,0xc2, +0x4d,0xb2,0x4d,0xda,0x4d,0x35,0x9b,0x9a,0x37,0x75,0x42,0xfa,0x36,0xdd,0xdf,0xf4, +0x68,0xd3,0x93,0x4d,0x33,0x9b,0x9e,0x5b,0x79,0xb1,0xe9,0xd5,0x26,0x9b,0xcd,0xf6, +0x9b,0x9d,0x37,0xbb,0x6f,0xf6,0xd9,0x4c,0xdd,0x1c,0xbc,0x39,0x7c,0x33,0x6b,0x33, +0x7b,0x73,0xea,0xe6,0x8c,0xcd,0xfc,0xcd,0x62,0x2b,0xb2,0xcd,0xaa,0xcd,0xd5,0x9b, +0x1b,0x37,0xb7,0x6e,0xee,0xdc,0xdc,0xbb,0x79,0x00,0x72,0x7f,0xf3,0xc3,0xcd,0x8f, +0x37,0x3f,0xd9,0x3c,0xb3,0xf9,0xf9,0xe6,0x17,0x9b,0x5f,0x6d,0xb6,0xb1,0xb3,0xb7, +0x73,0xb6,0x73,0xb7,0xf3,0xb6,0xf3,0xb3,0xa3,0xda,0x05,0xdb,0x85,0xdb,0x31,0xed, +0x92,0xec,0x52,0xec,0x32,0xec,0xf8,0x76,0x62,0x3b,0x99,0x9d,0xca,0xce,0x60,0x57, +0x63,0xd7,0x68,0xa5,0xd5,0xae,0xf3,0xb7,0xe8,0xb5,0x1b,0xb0,0xbb,0x6f,0xf7,0xd0, +0x6e,0xc2,0x6e,0xc6,0x6e,0xd1,0xee,0x95,0x9d,0x0d,0xde,0x1e,0xef,0x8a,0xf7,0xc6, +0xfb,0xe1,0xa9,0xff,0xa6,0xd0,0xf0,0x74,0x7c,0x08,0x3e,0x0c,0x1f,0x81,0x67,0xe0, +0x59,0xf8,0x78,0x3c,0x1b,0x9f,0xfc,0x57,0xc1,0xc1,0xa7,0xe3,0x79,0x78,0x11,0x5e, +0x8a,0x57,0xe2,0xb5,0x10,0x1d,0xde,0x88,0x37,0xe1,0x6b,0xf1,0x0d,0xf8,0xc6,0x7f, +0x5a,0x9a,0xf1,0xad,0x90,0x76,0xfc,0x8d,0xbf,0x31,0xbd,0xbf,0x60,0xc6,0x0f,0x60, +0xdc,0xfb,0x85,0x21,0xfc,0xf7,0xf8,0x47,0xf8,0x09,0xfc,0x13,0xfc,0x0c,0xfe,0x39, +0xfe,0x05,0xe4,0x15,0xc4,0x66,0x8b,0xfd,0x16,0xd7,0xbf,0x00,0xcf,0x2d,0x3e,0x5b, +0xc8,0x5b,0x02,0xb7,0x84,0x6e,0x89,0xdc,0x92,0xf4,0x17,0x90,0xb2,0x25,0x63,0x0b, +0x7f,0x8b,0x78,0x8b,0x6c,0x8b,0x7c,0x8b,0x72,0x8b,0x7a,0x8b,0x7e,0xcb,0xa7,0x5b, +0x1a,0xb6,0x34,0x6d,0x69,0xfe,0xb3,0x69,0xd9,0xd2,0xb6,0xa5,0x63,0x4b,0xe7,0x96, +0xae,0x2d,0xdd,0x5b,0x7a,0xad,0x98,0xb7,0xf4,0xfd,0x0e,0xf7,0xb6,0x3c,0x80,0x3c, +0xc2,0x98,0xf8,0x85,0xa7,0x5b,0xe6,0xb6,0x2c,0xfe,0x5e,0x5e,0xfe,0x95,0x80,0xad, +0x7f,0x0e,0x76,0x5b,0x09,0x10,0x57,0x0c,0xcf,0x5f,0xf0,0xd9,0x4a,0xde,0x1a,0xf8, +0x67,0x12,0xba,0x35,0xf2,0x1f,0x90,0xb8,0xad,0xc9,0xff,0x03,0x69,0x5b,0xb9,0x5b, +0x85,0x5b,0x8b,0xac,0x28,0xb6,0x6a,0xad,0x54,0x6f,0xad,0xdf,0xda,0xbc,0xb5,0x7d, +0xeb,0x8d,0xad,0x7d,0x56,0xee,0x6d,0x7d,0xb0,0xf5,0xd1,0xd6,0x89,0xad,0x4f,0xb7, +0xce,0x59,0x59,0xdc,0xfa,0x72,0x2b,0xb0,0xb7,0xb3,0x27,0xd8,0xbb,0xda,0x7b,0xda, +0xfb,0xd8,0x93,0xed,0x03,0xed,0x43,0xed,0x23,0xad,0xc4,0xd9,0x27,0xaf,0xf3,0x07, +0xe1,0xd8,0xa7,0xad,0xf3,0x17,0xc1,0xb5,0x17,0xda,0x17,0xd9,0x2b,0xec,0xb5,0xff, +0xc0,0xe8,0xec,0x4d,0xf6,0x0d,0xf6,0x2d,0xf6,0xed,0xff,0x60,0xdc,0x80,0xf4,0xfd, +0x51,0xee,0xfd,0xcd,0x00,0xeb,0x9f,0x7f,0xf3,0xcf,0xdf,0x22,0xaa,0x1e,0xfc,0x0e, +0x8f,0xac,0x4c,0xfc,0x4a,0x3c,0xb5,0x9f,0xb3,0x5f,0xb4,0x7f,0x69,0x0f,0x1c,0xec, +0x1c,0x08,0x0e,0xae,0xff,0xa2,0x78,0x3a,0xf8,0xfc,0x11,0xc8,0x0e,0x81,0x90,0xd0, +0x7f,0x1a,0x22,0xad,0xc4,0xfd,0x2a,0x24,0x3b,0xa4,0x39,0x70,0xad,0x08,0xd7,0xf9, +0x17,0xa4,0xc8,0x8a,0xc2,0x41,0xfb,0x47,0xa8,0x76,0xa8,0xff,0xbb,0xd2,0xfc,0x77, +0xa4,0xdd,0xe1,0x86,0x43,0xdf,0xbf,0x2d,0xf7,0xfe,0xcd,0x78,0xf0,0x5b,0x3c,0x72, +0x98,0x80,0x3c,0x75,0x78,0xfe,0x6f,0xce,0x0b,0x87,0x57,0x0e,0x36,0x6f,0xad,0xf3, +0x87,0xb0,0x87,0x38,0xbf,0xe5,0xf9,0x96,0xcf,0x3f,0x0d,0xbe,0x6f,0x91,0xff,0xad, +0xa1,0xbc,0x15,0xf8,0x2b,0x43,0x7f,0x2b,0xec,0xad,0xc8,0xbf,0x29,0x8c,0xb7,0x98, +0x7f,0x57,0x92,0x7e,0x0f,0x29,0xbf,0x90,0xf1,0x0b,0xfc,0x5f,0x10,0xff,0x41,0x64, +0xbf,0x07,0x15,0xc4,0xf0,0x56,0xed,0x5b,0xcd,0x6f,0x75,0xbc,0xd5,0xfb,0x3b,0x0c, +0xfc,0x09,0xdc,0xff,0x3d,0x3c,0xfc,0x85,0xc7,0xbf,0xf0,0xe4,0x17,0x66,0xfe,0x20, +0xcf,0xff,0x85,0x79,0xb1,0xce,0x3f,0x09,0xcb,0x6f,0xbd,0xfc,0xbd,0x00,0x47,0xe0, +0x68,0x07,0x21,0x40,0x5c,0x21,0x9e,0x18,0x3e,0xbf,0x3a,0x64,0x48,0xa0,0x95,0x50, +0xc7,0x48,0x48,0xdc,0x3a,0xff,0x62,0xc4,0x3b,0xb2,0x1d,0x39,0x8e,0x29,0x8e,0xa9, +0x8e,0xe9,0x8e,0x99,0x8e,0x3c,0x47,0x81,0xa3,0xc8,0x51,0xe2,0x28,0x75,0x94,0x3b, +0x2a,0x1d,0xd5,0x8e,0x5a,0x47,0x9d,0xa3,0xd1,0xd1,0xe4,0x58,0xeb,0xd8,0xe0,0xd8, +0xe4,0xd8,0xe2,0xd8,0xe6,0xd8,0xe1,0xd8,0xe5,0xd8,0xed,0x68,0x76,0xec,0x77,0x1c, +0x74,0x1c,0x72,0x1c,0x76,0x1c,0x71,0x1c,0x75,0x7c,0xe4,0x38,0xe6,0x38,0xee,0x38, +0xe9,0x38,0xe5,0x38,0xed,0x68,0x71,0x9c,0x77,0x5c,0x70,0x5c,0x72,0x5c,0x76,0x5c, +0x71,0x5c,0x75,0xc4,0x11,0x6c,0x09,0x78,0x82,0x03,0xc1,0x89,0xe0,0x42,0x70,0x23, +0x78,0x10,0xbc,0x08,0x44,0x82,0x2f,0x81,0x44,0xa0,0x10,0x68,0x04,0x3a,0x21,0x84, +0x10,0xfa,0x07,0x09,0x23,0x84,0xff,0x0a,0x44,0x10,0x18,0x04,0x16,0x21,0x9e,0xc0, +0x26,0x70,0x08,0xa9,0x84,0x74,0x42,0x26,0x81,0x47,0x10,0x10,0x44,0x04,0x09,0x41, +0x4a,0x90,0x13,0x94,0x04,0x35,0x41,0x47,0x30,0x12,0x4c,0x84,0x5a,0x42,0x03,0xa1, +0x89,0xd0,0x42,0x68,0x23,0x74,0x10,0xba,0x08,0xdd,0x04,0x33,0xa1,0x9f,0x30,0x48, +0x18,0x22,0x0c,0x13,0x46,0x08,0xa3,0x84,0x31,0xc2,0x38,0x61,0xe2,0x1f,0x80,0xa7, +0x84,0x39,0xc2,0x22,0xe1,0x25,0x01,0x38,0xd9,0x39,0x11,0x9c,0x5c,0x9d,0xbc,0x9d, +0xc8,0x4e,0x81,0x4e,0xa1,0x4e,0x91,0x4e,0x71,0x4e,0xc9,0x4e,0x69,0x4e,0x5c,0x27, +0xa1,0x53,0x91,0x93,0xc2,0xc9,0xe0,0x54,0xef,0xd4,0xea,0x74,0xc3,0xa9,0xcf,0xe9, +0x9e,0xd3,0x03,0xa7,0x47,0x4e,0x4f,0x9c,0xe6,0x9c,0x16,0x9d,0x5e,0x3a,0x81,0x6d, +0x76,0xdb,0x08,0xdb,0x5c,0xb7,0x79,0x6e,0xf3,0xd9,0x46,0xde,0x16,0xb8,0x2d,0x74, +0x5b,0xe4,0xb6,0xb8,0x6d,0xc9,0xdb,0xd2,0xb6,0x71,0xb7,0x89,0xb7,0x29,0xb6,0x69, +0xb7,0x55,0x6f,0xab,0xdf,0xd6,0xbc,0xad,0x7d,0xdb,0x8d,0x6d,0x7d,0xdb,0xee,0x6d, +0x7b,0xb8,0x6d,0x62,0xdb,0xd3,0x6d,0x73,0xdb,0x16,0xb7,0xbd,0xdc,0x06,0xb6,0xdb, +0x6d,0x27,0x6c,0x77,0xdd,0xee,0xb9,0xdd,0x67,0x3b,0x79,0x7b,0xe0,0xf6,0xd0,0xed, +0x91,0xdb,0xe3,0xb6,0x27,0x6f,0x4f,0xdb,0xce,0xdd,0x2e,0xde,0xae,0xd8,0x6e,0xd8, +0x5e,0xbf,0xbd,0x75,0xfb,0x8d,0xed,0x03,0xdb,0x1f,0x6c,0x7f,0xb4,0x7d,0x62,0xfb, +0xd3,0xed,0x73,0xdb,0x17,0xb7,0xbf,0xdc,0x0e,0x9c,0xed,0x9c,0x9d,0x9d,0x3d,0x9d, +0x7d,0x9c,0xc9,0xce,0x81,0xce,0xa1,0xce,0x91,0xce,0x71,0xce,0x29,0xce,0x5c,0x67, +0xb1,0xb3,0xc2,0xd9,0xe0,0x5c,0xef,0xdc,0xec,0xdc,0xee,0x7c,0xc3,0xb9,0xcf,0xf9, +0x9e,0xf3,0x03,0xe7,0x47,0xce,0x13,0xce,0x4f,0x9d,0xe7,0x9c,0x17,0x9d,0x5f,0x3a, +0x03,0x17,0x3b,0x17,0x67,0x17,0x4f,0x17,0x3f,0x97,0x40,0x97,0x50,0x97,0x48,0x97, +0x38,0x97,0x64,0x97,0x34,0x17,0xae,0x8b,0xd0,0xa5,0xc8,0x45,0xe1,0xa2,0x75,0xa9, +0x76,0xa9,0x77,0x69,0x76,0x69,0x77,0xb9,0xe1,0xd2,0xe7,0x72,0xcf,0xe5,0x81,0xcb, +0x23,0x97,0x09,0x97,0xa7,0x2e,0x73,0x2e,0x8b,0x2e,0x2f,0x5d,0xc0,0x0e,0xbb,0x1d, +0x84,0x1d,0xae,0x3b,0x3c,0x77,0xf8,0xee,0x78,0x77,0x47,0xe0,0x2f,0x84,0xee,0x88, +0xdc,0x11,0xb7,0x23,0x79,0x47,0xc6,0x0e,0xe1,0x0e,0xd9,0x0e,0xed,0x8e,0x9a,0x1d, +0xcd,0x3b,0x3a,0x77,0xf4,0xed,0xb8,0xbf,0xe3,0xd1,0x8e,0x27,0x3b,0xe6,0x76,0xbc, +0xd8,0x01,0x76,0xda,0xef,0x74,0xdd,0xe9,0xbd,0x93,0xbc,0x33,0x78,0x67,0xe4,0xce, +0xb8,0x9d,0xc9,0x3b,0xd3,0x76,0x72,0x77,0x0a,0x77,0x16,0xed,0x54,0xed,0xac,0xde, +0xd9,0xb8,0xb3,0x7d,0x67,0xef,0xce,0x7b,0x3b,0x1f,0xee,0x9c,0xd8,0x39,0xb3,0x73, +0x71,0xe7,0xcb,0x9d,0xc0,0xd5,0xce,0x95,0xe0,0xea,0xea,0xea,0xe9,0xea,0xe3,0x4a, +0x76,0x0d,0x76,0x8d,0x74,0x4d,0x72,0x4d,0x73,0xe5,0xbb,0x16,0xb9,0xaa,0x5c,0xab, +0x5d,0x1b,0x5d,0xdb,0x5d,0x7b,0x5d,0xef,0xb9,0x3e,0x74,0x9d,0x70,0x9d,0x71,0x5d, +0x74,0x7d,0xe5,0x6a,0xe7,0xe6,0xec,0xe6,0xe9,0xe6,0xe3,0x46,0x76,0x0b,0x74,0x0b, +0x75,0x63,0xba,0x25,0xbb,0x65,0xb8,0x09,0xdd,0x64,0x6e,0x5a,0xb7,0x1a,0xb7,0x66, +0xb7,0x4e,0xb7,0x3e,0xb7,0x7b,0x6e,0x0f,0xdc,0x1e,0xb9,0x4d,0xb8,0x3d,0x75,0x9b, +0x73,0x5b,0x74,0x7b,0xf9,0x3b,0x80,0x5d,0x76,0xbb,0x9c,0x77,0x79,0xee,0xf2,0xdb, +0x15,0xb8,0x2b,0x7c,0x57,0xdc,0xae,0xe4,0x5d,0x69,0xbb,0xf8,0xbb,0x8a,0x76,0xa9, +0x76,0x55,0xef,0x6a,0xdc,0xd5,0xbe,0xeb,0xc6,0xae,0xbe,0x5d,0xf7,0x77,0x3d,0xda, +0xf5,0x64,0xd7,0x9c,0x95,0xc5,0x5d,0x2f,0x77,0xd9,0xec,0x26,0xec,0x76,0xdf,0xed, +0x63,0x85,0xbc,0x3b,0x70,0x77,0xf8,0xee,0xb8,0xdd,0x29,0xbb,0xb9,0xbb,0xc5,0xbb, +0x15,0xbb,0xb5,0xbb,0xab,0x77,0x37,0xee,0x6e,0xdf,0xdd,0xbb,0xfb,0xde,0xee,0x87, +0xbb,0x27,0x76,0x3f,0xdd,0x3d,0xb7,0xfb,0xc5,0x6e,0xe0,0x6e,0xef,0xee,0xea,0xee, +0xed,0x4e,0x76,0x0f,0x74,0x0f,0x75,0x67,0xba,0x27,0xbb,0x67,0xb8,0x0b,0xdd,0x65, +0xee,0x5a,0xf7,0x6a,0xf7,0x7a,0xf7,0x56,0xf7,0x1b,0xee,0x03,0xee,0x0f,0xac,0x3c, +0x72,0x9f,0x70,0x9f,0x71,0x5f,0x74,0x7f,0xe5,0x6e,0xe7,0x81,0x20,0x78,0xb8,0x7a, +0x78,0x7b,0x90,0x3d,0x82,0x3d,0x22,0x3d,0x92,0x3c,0xd2,0x20,0x5c,0x88,0x18,0xa2, +0x80,0x18,0x3c,0x6a,0x3c,0x1a,0x3d,0xda,0x3d,0x7a,0x3d,0xee,0x79,0x3c,0xf4,0x98, +0xf0,0x98,0xf1,0x78,0xee,0xf1,0xc2,0x03,0xec,0xb1,0xdf,0xe3,0xba,0xc7,0x7b,0x0f, +0x79,0x4f,0xf0,0x9e,0xf0,0x3d,0xcc,0x3d,0x49,0x7b,0x52,0xf6,0x64,0xec,0xe1,0xef, +0x11,0xef,0x91,0xed,0x51,0xed,0x31,0xec,0xa9,0xd9,0xd3,0xb8,0xa7,0x75,0x4f,0xa7, +0x95,0xbe,0x3d,0xf7,0xf7,0x3c,0xde,0x33,0xb3,0xe7,0xc5,0x1e,0x9b,0xb7,0x9d,0xdf, +0xf6,0x7e,0x9b,0xfc,0x76,0xf0,0xdb,0xcc,0xb7,0x53,0xde,0xe6,0xbf,0x2d,0x7b,0xdb, +0xf0,0x76,0xe3,0xdb,0xed,0x6f,0xf7,0xbe,0x7d,0xff,0xed,0xc7,0x6f,0xcf,0xbc,0xfd, +0xe2,0x6d,0x1b,0x4f,0x67,0x4f,0x4f,0x4f,0x3f,0xcf,0x60,0x4f,0xa6,0x67,0x8a,0x27, +0xdf,0x53,0xe6,0x69,0xf0,0xac,0xf7,0x6c,0xf5,0xec,0xf5,0xbc,0xef,0xf9,0xd8,0x73, +0xc6,0xf3,0x85,0xa7,0x8d,0x17,0xc1,0xcb,0xdd,0xcb,0xcf,0x2b,0xd8,0x8b,0xe9,0x95, +0xe2,0xc5,0xf7,0x92,0x79,0xa9,0xbc,0x0c,0x5e,0xf5,0x5e,0xcd,0x5e,0x9d,0x90,0x5e, +0xaf,0x7b,0x5e,0x0f,0xbc,0x1e,0x79,0x4d,0x78,0x3d,0xf5,0x9a,0xf7,0x5a,0xf4,0x5a, +0xf6,0x5a,0xf5,0xda,0xb4,0xd7,0x7e,0xaf,0xeb,0x5e,0xcf,0xbd,0x7e,0x10,0xea,0xde, +0xd0,0xbd,0x91,0x7b,0xe3,0xf6,0x26,0xef,0x4d,0xdb,0x9b,0xbd,0x37,0x6f,0x6f,0xf1, +0x5e,0xc5,0x5e,0xed,0xde,0xea,0xbd,0x8d,0x7b,0xdb,0xad,0xdc,0xd8,0x3b,0xb0,0xf7, +0xfe,0xde,0x87,0x7b,0x1f,0xef,0x7d,0xb2,0xf7,0xff,0xd9,0x3b,0xbb,0xf7,0xff,0xdd, +0xfb,0x62,0xef,0xab,0xbd,0x36,0xfb,0x08,0xfb,0xdc,0xf7,0x79,0xef,0xf3,0xdb,0x47, +0xdd,0x17,0xba,0x2f,0x72,0x5f,0xdc,0xbe,0xe4,0x7d,0x69,0xfb,0xb2,0xf7,0xe5,0xed, +0x2b,0xda,0x27,0xb3,0xa2,0xdd,0x57,0xbd,0xaf,0x11,0xd2,0xba,0xef,0xc6,0xbe,0xbe, +0x7d,0xf7,0xf6,0x3d,0xd8,0xf7,0x68,0xdf,0x8f,0xfb,0xa6,0xf6,0xcd,0xec,0x9b,0x85, +0xfc,0xf7,0xbe,0x85,0x7d,0x4b,0xfb,0x96,0xf7,0xad,0xec,0x5b,0xdd,0x87,0xf3,0xb6, +0xf5,0xc6,0x7b,0x3b,0x78,0x13,0xde,0xc0,0xc9,0xdb,0xf9,0x17,0x5c,0xbc,0xdd,0xff, +0x00,0x1e,0xde,0x5e,0xde,0xbe,0xde,0xd4,0xdf,0x81,0xe6,0x1d,0x68,0x85,0xee,0x1d, +0xe6,0xcd,0xf4,0x66,0x79,0xb3,0xbd,0xd3,0x30,0xd2,0xbd,0xb9,0xde,0x3c,0x6f,0xe1, +0xef,0x20,0xf2,0x96,0x7a,0x2b,0xbd,0xb5,0x7f,0x10,0x9d,0x77,0xfd,0x6f,0xd1,0xe0, +0xdd,0xf8,0x47,0x68,0xf2,0x6e,0xf1,0x6e,0x85,0xb4,0x79,0x77,0x78,0x77,0x79,0x77, +0x7b,0x9b,0xbd,0xfb,0xbd,0x07,0xbd,0x87,0xbc,0x87,0xbd,0x47,0xbc,0x47,0xbd,0xc7, +0xbc,0xc7,0xbd,0x27,0xbd,0xa7,0xbc,0xa7,0xbd,0x2d,0xde,0xf3,0xde,0x0b,0xde,0x4b, +0xde,0xcb,0xde,0x2b,0xde,0xab,0xde,0x38,0xa2,0x2d,0x11,0x4f,0x74,0x20,0x12,0x88, +0x4e,0x44,0x17,0xa2,0x1b,0xd1,0x83,0xe8,0x45,0x24,0x12,0x7d,0x89,0x24,0x22,0x85, +0x48,0x23,0xd2,0x89,0x21,0xc4,0x30,0x62,0xf8,0xef,0x25,0x82,0xc8,0xfc,0xa7,0x82, +0x05,0xe1,0x10,0x33,0x89,0x3c,0xa2,0x90,0x28,0x22,0xca,0x89,0x3a,0xa2,0x81,0x68, +0x24,0xd6,0x12,0x1b,0x88,0x4d,0xc4,0x16,0x62,0x1b,0xb1,0x83,0xd8,0x45,0xec,0x26, +0x9a,0x89,0xfd,0xc4,0x01,0xe2,0x20,0x71,0x88,0xf8,0x00,0x32,0x42,0x1c,0x25,0x8e, +0x11,0xc7,0x89,0x93,0xc4,0x27,0x90,0x29,0xa2,0x85,0xb8,0x44,0x7c,0x49,0x5c,0x21, +0xbe,0x82,0x80,0xfd,0xb8,0xfd,0x36,0x10,0xbb,0xfd,0x4e,0xfb,0x5d,0xf6,0xbb,0xee, +0x77,0xdb,0xef,0xb1,0xdf,0x6b,0xbf,0xf7,0x7e,0xe2,0x7e,0xdf,0xfd,0xa4,0xfd,0x94, +0xfd,0xb4,0xfd,0xf4,0xfd,0x21,0xfb,0x43,0xf7,0x87,0xed,0x67,0xed,0x8f,0xdf,0xcf, +0xde,0xcf,0xd9,0x9f,0xba,0x3f,0x0d,0x23,0x7d,0x7f,0xe6,0x7e,0xde,0x7e,0xc1,0x7e, +0xd1,0x7e,0xf1,0x1b,0x48,0xf6,0x2b,0xf7,0x1b,0xf7,0x37,0xed,0xef,0xd8,0x6f,0xde, +0x3f,0xb4,0x7f,0x74,0xff,0xe4,0x7e,0xcb,0xfe,0xa5,0xfd,0xab,0xfb,0xf1,0x07,0x5c, +0x0e,0x78,0x1d,0x20,0x1d,0xa0,0x1d,0xa0,0x1f,0x08,0x3b,0xc0,0x3a,0xc0,0x3e,0xc0, +0x39,0x90,0x7e,0x40,0x70,0x40,0x7e,0x40,0x7d,0x40,0x77,0xc0,0x74,0xa0,0xe9,0x40, +0xcb,0x81,0xb6,0x03,0x1d,0x07,0xba,0x0e,0x74,0x1f,0xe8,0x3f,0x30,0x7c,0x60,0xf4, +0xc0,0xd8,0x81,0xc9,0x03,0x96,0x03,0xcb,0x07,0x56,0x0f,0xe0,0x7c,0xf0,0x3e,0x2e, +0x3e,0x6e,0x3e,0x1e,0x3e,0x5e,0x3e,0xde,0xff,0x07,0x44,0x1f,0xf2,0x1f,0x25,0xd0, +0x27,0xf4,0x4f,0x22,0xf2,0xaf,0x22,0xce,0x27,0xd9,0x27,0xed,0xef,0x08,0xf7,0x17, +0x84,0x56,0x8a,0xfe,0x4c,0x14,0x10,0xed,0x2f,0xe8,0x7c,0x4c,0x3e,0x8d,0x3e,0x4d, +0x3e,0x6d,0x3e,0x37,0xfe,0x28,0x7d,0x56,0xee,0x59,0x79,0x00,0x79,0xf4,0x67,0x31, +0x01,0x79,0xfa,0x7b,0x99,0xf3,0x59,0xf4,0x79,0xe9,0x03,0x7c,0xed,0xac,0x10,0x7c, +0x5d,0xad,0x78,0xfa,0xfa,0xfc,0x16,0x64,0xdf,0x40,0x2b,0xa1,0xbe,0x91,0x56,0xe2, +0x7c,0x93,0x7f,0x15,0xd2,0x7c,0xb9,0xbe,0x42,0xdf,0xa2,0xbf,0x39,0x0a,0x5f,0xad, +0x6f,0xb5,0x6f,0xfd,0x6f,0xd1,0xec,0xdb,0xee,0x7b,0xc3,0xb7,0xef,0xff,0x1a,0x03, +0xbe,0xf7,0xd6,0x59,0xe7,0xef,0xc4,0x90,0xef,0xb0,0xef,0x88,0xef,0xa8,0xef,0x98, +0xef,0xb8,0xef,0xa4,0xef,0x94,0xef,0xb4,0xaf,0xc5,0x77,0xc1,0x77,0xd9,0x77,0xd5, +0xd7,0xf6,0xa0,0xc3,0x41,0x97,0x83,0x1e,0x07,0x89,0x07,0x49,0x07,0x69,0x07,0x43, +0x0e,0x32,0x0e,0xb2,0x0f,0xa6,0x1f,0x14,0x1c,0x94,0x1e,0x54,0x1f,0x34,0x1d,0x6c, +0x3a,0xd8,0x71,0xb0,0xff,0xe0,0xc8,0xc1,0xc9,0x83,0xf3,0x07,0x57,0x0e,0xe2,0xdf, +0x71,0x7b,0xc7,0xf7,0x1d,0xfa,0x3b,0x8c,0x77,0x38,0xef,0xa4,0xbf,0xc3,0x7b,0x47, +0xf4,0x8e,0xf4,0x1d,0xe5,0x3b,0xba,0x77,0x4c,0xef,0x34,0xbc,0xd3,0xf2,0x4e,0xd7, +0x3b,0xfd,0xef,0x0c,0xbf,0x33,0xf6,0xce,0xd4,0x3b,0xf3,0xef,0x2c,0xbf,0x83,0xf3, +0x73,0xf0,0x73,0xf3,0x23,0xfa,0x51,0xfc,0x42,0xfc,0x18,0x7e,0x6c,0xbf,0x74,0x3f, +0x81,0x9f,0xd4,0x4f,0xed,0x67,0xf2,0x6b,0xf2,0xeb,0xf0,0x33,0xfb,0x0d,0xf9,0x8d, +0xfa,0x4d,0xfa,0x59,0xfc,0x96,0xfc,0x56,0xfd,0xf0,0x24,0x17,0x92,0x17,0x89,0x44, +0xa2,0x93,0x22,0x48,0xf1,0xa4,0x54,0x52,0x3a,0x29,0x93,0xc4,0x23,0x09,0x48,0x22, +0x92,0x84,0x24,0x25,0xc9,0x49,0x4a,0x92,0x9a,0xa4,0x23,0x19,0x49,0x26,0x52,0x2d, +0xa9,0x81,0xd4,0x44,0x6a,0x21,0xb5,0x91,0x3a,0x48,0x5d,0xa4,0x6e,0x92,0x99,0xd4, +0x4f,0x1a,0x24,0x0d,0x91,0x86,0x49,0x23,0xa4,0x51,0xd2,0x18,0x69,0x9c,0x34,0x49, +0x9a,0x22,0x4d,0x93,0x2c,0xa4,0x79,0xd2,0x02,0x69,0x89,0xb4,0x4c,0x5a,0x21,0xad, +0x92,0x70,0xfe,0xb6,0xfe,0x78,0x7f,0x07,0x7f,0x27,0x7f,0x17,0x7f,0x37,0x7f,0x0f, +0x7f,0x2f,0x7f,0xa2,0xbf,0xaf,0x3f,0xc9,0x9f,0xfc,0x2b,0x40,0xf1,0x0f,0xfd,0x97, +0x22,0xcc,0x9f,0xe5,0xcf,0xf6,0x4f,0xfb,0x17,0x82,0xbb,0xce,0x5f,0x05,0xcf,0x5f, +0xe0,0x2f,0x5c,0xe7,0x5f,0x1e,0x91,0xbf,0x78,0x9d,0x75,0xfe,0x86,0x48,0xfc,0x8b, +0xfe,0x29,0x90,0xfa,0xcb,0xfe,0x00,0x72,0x88,0xd2,0x5f,0xed,0xaf,0xf3,0x37,0xfa, +0x9b,0xfc,0x6b,0xfd,0x1b,0xfc,0x9b,0xfc,0x5b,0xfc,0xdb,0xfc,0x3b,0xfc,0xbb,0xfc, +0xbb,0xfd,0xcd,0xfe,0xfd,0xfe,0x83,0xfe,0x43,0xfe,0xc3,0xfe,0x23,0xfe,0xa3,0xfe, +0x63,0xfe,0xe3,0xfe,0x93,0xfe,0x53,0xfe,0xd3,0xfe,0x16,0xff,0x79,0xff,0x05,0xff, +0x25,0xff,0x65,0xff,0x15,0xff,0x55,0x7f,0x5c,0x80,0x6d,0x00,0x3e,0xc0,0x21,0xc0, +0x29,0xc0,0x25,0xc0,0x2d,0xc0,0x23,0xc0,0x2b,0x80,0x18,0xe0,0x1b,0x40,0x0a,0xa0, +0x04,0xd0,0x02,0xe8,0x01,0x21,0x01,0x61,0x01,0x11,0x01,0x8c,0x00,0x56,0x40,0x7c, +0x00,0x3b,0x80,0x13,0x90,0x1a,0x90,0x1e,0x90,0x19,0xc0,0x0b,0x10,0x04,0x88,0x02, +0x24,0x01,0xd2,0x00,0x79,0x80,0x32,0x40,0x1d,0xa0,0x0b,0x30,0x06,0x98,0x02,0x6a, +0x03,0x1a,0x02,0x9a,0x02,0x5a,0x02,0xda,0x02,0x3a,0x02,0xba,0x02,0xba,0x03,0xcc, +0x01,0xfd,0x01,0x83,0x01,0x43,0x01,0xc3,0x01,0x23,0x01,0xa3,0x01,0x63,0x01,0xe3, +0x01,0x93,0x01,0x53,0x01,0xd3,0x01,0x96,0x80,0xf9,0x80,0x85,0x80,0xa5,0x80,0xe5, +0x80,0x95,0x80,0xd5,0x00,0x1c,0xd9,0x96,0x8c,0x27,0x3b,0x90,0x9d,0xc8,0x2e,0x64, +0x37,0xb2,0x07,0xd9,0x8b,0x4c,0x24,0xfb,0x92,0x49,0x64,0x0a,0x99,0x46,0xa6,0x93, +0x43,0xc8,0x61,0xe4,0x08,0x32,0x83,0xcc,0x22,0xc7,0x93,0xd9,0x64,0x0e,0x39,0x95, +0x9c,0x4e,0xce,0x24,0xf3,0xc8,0x02,0xb2,0x88,0x2c,0x21,0x4b,0xc9,0x72,0xb2,0x92, +0xac,0x26,0xeb,0xc8,0x46,0xb2,0x89,0x5c,0x4b,0x6e,0x20,0x37,0x91,0x5b,0xc8,0x6d, +0xe4,0x0e,0x72,0x17,0xb9,0x9b,0x6c,0x26,0xf7,0x93,0x07,0xc9,0x43,0xe4,0x61,0xf2, +0x08,0x79,0x94,0x3c,0x46,0x1e,0x27,0x4f,0x92,0xa7,0xc8,0xd3,0x64,0x0b,0x79,0x9e, +0xbc,0x40,0x5e,0x22,0x2f,0x93,0x57,0xc8,0xab,0x64,0x1c,0xc5,0x96,0x82,0xa7,0x38, +0x50,0x9c,0x28,0x2e,0x14,0x37,0x8a,0x07,0xc5,0x8b,0x42,0xa4,0xf8,0x52,0x48,0x14, +0x0a,0x85,0x46,0xa1,0x53,0x42,0x28,0x61,0x94,0x08,0x0a,0x83,0xc2,0xa2,0xc4,0x53, +0xd8,0x14,0x0e,0x25,0x95,0x92,0x4e,0xc9,0xa4,0xf0,0x28,0x02,0x8a,0x88,0x22,0xa1, +0x48,0x29,0x72,0x8a,0x92,0xa2,0xa6,0xe8,0x28,0x46,0x8a,0x89,0x52,0x4b,0x69,0xa0, +0x34,0x51,0x5a,0x28,0x6d,0x94,0x0e,0x4a,0x17,0xa5,0x9b,0x62,0xa6,0xf4,0x53,0x06, +0x29,0x43,0x94,0x61,0xca,0x08,0x65,0x94,0x32,0x46,0x79,0xfc,0x37,0x60,0x1c,0x32, +0xf1,0x77,0x63,0x92,0xf2,0x84,0x32,0x45,0x99,0xa6,0x58,0x28,0x73,0x7f,0x02,0x8b, +0x90,0x97,0x10,0xf0,0x2e,0x78,0xd7,0x0e,0x42,0x80,0xb8,0x42,0x3c,0x21,0x3e,0x10, +0x32,0x24,0x10,0x12,0x0a,0x89,0xb4,0x12,0x07,0x49,0x86,0xa4,0xfd,0x16,0xdc,0x77, +0x85,0x90,0xa2,0x77,0x15,0x10,0xed,0xbb,0xd5,0x90,0xfa,0x77,0x9b,0x21,0xed,0xef, +0xde,0xf8,0xb3,0xe8,0x7b,0x83,0xfe,0x77,0x87,0xde,0x7d,0x00,0x19,0x7b,0x77,0xe2, +0x0f,0xf2,0x14,0x32,0x07,0x59,0x84,0xbc,0x84,0x80,0x43,0xe0,0x90,0x1d,0x84,0x00, +0x71,0x85,0x78,0x42,0x7c,0x20,0x64,0x48,0xa0,0x95,0x50,0x48,0x24,0x24,0xee,0xb7, +0x48,0x3e,0x94,0x06,0xe1,0x1e,0x12,0x42,0x8a,0x0e,0x29,0x20,0xda,0x43,0xd5,0x90, +0xfa,0x43,0xcd,0x7f,0x16,0xed,0x56,0x6e,0x1c,0xea,0x3b,0x74,0xef,0xd0,0x03,0x8c, +0xb1,0x43,0x13,0x7f,0x07,0x26,0x0f,0x4d,0x1d,0x9a,0x3e,0x64,0x39,0x34,0x7f,0x68, +0xe1,0xd0,0xd2,0xa1,0xe5,0x43,0x2b,0x87,0x56,0x0f,0xe1,0xa8,0xb6,0x54,0x3c,0xd5, +0x81,0xea,0x44,0x75,0xa1,0xba,0x51,0x3d,0xa8,0x5e,0x54,0x22,0xd5,0x97,0x4a,0xa2, +0x52,0xa8,0x34,0x2a,0x9d,0x1a,0x42,0x0d,0xa3,0x46,0x50,0x19,0x54,0x16,0x35,0x9e, +0xca,0xa6,0x72,0xa8,0xa9,0xd4,0x74,0x6a,0x26,0x95,0x47,0x15,0x50,0x45,0x54,0x09, +0x55,0x4a,0x95,0x53,0x95,0x54,0x35,0x55,0x47,0x35,0x52,0x4d,0xd4,0x5a,0x6a,0x03, +0xb5,0x89,0xda,0x42,0x6d,0xa3,0x76,0x50,0xbb,0xa8,0xdd,0x54,0x33,0xb5,0x9f,0x3a, +0x48,0x1d,0xa2,0x0e,0x53,0x47,0xa8,0xa3,0xd4,0x31,0xea,0x38,0x75,0x92,0x3a,0x45, +0x9d,0xa6,0x5a,0xa8,0xf3,0xd4,0x05,0xea,0x12,0x75,0x99,0xba,0x42,0x5d,0xa5,0xe2, +0x68,0xb6,0x34,0x3c,0xcd,0x81,0xe6,0x44,0x73,0xa1,0xb9,0xd1,0x3c,0x68,0x5e,0x34, +0x22,0xcd,0x97,0x46,0xa2,0x51,0x68,0x34,0x1a,0x9d,0x16,0x42,0x0b,0xa3,0x45,0xd0, +0x18,0x34,0x16,0x2d,0xce,0x4a,0x3c,0x8d,0x4d,0xe3,0xd0,0x52,0x69,0xe9,0xb4,0x4c, +0x1a,0x8f,0x26,0xa0,0x89,0x68,0x12,0x9a,0x94,0x26,0xa7,0x29,0x69,0x6a,0x9a,0xf6, +0x9f,0x1c,0x1d,0xa4,0x96,0xd6,0x42,0xeb,0xa2,0xf5,0xd3,0x86,0x69,0x63,0xb4,0x29, +0xda,0x3c,0x6d,0x99,0x86,0x7b,0xcf,0xe1,0x3d,0xb7,0xf7,0x88,0xef,0x51,0xde,0x0b, +0x7b,0x2f,0xfe,0xbd,0xf4,0xf7,0x44,0xef,0x29,0xdf,0x33,0xbd,0xd7,0xf2,0x5e,0xf7, +0x7b,0x43,0xef,0x8d,0xbd,0x37,0xfd,0xde,0xd2,0x7b,0xb8,0xf7,0x9d,0xde,0xf7,0x7a, +0x3f,0xe4,0xfd,0xa4,0xf7,0xd9,0xef,0xa7,0xbf,0x2f,0x78,0x5f,0xfa,0xbe,0xfa,0x7d, +0xd3,0xfb,0x4d,0xef,0x77,0xbc,0x6f,0x7e,0x7f,0xe8,0xfd,0xd1,0xf7,0x27,0xdf,0xb7, +0xbc,0xbf,0xf4,0xfe,0xea,0xfb,0xf8,0x40,0x97,0x40,0xaf,0x40,0x52,0x20,0x3d,0x30, +0x22,0x30,0x3e,0x30,0x35,0x90,0x17,0x28,0x09,0x54,0x06,0x1a,0x03,0x1b,0x02,0xdb, +0x02,0xbb,0x03,0x07,0x03,0x47,0x02,0xc7,0x03,0xa7,0x03,0x17,0x02,0x57,0x02,0x6d, +0xe9,0x78,0xba,0x03,0xdd,0x89,0xee,0xfc,0x3b,0xb8,0xd0,0xbd,0xe8,0xbe,0x74,0x0a, +0x9d,0x4e,0x0f,0xa3,0x33,0xe8,0xf1,0x74,0x0e,0x3d,0x9d,0xce,0xa3,0x8b,0xe8,0x52, +0xba,0x92,0xae,0xa3,0x9b,0xe8,0x0d,0xf4,0x26,0x7a,0x0b,0xbd,0x8d,0xde,0x41,0xef, +0xa2,0x77,0xd3,0xcd,0xf4,0x7e,0xfa,0x20,0x7d,0x88,0x3e,0x4c,0x1f,0xa1,0x8f,0xd2, +0xc7,0xe8,0x93,0xf4,0x69,0xfa,0x3c,0x7d,0x89,0xbe,0x42,0xc7,0x05,0xe1,0x83,0x9c, +0x82,0xdc,0x82,0xbc,0x82,0x7c,0x83,0x28,0x41,0xf4,0xa0,0xb0,0x20,0x76,0x50,0x66, +0x10,0x3f,0x48,0x10,0x24,0x0a,0x92,0x04,0x49,0x83,0xe4,0x41,0xca,0x20,0x75,0x90, +0x2e,0xc8,0x18,0x64,0x0a,0xaa,0x0d,0x6a,0x08,0x6a,0x0a,0x6a,0x09,0x6a,0x0b,0xea, +0x08,0xea,0x0a,0xea,0x0e,0x32,0x07,0xf5,0x07,0x0d,0x06,0x0d,0x05,0x0d,0x07,0x8d, +0x04,0x8d,0x06,0x8d,0x05,0x8d,0x07,0x4d,0x06,0x4d,0x05,0x4d,0x07,0x59,0x82,0xe6, +0x83,0x16,0x82,0x96,0x82,0x96,0x83,0x56,0x82,0x56,0x83,0x70,0x87,0x6d,0x0f,0xe3, +0x0f,0x3b,0x1c,0x76,0x3a,0xec,0x72,0xd8,0xed,0xb0,0xc7,0x61,0xaf,0xc3,0xc4,0xc3, +0xbe,0x87,0x49,0x87,0x29,0x87,0xe9,0x87,0xc3,0x0e,0x33,0x0e,0xc7,0x1f,0xe6,0x1c, +0x4e,0x3f,0xcc,0x3b,0x2c,0x3a,0x2c,0x3d,0xac,0x3c,0xac,0x3b,0x6c,0x3a,0xdc,0x70, +0xb8,0xe5,0x70,0xc7,0xe1,0xee,0xc3,0xfd,0x87,0x87,0x0e,0x8f,0x1c,0x1e,0x3b,0x3c, +0x79,0x78,0xfa,0xf0,0xfc,0xe1,0xa5,0xc3,0xab,0x87,0xf1,0xc1,0x2e,0xc1,0x1e,0xc1, +0xbe,0xc1,0x94,0xe0,0x90,0xe0,0xb0,0xe0,0x88,0x60,0x46,0x30,0x2b,0x38,0x3e,0x98, +0x1d,0xcc,0x09,0x4e,0x0d,0x4e,0x0f,0xce,0x0c,0xe6,0x05,0x0b,0x82,0x45,0xc1,0x92, +0x60,0x69,0xb0,0x3c,0x58,0x19,0xac,0x0e,0xd6,0x05,0x1b,0x83,0x4d,0xc1,0xb5,0xc1, +0x0d,0xc1,0x4d,0xc1,0x2d,0xc1,0x6d,0xc1,0x1d,0xc1,0x5d,0xc1,0xdd,0xc1,0xe6,0xe0, +0xfe,0xe0,0xc1,0xe0,0xa1,0xe0,0xe1,0xe0,0x91,0xe0,0xd1,0xe0,0xb1,0xe0,0xf1,0xe0, +0xc9,0xe0,0xa9,0xe0,0xe9,0x60,0x4b,0xf0,0x7c,0xf0,0x42,0xf0,0x52,0xf0,0x72,0xf0, +0x4a,0x30,0x2e,0x04,0x17,0xe2,0x12,0x42,0x0c,0xa1,0x87,0x44,0x84,0x70,0x42,0x32, +0x43,0x44,0x21,0xba,0x90,0x86,0x90,0xb6,0x90,0xee,0x90,0xc1,0x90,0xd1,0x90,0xa9, +0x90,0x85,0x90,0xd5,0x10,0x87,0x0f,0x3c,0x3e,0x20,0x7d,0x10,0xf1,0x01,0xeb,0x83, +0xcc,0x0f,0xe4,0x1f,0x98,0x3e,0x68,0xf9,0xa0,0xff,0x83,0xb1,0x0f,0xa6,0x3f,0x58, +0xf8,0x60,0xe5,0x03,0xfc,0x87,0x6e,0x1f,0x92,0x3e,0x0c,0xfb,0x90,0xf5,0x21,0xe7, +0x43,0xde,0x87,0x92,0x0f,0x95,0x1f,0xea,0x3e,0x34,0x7d,0xd8,0xf4,0x61,0xc7,0x87, +0x43,0x1f,0x8e,0x7d,0x68,0xf9,0x70,0xf5,0x43,0x87,0x50,0xb7,0x50,0x62,0x68,0x48, +0x28,0x2b,0x34,0x33,0x54,0x14,0xaa,0x0e,0x35,0x85,0xb6,0x84,0x76,0x85,0x0e,0x86, +0x8e,0x85,0x4e,0x87,0x2e,0x87,0xda,0x86,0x39,0x84,0x79,0x85,0x91,0xc2,0xe8,0x61, +0x8c,0x30,0x76,0x58,0x7a,0x98,0x20,0x4c,0x19,0x66,0x0a,0x6b,0x08,0xeb,0x0e,0x1b, +0x0c,0x1b,0x0b,0x9b,0x0e,0x5b,0x0a,0x5b,0x0d,0xc3,0x1f,0x71,0x3b,0xe2,0x75,0x84, +0x72,0x24,0xe2,0x08,0xeb,0x48,0xe6,0x11,0xd1,0x11,0xe9,0x11,0xe5,0x11,0xdd,0x11, +0xd3,0x91,0x86,0x23,0x2d,0x47,0x3a,0x8e,0x74,0x1f,0xe9,0x3f,0x32,0x74,0x64,0xf4, +0xc8,0xe4,0x11,0xcb,0x91,0xa5,0x23,0xab,0x47,0xf0,0x47,0x5d,0x8e,0x7a,0x1d,0x25, +0x1d,0xa5,0x1f,0x8d,0x38,0x1a,0x7f,0x34,0xf5,0x28,0xef,0xa8,0xe4,0xa8,0xf2,0xa8, +0xee,0xa8,0xe9,0x68,0xd3,0xd1,0xb6,0xa3,0x5d,0x47,0xcd,0x47,0x87,0x8e,0x8e,0x1e, +0x1d,0x3f,0x3a,0x75,0xd4,0x72,0x74,0xe1,0xe8,0xf2,0x51,0xdb,0x70,0x87,0x70,0x97, +0x70,0x8f,0x70,0x62,0x38,0x29,0x9c,0x16,0x1e,0x12,0x1e,0x11,0x1e,0x1f,0x9e,0x1e, +0xce,0x0b,0x17,0x85,0x4b,0xc3,0x95,0xe1,0xba,0x70,0x53,0x78,0x43,0x78,0x5b,0x78, +0x77,0xf8,0x60,0xf8,0x48,0xf8,0x58,0xf8,0x64,0xf8,0x74,0xf8,0x7c,0xf8,0x52,0xf8, +0x4a,0x38,0x2e,0x02,0x1f,0xe1,0x14,0xe1,0x16,0x41,0x8c,0xa0,0x44,0xd0,0x23,0x22, +0x22,0xe2,0x23,0x52,0x23,0x32,0x23,0x44,0x11,0xf2,0x08,0x63,0x44,0x6d,0x44,0x4b, +0x44,0x57,0x44,0x7f,0xc4,0x70,0xc4,0x64,0xc4,0x52,0xc4,0x4a,0x04,0xee,0x18,0xfe, +0x98,0xd3,0x31,0xb7,0x63,0x5e,0xc7,0x7c,0x8f,0x51,0x8e,0xd1,0x8f,0x85,0x1d,0x63, +0x1c,0x8b,0x3f,0xc6,0x39,0x96,0x7e,0x8c,0x77,0x4c,0x74,0x4c,0x7a,0x4c,0x79,0xcc, +0x74,0xac,0xe1,0x58,0xcb,0xb1,0x8e,0x63,0xfd,0xc7,0x86,0x8f,0x8d,0x1e,0x1b,0x3f, +0x36,0x75,0xcc,0x72,0x6c,0xe1,0xd8,0xf2,0xb1,0xd5,0x63,0xb6,0xc7,0x1d,0x8e,0xbb, +0x1c,0xf7,0x3a,0xee,0x7b,0x9c,0x72,0x3c,0xe4,0x38,0xe3,0x78,0xfc,0xf1,0xf4,0xe3, +0x82,0xe3,0x92,0xe3,0xf2,0xe3,0xea,0xe3,0xc6,0xe3,0x0d,0xc7,0xdb,0x8e,0x77,0x1d, +0x37,0x1f,0x1f,0x3c,0x3e,0x7c,0x7c,0xf4,0xf8,0xf8,0xf1,0xa9,0xe3,0x96,0xe3,0x0b, +0xc7,0x57,0x8e,0xdb,0x46,0x3a,0x45,0x7a,0x44,0xfa,0x46,0xd2,0x22,0xc3,0x22,0x59, +0x91,0x9c,0xc8,0xcc,0x48,0x51,0xa4,0x3c,0x52,0x17,0x59,0x1b,0xd9,0x12,0xd9,0x15, +0xd9,0x1f,0x39,0x1c,0x39,0x16,0x39,0x15,0x39,0x1f,0xb9,0x1c,0x09,0x18,0xeb,0xfc, +0x65,0xe0,0x18,0xb6,0x0c,0xbb,0x75,0xfe,0x09,0xc0,0x33,0xec,0xff,0xed,0x71,0x60, +0x38,0x31,0x5c,0x18,0xae,0x56,0xdc,0x18,0x1e,0x0c,0xcf,0x7f,0x09,0xbc,0x18,0x44, +0x86,0x2f,0x83,0xc4,0x20,0xff,0x1f,0x50,0x18,0xd4,0x75,0xfe,0x2c,0x02,0x19,0xc1, +0x8c,0x50,0x46,0x38,0x23,0x92,0xc1,0x64,0xc4,0x31,0x92,0x18,0xc9,0x8c,0x14,0x46, +0x1a,0x23,0x83,0xc1,0x65,0xf0,0x19,0x42,0x86,0x98,0x51,0xc4,0x90,0x31,0x14,0x0c, +0x15,0x43,0xcb,0x30,0x30,0xaa,0x19,0x35,0x8c,0x7a,0x46,0x23,0xa3,0x99,0xd1,0xca, +0x68,0x67,0x74,0x32,0x6e,0x30,0x7a,0x19,0x7d,0x8c,0x01,0xc6,0x3d,0xc6,0x7d,0xc6, +0x03,0xc6,0x43,0xc6,0x23,0xc6,0x63,0xc6,0x04,0xe3,0x09,0xe3,0x29,0x63,0x86,0x31, +0xc7,0x78,0xce,0x58,0x64,0xbc,0x60,0xbc,0x64,0xbc,0x62,0x80,0x28,0x9b,0x28,0xbb, +0x28,0xfb,0x28,0x42,0x94,0x73,0x94,0x6b,0x94,0x7b,0x94,0x67,0x94,0x77,0x94,0x4f, +0x94,0x5f,0x14,0x39,0x8a,0x1a,0x15,0x18,0x15,0x1c,0x15,0x1a,0x15,0x1e,0x15,0x19, +0xc5,0x8c,0x8a,0x8b,0x4a,0x8a,0x4a,0x8e,0x4a,0x89,0x4a,0x8b,0xca,0x88,0xe2,0x46, +0xf1,0xa3,0x84,0x51,0xe2,0xa8,0xa2,0x28,0x59,0x94,0x22,0x4a,0x15,0xa5,0x8d,0x32, +0x44,0x55,0x47,0xd5,0x44,0xd5,0x47,0x35,0x46,0x35,0x47,0xb5,0x46,0xb5,0x47,0x75, +0x46,0xdd,0x88,0xea,0x8d,0xea,0x8b,0x1a,0x88,0xba,0x17,0x75,0x3f,0xea,0x41,0xd4, +0xc3,0xa8,0x47,0x51,0x8f,0xa3,0x26,0xa2,0x9e,0x44,0x3d,0x8d,0x9a,0x89,0x9a,0x8b, +0x7a,0x1e,0xb5,0x18,0xf5,0x22,0xea,0x65,0xd4,0xab,0x28,0x10,0x6d,0x13,0x6d,0x17, +0x6d,0x1f,0x4d,0x88,0x76,0x8e,0x76,0x8d,0x76,0x8f,0xf6,0x8c,0xf6,0x8e,0xf6,0x89, +0xf6,0x8b,0x26,0x47,0x53,0xa3,0x03,0xa3,0x83,0xa3,0x43,0xa3,0xc3,0xa3,0x23,0xa3, +0x99,0xd1,0x71,0xd1,0x49,0xd1,0xc9,0xd1,0x29,0xd1,0x69,0xd1,0x19,0xd1,0xdc,0x68, +0x7e,0xb4,0x30,0x5a,0x1c,0x5d,0x14,0x2d,0x8b,0x56,0x44,0xab,0xa2,0xb5,0xd1,0x86, +0xe8,0xea,0xe8,0x9a,0xe8,0xfa,0xe8,0xc6,0xe8,0xe6,0xe8,0xd6,0xe8,0xf6,0xe8,0xce, +0xe8,0x1b,0xd1,0xbd,0xd1,0x7d,0xd1,0x03,0xd1,0xf7,0xa2,0xef,0x47,0x3f,0x88,0x7e, +0x18,0xfd,0x28,0xfa,0x71,0xf4,0x44,0xf4,0x93,0xe8,0xa7,0xd1,0x33,0xd1,0x73,0xd1, +0xcf,0xa3,0x17,0xa3,0x5f,0x44,0xbf,0x8c,0x7e,0x15,0x0d,0x98,0x36,0x4c,0x3b,0xa6, +0x3d,0x93,0xc0,0x74,0x66,0xba,0x32,0xdd,0x99,0x9e,0x4c,0x6f,0xa6,0x0f,0xd3,0x8f, +0x49,0x66,0x52,0x99,0x81,0xcc,0x60,0x66,0x28,0x33,0x9c,0x19,0xc9,0x64,0x32,0xe3, +0x98,0x49,0xcc,0x64,0x66,0x0a,0x33,0x8d,0x99,0xc1,0xe4,0x32,0xf9,0x4c,0x21,0x53, +0xcc,0x2c,0x62,0xca,0x98,0x0a,0xa6,0x8a,0xa9,0x65,0x1a,0x98,0xd5,0xcc,0x1a,0x66, +0x3d,0xb3,0x91,0xd9,0xcc,0x6c,0x65,0xb6,0x33,0x3b,0x99,0x37,0x98,0xbd,0xcc,0x3e, +0xe6,0x00,0xf3,0x1e,0xf3,0x3e,0xf3,0x01,0xf3,0x21,0xf3,0x11,0xf3,0x31,0x73,0x82, +0xf9,0x84,0xf9,0x94,0x39,0xc3,0x9c,0x63,0x3e,0x67,0x2e,0x32,0x5f,0x30,0x5f,0x32, +0x5f,0x31,0x01,0xcb,0x86,0x65,0xc7,0xb2,0x67,0x11,0x58,0xce,0x2c,0x57,0x96,0x3b, +0xcb,0x93,0xe5,0xcd,0xf2,0x61,0xf9,0xb1,0xc8,0x2c,0xf8,0x85,0x8b,0x15,0xc8,0x0a, +0x66,0x85,0xb2,0xc2,0x59,0x91,0x2c,0x26,0x2b,0x8e,0x95,0xc4,0x4a,0x66,0xa5,0xb0, +0xd2,0x58,0x19,0x2c,0x2e,0x8b,0x6f,0x45,0x08,0x11,0x5b,0x29,0x62,0xc9,0x58,0x0a, +0x96,0x8a,0xa5,0x65,0x19,0x58,0xd5,0xac,0x1a,0x56,0x3d,0xab,0x11,0xd2,0x0c,0x69, +0xb5,0xd2,0xce,0xea,0xc4,0xb8,0xc1,0xea,0x65,0xf5,0xb1,0x06,0x58,0xf7,0x58,0xf7, +0x59,0x0f,0x58,0x0f,0x59,0x8f,0x58,0x8f,0x59,0x13,0xac,0x27,0xac,0xa7,0xac,0x19, +0xd6,0x1c,0xeb,0x39,0x6b,0x91,0xf5,0x82,0xf5,0x92,0xf5,0x8a,0x05,0x62,0x6c,0x62, +0xec,0x62,0xec,0x63,0x08,0x31,0xce,0x31,0xae,0x31,0xee,0x31,0x9e,0x31,0xde,0x31, +0x3e,0x31,0x7e,0x31,0xe4,0x18,0x6a,0x4c,0x60,0x4c,0x70,0x4c,0x68,0x4c,0x78,0x4c, +0x64,0x0c,0x33,0x26,0x2e,0x26,0x29,0x26,0x39,0x26,0x25,0x26,0x2d,0x26,0x23,0x86, +0x1b,0xc3,0x8f,0x11,0xc6,0x88,0x63,0x8a,0x62,0x64,0x31,0x8a,0x18,0x55,0x8c,0x36, +0xc6,0x10,0x53,0x1d,0x53,0x13,0x53,0x1f,0xd3,0x18,0xd3,0x1c,0xd3,0x1a,0xd3,0x1e, +0xd3,0x19,0x73,0x23,0xa6,0x37,0xa6,0x2f,0x66,0xc0,0xca,0xbd,0x98,0xfb,0x31,0x0f, +0x62,0x1e,0xc6,0x3c,0x8a,0x79,0x1c,0x33,0x11,0xf3,0x24,0xe6,0x69,0xcc,0x4c,0xcc, +0x5c,0xcc,0xf3,0x98,0xc5,0x98,0x17,0x31,0x2f,0x63,0x5e,0xc5,0x80,0x58,0x9b,0x58, +0xbb,0x58,0xfb,0x58,0x42,0xac,0x73,0xac,0x6b,0xac,0x7b,0xac,0x67,0xac,0x77,0xac, +0x4f,0xac,0x5f,0x2c,0x39,0x96,0x1a,0x1b,0x18,0x1b,0x1c,0x1b,0x1a,0x1b,0x1e,0x1b, +0x19,0xcb,0x8c,0x8d,0x8b,0x4d,0x8a,0x4d,0x8e,0x4d,0x89,0x4d,0x8b,0xcd,0x88,0xe5, +0xc6,0xf2,0x63,0x85,0xb1,0xe2,0xd8,0xa2,0x58,0x59,0xac,0x22,0x56,0x15,0xab,0x8d, +0x35,0xc4,0x56,0xc7,0xd6,0xc4,0xd6,0xc7,0x36,0xc6,0x36,0xc7,0xb6,0xc6,0xb6,0xc7, +0x76,0xc6,0xde,0x88,0xed,0x8d,0xed,0x8b,0x1d,0x88,0xbd,0x17,0x7b,0x3f,0xf6,0x41, +0xec,0xc3,0xd8,0x47,0xb1,0x8f,0x63,0x27,0x62,0x9f,0xc4,0x3e,0x8d,0x9d,0x89,0x9d, +0x8b,0x7d,0x1e,0xbb,0x18,0xfb,0x22,0xf6,0x65,0xec,0xab,0x58,0x10,0x67,0x13,0x67, +0x17,0x67,0x1f,0x47,0x88,0x73,0x8e,0x73,0x8d,0x73,0x8f,0xf3,0x8c,0xf3,0x8e,0xf3, +0x89,0xf3,0x8b,0x23,0xc7,0x51,0xe3,0x02,0xe3,0x82,0xe3,0x42,0xe3,0xc2,0xe3,0x22, +0xe3,0x98,0x71,0x71,0x71,0x49,0x71,0xc9,0x71,0x29,0x71,0x69,0x71,0x19,0xbf,0x22, +0x99,0x10,0x41,0x9c,0x24,0x4e,0x1e,0xa7,0x8b,0xab,0x8d,0x6b,0x8a,0x6b,0xfd,0x03, +0xb4,0xc5,0x75,0xc5,0x99,0xe3,0x06,0xe3,0x86,0xe3,0x1e,0xbe,0xc1,0x63,0xc8,0x54, +0xdc,0x74,0x9c,0x25,0x6e,0x3e,0x6e,0x21,0x6e,0x29,0x6e,0x39,0x6e,0x25,0x6e,0x35, +0x0e,0x17,0x6f,0x13,0x6f,0x1f,0xef,0x1c,0xef,0x19,0xef,0x17,0x4f,0x8d,0x0f,0x8e, +0x0f,0x8f,0x67,0xc6,0x27,0xc5,0xa7,0xc4,0x67,0xc4,0xf3,0xe3,0xc5,0x10,0x59,0xbc, +0x2a,0xde,0x10,0x5f,0x13,0xdf,0x08,0x69,0x85,0x74,0xc6,0xf7,0x42,0x06,0xe2,0xef, +0x43,0x1e,0xc6,0x3f,0x8e,0x7f,0x12,0x3f,0x13,0xff,0x3c,0xfe,0x45,0xfc,0xab,0x78, +0x9b,0x04,0x87,0x04,0x97,0x04,0xb7,0x04,0x8f,0x04,0xaf,0x04,0x62,0x82,0x6f,0x02, +0x29,0x81,0x92,0x40,0x4b,0xa0,0x27,0x84,0x24,0x84,0x25,0x44,0x24,0x30,0x12,0x58, +0x09,0xf1,0x09,0xec,0x04,0x4e,0x42,0x6a,0x42,0x7a,0x42,0x66,0x02,0x2f,0x41,0x90, +0x20,0x4a,0x90,0x24,0x48,0x13,0xe4,0x09,0xca,0x04,0x75,0x82,0x2e,0xc1,0x98,0x60, +0x4a,0xa8,0x4d,0x68,0x48,0x68,0x4a,0x68,0x49,0x68,0x4b,0xe8,0x48,0xe8,0x4a,0xe8, +0x4e,0x30,0x27,0xf4,0x27,0x0c,0x26,0x0c,0x25,0x0c,0x27,0x8c,0x24,0x8c,0x26,0x8c, +0x25,0x8c,0x27,0x4c,0x26,0x4c,0x25,0x4c,0x27,0x58,0x12,0xe6,0x13,0x16,0x12,0x96, +0x12,0x96,0x13,0x56,0x12,0x56,0x13,0x70,0x89,0xb6,0x89,0xf8,0x44,0x87,0x44,0xa7, +0x44,0x97,0x44,0xb7,0x44,0x8f,0x44,0xaf,0x44,0x62,0xa2,0x6f,0x22,0x29,0x91,0x92, +0x48,0x4b,0xa4,0x27,0x86,0x24,0x86,0x25,0x46,0x24,0x32,0x12,0x59,0x89,0xf1,0x89, +0xec,0x44,0x4e,0x62,0x6a,0x62,0x7a,0x62,0x66,0xa2,0x20,0x51,0x92,0x28,0x4d,0x94, +0x27,0x2a,0x13,0xd5,0x89,0xba,0x44,0x63,0xa2,0x29,0xb1,0x36,0xb1,0x21,0xb1,0x29, +0xb1,0x2d,0xb1,0xf3,0xaf,0xa6,0x2b,0xb1,0x3b,0xd1,0x9c,0xd8,0x9f,0x38,0x98,0x38, +0x94,0x38,0x9c,0x38,0x92,0x38,0x9a,0x38,0x96,0x38,0x9e,0x38,0x95,0x38,0x9d,0x68, +0x49,0x9c,0x4f,0x5c,0x48,0x5c,0x4a,0x5c,0x4e,0x5c,0x49,0x5c,0x4d,0xc4,0x25,0xd9, +0x26,0xe1,0x93,0x1c,0x92,0xdc,0x92,0x88,0x49,0x94,0xa4,0x90,0x24,0x46,0x12,0x3b, +0x29,0x3d,0x49,0x90,0x24,0x4d,0x52,0x27,0x99,0x92,0x9a,0x92,0x3a,0x92,0xcc,0x49, +0x43,0x49,0xa3,0x49,0x93,0x49,0x96,0xa4,0xf9,0xa4,0x85,0xa4,0xa5,0xa4,0x65,0x08, +0x8e,0xed,0xc0,0x76,0x63,0x13,0xd9,0x14,0x36,0x9d,0x1d,0xc6,0x66,0xb0,0xe3,0xd9, +0x1c,0x76,0x3a,0x9b,0xc7,0x16,0xb1,0xa5,0x6c,0x25,0x5b,0xc7,0x36,0xb1,0x1b,0xd8, +0x2d,0xec,0x0e,0x76,0x37,0xbb,0x9f,0x3d,0xc4,0x1e,0x61,0x8f,0xb1,0x27,0xd9,0xd3, +0xec,0x79,0xf6,0x12,0x7b,0x85,0x8d,0x3b,0x81,0x3f,0xe1,0x74,0xc2,0xed,0x84,0xd7, +0x09,0xdf,0x13,0x94,0x13,0xf4,0x13,0x61,0x27,0x18,0x27,0xe2,0x4f,0x70,0x4e,0xa4, +0x9f,0xe0,0x9d,0x10,0x9d,0x90,0x9e,0x50,0x9e,0xd0,0x9d,0x30,0x9d,0x68,0x38,0xd1, +0x72,0xa2,0xe3,0x44,0xf7,0x89,0xfe,0x13,0x43,0x27,0x46,0x4e,0x8c,0x9d,0x98,0x3c, +0x31,0x7d,0x62,0xfe,0xc4,0xd2,0x89,0x95,0x13,0xb8,0x93,0xf8,0x93,0x4e,0x27,0xdd, +0x4e,0x7a,0x9d,0xf4,0x3d,0x49,0x39,0x49,0x3f,0x19,0x76,0x92,0x71,0x32,0xfe,0x24, +0xe7,0x64,0xfa,0x49,0xde,0x49,0xd1,0x49,0xe9,0x49,0xe5,0x49,0xdd,0x49,0xd3,0xc9, +0x86,0x93,0x2d,0x27,0x3b,0x4e,0x76,0x9f,0xec,0x3f,0x39,0x74,0x72,0xe4,0xe4,0xd8, +0xc9,0xc9,0x93,0xd3,0x27,0xe7,0x4f,0x2e,0x9d,0x5c,0x39,0x69,0x9b,0xec,0x94,0xec, +0x91,0xec,0x9b,0x4c,0x4b,0x0e,0x4b,0x66,0x25,0x73,0x92,0x33,0x93,0x45,0xc9,0xf2, +0x64,0x5d,0xb2,0x29,0xb9,0x21,0xb9,0x25,0xb9,0x23,0xb9,0x3b,0xb9,0x3f,0x79,0x28, +0x79,0x24,0x79,0x2c,0x79,0x32,0x79,0x3a,0x79,0x3e,0x79,0x29,0x79,0x25,0x19,0xc7, +0xc1,0x73,0x9c,0x38,0x6e,0x1c,0x2f,0x8e,0x2f,0x87,0xc2,0xa1,0x73,0xc2,0x38,0x0c, +0x4e,0x3c,0x87,0xc3,0x49,0xe7,0xf0,0x38,0x22,0x8e,0x94,0xa3,0xe4,0xe8,0x38,0x26, +0x4e,0x03,0xa7,0x85,0xd3,0xc1,0xe9,0xe6,0xf4,0x73,0x86,0x38,0x23,0x9c,0x31,0xce, +0x24,0x67,0x9a,0x33,0xcf,0x59,0xe2,0xac,0x72,0xf0,0xa7,0x5c,0x4e,0x79,0x9d,0x22, +0x9d,0xa2,0x9d,0x0a,0x39,0x15,0x71,0x8a,0x75,0x8a,0x7d,0x2a,0xf5,0x54,0xe6,0x29, +0xc1,0x29,0xc9,0x29,0xf9,0x29,0xf5,0x29,0xe3,0xa9,0xda,0x53,0x4d,0xa7,0xda,0x4e, +0x75,0x9d,0x32,0x9f,0x1a,0x3c,0x35,0x7c,0x6a,0xf4,0xd4,0xf8,0xa9,0xa9,0x53,0x96, +0x53,0x0b,0xa7,0x96,0x4f,0xad,0x9e,0xb2,0x3d,0xed,0x70,0xda,0xe5,0xb4,0xc7,0x69, +0xe2,0x69,0xd2,0x69,0xda,0xe9,0x90,0xd3,0x11,0xa7,0x59,0xa7,0xd9,0xa7,0x53,0x4f, +0x67,0x9e,0x16,0x9c,0x96,0x9c,0x96,0x9f,0x56,0x9f,0x36,0x9e,0xae,0x3d,0xdd,0x74, +0xba,0xed,0x74,0xd7,0x69,0xf3,0xe9,0xc1,0xd3,0xc3,0xa7,0x47,0x4f,0x8f,0x9f,0x9e, +0x3a,0x6d,0x39,0xbd,0x70,0x7a,0xf9,0xf4,0xea,0x69,0xdb,0x14,0x87,0x14,0x97,0x14, +0x8f,0x14,0x62,0x0a,0x29,0x85,0x96,0x12,0x92,0x12,0x91,0x12,0x9f,0x92,0x9a,0x92, +0x99,0x22,0x48,0x91,0xa4,0xc8,0x53,0xd4,0x29,0xc6,0x94,0xda,0x94,0xa6,0x94,0xb6, +0x94,0xae,0x14,0x73,0xca,0x60,0xca,0x70,0xca,0x68,0xca,0x78,0xca,0x54,0x8a,0x25, +0x65,0x29,0x65,0x35,0x05,0x9f,0xea,0x94,0xea,0x96,0xea,0x95,0xea,0x9b,0x4a,0x49, +0xa5,0xa7,0x86,0xa5,0x32,0x52,0xe3,0x53,0x39,0xa9,0xe9,0x10,0x5e,0xaa,0x28,0x55, +0x9a,0xaa,0x4c,0xd5,0xa5,0x9a,0x52,0x1b,0x52,0x5b,0x52,0x3b,0x52,0xbb,0x53,0xfb, +0x53,0x87,0x52,0x47,0x52,0xc7,0x52,0x27,0x53,0xa7,0x53,0xe7,0x53,0x97,0x52,0x57, +0x52,0x71,0x67,0xf0,0x67,0x9c,0xce,0xb8,0x9d,0xf1,0x3a,0xe3,0x7b,0x86,0x72,0x86, +0x7e,0x26,0xec,0x0c,0xe3,0x4c,0xfc,0x19,0xce,0x99,0xf4,0x33,0xbc,0x33,0xa2,0x33, +0xd2,0x33,0xca,0x33,0xba,0x33,0xa6,0x33,0x0d,0x67,0x5a,0xce,0x74,0x9c,0xe9,0x3e, +0xd3,0x7f,0x66,0xe8,0xcc,0xc8,0x99,0xb1,0x33,0x93,0x67,0xa6,0xcf,0xcc,0x9f,0x59, +0x3a,0xb3,0x72,0x06,0x77,0x16,0x7f,0xd6,0xe9,0xac,0xdb,0x59,0xaf,0xb3,0xbe,0x67, +0x29,0x67,0xe9,0x67,0xc3,0xce,0x32,0xce,0xc6,0xfd,0x09,0xc4,0x9f,0x4d,0x3d,0xcb, +0x3b,0x2b,0x39,0xab,0x3c,0x6b,0x3c,0xdb,0x70,0xb6,0xed,0x6c,0xf7,0xd9,0xc1,0xb3, +0x23,0x67,0xc7,0xcf,0x4e,0x9f,0x5d,0x38,0xbb,0x72,0xd6,0x36,0xcd,0x29,0xcd,0x23, +0xcd,0x37,0x8d,0x96,0x16,0x96,0xc6,0x4a,0xe3,0xa4,0x65,0xa6,0x89,0xd2,0xe4,0x69, +0xba,0xb4,0xda,0xb4,0x96,0xb4,0xae,0xb4,0xfe,0xb4,0xe1,0xb4,0xb1,0xb4,0xa9,0xb4, +0xf9,0xb4,0xe5,0x34,0x5c,0xba,0x43,0xba,0x5b,0x3a,0x31,0x9d,0x92,0x1e,0x92,0xce, +0x48,0x67,0xa7,0xa7,0xa7,0x0b,0xd2,0xa5,0xe9,0xea,0x74,0x53,0x7a,0x53,0x7a,0x47, +0xba,0x39,0x7d,0x28,0x7d,0x34,0x7d,0x32,0xdd,0x92,0xbe,0x94,0xbe,0x9a,0x8e,0xff, +0xc8,0xe5,0x23,0xaf,0x8f,0x48,0x1f,0xd1,0x3f,0x8a,0xf8,0x28,0x0e,0x12,0xff,0x51, +0xea,0x47,0xbc,0x8f,0x24,0x1f,0x29,0x3f,0x32,0x7e,0xd4,0xf0,0x51,0xdb,0x47,0xdd, +0x1f,0x0d,0x7e,0x34,0xf2,0xd1,0xf8,0x47,0xd3,0x1f,0x2d,0x7c,0xb4,0xf2,0x91,0xed, +0xc7,0x4e,0x1f,0x7b,0x7c,0xec,0xfb,0x31,0xed,0xe3,0xb0,0x8f,0x59,0x1f,0x73,0x3e, +0xce,0xfc,0x58,0xf4,0xb1,0xfc,0x63,0xdd,0xc7,0xb5,0x1f,0xb7,0x7c,0xdc,0xf5,0x71, +0xff,0xc7,0xc3,0x1f,0x8f,0x7d,0x3c,0xf5,0xf1,0xfc,0xc7,0xcb,0x1f,0xe3,0x32,0x1c, +0x32,0xdc,0x32,0x88,0x19,0x94,0x8c,0x90,0x0c,0x46,0x06,0x3b,0x23,0x3d,0x43,0x90, +0x21,0xcd,0x50,0x67,0x98,0x32,0x9a,0x32,0x3a,0x32,0xcc,0x19,0x43,0x19,0xa3,0x19, +0x13,0xbf,0x32,0x93,0x19,0x96,0x8c,0xa5,0x0c,0x5c,0xa6,0x53,0xa6,0x57,0x26,0x25, +0x33,0x2c,0x33,0x3e,0x33,0x3d,0x53,0x90,0x69,0xce,0x1c,0xcf,0x9c,0xf9,0x13,0xb1, +0x64,0xce,0x67,0x2e,0x64,0x2e,0x65,0x2e,0x67,0xae,0x64,0xae,0x66,0xe2,0xb2,0x6c, +0xb3,0xf0,0x59,0xce,0x7f,0x06,0x2e,0x59,0x1e,0x59,0x5e,0x59,0xc4,0x2c,0xdf,0x2c, +0x52,0x16,0x25,0x8b,0x96,0x45,0xcf,0x0a,0xc9,0x0a,0xcb,0x8a,0xc8,0x62,0x64,0xb1, +0xb2,0xe2,0xb3,0xd8,0x59,0x9c,0xac,0xd4,0xac,0xf4,0xac,0xcc,0x2c,0x5e,0x16,0x1f, +0x22,0xc8,0x12,0x65,0x49,0xb2,0xe4,0x59,0xea,0x2c,0x63,0x56,0x6d,0x56,0x43,0x56, +0x53,0x56,0x4b,0x56,0x5b,0x56,0x47,0x56,0x67,0x56,0x57,0x56,0x77,0x96,0x39,0xab, +0x3f,0x6b,0x30,0x6b,0x28,0x6b,0x38,0x6b,0x24,0x6b,0x34,0x6b,0x2c,0x6b,0x3c,0x6b, +0x32,0x6b,0x2a,0x6b,0x3a,0xcb,0x92,0x35,0x9f,0xb5,0x90,0xb5,0x94,0xb5,0x9c,0xf5, +0x32,0x6b,0x25,0x6b,0x35,0x0b,0x77,0xce,0xf6,0x9c,0x1d,0x06,0xfe,0x9c,0xd3,0x39, +0xb7,0x73,0x9e,0xe7,0xbc,0xce,0xf9,0x9c,0xf3,0x3d,0x47,0x39,0x47,0x3f,0x17,0x76, +0x8e,0x71,0x2e,0xfe,0x1c,0xe7,0x5c,0xfa,0x39,0xde,0x39,0xd1,0x39,0xe9,0x39,0xf9, +0x39,0xf5,0x39,0xe3,0xb9,0xda,0x73,0x4d,0xe7,0xda,0xce,0x75,0x9d,0x33,0x9f,0x1b, +0x3c,0x37,0x7c,0x6e,0xf4,0xdc,0xf8,0xb9,0xa9,0x73,0xd3,0xe7,0x2c,0xe7,0xe6,0xcf, +0x2d,0x9c,0x5b,0x3a,0xb7,0x7c,0x6e,0xe5,0xdc,0xea,0x39,0x1c,0xd7,0x96,0x8b,0xe7, +0x3a,0x70,0x9d,0xb8,0x2e,0x5c,0x37,0xae,0x07,0xd7,0x8b,0x4b,0xe4,0xfa,0x72,0x49, +0x5c,0x0a,0x97,0xc6,0xa5,0x73,0x43,0xb8,0x61,0xdc,0x08,0x2e,0x83,0xcb,0xe2,0xc6, +0x73,0xd9,0x5c,0x0e,0x37,0x95,0x9b,0xce,0xcd,0xe4,0xf2,0xb8,0x02,0xae,0x88,0x2b, +0xe1,0x4a,0xb9,0x72,0xae,0x92,0xab,0xe6,0xea,0xb8,0x46,0xae,0x89,0x5b,0xcb,0x6d, +0xe0,0x36,0x71,0x5b,0xb8,0x6d,0xdc,0x0e,0x6e,0x17,0xb7,0x9b,0x6b,0xe6,0xf6,0x73, +0x07,0xb9,0x43,0xdc,0x61,0xee,0x08,0x77,0x94,0x3b,0xc6,0x1d,0xe7,0x4e,0x72,0xa7, +0xb8,0xd3,0x5c,0x0b,0x77,0x9e,0xbb,0xc0,0x5d,0xe2,0x2e,0x73,0x57,0xb8,0xab,0x5c, +0x1c,0xcf,0x96,0x87,0xe7,0x39,0xf0,0x9c,0x78,0x2e,0x3c,0x37,0x9e,0x07,0xcf,0x8b, +0x47,0xe4,0xf9,0xf2,0x48,0x3c,0x0a,0x8f,0xc6,0xa3,0xf3,0x42,0x78,0x61,0xbc,0x08, +0x1e,0x83,0xc7,0xe2,0xc5,0xf3,0xd8,0x3c,0x0e,0x2f,0x95,0x97,0xce,0xcb,0xe4,0xf1, +0x78,0x02,0x9e,0x88,0x27,0xe1,0x49,0x79,0x72,0x9e,0x8e,0x57,0xcb,0x6b,0xe1,0x75, +0xf1,0xfa,0x79,0xc3,0xbc,0x51,0xde,0xe3,0x5f,0x18,0xe7,0x4d,0xf2,0xa6,0x78,0xd3, +0x3c,0x0b,0x6f,0x9e,0xb7,0xc0,0x5b,0xe2,0x2d,0xf3,0x56,0x78,0xab,0x3c,0x5c,0xb6, +0x6d,0x36,0x3e,0xdb,0x21,0xdb,0x29,0xdb,0x25,0xdb,0x2d,0xdb,0x23,0xdb,0x2b,0x9b, +0x98,0xed,0x9b,0x4d,0xca,0xa6,0x64,0xd3,0xb2,0xe9,0xd9,0x21,0xd9,0x61,0xd9,0x11, +0xd9,0x8c,0x6c,0x56,0x76,0x7c,0x36,0x3b,0x9b,0x93,0x9d,0x9a,0x9d,0x9e,0x9d,0x99, +0xcd,0xcb,0x16,0x64,0x8b,0xb2,0x25,0xd9,0xd2,0x6c,0x79,0xb6,0x32,0x5b,0x9d,0xad, +0xcb,0x36,0x66,0x9b,0xb2,0x6b,0xb3,0x1b,0xb2,0x9b,0xb2,0x5b,0xb2,0xdb,0xb2,0x3b, +0xb2,0xbb,0xb2,0xbb,0xb3,0xcd,0xd9,0xfd,0xd9,0x83,0xd9,0x43,0xd9,0xc3,0xd9,0x23, +0xd9,0xa3,0xd9,0x63,0xd9,0xe3,0xd9,0x93,0xd9,0x53,0xd9,0xd3,0xd9,0x96,0xec,0xf9, +0xec,0x85,0xec,0xa5,0xec,0xe5,0xec,0x95,0xec,0xd5,0x6c,0x5c,0x8e,0x6d,0x0e,0x3e, +0xc7,0x21,0xc7,0x29,0xc7,0x25,0xc7,0x2d,0xc7,0x23,0xc7,0x2b,0x87,0x98,0xe3,0x9b, +0x43,0xca,0xa1,0xe4,0xd0,0x72,0xe8,0x39,0x21,0x39,0x61,0x39,0x11,0x39,0x8c,0x1c, +0x56,0x4e,0x7c,0x0e,0x3b,0x87,0x93,0x93,0x9a,0x93,0x9e,0x93,0x99,0xc3,0xcb,0x11, +0xe4,0x88,0x72,0x24,0x39,0xd2,0x1c,0x79,0x8e,0x32,0x47,0x9d,0xa3,0xcb,0x31,0xe6, +0x98,0x72,0x6a,0x73,0x1a,0x72,0x9a,0x72,0x5a,0x72,0xda,0x72,0x3a,0x72,0xba,0x72, +0xba,0x73,0xcc,0x39,0xfd,0x39,0x83,0x39,0x43,0x39,0xc3,0x39,0x23,0x39,0xa3,0x39, +0x63,0x39,0xe3,0x39,0x93,0x39,0x53,0x39,0xd3,0x39,0x96,0x9c,0xf9,0x9c,0x85,0x9c, +0xa5,0x9c,0xe5,0x9c,0x95,0x9c,0xd5,0x1c,0x1c,0xdf,0x96,0x8f,0xe7,0x3b,0xf0,0x9d, +0xf8,0x2e,0x7c,0x37,0xbe,0x07,0xdf,0x8b,0x4f,0xe4,0xfb,0xf2,0x49,0x7c,0x0a,0x9f, +0xc6,0xa7,0xf3,0x43,0xf8,0x61,0xfc,0x08,0x3e,0x03,0xbe,0x28,0xc7,0xf3,0xd9,0x7c, +0x0e,0x3f,0x95,0x9f,0xce,0xcf,0xe4,0xf3,0xf8,0x02,0xbe,0x88,0x2f,0xe1,0x4b,0xf9, +0x72,0xbe,0x92,0xaf,0xe6,0xeb,0xf8,0x46,0xbe,0x89,0x5f,0xcb,0x6f,0xe0,0x37,0xf1, +0x5b,0xf8,0x6d,0xfc,0x0e,0x7e,0x17,0xbf,0x9b,0x6f,0xe6,0xf7,0xf3,0x07,0xf9,0x43, +0xfc,0x61,0xfe,0x08,0xff,0xa1,0x95,0x51,0xfe,0x18,0x7f,0x9c,0x3f,0xc9,0x9f,0xe2, +0x4f,0xf3,0x67,0x20,0x16,0xfe,0x3c,0x7f,0x81,0xbf,0xc4,0x5f,0xe6,0xaf,0xf0,0x5f, +0x41,0x56,0xf9,0x38,0x81,0xad,0x00,0x2f,0x70,0x10,0x38,0x09,0x9c,0x21,0x2e,0x02, +0x37,0x81,0x87,0xc0,0xd3,0x8a,0x97,0x80,0x28,0xf0,0x15,0x90,0x04,0x34,0x01,0x5d, +0x10,0x22,0x08,0x15,0x84,0x09,0x22,0x04,0x0c,0x01,0x4b,0x10,0x2f,0x60,0x0b,0x38, +0x82,0x94,0x75,0xfe,0x04,0x52,0x05,0xe9,0x82,0x4c,0x01,0x4f,0x20,0x10,0x08,0x05, +0x22,0x81,0x44,0x20,0x15,0xc8,0x05,0x4a,0x81,0x5a,0xa0,0x13,0x18,0x05,0x26,0x41, +0xad,0xa0,0x41,0xd0,0x24,0x68,0x11,0xb4,0x09,0x3a,0x04,0x5d,0x82,0x6e,0x81,0x59, +0xd0,0x2f,0x18,0x14,0x0c,0x09,0x86,0x05,0x23,0x82,0x51,0xc1,0x98,0x60,0x5c,0x30, +0x29,0x98,0x12,0x4c,0x0b,0x2c,0x82,0x79,0xc1,0x82,0x60,0x49,0xb0,0x2c,0x58,0x11, +0xac,0x0a,0x70,0xe7,0x6d,0xcf,0xe3,0xcf,0x3b,0x9c,0x77,0x3a,0xef,0x72,0xde,0xf5, +0xbc,0xdb,0x79,0x8f,0xf3,0x5e,0xe7,0x89,0xe7,0x7d,0xcf,0x93,0xce,0x53,0xce,0xd3, +0xce,0xd3,0xcf,0x07,0xaf,0xf3,0x4f,0x4e,0x38,0x84,0xf9,0x3f,0x92,0xb4,0x8e,0x95, +0x94,0xf3,0x19,0xeb,0xac,0xf3,0x17,0xc1,0x3f,0x2f,0x5e,0x67,0x9d,0x7f,0x61,0x64, +0xe7,0x55,0x10,0xc3,0x3a,0xff,0xa6,0xd4,0x9c,0x6f,0xfc,0x37,0xa6,0x75,0x9d,0x75, +0x7e,0x35,0x3a,0xcf,0xf7,0x9e,0xbf,0x77,0xfe,0xe1,0xf9,0x89,0xf3,0x33,0xe7,0x17, +0xff,0xa9,0x78,0x79,0x1e,0xe4,0xda,0xe7,0xba,0xe6,0x7a,0xe7,0x92,0xd7,0x59,0xe7, +0xff,0x22,0x14,0x08,0x2d,0x97,0x9e,0x1b,0x92,0x1b,0x96,0x1b,0x91,0xcb,0xc8,0x65, +0xe5,0xc6,0xe7,0xb2,0x73,0x39,0xb9,0xa9,0xb9,0xe9,0xb9,0x99,0xb9,0xbc,0x5c,0x41, +0xae,0x28,0x57,0x92,0x2b,0xcd,0x95,0xe7,0x2a,0x73,0xd5,0xb9,0xba,0x5c,0x63,0xae, +0x29,0xb7,0x36,0xb7,0x21,0xb7,0x29,0xb7,0x25,0xb7,0x2d,0xb7,0x23,0xb7,0x2b,0xb7, +0x3b,0xd7,0x9c,0xdb,0x9f,0x3b,0x98,0x3b,0x94,0x3b,0x9c,0x3b,0x92,0x3b,0x9a,0x3b, +0x96,0x3b,0x9e,0x3b,0x99,0x3b,0x95,0x3b,0x9d,0x6b,0xc9,0x9d,0xcf,0x5d,0xc8,0x5d, +0xca,0x5d,0xce,0x5d,0xc9,0x5d,0xcd,0xc5,0x09,0x6d,0x85,0x78,0xa1,0x83,0xd0,0x49, +0xe8,0x22,0x74,0x13,0x7a,0x08,0xbd,0x84,0x44,0xa1,0xaf,0x90,0x24,0xa4,0x08,0x69, +0x42,0xba,0x30,0x44,0x18,0x26,0x8c,0x10,0x32,0x84,0x2c,0x61,0xbc,0x90,0x2d,0xe4, +0x08,0x53,0x85,0xe9,0xc2,0x4c,0x21,0x4f,0x28,0x10,0x8a,0x84,0x12,0xa1,0x54,0x28, +0x17,0x2a,0x85,0x2a,0xa1,0x5a,0xa8,0x13,0x1a,0x85,0x26,0x61,0xad,0xb0,0x41,0xd8, +0x24,0x6c,0x11,0xb6,0x09,0x3b,0x84,0x5d,0xc2,0x6e,0xa1,0x59,0xd8,0x2f,0x1c,0x14, +0x0e,0x09,0x87,0x85,0x23,0xc2,0x51,0xe1,0x98,0x70,0x5c,0x38,0x29,0x9c,0x12,0x4e, +0x0b,0x2d,0xc2,0x79,0xe1,0x82,0x70,0x49,0xb8,0x2c,0x5c,0x11,0xae,0x0a,0x71,0x22, +0x5b,0x11,0x5e,0xe4,0x20,0x72,0x12,0xb9,0x88,0xdc,0x44,0x1e,0x22,0x2f,0x11,0x51, +0xe4,0x2b,0x22,0x89,0x28,0x22,0x9a,0x88,0x2e,0x0a,0x11,0x85,0x89,0x22,0x44,0x0c, +0x11,0x4b,0x14,0x2f,0x62,0x8b,0x38,0xa2,0x54,0x51,0xba,0x28,0x53,0xc4,0x13,0x09, +0x44,0x22,0x91,0x44,0x24,0x15,0xc9,0x45,0x4a,0x91,0x5a,0xa4,0x13,0x19,0x45,0x26, +0x51,0xad,0xa8,0x41,0xd4,0x24,0x6a,0x16,0xb5,0x88,0xda,0x44,0xed,0x90,0x0e,0x51, +0x27,0xa4,0x4b,0xd4,0x2d,0xea,0x85,0x98,0x45,0xfd,0xa2,0x41,0xd1,0x90,0xe8,0xbe, +0x68,0x58,0x34,0x22,0x1a,0x15,0x8d,0x89,0xc6,0x45,0x93,0xa2,0x29,0xd1,0xb4,0xc8, +0x22,0x9a,0x17,0x2d,0x88,0x96,0x44,0x2f,0x44,0xcb,0xa2,0x97,0xa2,0x15,0xd1,0xaa, +0x08,0x97,0x67,0x9b,0x87,0xcf,0x73,0xc8,0x73,0xca,0x73,0xce,0x73,0xc9,0x73,0xcb, +0xf3,0xc8,0xf3,0xca,0x23,0xe6,0xf9,0xe6,0x91,0xf2,0x28,0x79,0xb4,0x3c,0x7a,0x5e, +0x48,0x5e,0x58,0x5e,0x44,0x1e,0x23,0x8f,0x95,0x17,0x9f,0xc7,0xce,0xe3,0xe4,0xa5, +0xe6,0xa5,0xe7,0x65,0xe6,0xf1,0xf2,0x04,0x79,0xa2,0x3c,0x49,0x9e,0x34,0x4f,0x9e, +0xa7,0xcc,0x53,0xe7,0xe9,0xf2,0x8c,0x79,0xa6,0xbc,0xda,0xbc,0x86,0xbc,0xa6,0xbc, +0x96,0xbc,0xb6,0xbc,0x8e,0xbc,0xae,0xbc,0xee,0x3c,0x73,0x5e,0x7f,0xde,0x60,0xde, +0x50,0xde,0x70,0xde,0x48,0xde,0x68,0xde,0x58,0xde,0x78,0xde,0x64,0xde,0x54,0xde, +0x74,0x9e,0x25,0x6f,0x3e,0x6f,0x21,0x6f,0x29,0x6f,0x39,0x6f,0x25,0x6f,0x35,0x0f, +0x97,0x8f,0xcb,0xb7,0xcd,0xc7,0xe7,0x3b,0xe4,0x3b,0xe5,0xbb,0xe4,0xbb,0xe6,0xbb, +0xe5,0x7b,0xe4,0x7b,0xe5,0x13,0xf3,0x7d,0x20,0xbe,0xf9,0xa4,0x7c,0x4a,0x3e,0x2d, +0x9f,0x9e,0x1f,0x92,0x1f,0x96,0x1f,0x91,0x1f,0x99,0xcf,0xc8,0x67,0xe5,0xc7,0xe7, +0xb3,0xf3,0x39,0xf9,0xa9,0xf9,0xe9,0xf9,0x19,0xf9,0x99,0xf9,0xbc,0x7c,0x41,0xbe, +0x28,0x5f,0x92,0x2f,0xcd,0x97,0xe7,0x2b,0xf3,0xd5,0xf9,0xba,0x7c,0x63,0xbe,0x29, +0xbf,0x36,0xbf,0x21,0xbf,0x29,0xbf,0x25,0xbf,0x2d,0xbf,0x23,0xbf,0x2b,0xbf,0x3b, +0xdf,0x9c,0xdf,0x9f,0x3f,0x98,0x3f,0x94,0x3f,0x9c,0x3f,0x92,0x3f,0x9a,0x3f,0x96, +0xff,0x38,0x7f,0x3c,0x7f,0x32,0x7f,0x2a,0x7f,0x3a,0x7f,0x26,0xdf,0x92,0x3f,0x9f, +0xbf,0x90,0xbf,0x94,0xbf,0x9c,0xff,0x32,0x7f,0x25,0xff,0x95,0x95,0xd5,0x7c,0x9c, +0xd8,0x56,0x8c,0x17,0x3b,0x88,0x9d,0xc4,0x2e,0x62,0x57,0xb1,0x9b,0xd8,0x43,0xec, +0x25,0x26,0x8a,0x7d,0xc5,0x24,0x31,0x45,0x4c,0x13,0xd3,0xc5,0x21,0xe2,0x30,0x71, +0x84,0x98,0x21,0x66,0x89,0xe3,0xc5,0x6c,0x31,0x47,0x9c,0x2a,0x4e,0x17,0x67,0x8a, +0x79,0x62,0x81,0x58,0x24,0x96,0x88,0xa5,0x62,0xb9,0x58,0x29,0x56,0x8b,0x75,0x62, +0xa3,0xd8,0x24,0xae,0x15,0x37,0x88,0x9b,0xc4,0x2d,0xe2,0x36,0x71,0x87,0xb8,0x4b, +0xdc,0x2d,0x36,0x8b,0xfb,0xc5,0x83,0xe2,0x21,0xf1,0xb0,0x78,0x44,0x3c,0x2a,0x1e, +0x13,0x8f,0x8b,0x27,0xc5,0x53,0xe2,0x69,0xb1,0x45,0x3c,0x2f,0x5e,0x10,0x2f,0x89, +0x97,0xc5,0x2b,0xe2,0x55,0x31,0x4e,0x62,0x2b,0xc1,0x4b,0x1c,0x24,0x4e,0x12,0x17, +0x89,0x9b,0xc4,0x43,0xe2,0x25,0x21,0x4a,0x7c,0x25,0x24,0x09,0x45,0x42,0x93,0xd0, +0x25,0x21,0x92,0x30,0x49,0x84,0x84,0x21,0x61,0x49,0xe2,0x25,0x6c,0x09,0x47,0x92, +0x2a,0x49,0x97,0x64,0x4a,0x78,0x12,0x81,0x44,0x24,0x91,0x48,0xa4,0x12,0xb9,0x44, +0x29,0x51,0x4b,0x74,0x12,0xa3,0xc4,0x24,0xa9,0x95,0x34,0x48,0x9a,0x24,0x2d,0x92, +0x36,0x49,0x87,0xa4,0x4b,0xd2,0x2d,0x31,0x4b,0xfa,0x25,0x83,0x92,0x21,0xc9,0xb0, +0x64,0x44,0x32,0x2a,0x19,0x93,0x8c,0x4b,0x26,0x25,0x53,0x92,0x69,0x89,0x45,0x32, +0x2f,0x59,0x90,0x2c,0x49,0x96,0x25,0x2b,0x92,0x55,0x09,0xae,0xc0,0xb6,0x00,0x5f, +0xe0,0x50,0xe0,0x54,0xe0,0x52,0xe0,0x56,0xe0,0x51,0xe0,0x55,0x40,0x2c,0xf0,0x2d, +0x20,0x15,0x50,0x0a,0x68,0x05,0xf4,0x82,0x90,0x82,0xb0,0x82,0x88,0x02,0x46,0x01, +0xab,0x20,0xbe,0x80,0x5d,0xc0,0x29,0x48,0x2d,0x48,0x2f,0xc8,0x2c,0xe0,0x15,0x08, +0x0a,0x44,0x05,0x92,0x02,0x69,0x81,0xbc,0x40,0x59,0xa0,0x2e,0xd0,0x15,0x18,0x0b, +0x4c,0x05,0xb5,0x05,0x0d,0x05,0x4d,0x05,0x2d,0x05,0x6d,0x05,0x1d,0x05,0x5d,0x05, +0xdd,0x05,0xe6,0x82,0xfe,0x82,0xc1,0x82,0xa1,0x82,0xe1,0x82,0x91,0x82,0xd1,0x82, +0x31,0xc8,0x78,0xc1,0x64,0xc1,0x54,0xc1,0x74,0x81,0xa5,0x60,0xbe,0x60,0xa1,0x60, +0xa9,0x60,0xb9,0x60,0xa5,0x60,0xb5,0x00,0x57,0x68,0x5b,0x88,0x2f,0x74,0x28,0x74, +0x2a,0x74,0x29,0x74,0x2b,0xf4,0x28,0xf4,0x2a,0x24,0x16,0xfa,0x16,0x92,0x0a,0x29, +0x85,0xb4,0x42,0x7a,0x61,0x48,0x61,0x58,0x61,0x44,0x21,0xa3,0x90,0x55,0x18,0x5f, +0xc8,0x2e,0xe4,0x14,0xa6,0x16,0xa6,0x17,0x66,0x16,0xf2,0x0a,0x05,0x85,0xa2,0x42, +0x49,0xa1,0xb4,0x50,0x5e,0xa8,0x2c,0x54,0x17,0xea,0x0a,0x8d,0x85,0xa6,0xc2,0xda, +0xc2,0x86,0xc2,0xa6,0xc2,0x96,0xc2,0xb6,0xc2,0x8e,0xc2,0xae,0xc2,0xee,0x42,0x73, +0x61,0x7f,0xe1,0x60,0xe1,0x50,0xe1,0x70,0xe1,0x48,0xe1,0x68,0xe1,0x58,0xe1,0x78, +0xe1,0x64,0xe1,0x54,0xe1,0x74,0xa1,0xa5,0x70,0xbe,0x70,0xa1,0x70,0xa9,0x70,0xb9, +0x70,0xa5,0x70,0xb5,0x10,0x57,0x64,0x5b,0x84,0x2f,0x72,0x28,0x72,0x2a,0x72,0x29, +0x72,0x2b,0xf2,0x28,0xf2,0x2a,0x22,0x16,0xf9,0x16,0x91,0x8a,0x28,0x45,0xb4,0x22, +0x7a,0x51,0x48,0x51,0x58,0x51,0x44,0x11,0xa3,0x88,0x55,0x14,0x5f,0xc4,0x2e,0xe2, +0x14,0xa5,0x16,0xa5,0x17,0x65,0x16,0xf1,0x8a,0x04,0x45,0xa2,0x22,0x49,0x91,0xb4, +0x48,0x5e,0xa4,0x2c,0x52,0x17,0xe9,0x8a,0x8c,0x45,0xa6,0xa2,0xda,0xa2,0x86,0xa2, +0xa6,0xa2,0x96,0xa2,0xb6,0xa2,0x8e,0xa2,0xae,0xa2,0xee,0x22,0x73,0x51,0x7f,0xd1, +0x60,0xd1,0x50,0xd1,0x70,0xd1,0x48,0xd1,0x68,0xd1,0x58,0xd1,0x78,0xd1,0x64,0xd1, +0x54,0xd1,0x74,0x91,0xa5,0x68,0xbe,0x68,0xa1,0x68,0xa9,0x68,0xb9,0x68,0xa5,0x68, +0xb5,0x08,0x27,0xb5,0x95,0xe2,0xa5,0x0e,0x52,0x27,0xa9,0x8b,0xd4,0x4d,0xea,0x21, +0xf5,0x92,0x12,0xa5,0xbe,0x52,0x92,0x94,0x22,0xa5,0x49,0xe9,0xd2,0x10,0x69,0x98, +0x34,0x42,0xca,0x90,0xb2,0xa4,0xf1,0x52,0xb6,0x94,0x23,0x4d,0x95,0xa6,0x4b,0x33, +0xa5,0x5c,0x08,0x4f,0x2a,0x90,0x8a,0xa4,0x12,0xa9,0x54,0x2a,0x97,0x2a,0xa5,0x6a, +0xa9,0x4e,0x6a,0x94,0x9a,0xa4,0xb5,0xd2,0x06,0x69,0x93,0xb4,0x45,0xda,0x26,0xed, +0x90,0x76,0x49,0xbb,0xa5,0x66,0x69,0xbf,0x74,0x50,0x3a,0x24,0x1d,0x96,0x8e,0x48, +0x47,0xa5,0x63,0xd2,0x71,0xe9,0xa4,0x74,0x4a,0x3a,0x2d,0xb5,0x48,0xe7,0xa5,0x0b, +0xd2,0x25,0xe9,0xb2,0x74,0x45,0xba,0x2a,0xc5,0x15,0xdb,0x16,0xe3,0x8b,0x1d,0x8a, +0x9d,0x8a,0x5d,0x8a,0xdd,0x8a,0x3d,0x8a,0xbd,0x8a,0x89,0xc5,0xbe,0xc5,0xa4,0x62, +0x4a,0x31,0xad,0x98,0x5e,0x1c,0x52,0x1c,0x56,0x1c,0x51,0xcc,0x28,0x66,0x15,0xc7, +0x17,0xb3,0x8b,0x39,0xc5,0xa9,0xc5,0xe9,0xc5,0x99,0xc5,0xbc,0x62,0x41,0xb1,0xa8, +0x58,0x52,0x2c,0x2d,0x96,0x17,0x2b,0x8b,0xd5,0xc5,0xba,0x62,0x63,0xb1,0xa9,0xb8, +0xb6,0xb8,0xa1,0xb8,0xa9,0xb8,0xa5,0xb8,0xad,0xb8,0xa3,0xb8,0xab,0xb8,0xbb,0xd8, +0x5c,0xdc,0x5f,0x3c,0x58,0x3c,0x54,0x3c,0x5c,0x3c,0x02,0x19,0x2d,0x1e,0x2b,0x1e, +0x2f,0x9e,0x2c,0x9e,0x2a,0x9e,0x2e,0xb6,0x14,0xcf,0x17,0x2f,0x14,0x2f,0x15,0x2f, +0x17,0xaf,0x14,0xaf,0x16,0xe3,0x4a,0x6c,0x4b,0xf0,0x25,0x0e,0x25,0x4e,0x25,0x2e, +0x25,0x6e,0x25,0x1e,0x25,0x5e,0x25,0xc4,0x12,0xdf,0x12,0x52,0x09,0xa5,0x84,0x56, +0x42,0x2f,0x09,0x29,0x09,0x2b,0x89,0x28,0x61,0x94,0xb0,0x4a,0xe2,0x4b,0xd8,0x25, +0x9c,0x92,0xd4,0x92,0xf4,0x92,0xcc,0x12,0x5e,0x89,0xa0,0x44,0x54,0x22,0x29,0x91, +0x96,0xc8,0x4b,0x94,0x25,0xea,0x12,0x5d,0x89,0xb1,0xc4,0x54,0x52,0x5b,0xd2,0x50, +0xd2,0x54,0xd2,0x52,0xd2,0x56,0xd2,0x51,0xd2,0x55,0xd2,0x5d,0x62,0x2e,0xe9,0x2f, +0x19,0x2c,0x19,0x2a,0x19,0x2e,0x19,0x29,0x19,0x2d,0x19,0x2b,0x19,0x2f,0x99,0x2c, +0x99,0x2a,0x99,0x2e,0xb1,0x94,0xcc,0x97,0x2c,0x94,0x2c,0x95,0x2c,0x97,0xac,0x94, +0xac,0x96,0xe0,0x64,0xb6,0x32,0xbc,0xcc,0x41,0xe6,0x24,0x73,0x91,0xb9,0xc9,0x3c, +0x64,0x5e,0x32,0xa2,0xcc,0x57,0x46,0x92,0x51,0x64,0x34,0x19,0x5d,0x16,0x22,0x0b, +0x93,0x45,0xc8,0x18,0x32,0x96,0x2c,0x5e,0xc6,0x96,0x71,0x64,0xa9,0xb2,0x74,0x59, +0xa6,0x8c,0x27,0x13,0xc8,0x44,0x32,0x89,0x4c,0x2a,0x93,0xcb,0x94,0x32,0xb5,0x4c, +0x27,0x33,0xca,0x4c,0xb2,0x5a,0x59,0x83,0xac,0x49,0xd6,0x22,0x6b,0x93,0x75,0xc8, +0xba,0x64,0xdd,0x32,0xb3,0xac,0x5f,0x36,0x28,0x1b,0x92,0x0d,0xcb,0x46,0x64,0xa3, +0xb2,0x31,0xd9,0xb8,0x6c,0x52,0x36,0x25,0x9b,0x96,0x59,0x64,0xf3,0xb2,0x05,0xd9, +0x92,0x6c,0x59,0xb6,0x22,0x5b,0x95,0xe1,0xe4,0xb6,0x72,0xbc,0xdc,0x41,0xee,0x24, +0x77,0x91,0xbb,0xc9,0x3d,0xe4,0x5e,0x72,0xa2,0xdc,0x57,0x4e,0x92,0x53,0xe4,0x34, +0x39,0x5d,0x1e,0x22,0x0f,0x93,0x47,0xc8,0x19,0x72,0x96,0x3c,0x5e,0xce,0x96,0x73, +0xe4,0xa9,0xf2,0x74,0x79,0xa6,0x9c,0x27,0x17,0xc8,0x45,0x72,0x89,0x5c,0x2a,0x97, +0xcb,0x95,0x72,0xb5,0x5c,0x27,0x37,0xca,0x4d,0xf2,0x5a,0x79,0x83,0xbc,0x49,0xde, +0x22,0x6f,0x93,0x77,0xc8,0xbb,0xe4,0xdd,0x72,0xb3,0xbc,0x5f,0x3e,0x28,0x1f,0x92, +0x0f,0xcb,0x47,0xe4,0xa3,0xf2,0x31,0xf9,0xb8,0x7c,0x52,0x3e,0x25,0x9f,0x96,0x5b, +0xe4,0xf3,0xf2,0x05,0xf9,0x92,0x7c,0x59,0xfe,0x12,0xb2,0x22,0x5f,0x95,0xe3,0x4a, +0x6d,0x4b,0xf1,0xa5,0x0e,0xa5,0x4e,0xa5,0x2e,0xa5,0x6e,0xa5,0x1e,0xa5,0x5e,0xa5, +0xc4,0x52,0xdf,0x52,0x52,0x29,0xa5,0x94,0x56,0x4a,0x2f,0x0d,0x29,0x0d,0x2b,0x8d, +0x28,0x65,0x94,0xb2,0x4a,0xe3,0x4b,0xd9,0xa5,0x9c,0xd2,0xd4,0xd2,0xf4,0xd2,0xcc, +0x52,0x5e,0xa9,0xa0,0x54,0x54,0x2a,0x29,0x95,0x96,0xca,0x4b,0x95,0xa5,0xea,0x52, +0x5d,0xa9,0xb1,0xd4,0x54,0x5a,0x5b,0xda,0x50,0xda,0x54,0xda,0x52,0xda,0x56,0xda, +0x51,0xda,0x55,0xda,0x5d,0x6a,0x2e,0xed,0x2f,0x1d,0x2c,0xbd,0xf7,0x37,0x67,0xa8, +0x74,0xb8,0x74,0xa4,0x74,0xb4,0x74,0xac,0x74,0xbc,0x74,0xb2,0x74,0xaa,0x74,0xba, +0xd4,0x52,0x3a,0x5f,0xba,0x50,0xba,0x54,0xba,0x5c,0xba,0x52,0xba,0x5a,0x8a,0x2b, +0xb3,0x2d,0xc3,0x97,0x39,0x94,0x39,0x95,0xb9,0x94,0xb9,0x95,0x79,0x94,0x79,0x95, +0x11,0xcb,0x7c,0xcb,0x48,0x65,0x94,0x32,0x5a,0x19,0xbd,0x2c,0xa4,0x2c,0xac,0x2c, +0xa2,0x8c,0x51,0xc6,0x2a,0x8b,0x2f,0x63,0x97,0x71,0xca,0x52,0xcb,0xd2,0xcb,0x32, +0xcb,0x78,0x65,0x82,0x32,0x51,0x99,0xa4,0x4c,0x5a,0x26,0x2f,0x53,0x96,0xa9,0xcb, +0x74,0x65,0xc6,0x32,0x53,0x59,0x6d,0x59,0x43,0x59,0x53,0x59,0x4b,0x59,0x5b,0x59, +0x47,0x59,0x57,0x59,0x77,0x99,0xb9,0xac,0x6f,0x9d,0x75,0xd6,0xf9,0x23,0xf4,0x43, +0x06,0xcb,0x86,0xca,0x86,0xcb,0x1e,0x94,0x8d,0x94,0x8d,0x96,0x8d,0x95,0x8d,0x97, +0x4d,0x96,0x4d,0x95,0x4d,0x97,0x59,0xca,0xe6,0xcb,0x16,0xca,0x96,0xca,0x96,0xcb, +0x56,0xca,0x56,0xcb,0x70,0x0a,0x5b,0x05,0x5e,0xe1,0xa0,0x70,0x52,0xb8,0x28,0xdc, +0x14,0x1e,0x0a,0x2f,0x05,0x51,0xe1,0xab,0x20,0x29,0x28,0x0a,0xaa,0x82,0xa6,0xa0, +0x2b,0x82,0x15,0x21,0x8a,0x50,0x48,0x98,0x22,0x5c,0x11,0xa1,0x60,0x28,0x58,0x8a, +0x78,0x05,0x5b,0xc1,0x51,0xa4,0x2a,0xd2,0x15,0x99,0x0a,0x9e,0x82,0xaf,0x10,0x28, +0x44,0x0a,0x89,0x42,0xaa,0x90,0x29,0xe4,0x0a,0x85,0x42,0xa9,0x50,0xbd,0x81,0x5a, +0xa1,0xc5,0xd0,0x29,0x0c,0x0a,0xa3,0xa2,0x5a,0x61,0x52,0xd4,0x28,0x6a,0x15,0x0d, +0x8a,0x26,0x45,0xb3,0xa2,0x45,0xd1,0xa6,0x68,0x57,0x74,0x28,0x3a,0x21,0x5d,0x8a, +0x1b,0x8a,0x6e,0x45,0xaf,0xc2,0xac,0xe8,0x53,0xf4,0x2b,0x06,0x14,0x83,0x8a,0x7b, +0x8a,0x21,0xc5,0xb0,0xe2,0x81,0x62,0x44,0xf1,0x10,0x32,0xaa,0x18,0x53,0x8c,0x2b, +0x26,0x15,0x4f,0x14,0x53,0x8a,0x69,0x85,0x45,0x31,0xaf,0x58,0x50,0x2c,0x29,0x96, +0x15,0x2f,0x15,0x2b,0x8a,0x55,0x05,0x4e,0x69,0xab,0xb4,0x53,0xe2,0x95,0x0e,0x4a, +0x27,0xa5,0x8b,0xd2,0x55,0xe9,0xa6,0x74,0x57,0x7a,0x28,0xbd,0x94,0x44,0xa5,0xaf, +0x92,0xa4,0xa4,0x28,0x69,0x4a,0xba,0x32,0x44,0x19,0xa6,0x0c,0x57,0x46,0x28,0x19, +0x4a,0x96,0x32,0x5e,0xc9,0x56,0x72,0x94,0xa9,0xca,0x74,0x65,0xa6,0x92,0xa7,0x14, +0x28,0x45,0x4a,0x89,0x52,0xaa,0x94,0x2b,0x95,0x4a,0xb5,0x52,0xfb,0x0b,0x3a,0xa5, +0x51,0x69,0x52,0xd6,0x28,0x6b,0x95,0x0d,0xca,0x26,0x65,0x8b,0xb2,0x4d,0xd9,0xae, +0xec,0x50,0x76,0x29,0xbb,0x95,0x66,0x65,0xbf,0x72,0x50,0x39,0xa4,0x1c,0x56,0x8e, +0x28,0x47,0x95,0x63,0xca,0x71,0xe5,0xa4,0x72,0x4a,0x39,0xad,0xb4,0x28,0xe7,0x95, +0xcf,0xd7,0x59,0xe7,0x1f,0x82,0x05,0xc8,0xb2,0x72,0x55,0x69,0x5b,0xee,0x50,0xee, +0x52,0xee,0x51,0x4e,0x2c,0x27,0x95,0xd3,0xca,0x43,0xca,0xc3,0x7f,0x21,0xa2,0x3c, +0xbe,0x3c,0xb5,0x9c,0x57,0x2e,0x29,0x57,0x96,0x1b,0xcb,0x1b,0xca,0xdb,0xca,0xbb, +0xcb,0x07,0xcb,0x47,0xca,0xc7,0xcb,0xa7,0xcb,0x17,0xca,0x57,0xca,0x6d,0x2b,0x9c, +0x2a,0x3c,0x2a,0x7c,0x2b,0x68,0x15,0x61,0x15,0xac,0x0a,0x4e,0x45,0x66,0x85,0xa8, +0x42,0x5e,0xa1,0xab,0x30,0x56,0x98,0x2a,0x1a,0x2a,0x9a,0x2b,0x5a,0x2a,0xda,0x2a, +0x3a,0x2a,0xba,0x2a,0xba,0x2b,0xcc,0x15,0xfd,0x15,0x83,0x15,0x43,0x15,0xc3,0x15, +0x23,0x15,0xa3,0x15,0x63,0x15,0xe3,0x15,0x93,0x15,0x53,0x15,0xd3,0x15,0x96,0x8a, +0xf9,0x8a,0x85,0x8a,0xa5,0x8a,0xe5,0x8a,0x95,0x8a,0xd5,0x0a,0x9c,0xca,0x56,0x85, +0x57,0x39,0xa9,0xdc,0x54,0x5e,0x2a,0x5f,0x15,0x4d,0x15,0xfc,0x17,0x10,0xa2,0x8a, +0x50,0xb1,0x54,0x49,0xbf,0x0a,0x6c,0x55,0xca,0xbf,0x34,0xa9,0x90,0x4c,0x95,0x40, +0x25,0xfc,0x83,0x88,0x54,0x12,0x95,0x54,0x25,0x57,0xa9,0x55,0x3a,0x95,0x51,0x65, +0x52,0xd5,0xaa,0x1a,0x54,0x4d,0xaa,0x16,0x55,0x9b,0xaa,0x43,0xd5,0xa5,0xea,0x56, +0x99,0x55,0xfd,0xaa,0x41,0xd5,0x90,0x6a,0x58,0x35,0xa2,0x1a,0x55,0x8d,0xa9,0xc6, +0x55,0x93,0xaa,0x29,0xd5,0xb4,0xca,0xa2,0x9a,0x57,0x2d,0xa8,0x96,0x54,0xcb,0xaa, +0x15,0xd5,0xaa,0x0a,0xa7,0xb6,0x55,0xe3,0xd5,0x0e,0x6a,0x27,0xb5,0x8b,0xda,0x4d, +0xed,0xa1,0xf6,0x52,0x7b,0x63,0x10,0xd5,0x14,0x75,0x88,0x9a,0xa1,0x66,0xab,0xd3, +0xd5,0x02,0xb5,0x54,0xad,0x56,0x57,0xff,0x16,0x26,0x75,0xad,0xba,0x7e,0x9d,0x75, +0xd6,0xf9,0x0b,0x69,0x50,0x37,0xa9,0x5b,0xd4,0x6d,0xea,0x0e,0x75,0x97,0xba,0x5b, +0x6d,0x56,0xf7,0xab,0x07,0xd5,0xf7,0x7e,0x87,0xfb,0xea,0x07,0xea,0x87,0xea,0x47, +0xea,0xc7,0xea,0x09,0xf5,0x13,0xf5,0x53,0xf5,0x8c,0x7a,0x4e,0xfd,0x5c,0xbd,0xa8, +0x7e,0xa1,0x7e,0xa9,0x7e,0xa5,0x06,0x1a,0x1b,0x8d,0x9d,0xc6,0x5e,0x43,0xd0,0x38, +0x6b,0x5c,0x35,0xee,0x1a,0x4f,0x8d,0xb7,0xc6,0x47,0xe3,0xa7,0x21,0x6b,0xa8,0x9a, +0x40,0x4d,0xb0,0x26,0x54,0x13,0xae,0x89,0xd4,0x30,0x35,0x71,0x9a,0x24,0x4d,0xb2, +0x26,0x45,0x93,0xa6,0xc9,0xd0,0x70,0x35,0x7c,0x8d,0x50,0x23,0xd6,0x14,0x69,0x64, +0x1a,0x85,0x46,0xa5,0xd1,0x6a,0x0c,0x9a,0x6a,0x4d,0x8d,0xa6,0x5e,0xd3,0xa8,0x69, +0xd6,0xb4,0x6a,0xda,0x35,0x9d,0x9a,0x1b,0x9a,0x5e,0x4d,0x9f,0x66,0x40,0x73,0x4f, +0x73,0x5f,0xf3,0x40,0xf3,0x50,0xf3,0x48,0xf3,0x58,0x33,0xa1,0x79,0xa2,0x79,0xaa, +0x99,0xd1,0xcc,0x69,0x9e,0x6b,0x16,0x35,0x2f,0x34,0x2f,0x35,0xaf,0x34,0xa0,0xd2, +0xa6,0xd2,0xae,0xd2,0xbe,0x92,0x50,0xe9,0x5c,0xe9,0x5a,0xe9,0x5e,0xe9,0x59,0xe9, +0x5d,0xe9,0x53,0xe9,0x57,0x49,0xae,0xa4,0x56,0x06,0x56,0x06,0x57,0x86,0x56,0x86, +0x57,0x46,0x56,0x32,0x2b,0xe3,0x2a,0x93,0x2a,0x93,0x2b,0x53,0x2a,0xd3,0x2a,0x33, +0x2a,0xb9,0x95,0xfc,0x4a,0x61,0xa5,0xb8,0xb2,0xa8,0x52,0x56,0xa9,0xa8,0x54,0x55, +0x6a,0x2b,0x0d,0x95,0xd5,0x95,0x35,0x95,0xf5,0x95,0x8d,0x95,0xcd,0x95,0xad,0x95, +0xed,0x95,0x9d,0x95,0x37,0x2a,0x7b,0x2b,0xfb,0x2a,0x07,0x2a,0xef,0x55,0xde,0xaf, +0x7c,0x50,0xf9,0xb0,0xf2,0x51,0xe5,0xe3,0xca,0x89,0xca,0x27,0x95,0x4f,0x2b,0x67, +0x2a,0xe7,0x2a,0x9f,0x57,0x2e,0x56,0xbe,0xa8,0x7c,0x59,0xf9,0xaa,0x12,0x68,0x6d, +0xb4,0x76,0x5a,0x7b,0x2d,0x41,0xeb,0xac,0x75,0xd5,0xba,0x6b,0x3d,0xb5,0xde,0x5a, +0x1f,0xad,0x9f,0x96,0xac,0xa5,0x6a,0x03,0xb5,0xc1,0xda,0x50,0x6d,0xb8,0x36,0x52, +0xcb,0xd4,0xc6,0x69,0x93,0xb4,0xc9,0xda,0x14,0x6d,0x9a,0x36,0x43,0xcb,0xd5,0xf2, +0xb5,0x42,0xad,0x58,0x5b,0xa4,0x95,0xc1,0xd7,0x5b,0x95,0x56,0xab,0x35,0x68,0xab, +0xb5,0x35,0xda,0x7a,0x6d,0xa3,0xb6,0x59,0xdb,0xaa,0x6d,0xd7,0x76,0x6a,0x6f,0x68, +0x7b,0xb5,0x7d,0xda,0x01,0xed,0x3d,0xed,0x7d,0xed,0x03,0xed,0x43,0xed,0x23,0xed, +0x63,0xed,0x84,0xf6,0x89,0xf6,0xa9,0x76,0x46,0x3b,0xa7,0x7d,0xae,0x5d,0xd4,0xbe, +0xd0,0xbe,0xd4,0xbe,0xd2,0x02,0x9d,0x8d,0xce,0x4e,0x67,0xaf,0x23,0xe8,0x9c,0x75, +0xae,0x3a,0x77,0x9d,0xa7,0xce,0x5b,0xe7,0xa3,0xf3,0xd3,0x91,0x75,0x54,0x5d,0xa0, +0x2e,0x58,0x17,0xaa,0x0b,0xd7,0x45,0xea,0x98,0xba,0x38,0x5d,0x92,0x2e,0x59,0x97, +0xa2,0x4b,0xd3,0x65,0xe8,0xb8,0x3a,0xbe,0x4e,0xa8,0x13,0xeb,0x8a,0x74,0x32,0x9d, +0x42,0xa7,0xd2,0x69,0x75,0x06,0x5d,0xb5,0xae,0x46,0x57,0xaf,0x6b,0xd4,0x35,0xeb, +0x5a,0x75,0xed,0xba,0x4e,0xdd,0x0d,0x5d,0xaf,0xae,0x4f,0x37,0xa0,0xbb,0x07,0xb9, +0xaf,0x7b,0xa0,0x7b,0xa8,0x7b,0xa4,0x7b,0xac,0x9b,0xd0,0x3d,0xd1,0x3d,0xd5,0xcd, +0xe8,0xe6,0x74,0xcf,0x75,0x8b,0xba,0x17,0xba,0x97,0xba,0x57,0x3a,0xa0,0xb7,0xd1, +0xdb,0xe9,0xed,0xf5,0x04,0xbd,0xb3,0xde,0x55,0xef,0xae,0xf7,0xd4,0x7b,0xeb,0x7d, +0xf4,0x7e,0x7a,0xb2,0x9e,0xaa,0x0f,0xd4,0x07,0xeb,0x43,0xf5,0xe1,0xfa,0x48,0x3d, +0x53,0x1f,0xa7,0x4f,0xd2,0x27,0xeb,0x53,0xf4,0x69,0xfa,0x0c,0x3d,0x57,0xcf,0xd7, +0x0b,0xf5,0x62,0x7d,0x91,0x5e,0xa6,0x57,0xe8,0x55,0x7a,0xad,0xde,0xa0,0xaf,0xd6, +0xd7,0xe8,0xeb,0xf5,0x8d,0xfa,0x66,0x7d,0xab,0xbe,0x5d,0xdf,0xa9,0xbf,0xa1,0xef, +0xd5,0xf7,0xe9,0x07,0xf4,0xf7,0xf4,0xf7,0xf5,0x0f,0xf4,0x0f,0xf5,0x8f,0xf4,0x8f, +0xf5,0x13,0xfa,0x27,0xfa,0xa7,0xfa,0x19,0xfd,0x9c,0xfe,0xb9,0x7e,0x51,0xff,0x42, +0xff,0x52,0xff,0x4a,0x0f,0xaa,0x6c,0xaa,0xec,0xaa,0xec,0xab,0x08,0x55,0xce,0x55, +0xae,0x55,0xee,0x55,0x9e,0x55,0xde,0x55,0x3e,0x55,0x7e,0x55,0xe4,0x2a,0x6a,0x55, +0x60,0x55,0x70,0x55,0x68,0x55,0x78,0x55,0x64,0x15,0xb3,0x2a,0xae,0x2a,0xa9,0x2a, +0xb9,0x2a,0xa5,0x2a,0xad,0x2a,0xa3,0x8a,0x5b,0xc5,0xaf,0x12,0x56,0x89,0xab,0x8a, +0xaa,0x64,0x55,0x8a,0x2a,0x55,0x95,0xb6,0xca,0x50,0x55,0x5d,0x55,0x53,0x55,0x5f, +0xd5,0x58,0xd5,0x5c,0xd5,0x5a,0xd5,0x5e,0xd5,0x59,0x75,0xa3,0xaa,0xb7,0xaa,0xaf, +0x6a,0xa0,0xea,0x5e,0xd5,0xfd,0xaa,0x07,0x55,0x0f,0xab,0x1e,0x55,0x3d,0xae,0x9a, +0xa8,0x7a,0x52,0xf5,0xb4,0x6a,0xa6,0x6a,0xae,0xea,0x79,0xd5,0x62,0xd5,0x8b,0xaa, +0x97,0x55,0xaf,0xaa,0x80,0xc1,0xc6,0x60,0x67,0xb0,0x37,0x10,0x0c,0xce,0x06,0x57, +0x83,0xbb,0xc1,0xd3,0xe0,0x6d,0xf0,0x31,0xf8,0x19,0xc8,0x06,0xaa,0x21,0xd0,0x10, +0x6c,0x08,0x35,0x84,0x1b,0x22,0x0d,0x4c,0x43,0x9c,0x21,0xc9,0x90,0x6c,0x48,0x31, +0xa4,0x19,0x32,0x0c,0x5c,0x03,0xdf,0x20,0x34,0x88,0x0d,0x45,0x06,0x99,0x41,0x61, +0x50,0x19,0xb4,0x06,0x83,0xa1,0xda,0x50,0x63,0xa8,0x37,0x34,0x1a,0x9a,0x0d,0xad, +0x86,0x76,0x43,0xa7,0xe1,0x86,0xa1,0xd7,0xd0,0x67,0x18,0x30,0xdc,0x33,0xdc,0x37, +0x3c,0x30,0x3c,0x34,0x3c,0x32,0x3c,0x36,0x4c,0x18,0x9e,0x18,0x9e,0x1a,0x66,0x0c, +0x73,0x86,0xe7,0x86,0x45,0xc3,0x0b,0xc3,0x4b,0xc3,0x2b,0x03,0x30,0xda,0x18,0xed, +0x8c,0xf6,0x46,0x82,0xd1,0xd9,0xe8,0x6a,0x74,0x37,0x7a,0x1a,0xbd,0x8d,0x3e,0x46, +0x3f,0x23,0xd9,0x48,0x35,0x06,0x1a,0x83,0x8d,0xa1,0xc6,0x70,0x63,0xa4,0x91,0x69, +0x8c,0x33,0x26,0x19,0x93,0x8d,0x29,0xc6,0x34,0x63,0x86,0x91,0x6b,0xe4,0x1b,0x85, +0x46,0xb1,0xb1,0xc8,0x28,0x33,0x2a,0x8c,0x2a,0xa3,0xd6,0x68,0x30,0x56,0x1b,0x6b, +0x8c,0xf5,0xc6,0x46,0x63,0xb3,0xb1,0xd5,0xd8,0x6e,0xec,0x34,0xde,0x30,0xf6,0x1a, +0xfb,0x8c,0x03,0xc6,0x7b,0x90,0xfb,0xc6,0x07,0xc6,0x87,0xc6,0x47,0xc6,0xc7,0xc6, +0x09,0xe3,0x13,0xe3,0x53,0xe3,0x8c,0x71,0xce,0xf8,0xdc,0xb8,0x68,0x7c,0x61,0x7c, +0x69,0x7c,0x65,0x04,0x17,0x6c,0x2e,0xd8,0x5d,0xb0,0xbf,0x40,0xb8,0xe0,0x7c,0xc1, +0xf5,0x82,0xfb,0x05,0xcf,0x0b,0xde,0x17,0x7c,0x2e,0xf8,0x5d,0x20,0x5f,0xa0,0x5e, +0x08,0x5c,0xe7,0x5f,0x80,0xb5,0xff,0xf7,0xac,0x27,0x96,0xec,0x36,0x02,0x90,0x8e, +0x1d,0xdb,0xc0,0xe3,0x77,0x61,0x7e,0x08,0x2b,0xe3,0x60,0x79,0x60,0xe3,0xda,0xf1, +0x01,0x98,0x53,0x60,0x9e,0x0b,0xd6,0xf2,0x70,0x58,0x49,0x7d,0xe3,0xf8,0xf5,0x79, +0xaf,0xeb,0xc3,0xd0,0x4d,0x36,0xae,0xe5,0x38,0x2c,0xdf,0x80,0xe5,0x1b,0xb1,0xdc, +0x0e,0xcb,0xb7,0xc0,0xfc,0x28,0x76,0x8f,0x08,0xec,0xbc,0x08,0xec,0xbc,0x08,0xec, +0xbc,0x08,0xac,0x3f,0x03,0x6b,0x67,0x60,0xed,0x0c,0xac,0x9d,0x81,0xb5,0xc7,0x60, +0xd7,0x8f,0xc5,0xfa,0xc5,0x62,0xfd,0x62,0xb1,0x7e,0xb1,0x6f,0xb4,0xa3,0xfe,0x6c, +0xac,0x1f,0x1b,0xeb,0xc7,0xc6,0xfa,0xb1,0xb1,0x76,0x0e,0x56,0x9f,0x8e,0xf5,0x4b, +0x7f,0xa3,0xbc,0x01,0xcb,0x37,0x62,0xf9,0x6b,0x5b,0xa2,0xf9,0x7c,0x8c,0xcd,0x27, +0x13,0x3b,0x2f,0x13,0x3b,0x2f,0x13,0x3b,0x2f,0x13,0xeb,0xcf,0xc3,0xda,0x79,0x58, +0x3b,0x0f,0x6b,0xe7,0x61,0xed,0xe7,0xb1,0xeb,0xe7,0x62,0xfd,0x72,0xb1,0x7e,0xb9, +0x58,0xbf,0xdc,0x37,0xda,0x51,0x7f,0x09,0xd6,0x4f,0x82,0xf5,0x93,0x60,0xfd,0x24, +0x58,0xbb,0x14,0xab,0x97,0xbe,0x61,0x7f,0x1b,0x6c,0xdc,0x36,0x58,0x79,0x13,0x56, +0xde,0x84,0x95,0x7d,0xb0,0xb2,0x0f,0xe6,0x27,0x1c,0x36,0x3f,0x1c,0x56,0xde,0x80, +0x95,0x37,0x60,0xe5,0xcd,0x58,0x79,0x33,0x56,0xb6,0xc7,0xca,0x28,0x0f,0xc7,0xf2, +0x0c,0x2c,0x8f,0xc0,0xee,0x9b,0x89,0xe5,0x11,0xd8,0x7d,0x33,0xb1,0x3c,0x02,0xbb, +0x4e,0x26,0x96,0x47,0x60,0xe3,0xc8,0xc4,0xf2,0x08,0xec,0x3a,0x99,0x58,0x7e,0x1c, +0x1b,0xc7,0x39,0x2c,0x3f,0x8e,0x5d,0xe7,0x1c,0x96,0x1f,0xc7,0xae,0x73,0x0e,0xcb, +0x8f,0x63,0x7e,0x3a,0x87,0xe5,0x91,0xd8,0x79,0xdc,0x37,0xe2,0x6a,0x23,0xe6,0x8f, +0x8d,0x58,0xd9,0x06,0x2b,0xdb,0x60,0xe5,0x4d,0x58,0x79,0x13,0x56,0xf6,0xc1,0xca, +0x3e,0x58,0x79,0x33,0x96,0x47,0x81,0xb5,0xfa,0x6c,0xec,0x18,0x5d,0x3f,0x1b,0xcb, +0xa3,0xb1,0xfb,0xe7,0x60,0x39,0x13,0xb3,0x2f,0x1f,0xcb,0x99,0x58,0x3d,0xff,0x8d, +0x76,0x7b,0xac,0x6c,0x8f,0x95,0x6f,0x83,0xb5,0x32,0xca,0x63,0xb0,0xf3,0xce,0x63, +0x79,0x0c,0x76,0xde,0x79,0x2c,0x8f,0xc1,0xce,0x3b,0x8f,0xe5,0x03,0x1b,0xd6,0x8e, +0x63,0xb1,0x79,0xe5,0x62,0x79,0x2c,0x36,0xaf,0x5c,0x2c,0x47,0xe5,0xad,0x58,0x19, +0xe5,0x09,0xd8,0xf5,0xf3,0xb0,0x3c,0x01,0xbb,0x7e,0x1e,0x96,0x27,0x60,0xd7,0xcf, +0xc3,0xf2,0x44,0xac,0x5f,0x3e,0x96,0x27,0x62,0xf3,0xcf,0xc7,0xf2,0x44,0xec,0xbc, +0x7c,0x2c,0x4f,0xc4,0xce,0xcb,0xc7,0xf2,0x24,0xac,0x5e,0x8c,0xe5,0x49,0x58,0xbd, +0x18,0xcb,0xd9,0x98,0x9f,0x24,0x58,0xce,0xc6,0xe6,0x21,0xc1,0x72,0x36,0x36,0x0f, +0x09,0x96,0xb3,0xb1,0xf5,0x2a,0xc1,0x72,0x36,0x36,0x2f,0x09,0x96,0xb3,0x31,0x3f, +0x4a,0xb0,0xfc,0x24,0x36,0xce,0x42,0x2c,0xe7,0x60,0xb9,0xf4,0x8d,0x32,0x5a,0x57, +0xa7,0xb0,0xf9,0x15,0x63,0xf9,0x29,0x2c,0x0e,0x8a,0xb1,0xfc,0x14,0x36,0xde,0xe2, +0x37,0xe6,0x87,0x6c,0xbb,0x1b,0xb3,0xed,0x6e,0xec,0xde,0xbb,0xb1,0x7b,0xef,0xc6, +0xd6,0xce,0xa9,0x37,0xd6,0x51,0xf1,0x1b,0x6b,0xa9,0xf8,0x8d,0x38,0x40,0xb1,0xc5, +0xc4,0xe2,0x8c,0x8f,0xe5,0x31,0x58,0x7d,0x0c,0x56,0x3e,0x8f,0xe5,0x61,0xd8,0x79, +0xe9,0x58,0xce,0xc0,0x72,0x1e,0x96,0xc7,0x62,0x79,0xee,0x1b,0xf6,0xb5,0xc7,0xc6, +0x64,0xff,0xc6,0x3e,0x69,0xf3,0xc6,0x1e,0x63,0xf3,0x46,0x3d,0xee,0x8d,0x7a,0xdc, +0x1b,0xf5,0xf6,0x6f,0xd4,0xbf,0x79,0x1d,0xf0,0x46,0x3d,0x78,0xe3,0x39,0x61,0xf3, +0xc6,0x1e,0xfb,0x7a,0x9f,0xda,0xfc,0x46,0xfd,0xeb,0xe3,0xff,0x85,0xf9,0x79,0x16, +0xcb,0x8f,0x63,0xe3,0x3c,0x87,0xe5,0xd1,0x58,0x9e,0xf3,0xc6,0xfc,0x7c,0xb0,0xf9, +0xf9,0xbc,0x51,0xb6,0x79,0xa3,0x0e,0x1d,0xdf,0xc6,0xad,0xf5,0xff,0x74,0xc3,0x5a, +0x9e,0xfd,0x86,0x1f,0x90,0x4f,0x5e,0xfb,0xe3,0xb5,0x2f,0x8e,0x63,0x7e,0x3f,0xf7, +0xc6,0xfa,0x03,0xd8,0x7a,0x03,0x6f,0x3c,0xf7,0x70,0x6f,0x3c,0x33,0x70,0xd8,0xf8, +0x71,0xd8,0xf8,0x51,0x3e,0x81,0xe5,0x2f,0xff,0x3f,0xf6,0xce,0x04,0x40,0xc7,0xe2, +0xf1,0xe3,0xcf,0xfb,0xee,0xbe,0xbb,0xd6,0x7d,0x76,0x29,0xd7,0x16,0xc2,0xae,0xbd, +0x59,0xe7,0x5a,0xd6,0x99,0x90,0x90,0x54,0xae,0x90,0x5c,0xeb,0x08,0x95,0xca,0x91, +0xd2,0x49,0x87,0x4a,0x27,0x9d,0xa4,0x72,0x25,0x54,0xce,0x0a,0x91,0x12,0x15,0x65, +0x8b,0x90,0x44,0x42,0xba,0x48,0xf5,0xff,0xcc,0x3e,0xdf,0x27,0xe3,0xf9,0xdb,0x1f, +0xaa,0x5f,0xbf,0x8e,0xf7,0x19,0x1f,0xdf,0x99,0x79,0xe6,0x99,0x67,0x66,0x9e,0x99, +0x79,0x9e,0xf7,0x99,0x79,0x66,0xad,0xfb,0x68,0x11,0x1d,0x53,0x44,0xee,0x62,0x72, +0x17,0x53,0x7f,0x58,0x44,0xfd,0x61,0x11,0xb9,0x8b,0xc9,0x5d,0x4c,0xd7,0xb7,0x88, +0xae,0x6f,0x11,0xb9,0x8b,0xc9,0x5d,0x4c,0xf9,0x2f,0xa2,0xbc,0x17,0x91,0xbb,0x98, +0xdc,0xc5,0xd4,0x9e,0x8b,0xa8,0x3d,0x17,0x91,0xbb,0x98,0xdc,0xc5,0x74,0x1d,0x8b, +0xe8,0x1a,0x16,0x91,0xbb,0x98,0xdc,0xc5,0xd4,0x9e,0x2b,0xaa,0xbe,0x57,0x54,0xfb, +0xad,0xa8,0xf6,0x5b,0x51,0xfd,0x6f,0x41,0xf5,0xbf,0x05,0xad,0xeb,0xdc,0xd5,0xea, +0xff,0xbd,0xfb,0x6a,0x25,0xeb,0x3e,0x1e,0x69,0xdd,0x03,0x23,0xad,0xfb,0x7c,0xa4, +0x75,0x8f,0xf4,0xfc,0xa3,0xe5,0x17,0x6d,0xb9,0x23,0x2d,0xbf,0x48,0xb5,0xe3,0x48, +0xb5,0xeb,0x48,0xa5,0xa7,0x67,0xd0,0xbd,0xee,0x26,0xaf,0x57,0x63,0xbf,0x16,0x46, +0x05,0xdd,0xbe,0xe0,0x6a,0x3d,0x33,0x45,0xe9,0x79,0x29,0x5a,0x9a,0x5f,0x5a,0x59, +0x1a,0x21,0x35,0x7d,0x4b,0xf7,0xa0,0xdb,0x3e,0x4d,0x59,0x0c,0x87,0x89,0x41,0xb7, +0x6e,0x98,0xeb,0x5c,0x22,0xe2,0x48,0x9b,0x59,0x10,0x74,0x8f,0xc9,0xc2,0x5e,0xdb, +0x7a,0x36,0x9b,0x2a,0xbd,0x4b,0xe1,0x4c,0xbf,0x3f,0x51,0xf6,0xfb,0xa5,0x93,0xa4, +0x8f,0x49,0x9f,0x92,0x4e,0xf3,0xe2,0xb6,0xce,0x33,0x49,0xf6,0xa7,0xa4,0xb3,0xe4, +0x3f,0xd7,0x8b,0xdf,0x3a,0xc6,0xe8,0x1b,0x76,0x1a,0x65,0xf7,0xfc,0x16,0x5b,0x61, +0x8c,0xbe,0x29,0x9d,0x0d,0xf3,0x75,0x8e,0x75,0xf2,0x5b,0xa7,0x63,0x96,0xc3,0x12, +0x78,0x19,0x96,0xc2,0x32,0x78,0x40,0xe7,0x7f,0x02,0x4a,0x45,0xba,0xe5,0x63,0xd4, +0x84,0x2f,0x11,0xe9,0x1e,0x1f,0x25,0xf7,0x19,0x72,0x9f,0xa6,0x70,0xb1,0x91,0xee, +0xf5,0x38,0x4d,0x5a,0x53,0x9a,0xaa,0xfd,0xa9,0x3a,0x2e,0x59,0xc7,0xb5,0x97,0xbb, +0x96,0xdc,0x35,0x15,0xae,0xa1,0x8e,0x1b,0x12,0xa9,0xba,0x2d,0x3d,0x45,0xfe,0x69, +0xd2,0xa2,0xd2,0x04,0xcb,0x9d,0x4f,0xee,0x7c,0x4a,0xb7,0x77,0x7e,0xa3,0x1b,0xe5, +0xff,0xa1,0xf4,0x14,0x69,0x9a,0xf4,0x54,0x69,0x0d,0xa9,0xc9,0x47,0xa4,0xd2,0x15, +0x29,0x77,0x3e,0xb9,0x8d,0x96,0x91,0xd6,0x93,0xee,0x94,0x7e,0x21,0x8d,0x93,0xb6, +0x94,0xc6,0x2a,0x9e,0x86,0xd2,0x58,0xf9,0x37,0xb4,0xf6,0x17,0x90,0xdb,0x68,0x25, +0xf9,0x37,0x91,0x56,0x95,0xb6,0x90,0xf6,0x08,0x39,0xce,0x68,0xa8,0x14,0x45,0x3b, +0x8f,0x72,0xf5,0x42,0x68,0x2a,0x35,0xee,0x76,0xd0,0xdc,0x72,0x0f,0xd1,0x7e,0xa3, +0x2b,0xa4,0xcd,0xa5,0xef,0x2b,0xdc,0x52,0xe9,0x3a,0x69,0xe5,0x18,0xc7,0xa9,0x03, +0x09,0xd2,0x64,0x69,0x29,0xe9,0x29,0xd2,0x53,0xa5,0x67,0x4a,0xcb,0x4b,0x2b,0x48, +0xab,0x4a,0xab,0x4b,0x57,0xc0,0x22,0xe9,0x06,0x98,0x02,0xaf,0xc2,0xe3,0xd2,0x19, +0xd2,0xa4,0xfc,0x84,0x87,0x9a,0xd2,0x53,0xa4,0xa7,0x4a,0xcf,0x94,0x56,0x95,0x36, +0x29,0x40,0xdd,0x2a,0xe0,0x6a,0x3d,0x69,0x07,0x28,0x0f,0x75,0xa0,0x82,0xf4,0x6e, +0xd8,0x00,0xcb,0x61,0x11,0xac,0x90,0x2e,0x97,0x7f,0xe3,0x82,0xc4,0x03,0x8b,0xe1, +0x7d,0x58,0x6e,0xe9,0x07,0xd2,0x65,0x96,0x9a,0x7d,0x8d,0x0b,0x71,0x4e,0x68,0x22, +0x35,0xee,0x0e,0xf0,0x21,0xac,0x92,0xbe,0x63,0xa9,0xe7,0xb7,0x19,0x5a,0x16,0x26, +0xaf,0xb0,0x06,0x66,0xc3,0x74,0x98,0x24,0x9d,0x02,0x05,0x8a,0x38,0x4e,0x26,0xcc, +0x83,0xf3,0xa4,0x6d,0xa4,0xed,0xa5,0x9d,0xa4,0x19,0x30,0x17,0x06,0xc2,0x20,0xe9, +0x10,0x98,0x0d,0x23,0xa5,0x03,0x65,0x9f,0x63,0xa9,0xe7,0xe7,0xe9,0xdd,0x8a,0xef, +0x61,0xe9,0x14,0xe9,0xd3,0xd2,0xe9,0xd2,0x09,0x3a,0xdf,0x39,0x45,0x1d,0x27,0x1e, +0x72,0x20,0x54,0x9a,0xb6,0x07,0xd1,0xd2,0x18,0x69,0x01,0x69,0x21,0x69,0x31,0x69, +0x2d,0x69,0x1d,0x69,0x3d,0x69,0x7d,0x69,0xa6,0xd4,0xdc,0xa3,0xcc,0x7d,0x3b,0x53, +0xcf,0x01,0xe6,0x1e,0x75,0x67,0xc0,0x7d,0x06,0x30,0xf7,0x33,0xef,0xd9,0xbf,0x85, +0x9e,0xcb,0x5a,0xea,0x39,0xcc,0xdc,0x7b,0x2a,0xd0,0xb7,0xb7,0x76,0xdc,0xfb,0xa8, +0xb9,0x17,0x9a,0xfb,0xa5,0x79,0xc6,0x34,0xf7,0xbb,0xd6,0xec,0x6b,0x03,0xc1,0xb3, +0x1c,0xa7,0x9b,0x9e,0x2d,0xcc,0x7d,0xaf,0x23,0x7e,0x9d,0xe0,0x92,0xa0,0xfb,0x7c, +0x61,0x9e,0x65,0xfa,0x99,0xf8,0x03,0xee,0x3d,0xec,0x42,0xfc,0x4f,0xe1,0x98,0x53, +0x21,0xdb,0x71,0xef,0xad,0xe6,0xfe,0x7b,0x16,0xee,0x01,0xec,0x1b,0x8a,0xfd,0x9c, +0xb3,0xdc,0xbe,0x78,0x0e,0xbc,0xa8,0xbe,0x77,0x85,0x9e,0x03,0x06,0x29,0xbc,0x09, +0xe7,0x85,0x59,0x6a,0x85,0xa9,0x4b,0x7b,0xbf,0x20,0xe8,0xfe,0xa6,0x6b,0x87,0xee, +0x73,0xdc,0xb4,0xf4,0x44,0x3b,0xa3,0x5d,0xa1,0x07,0x5c,0x01,0xbd,0xcd,0x3d,0xd3, +0xdc,0x2b,0x39,0xdf,0x23,0x68,0x3f,0x18,0x8b,0xfd,0x31,0x74,0x20,0x64,0xc3,0x20, +0x18,0x0c,0x43,0xe0,0x2a,0x18,0x0e,0xa3,0x61,0x0c,0x4c,0x27,0x4f,0xb7,0xa0,0xb7, +0xc2,0x99,0x1c,0x77,0x1b,0x7a,0x7b,0xd0,0x7d,0xc6,0x9a,0x80,0xde,0x15,0x74,0x9f, +0xc9,0xe6,0xeb,0x59,0xe1,0x1c,0x3d,0x2b,0x18,0xcd,0xd4,0x7d,0xb8,0x9b,0xd4,0xb8, +0x63,0xe5,0x8e,0x95,0x3b,0x51,0xee,0x44,0xeb,0x1d,0x44,0xc0,0xfa,0xfd,0x1e,0xd0, +0x33,0x5e,0xb4,0x9e,0xb3,0xa3,0xe5,0x8e,0x95,0x3b,0x56,0xee,0x44,0xb9,0x13,0xe5, +0xae,0x24,0x77,0x25,0xb9,0xe3,0xe4,0x8e,0xb3,0x7e,0xf3,0x3a,0xd6,0xef,0x5e,0xc7, +0xf2,0x0f,0x58,0xfe,0xde,0x3b,0x90,0x38,0xf9,0x79,0xc7,0x27,0xc8,0x9d,0x60,0x3d, +0x13,0x45,0x59,0xcf,0x45,0xc6,0xde,0x58,0xe9,0xed,0x69,0xfd,0xd6,0x8d,0xd4,0x33, +0x69,0xa4,0x9e,0xb5,0xa2,0xf5,0x6c,0x13,0x2d,0x77,0xac,0xdc,0xb1,0x72,0xe7,0x93, +0x3b,0x9f,0xdc,0x95,0xe4,0xf6,0x7e,0x2b,0xc7,0xcb,0x1d,0xaf,0x67,0xc9,0x04,0xd5, +0xa1,0x04,0xeb,0x9d,0x4c,0xc0,0x7a,0x9f,0x11,0xd0,0x33,0x78,0x40,0xcf,0xe0,0x9e, +0x3b,0x56,0xee,0x58,0xb9,0x13,0xe5,0x4e,0xd4,0x6f,0x9a,0x58,0xfd,0xd6,0x8d,0xb5, +0xdc,0x91,0x96,0x5f,0xa4,0xfc,0x13,0xe5,0xe7,0x1d,0x17,0x27,0xb7,0xd1,0x96,0x3a, +0x5f,0x3f,0x69,0x4b,0xe5,0xbb,0x9f,0xb4,0xa5,0xe2,0xea,0x27,0x3d,0x5f,0xfe,0xfd, +0xa5,0xe7,0xcb,0xbf,0xbf,0xb5,0x3f,0x51,0xee,0x44,0xb9,0xe3,0xe4,0x8e,0xb3,0x9e, +0x41,0x03,0xd6,0x33,0x68,0xc0,0xf2,0xcf,0x67,0xf9,0xe7,0x8b,0x38,0xf2,0xdb,0xdb, +0xb1,0x7e,0x7f,0x3b,0x96,0x7f,0xc0,0xf2,0x37,0xf6,0xd6,0xca,0x47,0xb6,0x73,0xc4, +0x1d,0x2d,0x77,0xb4,0x9e,0xcd,0xa3,0xf5,0x6c,0xee,0xb9,0x63,0xe5,0x8e,0xb5,0xdc, +0x91,0x96,0x5f,0xa4,0xfc,0x13,0xe5,0x97,0xa8,0x67,0xf6,0x68,0x3d,0xb3,0x47,0xcb, +0x1d,0x2b,0x77,0xac,0xf5,0x9b,0x3e,0xda,0xfa,0x5d,0x1f,0x6d,0xfd,0x76,0x8f,0xb6, +0x7e,0xbf,0xdb,0xc7,0x47,0x5b,0x71,0x44,0xeb,0xb7,0x40,0xb4,0x7e,0x0b,0x78,0xee, +0x58,0xb9,0x63,0xe5,0x4e,0x94,0x3b,0x51,0xee,0x38,0xb9,0xe3,0xf4,0x5b,0xe3,0x6c, +0xfd,0xd6,0x38,0x5b,0xee,0x04,0xb9,0x13,0xe4,0x8e,0x93,0x3b,0xce,0x7a,0x57,0x10, +0xb0,0xde,0x17,0x04,0xac,0x77,0x06,0xf9,0xac,0xf7,0x06,0xc6,0xde,0x5e,0x61,0x86, +0x4a,0xdb,0x2b,0x5d,0x43,0xa5,0x1d,0xf4,0xdb,0x6e,0x98,0xb4,0x83,0xca,0x62,0x98, +0xb4,0x83,0xda,0xc0,0x30,0x69,0x07,0xe5,0x73,0x98,0xb4,0x83,0xe2,0x19,0x26,0xbd, +0x48,0xfe,0xc3,0xa5,0x17,0xe9,0xb8,0xe1,0xd6,0xbb,0xc9,0x68,0xfd,0x46,0xf1,0xde, +0x29,0x04,0xf5,0x4e,0x21,0x28,0x77,0xac,0xdc,0xb1,0x72,0x27,0xca,0x9d,0xa8,0x76, +0xeb,0x95,0xa7,0x97,0xae,0xfc,0x8a,0x2f,0xbf,0xfa,0xd1,0x45,0xf4,0xad,0x37,0x04, +0xdc,0xf8,0x1b,0x28,0x9e,0xae,0x52,0xe3,0x8e,0x91,0x3b,0xc6,0x7a,0xc7,0x6b,0xbf, +0x1f,0xb5,0xdf,0xfd,0x3a,0x96,0xbf,0x63,0xf9,0xc7,0x58,0xfe,0x76,0x3c,0x11,0x96, +0x7f,0x84,0x75,0xfe,0xa0,0x95,0x86,0xa0,0xf5,0xce,0x32,0x60,0xbd,0xb7,0x0c,0x58, +0xfe,0x8e,0xe5,0xef,0x58,0xfe,0x31,0x96,0x7f,0x8c,0xe5,0x1f,0x61,0xf9,0xdb,0xe7, +0x8d,0xb2,0xce,0xeb,0xbd,0x9b,0x8c,0x55,0x9f,0x1b,0x2b,0x77,0x8c,0xdc,0x31,0x72, +0x47,0xc8,0x1d,0x61,0xbd,0xcb,0xb6,0xdf,0x03,0xdb,0xef,0xb8,0x1d,0xcb,0xdf,0xb1, +0xfc,0x63,0x2c,0xff,0x18,0xcb,0x3f,0xc2,0xf2,0x8f,0xb0,0xd2,0x13,0xb4,0xd2,0xe4, +0xbd,0xc3,0x8c,0x51,0x1f,0x1c,0x23,0x77,0xac,0xdc,0xb1,0xea,0x5f,0x62,0xd5,0xb7, +0x78,0xee,0x18,0xb9,0x63,0xac,0x77,0xe7,0xf6,0x7b,0x67,0xfb,0x9d,0xba,0x63,0xf9, +0x3b,0x96,0x7f,0x8c,0xe5,0x6f,0xc7,0x13,0x61,0xf9,0x47,0x58,0xe7,0x0f,0x5a,0x69, +0xf0,0xde,0xd5,0x97,0xb6,0xce,0x5b,0xda,0x3a,0x6f,0x69,0xeb,0xbc,0xa5,0xad,0xf3, +0x96,0xb6,0xce,0x5b,0xda,0x3a,0x6f,0x69,0xeb,0xbc,0xa5,0xad,0xf3,0x1a,0x7b,0xac, +0xe5,0x1f,0xab,0xf6,0x1f,0xab,0xb6,0xef,0xb9,0x63,0xe4,0x8e,0xb1,0xde,0xcb,0x05, +0xac,0x77,0x73,0x01,0xcb,0xdf,0xb1,0xfc,0x1d,0xcb,0x3f,0xc6,0xf2,0xb7,0xe3,0x89, +0xb0,0xfc,0x23,0x2c,0xff,0x58,0xcb,0x3f,0x56,0xed,0xdd,0x51,0xfb,0x74,0xe4,0x8e, +0x95,0xdb,0xdb,0x1f,0x23,0x77,0x8c,0xdc,0x11,0x72,0x47,0xe8,0xf7,0x7c,0x09,0x69, +0x49,0xcb,0xed,0x58,0x7e,0x8e,0xe5,0x1f,0xb0,0xfc,0x03,0x96,0x7f,0xa6,0xe5,0x9f, +0xa9,0xf7,0x0f,0x25,0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0x0f, +0x58,0xfe,0x99,0x96,0x7f,0xa6,0x7e,0xf7,0x97,0x90,0x96,0xb4,0xdc,0x8e,0xe5,0xe7, +0x58,0xfe,0x01,0xcb,0xdf,0xd8,0x27,0xca,0x7f,0xa2,0xfc,0x26,0x5a,0xc7,0x4f,0xb4, +0x8e,0x9f,0x68,0x1d,0x3f,0xd1,0x3a,0x7e,0x9e,0xfc,0xe7,0xc9,0x6f,0x9e,0x75,0xfc, +0x3c,0xeb,0xf8,0x79,0xd6,0xf1,0xf3,0x8e,0x71,0x7c,0xa6,0xe5,0x9f,0xa9,0x77,0x33, +0x25,0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0x0f,0x58,0xfe,0x99, +0x96,0x7f,0xa6,0xde,0xc1,0x94,0x90,0x96,0xb4,0xdc,0x8e,0xe5,0xe7,0x58,0xfe,0x01, +0xcb,0x3f,0x60,0xf9,0x67,0x5a,0xfe,0x99,0x7a,0x2f,0x54,0x42,0x5a,0xd2,0x72,0x3b, +0x96,0x9f,0x63,0xf9,0x07,0x2c,0xff,0x80,0xe5,0x9f,0x69,0xf9,0x67,0xea,0x1d,0x51, +0x09,0x69,0x49,0xcb,0xed,0x58,0x7e,0x8e,0xe5,0x1f,0xb0,0xfc,0xbd,0x77,0x5a,0x25, +0xa4,0x25,0x2d,0xb7,0x63,0xf9,0x39,0x96,0x7f,0xc0,0xf2,0xf7,0xde,0x4d,0x95,0x90, +0x96,0xb4,0xdc,0x8e,0xe5,0xe7,0x58,0xfe,0x01,0xcb,0xdf,0x3e,0x3e,0xd3,0xf2,0xcf, +0xd4,0xbb,0xad,0x92,0x96,0x3a,0x96,0x3d,0x60,0xd9,0x33,0xf5,0x5e,0xac,0x84,0xb4, +0xa4,0xe5,0x76,0x2c,0x3f,0xc7,0xf2,0x0f,0x58,0xfe,0x01,0xcb,0x3f,0xd3,0xf2,0xcf, +0xd4,0xfb,0xbd,0x12,0xd2,0x92,0x96,0xdb,0xb1,0xfc,0x1c,0xcb,0x3f,0x60,0xf9,0x07, +0x2c,0xff,0x4c,0xcb,0xdf,0x6b,0xf7,0x8e,0xef,0xdd,0xa0,0xe3,0x7b,0x47,0xe8,0xf8, +0xde,0x15,0x3a,0xd6,0x3b,0xc3,0xc5,0xd6,0x35,0xf5,0xca,0xd0,0xf1,0xbd,0x27,0x74, +0xac,0xf7,0x85,0x5e,0x9f,0x93,0x65,0xf5,0x39,0x59,0xbe,0xbe,0x2b,0xcb,0xd7,0x7f, +0x65,0xf9,0xfa,0xb0,0x2c,0x5f,0x3f,0x96,0xe5,0xeb,0xcb,0xb2,0x7c,0xfd,0x59,0x96, +0xd5,0x27,0x65,0x59,0x7d,0x52,0x96,0xaf,0x6f,0xcb,0xf2,0xf5,0x6f,0x59,0xbe,0x3e, +0x2e,0xcb,0xd7,0xcf,0x65,0xf9,0xfa,0xba,0x2c,0x5f,0x7f,0x97,0x65,0xf5,0x19,0x59, +0x56,0x9f,0x91,0xe5,0xeb,0x7b,0xb2,0x7c,0xfd,0x4f,0x96,0xaf,0x0f,0xca,0xf2,0xf5, +0x43,0x59,0xbe,0xbe,0x28,0xcb,0xd7,0x1f,0x65,0x59,0x7d,0x4a,0x96,0xd5,0xa7,0x64, +0xf9,0xfa,0xa6,0x2c,0x5f,0xff,0x94,0xe5,0xeb,0xa3,0xb2,0x7c,0xfd,0x54,0x96,0xaf, +0xaf,0xca,0xf2,0xf5,0x57,0x59,0x56,0xfd,0xcd,0xb2,0xea,0x6f,0x96,0xaf,0x1d,0x64, +0xf9,0xda,0x42,0x96,0xaf,0x3d,0x64,0xf9,0xda,0x44,0x96,0xaf,0x5d,0x64,0xf9,0xda, +0x46,0x96,0x55,0xbf,0xb3,0xac,0xfa,0x9d,0xe5,0x6b,0x27,0x59,0xbe,0xb6,0x92,0xe5, +0x6b,0x2f,0x59,0xbe,0x36,0x93,0xe5,0x6b,0x37,0x59,0xbe,0xb6,0xe3,0xd5,0xb3,0x28, +0x69,0xa4,0xd5,0x9e,0xbc,0x7d,0x59,0x56,0xdb,0xf2,0xec,0x99,0x96,0x7a,0x75,0x26, +0x4a,0x1a,0x29,0x75,0xac,0x71,0x80,0xbb,0x14,0xce,0x8c,0x13,0x78,0xf7,0x03,0xcf, +0x6e,0x34,0x53,0x63,0x07,0x99,0x56,0x7b,0xf5,0xea,0x44,0x96,0xd5,0x76,0x3d,0x7b, +0xa6,0xa5,0x59,0xba,0x47,0x7a,0xf7,0x4d,0xef,0x7e,0xe4,0x58,0x63,0x0e,0xf7,0x2b, +0xdc,0xe2,0xb2,0x6a,0xeb,0x65,0xd5,0xf6,0xcb,0x1e,0xb9,0xb7,0x44,0x49,0x23,0xad, +0xb1,0x03,0xc7,0x37,0x1e,0xb1,0xc0,0xba,0x17,0xe5,0xb3,0xee,0x1f,0x51,0xd2,0x48, +0xa9,0x63,0x8d,0x73,0xfc,0xac,0x73,0xfe,0x5c,0xf6,0x88,0xdb,0xeb,0x9f,0xa3,0xa4, +0x91,0xd6,0x38,0x85,0xe3,0x1b,0xc7,0x58,0xaa,0xeb,0xb7,0xd4,0xba,0x27,0x64,0x5a, +0x61,0xbc,0xfe,0x3d,0x4a,0x1a,0x29,0x75,0xac,0xb1,0x95,0x29,0x3a,0x76,0xaa,0x9e, +0xd3,0xbc,0x71,0x9a,0x2e,0xce,0x91,0xfe,0xcd,0xab,0x93,0x59,0x56,0x5f,0xe7,0xd9, +0x33,0x2d,0xcd,0xd2,0x3d,0xcb,0xb1,0xc6,0x70,0xa6,0x59,0x7d,0xb7,0xe7,0x36,0xe1, +0x5e,0xd4,0xd8,0x90,0x39,0x77,0x10,0x4b,0x44,0xb9,0x23,0xf3,0x7c,0xfe,0x13,0x45, +0x15,0x2e,0x99,0xe3,0xe2,0x9d,0x63,0x63,0xf6,0x27,0x95,0xfb,0xff,0xa4,0x1e,0x83, +0xf2,0x8e,0x8b,0x39,0x26,0x44,0x9c,0xf5,0x9d,0x23,0x78,0xfb,0xea,0x1f,0x23,0x3e, +0x13,0x3e,0x41,0x73,0x24,0xcc,0x1c,0xa2,0x54,0x48,0x83,0x1a,0x50,0x13,0xd2,0xa1, +0x2a,0x14,0xaf,0xe0,0x38,0x75,0xcd,0x98,0x1a,0x9c,0xab,0xb1,0xec,0x04,0xcd,0x45, +0xf2,0xe6,0x21,0x9d,0xcc,0xf1,0x5d,0xf5,0x5e,0x75,0x80,0xc6,0xe1,0xcc,0xfb,0xd5, +0x2b,0xf4,0x5e,0xb5,0xaf,0xde,0xad,0x9a,0x73,0x64,0x6b,0xac,0x6e,0x88,0xde,0xd7, +0x0e,0xd6,0xb1,0xd5,0x1d,0xf7,0x7d,0xa1,0x67,0x37,0xfe,0xe6,0x5d,0xe2,0x4c,0x69, +0x77,0xf9,0x0f,0xb0,0xec,0xe6,0xb9,0x7e,0x42,0xc0,0x0d,0x63,0xde,0xd3,0xf5,0xd2, +0xbb,0x62,0x8f,0xdc,0x77,0x6c,0x01,0xf7,0xb7,0x5a,0x33,0xbd,0x37,0xee,0xab,0xf7, +0xc6,0xe7,0x2b,0x2e,0xf3,0xbe,0xa7,0x8d,0xd2,0xe2,0xd1,0x56,0xef,0x97,0x2f,0xd4, +0x7b,0xe8,0xf3,0x64,0x6f,0xa9,0x71,0xea,0x69,0x7a,0x0f,0xd0,0xc2,0x39,0x32,0x06, +0x9d,0xa9,0x74,0xf6,0xd0,0x31,0x8d,0x15,0xde,0x9c,0x63,0x6d,0xc8,0x71,0xde,0x85, +0x75,0xb0,0x3e,0xe4,0x5e,0x9b,0xc6,0x3a,0xd6,0xbc,0x8f,0x58,0xa2,0xf7,0xc3,0xf7, +0xc0,0x64,0x28,0x56,0xc1,0x7d,0xdf,0xe9,0xbd,0xab,0xf6,0xe6,0xbb,0x78,0xf3,0xc4, +0x6a,0x58,0xf6,0x74,0xcb,0x9e,0x68,0x5d,0x43,0xe3,0x4e,0xd6,0xb5,0xf4,0xec,0x9e, +0x7f,0xaa,0xe5,0x9f,0x6a,0xcd,0x39,0x4b,0xd5,0x35,0xf7,0xec,0x5e,0xf8,0x34,0xd5, +0x03,0xcf,0xee,0xf9,0xd7,0xb4,0x8e,0xad,0x69,0x85,0xa9,0xa9,0xfa,0xe2,0xd9,0xbd, +0xf0,0xde,0x75,0x38,0x16,0xed,0x2d,0x9a,0x59,0xea,0xb7,0x7b,0x5c,0x64,0xd1,0xcc, +0x52,0xef,0x3a,0x37,0xd4,0x38,0x42,0x4b,0x95,0x5f,0x5e,0x0c,0xb5,0xe8,0x6d,0xa9, +0xdf,0xee,0x31,0xdc,0xa2,0xb7,0xa5,0xbd,0x55,0xb7,0xba,0xeb,0xba,0xf5,0xd3,0xb5, +0xf0,0xca,0x7e,0x02,0x0d,0xb6,0xa6,0x99,0xfb,0x20,0xbd,0x57,0xba,0x56,0xfa,0x9e, +0x74,0x9d,0x34,0xa2,0x82,0xab,0xf9,0xa4,0x05,0xa4,0xb1,0xd2,0x73,0xa4,0x55,0x2b, +0xfc,0x7f,0xe2,0x8f,0x41,0x1d,0x85,0x6f,0x28,0xcd,0x92,0x36,0x95,0x9a,0xb6,0x6c, +0xb4,0xab,0xdc,0x2d,0xa5,0x75,0xe4,0x5f,0x4f,0x7a,0xb9,0xfc,0x7b,0x48,0x07,0x49, +0x07,0x4b,0x87,0x4a,0x87,0x49,0xaf,0x91,0x5e,0x2b,0x1d,0x2d,0x1d,0x23,0xbd,0x49, +0x7a,0xb3,0xf4,0x71,0xe9,0x54,0xe9,0x34,0xe9,0x74,0xe9,0x08,0xe9,0x75,0xd2,0xbb, +0xa4,0x77,0x4b,0x67,0x4b,0xe7,0x48,0x5f,0x94,0xce,0xf5,0xca,0x93,0x8b,0x12,0x93, +0x70,0x62,0xfd,0x9c,0xdd,0x9e,0x12,0xad,0xbe,0x31,0xd1,0x39,0xd2,0x9e,0xbc,0xf9, +0x9b,0x5e,0x7b,0xf1,0xda,0x87,0xd7,0x46,0xbd,0xfa,0x9f,0xae,0x63,0x13,0xd4,0x67, +0x26,0xaa,0xdf,0xac,0x2c,0x7f,0xcf,0x9e,0x6c,0xd9,0x53,0x2c,0x7b,0xaa,0x65,0x4f, +0xb3,0xec,0x35,0x2c,0x7b,0x4d,0xcb,0x9e,0x6e,0xd9,0xbd,0x7c,0xd8,0xee,0x44,0x9f, +0x3b,0xc9,0xe7,0x4e,0xf6,0xb9,0x53,0x7c,0xee,0x54,0x9f,0x3b,0xcd,0xe7,0xae,0xe1, +0x73,0xd7,0xf4,0xb9,0xd3,0x7d,0xf9,0xf7,0xd2,0x97,0xa8,0x7b,0x65,0x92,0x34,0x59, +0x9a,0x22,0x4d,0x95,0xa6,0x49,0x6b,0x48,0x6b,0x4a,0xd3,0xa5,0x5e,0x9e,0xe3,0xad, +0xfc,0xc6,0x5b,0x79,0x8d,0xb7,0xf2,0x19,0x6f,0xe5,0x31,0xde,0xca,0x5f,0xbc,0x95, +0xb7,0x78,0x2b,0x5f,0xf1,0x56,0x9e,0xe2,0xad,0xfc,0xc4,0x5b,0x79,0x89,0x57,0xde, +0xba,0x5a,0xf9,0xec,0x66,0xd9,0xbb,0x5b,0xf6,0xcb,0x2d,0x7b,0x0f,0xcb,0xde,0xd3, +0xb2,0xf7,0xb2,0xec,0x57,0x58,0xf6,0xde,0x96,0xfd,0x4a,0xcb,0xde,0xc7,0xb2,0xf7, +0xb5,0xec,0xfd,0x2c,0x7b,0x7f,0xcb,0x3e,0xc0,0xb2,0x67,0x5b,0xf6,0x81,0x96,0x7d, +0x90,0x65,0x1f,0x6c,0xd9,0x87,0x58,0xf6,0xab,0x2c,0xfb,0x50,0xcb,0x3e,0xcc,0xb2, +0x0f,0xb7,0xec,0x57,0x5b,0xf6,0x6b,0x64,0x6f,0xe0,0x1c,0xb9,0x9f,0x36,0xb2,0xee, +0xa7,0x27,0x32,0x16,0x6c,0xdf,0xcf,0xdb,0x5a,0xe3,0xc1,0xed,0x35,0x26,0x6c,0xee, +0x13,0x1d,0x75,0x1f,0xef,0xaa,0x6b,0xd2,0xdd,0xba,0xd7,0xf6,0x54,0x59,0x5f,0x61, +0xdd,0x77,0xfd,0xcf,0x30,0x03,0x54,0x46,0x03,0x55,0x26,0x83,0xad,0xf1,0xe1,0xa1, +0xca,0xeb,0x70,0xe5,0xed,0x1a,0xd5,0x07,0x7f,0x1f,0x5d,0xcb,0x71,0xa9,0x9b,0x07, +0x1f,0x57,0x71,0xfb,0xab,0x2b,0x95,0xf6,0xae,0x71,0x8e,0xb3,0x86,0x84,0x3c,0xf6, +0x98,0x9b,0xd9,0xca,0x90,0x06,0xf5,0xa1,0x23,0x8c,0x85,0xdb,0x61,0x32,0xbc,0x6c, +0xfc,0x29,0x84,0x1e,0xd0,0x07,0x46,0xc3,0x7d,0x30,0x1d,0xb6,0xc0,0xb7,0x2a,0xa0, +0x87,0xe0,0x20,0x94,0xa2,0xa0,0xce,0x80,0x9a,0xd0,0x00,0x2e,0x81,0xde,0x30,0x1a, +0x5e,0x82,0x95,0xb0,0x0d,0x36,0x90,0x90,0xb2,0x14,0xe2,0x6e,0x0a,0x31,0x48,0x21, +0xe6,0x87,0x52,0x50,0x09,0x06,0x43,0xeb,0x4e,0x8e,0x33,0x12,0x7e,0x80,0x22,0x97, +0x38,0x4e,0x05,0xa8,0x09,0xfd,0x61,0x20,0x6c,0xba,0xd4,0x71,0x3e,0x83,0xfd,0xf0, +0x33,0x0c,0xba,0x8c,0xf2,0x81,0x1b,0xe0,0x1b,0xf8,0x19,0x0a,0x74,0xe6,0xb7,0x03, +0xb4,0x86,0xae,0x30,0x18,0x5e,0x83,0x7c,0x5c,0xa8,0x34,0x68,0x01,0xd5,0xb9,0x50, +0x29,0x70,0x33,0xdc,0x0f,0x4f,0xc2,0x02,0xd8,0x02,0x9f,0xc1,0x3e,0x2e,0x62,0x3e, +0x2e,0x62,0x65,0x28,0x47,0x99,0x75,0x83,0xab,0x61,0x0e,0xac,0x86,0xf7,0x60,0x13, +0x14,0xe1,0xa2,0x96,0x84,0x14,0xe8,0xc3,0x05,0xad,0xc2,0xc5,0x4c,0x83,0xda,0x50, +0x1f,0x9a,0x40,0x47,0xe8,0x04,0xcf,0xc1,0x8d,0x5c,0xe8,0x5b,0x20,0x87,0x8b,0xbd, +0x03,0x4e,0xe3,0x82,0x97,0x85,0xca,0x90,0x00,0xb7,0xc1,0xdd,0x30,0x94,0x4a,0x70, +0x1d,0xbc,0x00,0x8b,0xe1,0x2b,0xd8,0x44,0xa5,0xd8,0x0a,0x07,0xa0,0x16,0x15,0x63, +0x3e,0x2c,0x82,0x21,0x54,0x90,0xd5,0x70,0x10,0x06,0x8f,0xa0,0xec,0x20,0xed,0x06, +0xea,0x30,0xdc,0x0a,0x0b,0x21,0x30,0xd2,0x71,0x0a,0x42,0x71,0x48,0x86,0x1b,0xe0, +0x16,0xd8,0x36,0xca,0x71,0x76,0xc1,0x01,0x38,0x0c,0x05,0x47,0x3b,0x4e,0x69,0x28, +0x0b,0xfd,0x61,0x10,0x0c,0x87,0x96,0x37,0x91,0x3f,0xc8,0x18,0x47,0x7b,0x81,0xee, +0x70,0xfd,0x2d,0xa4,0x17,0xd6,0x81,0x73,0x2b,0xfd,0xda,0xed,0xb4,0x31,0x68,0x07, +0xc3,0xe1,0x11,0xb8,0xfc,0x0e,0xea,0x39,0xcc,0x81,0xe9,0x77,0x3a,0xce,0x2a,0x78, +0x68,0x3c,0xcf,0xdb,0x30,0x17,0xee,0x9a,0x40,0x5b,0xbc,0xcb,0x71,0x96,0xc3,0x5b, +0xf0,0x2e,0x0c,0x9b,0x48,0x1d,0x80,0x33,0xef,0xa3,0xee,0xc0,0x02,0xd8,0x09,0x6d, +0xee,0x77,0x9c,0xcb,0xa0,0x1b,0xf4,0x86,0xd5,0xb0,0x07,0x0e,0x40,0xe0,0x01,0xee, +0xf7,0xb0,0x09,0x36,0xc3,0x7d,0x93,0xf8,0x2d,0x0a,0xcf,0xc1,0xd4,0x07,0x1d,0x67, +0x23,0x6c,0x86,0x73,0x1e,0xe2,0xda,0x43,0x12,0xd4,0x81,0x8b,0xe1,0xb3,0x87,0x69, +0x77,0x8f,0x52,0x26,0xf0,0x14,0xbc,0x02,0xaf,0xc1,0x1a,0x78,0x17,0x0e,0xc2,0x4f, +0x50,0x98,0x76,0x53,0x02,0xca,0x41,0x6d,0x68,0x0e,0x17,0xc0,0x1d,0xf0,0x30,0x4c, +0x7e,0xcc,0xfd,0xed,0x54,0x3c,0xc1,0x6d,0x03,0x8d,0x20,0x0b,0x5a,0xe0,0x9e,0x04, +0x2d,0xa5,0xad,0xa4,0x6d,0xa4,0x6d,0xa5,0xed,0xa4,0x1d,0xa4,0x1d,0xa5,0x9d,0xa4, +0x97,0x4a,0x3b,0x4b,0xbb,0x4a,0x2f,0x97,0xf6,0x94,0x5e,0x21,0x1d,0x60,0xe9,0x83, +0x30,0x48,0xee,0x41,0x72,0x5f,0x25,0xf7,0x55,0x72,0x0f,0x97,0x7b,0xb8,0xdc,0xd7, +0xca,0x7d,0xad,0xdc,0x8d,0xe5,0x36,0x79,0xf4,0xd4,0xf8,0x3f,0x22,0xff,0x71,0x70, +0x2b,0x4c,0x97,0xfb,0x79,0xe9,0x0c,0xe9,0x2c,0xe9,0x1c,0xe9,0x5c,0xe9,0x3c,0xe9, +0x02,0xe9,0x2b,0xd2,0x85,0xd2,0xc5,0xd2,0xa5,0xd2,0xd7,0xa5,0xcb,0xa5,0x2b,0xa5, +0xef,0x58,0x6a,0xd2,0xb5,0x4e,0xee,0x75,0x72,0xbf,0x2f,0xf7,0xfb,0x72,0x6f,0x94, +0x7b,0xa3,0xdc,0x9b,0xe4,0xde,0x24,0xf7,0xd3,0x72,0xef,0x95,0xee,0x93,0xee,0x97, +0x7e,0x2d,0xfd,0xc9,0xca,0x97,0x49,0x8b,0x53,0x8c,0xfa,0x08,0xcf,0x42,0x10,0x9e, +0x83,0xe7,0x21,0x02,0x22,0x21,0x04,0x33,0x61,0x16,0xcc,0x86,0x39,0xf0,0x22,0xcc, +0x85,0x33,0x20,0x0a,0xa2,0x21,0x1f,0x94,0x87,0x18,0xc8,0x0f,0x05,0xa0,0x20,0x14, +0x82,0xc2,0x50,0x04,0x8a,0x42,0x31,0x28,0x0e,0x5d,0xa1,0x1b,0x74,0x87,0xcb,0xa1, +0x07,0xf4,0x84,0x5e,0x70,0x05,0xf4,0x86,0x2b,0xa1,0x0f,0xf4,0x85,0x7e,0xd0,0x1f, +0x06,0x40,0x36,0x0c,0x84,0x41,0x30,0x18,0x86,0xc0,0x55,0xd0,0x05,0x4a,0x42,0x29, +0x58,0x01,0x2b,0xe1,0x2d,0x78,0x1b,0xd6,0xc3,0x06,0xf8,0x10,0xce,0x84,0x8f,0x61, +0x33,0x9c,0x05,0x65,0xa0,0x1c,0x54,0x80,0x58,0xa8,0x04,0xe7,0x42,0x55,0xa8,0x06, +0x71,0x10,0x0f,0xd5,0x21,0x09,0xd2,0x20,0x03,0x9a,0xc0,0x79,0xb0,0x1f,0xbe,0x86, +0x0e,0x70,0x11,0x74,0x84,0x1b,0x61,0x2c,0x8c,0x83,0xbb,0xe0,0x6e,0xb8,0x17,0x1e, +0x85,0x29,0xc5,0xdc,0x7b,0x9a,0xb9,0x7f,0xc5,0xc0,0x26,0xee,0x33,0xf9,0xd1,0x38, +0x28,0x00,0x49,0x57,0xb9,0xf7,0xb8,0xd3,0x21,0x00,0xe7,0x72,0xaf,0x49,0xe8,0xe0, +0xde,0xe7,0xcc,0x73,0x83,0xb9,0x66,0xde,0x33,0x44,0xd0,0xb2,0x47,0x58,0xf6,0x90, +0x65,0x8f,0xb2,0xec,0xd1,0x96,0x3d,0xc6,0xb2,0x17,0xb0,0xec,0x05,0x2d,0x7b,0x61, +0xcb,0x5e,0xc4,0xb2,0x17,0xb5,0xec,0xc5,0x2c,0x7b,0x71,0xcb,0xee,0xe8,0x3a,0xdb, +0x69,0xed,0xea,0x4b,0x6f,0x57,0x5f,0x9a,0xbb,0xfa,0xd2,0xdd,0xd5,0x97,0xf6,0xae, +0xbe,0xf4,0x77,0xf5,0xe5,0xa1,0xab,0x2f,0x1f,0x5d,0x7d,0x79,0xe9,0xea,0xcb,0x4f, +0x57,0x5f,0x9e,0xba,0xfa,0xf2,0xd5,0xd5,0x97,0x37,0x7f,0xfc,0xfd,0x7d,0xe7,0xef, +0xad,0x7a,0x6f,0xea,0xf3,0xf4,0x63,0xec,0x2b,0xee,0x3b,0xc6,0xd4,0x03,0xcf,0x7e, +0xbb,0x65,0x8f,0xb1,0xec,0xa6,0x7e,0x78,0xf6,0x7b,0x2d,0xff,0x7e,0x6d,0xac,0xb2, +0xb4,0xfc,0xfb,0x58,0xfe,0x97,0x5a,0xfe,0xa6,0x9f,0xf7,0xec,0xe6,0x79,0xe1,0xd7, +0xf0,0xd9,0xd6,0x6f,0xb0,0xbe,0x47,0xec,0x95,0xad,0x30,0xe6,0x5e,0xe7,0xd9,0xcd, +0x33,0x91,0x67,0x37,0xcf,0x1f,0x9e,0xbd,0xca,0x15,0x56,0xfa,0xad,0x63,0xeb,0x5d, +0x7d,0xc4,0x5e,0xe8,0x42,0xeb,0x59,0x78,0xd0,0x11,0xfb,0x94,0xdb,0xad,0x34,0x5b, +0xe1,0x5f,0xbc,0xe0,0x88,0x7d,0x9b,0x95,0x97,0x11,0x56,0x3c,0x3d,0x3b,0x59,0x61, +0x86,0x1e,0xb1,0x07,0x5a,0x1d,0xb1,0xaf,0xb0,0xe2,0xbf,0xd0,0x2a,0x87,0x7e,0xd6, +0xb9,0x8a,0x59,0xe1,0xcd,0x73,0x86,0x67,0x3f,0x20,0x7b,0x2b,0x1e,0xac,0x47,0x5c, +0xe6,0x3e,0x87,0x8d,0xbf,0xd6,0x7d,0xf6,0xf6,0xde,0x99,0x25,0x59,0xbf,0xb5,0x92, +0xac,0xdf,0xda,0x49,0xfa,0x9d,0x95,0xe4,0x1c,0x79,0x0f,0x95,0x26,0xad,0x21,0xad, +0x29,0x4d,0xd7,0x31,0x09,0xd6,0xef,0xed,0x64,0x2b,0xae,0x64,0xeb,0xf7,0x7b,0xb2, +0xe2,0x73,0xd4,0x6f,0x47,0xa8,0xaf,0xf6,0xfa,0xe3,0x18,0xab,0x0f,0x3e,0x56,0xff, +0xeb,0xb5,0x4d,0xaf,0x4d,0x7a,0x6d,0xd1,0x6b,0x83,0x5e,0xdb,0xf3,0xda,0x9c,0xd7, +0xd6,0xbc,0x36,0xe6,0xb5,0x2d,0xaf,0x4d,0x79,0x6d,0xc9,0x6b,0x43,0x5e,0xdb,0x29, +0xee,0x0b,0x37,0x4f,0xe7,0xf6,0xda,0x49,0x7f,0xc5,0x39,0x44,0xda,0xff,0x18,0x7d, +0xa3,0xa9,0xf3,0xa6,0xae,0x9b,0x3a,0x6e,0xea,0xb6,0xa9,0xd3,0xa6,0x2e,0x9b,0x3a, +0x6c,0xea,0xae,0xa9,0xb3,0xa6,0xae,0x9a,0x3a,0x6a,0xea,0xa6,0xa9,0x93,0xa6,0x2e, +0x9a,0x3a,0x68,0xea,0x9e,0xa9,0x73,0xa6,0xae,0x99,0x3a,0x66,0xea,0x96,0xa9,0x53, +0x1b,0xd1,0x1a,0x57,0xb9,0xcf,0xf1,0xbd,0x79,0xae,0xab,0x42,0xbc,0xd9,0xc4,0xb9, +0x93,0xb8,0x42,0x0f,0xb8,0x75,0x61,0x12,0x7e,0xdd,0xfb,0x1c,0xdd,0x37,0xef,0xe0, +0x39,0xfe,0x00,0xe1,0x6a,0xc3,0xfd,0x9d,0xdc,0xba,0x67,0xea,0x9c,0xa9,0x6b,0xa6, +0x8e,0x99,0xba,0x75,0x66,0x47,0xf7,0xfa,0xa4,0xe9,0x3a,0xd5,0x90,0x7a,0xef,0x0f, +0xd3,0x75,0x0d,0x13,0xac,0xf7,0x29,0x29,0x56,0x5d,0xf1,0xae,0x71,0x8a,0xf5,0xae, +0x26,0x45,0xf1,0xa5,0x28,0xbe,0x14,0xc5,0x97,0xa2,0xf8,0x52,0xad,0x77,0x37,0xa6, +0x5c,0x92,0xa4,0xc9,0xd2,0x14,0x69,0xaa,0x34,0x4d,0x5a,0x43,0x5a,0x53,0x9a,0x2e, +0xf5,0xde,0x27,0x78,0xf6,0x44,0xcb,0xee,0xc5,0xdd,0x54,0xbf,0x1d,0x7b,0xe8,0x77, +0xa1,0x67,0x6f,0x6f,0xbd,0x43,0x36,0xbf,0x67,0x1f,0x27,0xa2,0x27,0xf5,0x8c,0x32, +0x15,0x9e,0xd5,0x73,0xd7,0xf3,0x7a,0xde,0x9a,0xa5,0xe7,0x91,0xb9,0x7a,0xbe,0x5a, +0xa0,0xe7,0xaa,0x85,0x7a,0x9e,0x5a,0xaa,0xe7,0xa8,0xe5,0x7a,0x66,0x59,0x05,0xab, +0xe1,0x2d,0x58,0x03,0x6f,0xeb,0x39,0x6a,0x9d,0x9e,0x97,0x36,0xea,0xb9,0xe8,0x13, +0xd8,0x0c,0x5b,0xe0,0x53,0xd8,0x0a,0xdb,0x61,0x07,0xec,0x84,0x2f,0x60,0x17,0xec, +0x86,0x2f,0x61,0x8f,0x9e,0x9f,0xf6,0xe9,0xb9,0xc9,0x3c,0x33,0x6d,0x37,0x75,0xf1, +0x42,0x37,0x0f,0xde,0xb3,0xda,0x61,0xa5,0xe3,0x71,0x1d,0x6b,0xce,0x39,0x45,0xee, +0x03,0xd6,0x33,0xda,0xe3,0xe2,0xb0,0xc2,0x3d,0xa9,0x74,0x1f,0xb0,0x9e,0x33,0x9f, +0x94,0x7b,0xa9,0xca,0x67,0x9a,0xdc,0x53,0x55,0x0e,0x33,0xac,0xf3,0x4d,0x92,0xff, +0x61,0x95,0xdf,0x61,0x95,0xe5,0x01,0x85,0x7d,0x56,0x7e,0x5b,0xb4,0xff,0x49,0xe5, +0x6f,0xba,0xf2,0xfa,0x9a,0xe2,0x99,0xae,0xbc,0xee,0xb2,0xe2,0x9a,0x24,0xbf,0x03, +0x96,0xfb,0x80,0xca,0xd0,0x7b,0x36,0xf6,0x3f,0x2b,0xaf,0xd6,0xf1,0xc6,0xfd,0x99, +0x15,0x9f,0xb7,0x7f,0xb7,0xf5,0x3c,0xec,0xf9,0xef,0xb1,0xd4,0x2b,0x83,0x2f,0x94, +0x66,0xcf,0xff,0x53,0x2b,0xcf,0xbb,0x2d,0xff,0xbd,0x56,0x1e,0xfc,0xc7,0xfa,0xdd, +0x2b,0xad,0x72,0xde,0x6d,0x3d,0xa7,0x3f,0x69,0x9d,0x7b,0x8f,0xce,0xb3,0x46,0x75, +0xf0,0xb0,0xca,0x71,0x8e,0x8e,0x59,0x25,0xfb,0x61,0xeb,0x39,0x7b,0xae,0xe2,0xf0, +0xe2,0x9d,0x6b,0x5d,0x3f,0xaf,0xec,0xe7,0xa9,0x2c,0xec,0xeb,0xfc,0x8a,0x15,0xce, +0xb3,0xaf,0xf4,0x95,0xcf,0x02,0xeb,0x77,0xc2,0x3c,0xeb,0x9a,0xef,0xb6,0xf2,0xb3, +0x4a,0xf5,0xfd,0x6d,0xab,0x2c,0xde,0x51,0x9a,0x5e,0xf7,0xd5,0x51,0xfb,0x3c,0xb6, +0xff,0xeb,0xd6,0xef,0x8f,0xc3,0xaa,0xfb,0xbb,0xad,0xdf,0x1e,0x8f,0x2b,0x2d,0x2b, +0x7d,0xfe,0x33,0x7c,0xee,0x39,0xd6,0xef,0x16,0xbb,0x1d,0xd8,0x75,0xcd,0xfb,0x0d, +0xf3,0x84,0x75,0x4d,0xbd,0xdf,0x36,0xaf,0x29,0x9f,0xcf,0x58,0xc7,0x7f,0x61,0xb5, +0xa1,0x19,0x2a,0x1f,0xaf,0xfd,0x78,0xed,0x6a,0xa1,0x65,0x5f,0xad,0x34,0x6c,0x54, +0x98,0xd7,0xad,0x7d,0x5e,0xbb,0xd8,0x68,0xe5,0x7d,0x9e,0xf5,0x3b,0xca,0xcb,0xff, +0x62,0xeb,0xfa,0x3e,0x69,0x95,0xd9,0x26,0x5f,0xf9,0x6f,0xd2,0xbe,0x4d,0x56,0xfc, +0x2b,0xad,0xdf,0x61,0x5e,0x3a,0x3d,0xbb,0xd7,0x7e,0x9e,0xb4,0xea,0x9b,0xe7,0xde, +0x2d,0xfb,0x6b,0xba,0x16,0x9f,0xc8,0x6f,0x86,0xec,0x07,0x94,0xd6,0xcf,0x65,0xdf, +0x6c,0xc5,0xe1,0xb9,0x77,0x59,0x6a,0x5f,0xcf,0xdd,0x6a,0x43,0x5e,0x7b,0xb5,0xed, +0x5e,0x3d,0xf2,0xb7,0xb1,0xed,0xbe,0x7e,0x66,0xbb,0x15,0xd7,0x0e,0xab,0x6f,0xdb, +0x65,0x5d,0xdb,0xdd,0x72,0x7f,0xe1,0xab,0x17,0xde,0x71,0x87,0xad,0x6b,0xed,0xf5, +0xb1,0x5b,0xa4,0x5e,0xd9,0xcd,0xb2,0xfa,0x1a,0xbb,0x7d,0x9b,0x7b,0xcf,0x82,0x6c, +0xf7,0x7e,0x63,0x34,0x49,0x9a,0x2c,0x4d,0x91,0xa6,0x4a,0xd3,0xa4,0x35,0xa4,0x35, +0xa5,0xe9,0x56,0x3c,0x76,0x9c,0x89,0x96,0x3d,0xc9,0xb2,0x27,0x5b,0xf6,0x14,0xcb, +0x9e,0x6a,0xd9,0xd3,0x2c,0x7b,0x0d,0xcb,0x5e,0xd3,0xb2,0xa7,0x5b,0xe9,0x4e,0xb0, +0xec,0x76,0x7e,0x92,0x2c,0x7b,0xb2,0x65,0xf7,0xce,0x7b,0x85,0xde,0xef,0x76,0xd5, +0xfb,0xda,0xae,0x7a,0x57,0xdc,0x4e,0xef,0x71,0xbb,0xea,0xbe,0x3b,0x40,0xf7,0xdc, +0x6c,0xdf,0x78,0x9c,0xa7,0x49,0x96,0x3d,0x59,0xef,0x93,0x4d,0x1c,0x83,0x79,0x96, +0x2d,0x4a,0x44,0x71,0x3d,0xdd,0x7b,0x9c,0x79,0xaf,0x69,0x9e,0x77,0x0a,0xe3,0x7e, +0xa5,0xaf,0xfb,0x0c,0x55,0xa4,0x33,0xbf,0xf3,0x5b,0xb9,0xcf,0x51,0xd9,0x3a,0x7f, +0x7f,0xe9,0xab,0x9a,0xe7,0xdc,0x4f,0xee,0x3e,0xd2,0x16,0x7a,0x9f,0xdd,0x52,0xda, +0x44,0xea,0x8d,0x77,0xf7,0x55,0x58,0xdb,0x9d,0xad,0x77,0xde,0xfd,0xa5,0xaf,0x46, +0x1c,0xd1,0x5e,0x3a,0x87,0xf7,0xdd,0x92,0x37,0xee,0x7d,0x8d,0xdc,0x9e,0xbd,0xa5, +0x65,0x6f,0x62,0xd9,0x2f,0xb4,0xec,0xaf,0x46,0x1c,0x79,0xb7,0xdd,0x57,0xe5,0xd2, +0xd7,0x7a,0xe7,0xdd,0xd3,0x7a,0xef,0xdd,0x4f,0xe1,0xfb,0x39,0x47,0xe8,0x2e,0xed, +0xe3,0x1c,0xed,0x9f,0x64,0xed,0x4b,0xb2,0xb4,0x8f,0xcf,0xcf,0xbb,0x06,0xdd,0x2d, +0xbb,0xa7,0x7d,0x7c,0x7e,0xa5,0x2a,0xb8,0xef,0xda,0x6d,0x7b,0x92,0x55,0x27,0xfa, +0x58,0xf6,0x96,0x96,0xbd,0x89,0x65,0x1f,0x64,0xd5,0x1f,0xdb,0xee,0xc5,0x77,0x2c, +0xbf,0x24,0x6b,0xde,0x42,0x7f,0xe9,0xab,0x11,0x47,0xd2,0x32,0x58,0xfb,0xdb,0x6b, +0x7f,0x7b,0xed,0x6f,0xaf,0xfd,0xed,0x95,0xb6,0xf6,0x4a,0x97,0x57,0x37,0x3b,0x28, +0x7c,0x07,0x85,0xef,0xa0,0xf0,0x1d,0x14,0xbe,0x83,0xc2,0x7b,0xee,0x69,0xfa,0xbe, +0x66,0x9a,0xe6,0xd0,0xc7,0x2b,0x7c,0xbc,0xea,0xd3,0x40,0x95,0x63,0x77,0xab,0xde, +0x37,0x54,0x3e,0xbc,0x7a,0xd2,0x50,0xed,0x23,0x5e,0xfb,0xbd,0xfa,0x78,0xb5,0xc6, +0x3c,0xba,0xaa,0x6e,0xb4,0xd6,0xf8,0x47,0x7f,0xd5,0x5f,0x8f,0x96,0x4a,0xcb,0x10, +0xe7,0xe8,0x7a,0xd3,0x5f,0x3a,0x40,0xe7,0xe9,0xab,0x31,0x90,0x7e,0x6a,0x9b,0xfd, +0xac,0x31,0xf2,0x7e,0x0a,0xd7,0x57,0xe7,0x69,0xaa,0xf2,0xb0,0xf3,0xd3,0x5a,0x78, +0xd7,0xd1,0x9b,0x2b,0x32,0x48,0xe3,0x3a,0x43,0x55,0x2e,0xdd,0x54,0x9e,0x26,0x8f, +0x5e,0xbb,0xf3,0xec,0x89,0xfa,0x3d,0x9e,0x24,0x4d,0x96,0xa6,0x48,0x53,0xa5,0x69, +0xd2,0x1a,0xd2,0x9a,0xd2,0x74,0xa9,0xd7,0x57,0x7a,0xf6,0x44,0xcb,0x9e,0x64,0xd9, +0x93,0x2d,0x7b,0x8a,0x65,0x4f,0xb5,0xec,0x69,0x96,0xbd,0x86,0x65,0xaf,0x69,0xd9, +0xd3,0xad,0x74,0x27,0x58,0x76,0x3b,0x3f,0x49,0x96,0x3d,0xd9,0xb2,0xa7,0x58,0xf6, +0x54,0xcb,0x9e,0x66,0xd9,0x6b,0x58,0xf6,0x9a,0x96,0x3d,0xdd,0x2a,0xa7,0x04,0xcb, +0xee,0x9d,0xb7,0x97,0xd5,0x3f,0x35,0x8f,0xe4,0x37,0x0d,0x0c,0x78,0xc6,0xad,0x53, +0x8d,0x35,0xee,0x56,0x31,0xc0,0xf5,0x81,0x4a,0xf8,0xd7,0x98,0x4e,0x5d,0x09,0x72, +0xed,0xd0,0x3b,0xd0,0xa6,0xfc,0x1e,0xfc,0xa6,0xa7,0x3b,0x8e,0xb0,0x12,0xfb,0xbb, +0x54,0x9a,0x24,0x7e,0x4f,0x7c,0xd6,0xd6,0x7d,0x07,0x6f,0x68,0xd3,0xd1,0xfd,0xdd, +0x7a,0x33,0x1d,0x72,0x53,0xec,0xdf,0x71,0xc2,0xde,0x5c,0xec,0xb1,0x37,0x38,0x4e, +0xfd,0x9b,0x1c,0xe7,0xe5,0x9b,0x1d,0xe7,0x87,0x71,0x8e,0x33,0x9e,0xdf,0xa8,0xc1, +0x2b,0x1d,0xa7,0x34,0x17,0xfa,0x43,0x2a,0xcf,0x27,0x54,0x8e,0xba,0x37,0x3a,0xce, +0x95,0x1c,0xbb,0x7f,0x92,0xe3,0x8c,0x26,0xde,0xab,0x88,0x37,0x92,0xca,0x5a,0x9a, +0x4a,0x13,0xc7,0xb1,0x65,0x1e,0xa5,0x2e,0xf1,0x7b,0x75,0x37,0x95,0x6f,0xcd,0x58, +0xea,0xff,0x2d,0x8e,0xf3,0x26,0x15,0x68,0xe3,0x28,0x7e,0x27,0x13,0xe7,0x2a,0xfa, +0xff,0x53,0xc9,0xe4,0x95,0xc4,0x79,0x98,0x63,0xde,0xe6,0x1c,0x37,0xd1,0xd7,0xcf, +0x23,0x63,0x9f,0x50,0x01,0x5f,0xa7,0xc1,0xac,0xe7,0x9c,0x45,0xd9,0xf7,0xf9,0x50, +0x77,0x5c,0x26,0x8a,0x78,0x2f,0x81,0xbd,0x77,0x90,0x97,0xfb,0x29,0x8f,0x87,0x1c, +0xe7,0xd0,0x23,0xdc,0x3f,0xa8,0xfc,0x37,0xd0,0xa8,0x26,0x5f,0xc7,0x39,0xc6,0x90, +0x8e,0x7b,0xdc,0x31,0x8a,0x0f,0x6e,0xe5,0x19,0xe5,0x22,0xdc,0xdc,0x47,0xba,0x8c, +0x70,0x9c,0xeb,0x89,0xa3,0x1b,0xf1,0xad,0x22,0xfc,0x32,0xca,0xe4,0xfb,0xfb,0x48, +0x0f,0xfb,0xbb,0x5d,0xe2,0x38,0x25,0x38,0xd7,0x47,0xa4,0xa5,0x08,0xe9,0xad,0x4e, +0x3c,0x35,0xae,0xa7,0x0d,0xb2,0x7f,0x1d,0x69,0xb9,0x8d,0xe3,0x72,0x48,0xd7,0x5b, +0x70,0x26,0x1d,0xf9,0x22,0xf6,0xef,0xe7,0x3c,0x57,0xb1,0x7f,0xe4,0x6d,0x3c,0xff, +0x74,0x73,0xcb,0xe7,0x67,0xce,0x97,0x4e,0x59,0x7c,0xce,0xef,0xf2,0xe2,0x5d,0x28, +0x57,0xca,0x29,0x9b,0xdf,0xf9,0xa7,0x52,0x36,0x3f,0x72,0xce,0xc5,0xe4,0x6f,0x1a, +0x69,0x29,0x44,0x98,0xb7,0xb8,0xb0,0xc3,0xb9,0xce,0x15,0x88,0xeb,0x35,0xf6,0x5f, +0x46,0x3a,0x02,0xc3,0xb8,0x3f,0x52,0xae,0xcf,0x12,0xcf,0xcb,0x7d,0xdc,0xb1,0x9f, +0x71,0x84,0xfb,0x99,0xf8,0x3f,0x1b,0x4d,0xfe,0xe8,0x68,0x7a,0x10,0xdf,0x0b,0x1c, +0xdf,0x9b,0xb4,0xbc,0x09,0xa3,0xe8,0x48,0x3e,0x27,0x6f,0x03,0xd8,0xbf,0x8e,0xe3, +0xde,0xe1,0x9a,0x7c,0x4b,0x9a,0x33,0x2f,0x74,0xdf,0x2f,0x7c,0x49,0x39,0xbf,0xc1, +0x79,0x7e,0x26,0x5f,0x55,0x28,0xa3,0xe7,0x27,0x52,0xe6,0x0f,0x3a,0xce,0xfd,0x94, +0xcf,0xdb,0x8f,0xba,0xe3,0x92,0xcb,0xa9,0x27,0xc3,0xcc,0xd8,0x1d,0xe7,0x1b,0x42, +0xf8,0x09,0x1a,0xac,0x7d,0x90,0x6b,0x10,0xcb,0x71,0xcd,0xe8,0xec,0x6e,0xa1,0x13, +0x5a,0xc5,0xf1,0xdf,0x90,0xde,0x01,0x94,0x47,0x45,0xc2,0x7e,0x45,0x5a,0x63,0xb9, +0x6e,0xcd,0x29,0xef,0x53,0x89,0xe7,0x09,0x58,0xc8,0x79,0x57,0x52,0x47,0x96,0x8d, +0x73,0xf3,0xf1,0x26,0xf1,0x7d,0x4b,0x9e,0xaf,0x25,0xed,0x2f,0x70,0x8e,0x7a,0xa4, +0xf5,0xaa,0xc1,0xee,0x6f,0xdb,0x83,0xed,0xdd,0xb2,0x7a,0x99,0x7a,0x72,0x26,0xe5, +0x35,0x1b,0xff,0xde,0x9c,0xe7,0x41,0xea,0x5f,0x63,0xce,0x91,0x72,0x37,0x75,0x92, +0x32,0x6e,0xca,0xb5,0x3e,0xed,0x01,0xae,0x03,0xe5,0xf7,0x82,0x79,0x87,0x42,0x1e, +0xe7,0xe3,0xff,0x29,0xc7,0xdc,0x44,0x3c,0x1f,0xd1,0x69,0x7d,0x45,0x3c,0xf5,0xb9, +0x8e,0x93,0x7a,0xb8,0xd7,0xe2,0x6d,0xd2,0x9c,0x49,0xbd,0x39,0x4c,0x1a,0x47,0x4c, +0x70,0xc7,0x9e,0xc6,0x91,0xcf,0x78,0x8e,0xbb,0x85,0x74,0x5e,0x4b,0xdd,0x3b,0x00, +0x0d,0xb8,0xe6,0x0f,0xd3,0x36,0x62,0x38,0x6f,0x47,0xca,0xb6,0x0f,0xd7,0xa9,0x28, +0x79,0xbc,0xec,0x01,0xf7,0xbd,0x4f,0x3c,0xe5,0x30,0x9c,0x63,0xaa,0x72,0x8e,0xd3, +0x49,0xe7,0x2e,0xc2,0x57,0x21,0xef,0xb7,0x91,0xa7,0x46,0x94,0xd3,0xa9,0x57,0xb8, +0xd7,0xf9,0x26,0xc2,0x9c,0x4b,0xbc,0x45,0xc8,0x7f,0x0f,0x53,0x9f,0x38,0xd7,0xf9, +0xc4,0x3f,0x95,0xfd,0x9f,0x71,0x0d,0xa3,0x88,0x7f,0x2b,0xf1,0x5f,0x4d,0xde,0xde, +0xa1,0x6c,0x3e,0x1d,0xe7,0x8e,0xe3,0x6d,0xe5,0xb8,0xfa,0x5c,0xff,0x97,0x49,0xc3, +0x59,0x1c,0xbb,0x96,0x74,0x3f,0x40,0xd8,0x43,0xb4,0x99,0x27,0xd8,0xd7,0xe1,0x61, +0xc7,0x79,0x8c,0xeb,0x74,0x3f,0x71,0xad,0xe6,0xdc,0x3b,0x47,0xb9,0x63,0x98,0xe5, +0xae,0x75,0x9c,0xbb,0x29,0xcb,0x25,0xd4,0xe7,0x49,0x94,0xf7,0x45,0xd4,0xc3,0x25, +0x66,0x9c,0x9a,0x7a,0x59,0x8b,0x74,0x44,0xc3,0xd3,0x94,0xfd,0x7a,0xd2,0xff,0x01, +0xe1,0xc6,0x52,0x3e,0x65,0x38,0xfe,0x45,0xd2,0x55,0x7b,0xbc,0x3b,0x36,0xd9,0xf2, +0x3e,0x77,0x5c,0x72,0x3d,0xe1,0x32,0xc8,0xeb,0x12,0xfa,0x81,0x8b,0xa9,0x87,0x43, +0x08,0xf3,0x09,0xee,0x2a,0xe4,0x6b,0x15,0x65,0x58,0x87,0x32,0xbf,0x0c,0x7a,0xc0, +0x78,0x68,0xcf,0xf5,0x58,0x34,0xc2,0x1d,0x2f,0x2d,0x4e,0x7b,0xfc,0x81,0xeb,0x5c, +0x93,0x32,0xfe,0x09,0xf6,0x52,0x6e,0x87,0xa1,0x32,0xfd,0xc2,0x8b,0xb4,0xcd,0x4f, +0xf0,0x9b,0xc7,0x79,0x5e,0xe0,0xda,0x7d,0x4e,0x19,0xb6,0x34,0xf5,0x96,0xb4,0x6d, +0x87,0x36,0xe4,0xfb,0x11,0xce,0x19,0x45,0x3d,0xb8,0x02,0x32,0x38,0xf7,0x54,0xb8, +0x5c,0xe3,0xd8,0xf7,0x72,0x7d,0xaf,0xa0,0x8c,0xef,0x84,0xaf,0xa1,0x15,0xd7,0x76, +0x2b,0xdc,0x45,0xfa,0xc6,0x52,0xae,0xc3,0xc8,0xcf,0x19,0x94,0x5b,0x05,0xea,0x68, +0x7f,0xca,0xad,0x2a,0x65,0x51,0x81,0xb2,0xbb,0x6b,0xb8,0xfb,0xcc,0xd8,0x0c,0x9a, +0x42,0x6b,0x93,0xe6,0xab,0xdd,0xf7,0x6f,0x77,0xc0,0x9d,0x90,0x41,0x19,0x8e,0x82, +0x25,0xd7,0xba,0x75,0x3a,0x86,0xf6,0xde,0x00,0x06,0x91,0xa7,0x10,0x75,0x6f,0x0f, +0xe5,0x7c,0xf5,0x68,0x97,0x0e,0xd4,0xa1,0xa2,0x94,0xd3,0x7d,0x10,0xa0,0x9c,0xd3, +0x61,0x3d,0xfd,0x47,0x3e,0xfa,0xa1,0x97,0xc6,0xbb,0x79,0xdf,0x46,0x1e,0x7f,0xa1, +0x5c,0x6a,0x93,0xf7,0xab,0x48,0xf7,0x57,0x99,0x41,0xe7,0x34,0x8e,0xad,0xc8,0x35, +0x99,0x4b,0x9e,0xaf,0x80,0x91,0x94,0x41,0x96,0x51,0x58,0x41,0xfe,0x0f,0x5d,0xe0, +0xe6,0xbf,0x1d,0x4c,0x82,0xad,0x2a,0xff,0x39,0xd0,0x88,0xb6,0x7b,0x21,0x74,0xbb, +0x98,0xb2,0xe4,0xda,0xad,0xe3,0x1a,0x7d,0x08,0xbd,0xa9,0x77,0xcf,0xc3,0x46,0xce, +0x71,0x3e,0x65,0x92,0x4f,0xe5,0xd3,0x45,0x65,0x94,0xc2,0xf5,0x7e,0x9d,0xb6,0x76, +0x26,0x6d,0xf7,0x02,0x68,0xdf,0xc3,0xbd,0x9e,0xa6,0xaf,0x2d,0x0d,0xed,0x7b,0xb9, +0xe3,0xf3,0xa6,0x7f,0x31,0x75,0x7f,0x13,0xe5,0xb7,0x5a,0x65,0x58,0x26,0xdb,0x2d, +0xc7,0x67,0xe8,0x87,0x52,0x29,0xcb,0x19,0x83,0xdc,0x3a,0x30,0x90,0x32,0x8d,0xa2, +0xee,0xd6,0x86,0xb3,0xa8,0x0f,0x65,0x87,0xba,0xf5,0x62,0x13,0x7c,0x03,0xcd,0x09, +0x9f,0x01,0x6f,0x51,0xee,0xb3,0x54,0xa6,0xd7,0x52,0x3f,0x3a,0x5d,0xe7,0x96,0x6d, +0x3d,0x95,0xe9,0x05,0xd4,0xcd,0xbd,0x70,0x35,0xf7,0x95,0x06,0x94,0xe5,0x4d,0x2a, +0xd3,0xc5,0xb7,0xba,0x75,0x68,0xf5,0xad,0x6e,0xf9,0x9a,0x7e,0x74,0xcf,0xad,0x6e, +0x39,0xdf,0x7a,0x9b,0x5b,0xce,0x35,0x29,0xe7,0x41,0x94,0xf3,0x24,0xda,0xcc,0x50, +0xfa,0x85,0x11,0xf7,0xb9,0x65,0x6e,0xea,0xe2,0xa6,0xfb,0xdd,0xb2,0x2f,0xf0,0x80, +0x5b,0xfe,0xc5,0x1f,0x72,0xef,0x6f,0xcd,0x2b,0x07,0x9d,0x46,0xf0,0x7e,0x72,0xd0, +0x79,0xa4,0x36,0x7d,0x48,0x06,0x71,0x42,0xb3,0x0b,0x82,0xce,0xda,0x4b,0x82,0xce, +0xfa,0xeb,0x83,0x4e,0x43,0xc2,0xdd,0xf9,0x98,0xfb,0xec,0xed,0xd1,0x5b,0xda,0xf7, +0x18,0x7e,0x9e,0xbf,0x37,0x0f,0xc5,0xd3,0x21,0x21,0xd2,0x15,0x72,0xb5,0x87,0xb4, +0x0f,0x5c,0x6f,0xf9,0xf7,0x83,0x0f,0xe1,0x45,0xf8,0x1a,0xe6,0xc1,0xd6,0x90,0x3b, +0x67,0xd5,0xcc,0x55,0x7d,0x0f,0x36,0x41,0x0e,0x7c,0x0c,0x3b,0x61,0x57,0xc8,0x9d, +0x03,0xfc,0x05,0xba,0x34,0xe4,0xea,0x32,0xe9,0xab,0x96,0xdf,0xab,0xf2,0x5f,0xab, +0x78,0x8d,0xce,0x97,0xbe,0xaa,0x39,0xb1,0xaf,0x6a,0x5e,0xec,0xab,0x3a,0xdf,0xab, +0x3a,0xa7,0xd1,0xf7,0xa5,0x1f,0x48,0x37,0x4a,0x3f,0x94,0x7e,0x24,0xdd,0x24,0xcd, +0x91,0x7e,0x22,0xdd,0x22,0xfd,0x54,0xba,0x4d,0xba,0x5d,0xba,0x43,0xfa,0xb9,0x74, +0xa7,0xd4,0x4b,0xfb,0x2e,0x2b,0x1d,0x0b,0x94,0xde,0xc5,0x3a,0xdf,0x62,0xc5,0xb3, +0x58,0xf9,0x31,0xe7,0x1e,0x18,0xe5,0x72,0xad,0x8f,0xeb,0x7d,0x8c,0xf4,0x71,0x8d, +0x8f,0x1b,0x7c,0x5c,0xed,0xe3,0x49,0x1f,0x4f,0xfb,0xb8,0xd1,0xc7,0x18,0x1f,0x37, +0xf9,0xb8,0xd9,0xc7,0x1d,0xe2,0x76,0x71,0xa7,0x18,0x27,0x1e,0x10,0x77,0x89,0x69, +0x3e,0x66,0xf8,0x98,0xe3,0x63,0x96,0x8f,0x97,0xc5,0x2b,0x3e,0xbc,0xb5,0x6b,0xec, +0x35,0x6c,0x6c,0x16,0xf9,0x58,0x67,0x61,0xaf,0x75,0xf3,0xbc,0x8f,0x15,0x62,0xb9, +0x58,0x29,0xbc,0xb5,0x73,0x56,0x8b,0x37,0xc4,0x9b,0x62,0xad,0x8f,0x66,0xc2,0x5e, +0x8b,0xe7,0x58,0xf6,0xf7,0xf3,0xb0,0x37,0xcd,0xc3,0xbe,0x22,0x0f,0xfb,0xf2,0x3c, +0xec,0x2b,0xf3,0xb0,0xaf,0x3d,0x01,0x7b,0xb3,0xff,0x60,0x7f,0xcb,0x87,0xb7,0xaf, +0x9a,0x65,0x8f,0xb3,0xec,0x59,0x79,0xc4,0x65,0xb4,0xb2,0x8e,0xab,0xac,0x63,0x8c, +0xc6,0x4b,0xb3,0xa4,0xcd,0xa4,0x26,0x7c,0x15,0x85,0xaf,0xa2,0xf0,0x55,0x14,0xbe, +0x8a,0xc2,0x57,0x51,0xf8,0x2a,0x0a,0x5f,0x55,0xe1,0xab,0x6a,0x7f,0x55,0xed,0xaf, +0xaa,0xfd,0xd5,0x14,0x4f,0x35,0xed,0x8f,0xb3,0xfc,0xb2,0x14,0x77,0x35,0x69,0x9c, +0xd4,0xf8,0x27,0xcb,0x3f,0x59,0xfe,0xc9,0xda,0x97,0xac,0xfd,0xa9,0xf2,0x4f,0x95, +0x3b,0x4d,0xe1,0xd3,0xe4,0x9f,0xa6,0xf0,0x69,0xda,0x5f,0x43,0xfe,0x35,0xe4,0xae, +0x29,0x4d,0xd7,0x71,0xe9,0x72,0xd7,0x92,0xbb,0x96,0xdc,0x0d,0xe4,0x6e,0xa0,0xe3, +0x1b,0x28,0xde,0x06,0xd6,0xfe,0x66,0x52,0x93,0xdf,0x4c,0x85,0xcb,0xd4,0xfe,0x4c, +0xed,0xcf,0xd4,0xfe,0x86,0xaa,0xa3,0x0d,0x15,0x6f,0x43,0x85,0x6f,0xa8,0x78,0x8d, +0x36,0x92,0x66,0x49,0x9b,0x49,0x9b,0x6b,0x5f,0x35,0x69,0x9c,0x34,0x5e,0x9a,0x25, +0x6d,0x26,0x6d,0x2e,0x3f,0xbb,0xec,0xb3,0xac,0x32,0xf6,0x68,0x66,0xd5,0xa1,0xc6, +0x0a,0xdf,0x58,0xe1,0x1b,0x2b,0x7c,0x63,0x85,0x69,0xac,0xf0,0x8d,0x15,0xbe,0x89, +0xc2,0x37,0xd1,0xfe,0x26,0xda,0xdf,0x44,0xfb,0x9b,0x5b,0xf5,0xd6,0xab,0xb3,0xf1, +0x56,0xda,0x9a,0x5b,0x75,0xd6,0x90,0x00,0xd9,0x90,0x28,0x6d,0x26,0x35,0xf3,0xa6, +0xce,0x43,0xdb,0xc8,0xde,0xd2,0xb2,0x9f,0x6f,0xd9,0x5b,0x59,0xf6,0xd6,0x96,0xbd, +0x8d,0xe2,0xf1,0xda,0x46,0xa2,0x65,0x4f,0xca,0xa3,0x2d,0x35,0x3e,0x4e,0xbb,0x4a, +0x94,0x26,0xf9,0xda,0x53,0xe3,0x3c,0xda,0x55,0xa2,0x34,0xc9,0xd7,0x9e,0x1a,0xe7, +0xd1,0xae,0x12,0xa5,0x49,0xbe,0xf6,0xd5,0xf8,0x18,0xed,0xec,0x58,0xf5,0x30,0xaf, +0x7a,0x77,0xbc,0xfa,0x95,0x57,0x3d,0xaa,0x64,0xd5,0x99,0xc6,0x4a,0x5f,0x63,0xa5, +0xcf,0xae,0x1f,0x8d,0x8f,0x51,0x4f,0x9a,0x59,0xe5,0xef,0x95,0x7d,0x92,0xaf,0x1e, +0x34,0x3e,0x46,0x7d,0x38,0x5e,0xdf,0x17,0x9f,0xc7,0xb5,0x6b,0x72,0x82,0x7d,0x5f, +0x93,0x13,0xec,0xf3,0x9a,0x58,0xd7,0xe0,0x64,0xfa,0xb4,0x93,0xed,0xcb,0xe2,0x7f, +0x43,0x9f,0xf6,0x47,0xf5,0x65,0xfe,0xbe,0xeb,0x44,0xfb,0xa8,0x13,0xe9,0x93,0x9a, +0x9c,0x40,0x5f,0x74,0x22,0x7d,0x4f,0x93,0x3c,0xfa,0x9c,0xec,0x13,0xec,0x6b,0x9a, +0x1c,0xa7,0xbe,0xf8,0xeb,0xc5,0xb1,0xae,0x7f,0x55,0xb9,0x93,0xad,0xeb,0x6b,0xdc, +0x29,0x72,0xa7,0xc8,0x7d,0xac,0x72,0xca,0x3a,0x46,0x7e,0xfc,0xe9,0xcb,0x88,0x3a, +0xd2,0xa7,0x19,0x7b,0x2b,0xcb,0xee,0xf5,0x69,0x35,0xd4,0x4e,0x6a,0xe8,0xb8,0x74, +0xb9,0xd3,0xe5,0xae,0x25,0x77,0x2d,0xb9,0x93,0xe5,0x4e,0x96,0x3b,0x45,0xee,0x14, +0xab,0xbc,0x9a,0x59,0xe5,0x56,0x4d,0xee,0x6a,0x56,0x39,0x36,0xb3,0xca,0x33,0x55, +0xee,0x54,0xb9,0xd3,0xe4,0x4e,0xb3,0xe2,0xaf,0x26,0x8d,0x93,0xc6,0xfb,0xca,0x28, +0x51,0xe9,0x49,0x54,0x3c,0x89,0x3a,0x3e,0xf1,0x5f,0x90,0xbf,0xe3,0x1d,0x6f,0xd7, +0xa9,0x26,0xd6,0x73,0x4b,0x5e,0x7d,0x49,0x5e,0xf1,0xf9,0x9f,0x77,0x4c,0x1f,0xde, +0xc2,0xd2,0x2a,0x56,0x9b,0xac,0x62,0xf5,0x65,0xc7,0xb2,0x67,0x59,0x7d,0x63,0x96, +0xd5,0x3e,0xaa,0x59,0xf6,0x38,0xcb,0x1e,0x7f,0x8c,0x3e,0xd2,0xb3,0xc7,0x59,0x75, +0x3e,0xce,0x7a,0x0e,0x49,0xb6,0xc2,0x26,0x5b,0xfd,0x6a,0xb2,0x75,0xcd,0x92,0xad, +0x78,0x8e,0x65,0xaf,0x66,0xd9,0xb3,0x7c,0xf6,0x54,0xeb,0xfc,0x7e,0x7b,0x96,0x75, +0xed,0xe2,0xf2,0xb0,0x57,0xb3,0xae,0x7f,0x96,0xef,0x9a,0xd9,0xf6,0x2c,0x9f,0x3d, +0xcd,0xaa,0x83,0x69,0x56,0x19,0xda,0xf6,0x1a,0x56,0x5e,0x8e,0x65,0xb7,0xc3,0x34, +0xb7,0xfa,0xfb,0x2c,0xab,0xcf,0xcf,0xcb,0xde,0xcc,0xba,0x0f,0x64,0x59,0xf6,0xe6, +0x96,0xbd,0x99,0x75,0x4f,0xc8,0xf2,0xd9,0x33,0xad,0xf4,0x64,0x5a,0xf1,0x34,0xb2, +0xca,0xa7,0x91,0xd5,0xbe,0x1a,0x59,0xf9,0xf5,0xee,0x0f,0xd5,0x8e,0x61,0x8f,0xb7, +0x8e,0x8d,0xf7,0xf5,0x93,0x71,0x3e,0xfb,0xb1,0xea,0x51,0x96,0x65,0x6f,0xee,0xbb, +0x3f,0xdb,0xf7,0x1b,0x7f,0x7d,0xb4,0xef,0x3b,0xde,0xbd,0xda,0xbe,0x47,0x35,0xf1, +0xdd,0x97,0xe2,0x7c,0xf6,0x66,0xd6,0xfd,0x2a,0x2b,0x0f,0x7b,0x33,0xab,0xaf,0x6f, +0x6e,0xd9,0x9b,0x59,0x69,0xcd,0xf2,0xd9,0x2b,0x5b,0x7d,0x50,0x15,0xab,0xbe,0x55, +0xb1,0xe2,0xac,0xe2,0x0b,0x13,0x6f,0xf9,0x67,0x59,0xfe,0x59,0x56,0x1f,0x97,0xe5, +0xfb,0x3d,0x66,0xfb,0x37,0xb3,0xfa,0x91,0x66,0x56,0xbb,0x68,0x6e,0xd5,0xff,0xe6, +0x56,0x1d,0xb6,0x7f,0x87,0xd8,0xcf,0x8c,0xcd,0x7d,0xf7,0x5e,0xfb,0x7e,0xdc,0xfc, +0x18,0x79,0x6d,0x6e,0xd5,0xa5,0xe6,0x56,0xd9,0x36,0xf7,0xd5,0x37,0xbb,0x8e,0xa5, +0x5b,0xe1,0x1b,0x1e,0xe3,0x77,0x8b,0xfd,0x5c,0x61,0xa7,0x33,0xcb,0x0a,0x9f,0xe5, +0xf3,0x6f,0xec,0x7b,0xa6,0x8b,0xb3,0xf2,0x51,0xcd,0x57,0xaf,0x9a,0x5b,0xcf,0x4b, +0xcd,0xad,0x67,0xcb,0xe6,0xbe,0xf8,0xed,0xb6,0x99,0xea,0xeb,0x8b,0xe2,0x7d,0x69, +0xf6,0xee,0x37,0x8d,0xf4,0xee,0x24,0xd3,0xb2,0x57,0x92,0xdd,0x7b,0x86,0xf2,0x9e, +0xe1,0xbd,0xdf,0x1f,0x76,0x3b,0xa8,0x6e,0xc5,0xe3,0x95,0x93,0x77,0x0f,0x6a,0x6a, +0xf9,0x37,0xb2,0x9e,0x35,0x9a,0x6a,0x7f,0x23,0x2b,0xad,0x8d,0xac,0x7a,0xe0,0xd9, +0x73,0xff,0x8e,0x8a,0x2f,0x2d,0xc6,0xcf,0x1f,0x9f,0xf1,0xf3,0xc7,0xe9,0xb5,0x75, +0xb3,0xcf,0xb3,0x57,0xb2,0xe2,0x49,0xd4,0x7b,0x0e,0xcf,0xaf,0x9a,0x99,0x33,0x9d, +0xe0,0x38,0xc1,0x04,0xf7,0x5b,0xbd,0xda,0xd6,0xba,0x0b,0xa7,0xe0,0x77,0x6a,0xc2, +0xb1,0xd7,0x79,0x28,0xc9,0x09,0x4a,0x40,0x67,0xc7,0xc5,0x5b,0x23,0xe1,0x5a,0xb8, +0xce,0xec,0xe7,0xb8,0x52,0x50,0x14,0x8a,0x41,0x7e,0x28,0x90,0x70,0xe4,0xdb,0xe4, +0x82,0x50,0x08,0x0a,0x43,0x11,0xf3,0x0d,0x91,0x99,0x03,0x6e,0xad,0x05,0x91,0x97, +0x7a,0xe7,0x33,0x78,0x69,0x8f,0x57,0xba,0x6b,0x59,0x6b,0x47,0x98,0xf4,0xe5,0x95, +0xa6,0x58,0x33,0x86,0x6b,0xe6,0xae,0x6b,0x9d,0x87,0x38,0xc7,0xfd,0x06,0xbc,0x9e, +0xbe,0x4b,0xbc,0xc4,0xac,0x0b,0x69,0xd6,0x86,0x85,0x0c,0xa5,0xa9,0x85,0x9e,0x09, +0x5b,0x58,0xbf,0x8f,0xbd,0xdf,0xc6,0xde,0xef,0x62,0xef,0x59,0xd2,0xfb,0x6d,0xec, +0x3d,0x4f,0x7a,0xbf,0x8f,0xbd,0x67,0x4a,0xef,0x37,0x72,0x86,0xf5,0x9b,0xf9,0x02, +0xb9,0x8d,0x96,0x8f,0x3a,0x7a,0x6d,0x6c,0x7b,0x8d,0x6c,0xff,0x5a,0xd9,0xfe,0x35, +0xb3,0xfd,0x6b,0x67,0xe7,0xa5,0x95,0x44,0x65,0x1f,0xe7,0x8a,0x2a,0x3e,0xaa,0xfa, +0xa8,0xe6,0x23,0xce,0x47,0xbc,0x8f,0xea,0x22,0x41,0x24,0x8a,0x24,0x91,0xec,0x23, +0xc5,0x47,0xaa,0x8f,0x34,0x1f,0x35,0x7c,0xd4,0xf4,0x91,0xee,0xa3,0x96,0x8f,0x06, +0x3e,0x32,0x7d,0x34,0xf4,0xd1,0xc8,0x47,0x96,0x8f,0xc6,0x3e,0x9a,0xf8,0x68,0x2a, +0x9a,0x1d,0xe3,0x37,0x78,0x73,0xab,0xdd,0xb6,0xcd,0xc3,0x7e,0x61,0x1e,0xf6,0x76, +0x79,0xd8,0x3d,0x35,0x6d,0xa3,0x82,0xe3,0xb6,0x01,0xaf,0x8e,0x9b,0xb6,0x50,0xc9, +0x6a,0xc3,0x5e,0xbb,0xa8,0xa6,0xb6,0x11,0xaf,0xb5,0x48,0x4e,0x74,0xed,0x14,0xaf, +0x1f,0xa9,0xa3,0xf6,0x54,0x4f,0xed,0x32,0xe3,0x4f,0xfc,0xee,0xb9,0x93,0xda,0xb1, +0xe9,0x53,0x2e,0x53,0x7f,0xd1,0xe5,0x4f,0xfc,0x1e,0xda,0xf4,0x39,0x23,0xd4,0xef, +0x5c,0x0f,0x63,0x29,0xd8,0x9b,0xce,0x75,0xfb,0x59,0xaf,0xef,0x33,0x7d,0xd7,0x8f, +0x9a,0x73,0x3e,0x45,0xf3,0x65,0x9f,0xd2,0xdc,0x58,0x33,0x27,0x7c,0x9b,0xe6,0x58, +0x7f,0xae,0x39,0x92,0x87,0x13,0xfe,0x7e,0xf3,0xea,0x0f,0x68,0xae,0xa7,0x99,0x23, +0xda,0xa5,0xd8,0x3f,0xeb,0xdb,0xc3,0xc7,0xc9,0xce,0x13,0xf0,0x9c,0xf5,0x77,0xd1, +0x9e,0x46,0x9f,0x32,0xf3,0xd7,0xf0,0x08,0x9e,0xe3,0xae,0x89,0x72,0x57,0x79,0x77, +0x4d,0x94,0x7b,0x60,0x32,0x7e,0xab,0x61,0x6d,0xd0,0x71,0xde,0x0d,0xba,0x7f,0xbf, +0x65,0x12,0xda,0x16,0x9e,0x30,0x6b,0xa3,0x4f,0xe7,0x78,0xf4,0x49,0x68,0x0f,0x1d, +0xcc,0xda,0xe5,0x67,0x51,0xb7,0xd1,0xcb,0x60,0x1a,0x5c,0x0e,0xdd,0xa0,0x0b,0x3c, +0x14,0x74,0xd7,0xff,0x79,0xd8,0xac,0xf1,0x0e,0x37,0xc2,0xb3,0x66,0x3d,0x74,0xf3, +0x37,0x43,0x20,0x72,0x73,0xc0,0xb9,0xf3,0x19,0xf2,0x82,0x3d,0x64,0xec,0x68,0x14, +0x6a,0xfe,0x4e,0xcc,0x50,0xf3,0x37,0x49,0x82,0x6e,0x9d,0xbe,0x06,0xcd,0x87,0xff, +0x75,0xe8,0xf5,0x30,0x12,0xa6,0xc2,0xd3,0x26,0x5e,0xd2,0xf4,0x0c,0x3a,0xce,0x84, +0xa5,0x53,0x18,0x8f,0x4e,0x81,0xc7,0xe1,0x01,0x58,0xc2,0xf9,0x97,0xc2,0x32,0xc8, +0x4f,0x1c,0x65,0x60,0x52,0xd1,0x80,0xf3,0x32,0x3c,0x24,0x7d,0x4a,0x9a,0x58,0x2c, +0xe0,0x54,0x82,0x24,0x69,0x93,0x12,0x01,0xa7,0x5e,0x09,0x57,0x3b,0xc0,0x82,0x92, +0x84,0x2b,0xe9,0xea,0x4c,0xe9,0x42,0x98,0x5f,0x2a,0xe0,0xcc,0x80,0x05,0xd2,0xd4, +0xd3,0x03,0x4e,0x02,0x74,0x78,0x37,0xe0,0xf4,0x80,0x8b,0x7c,0xda,0xdf,0xb2,0x0f, +0xb0,0xec,0xd9,0x96,0x7d,0xa0,0x65,0x1f,0x04,0x0b,0x64,0x7f,0x59,0xba,0xc0,0x8a, +0xeb,0x65,0xcb,0xbe,0xc0,0x8a,0xf7,0x65,0xcb,0xfe,0x4f,0x5b,0xd3,0xe1,0xaf,0x90, +0x9f,0x7f,0x52,0x5e,0xfe,0xe8,0x6b,0xe3,0xe5,0xa5,0x89,0x95,0x76,0x7f,0x9a,0x4f, +0x36,0xbd,0x3d,0x8f,0x93,0xce,0x7f,0x7b,0x99,0x67,0x1e,0x23,0x2f,0xc7,0xcb,0xc3, +0x7f,0x4a,0xff,0xff,0x3a,0xed,0xc7,0xba,0x06,0xad,0xfe,0x62,0x69,0x0e,0xf7,0xa7, +0xe1,0xfc,0x84,0xf3,0x13,0xce,0xcf,0x3f,0x2d,0x3f,0x89,0x3c,0x2f,0xd7,0x08,0xba, +0xeb,0xf0,0xde,0xad,0xb5,0x31,0xef,0xd5,0x7a,0xb9,0xf7,0x69,0x7d,0xdc,0x07,0xb4, +0x66,0xed,0x83,0xf0,0x10,0x3c,0x0c,0x8f,0xc0,0xa3,0x5a,0xe7,0x75,0xb2,0xd6,0x91, +0x7d,0x40,0x7f,0xfb,0xee,0x49,0xad,0x2f,0xfb,0x34,0x3c,0x63,0xd6,0x18,0xd4,0xba, +0xaf,0xd1,0x15,0xdc,0xb5,0x81,0xed,0xbf,0xe5,0x64,0xd6,0xe2,0x7e,0x49,0x6b,0xf6, +0xce,0xd7,0xfa,0xb9,0xe6,0x6f,0xea,0xbd,0xa2,0xbf,0xe7,0xbc,0x10,0x16,0x69,0x0d, +0xee,0x25,0xd6,0xdf,0xda,0x7b,0x0d,0x5e,0xd7,0x5a,0xb7,0xde,0xdf,0x7a,0x5a,0xa9, +0xb5,0x68,0x83,0x15,0xdc,0x78,0xe7,0x2b,0xae,0xe5,0x3a,0x6e,0x49,0x44,0x38,0x9f, +0xe1,0x7c,0x86,0xf3,0xf9,0x57,0xce,0x67,0x0e,0x7c,0x1c,0x71,0xe2,0xef,0xf9,0xfe, +0xf2,0xe1,0x22,0x09,0x07,0x49,0x91,0xee,0xdf,0xee,0x4c,0x89,0x74,0xff,0xa6,0xa6, +0xf9,0xbb,0x99,0xe6,0x6f,0x65,0x9a,0xbf,0x87,0x69,0xfe,0x86,0x67,0x6d,0xa8,0x13, +0xe9,0xfe,0x3d,0xcc,0xfa,0x90,0x01,0x0d,0x20,0x33,0xd2,0xfd,0x9b,0x96,0x8d,0x20, +0x0b,0x1a,0x47,0xba,0x7f,0xd3,0xb2,0x69,0xa4,0xfb,0xb7,0x2c,0xcd,0xdf,0xc7,0x3c, +0x1f,0x6e,0x79,0xda,0xfd,0xdb,0x9c,0xe6,0xef,0x82,0x5e,0x14,0xe9,0xfe,0x1d,0xcd, +0x19,0xf0,0x4e,0xe4,0xc9,0xa5,0xc1,0x3b,0x7f,0x83,0xff,0x70,0xde,0xe6,0x3a,0xf7, +0x5d,0x3a,0x5f,0x3b,0xe8,0x0c,0xd3,0xa1,0x0d,0xe9,0x98,0x15,0x79,0xe4,0xbd,0x7e, +0x35,0xbd,0x73,0x6f,0xaa,0x77,0xec,0x71,0xd6,0x1c,0x8f,0x86,0xbe,0x39,0x32,0xc9, +0x7a,0x2f,0xde,0x40,0xef,0xd7,0x33,0xad,0xb9,0x13,0xde,0xfb,0xff,0x78,0xbd,0xbb, +0x4f,0xd3,0x3b,0x75,0xf3,0xde,0xbc,0xbf,0xe6,0x35,0x4f,0x81,0x01,0xd6,0x79,0x9b, +0xf8,0xc6,0xea,0x8e,0x77,0x2e,0xff,0x79,0xd2,0xac,0x39,0x55,0xf6,0x38,0xa8,0x7d, +0xbc,0x7d,0xac,0x7d,0xcc,0xcb,0x79,0xa4,0xa5,0x86,0x6f,0xec,0xf0,0x64,0xd2,0x62, +0xe7,0x77,0x4a,0xd4,0xff,0x2f,0xe3,0x26,0x79,0x94,0xf3,0x1f,0x51,0xc6,0xc7,0xbb, +0x96,0x7f,0xc4,0x39,0xbc,0xf5,0x5c,0x13,0xf4,0xde,0x3f,0x51,0x9a,0x24,0x4d,0x96, +0xa6,0x48,0x53,0xa5,0x69,0xd2,0x1a,0xd2,0x9a,0xd2,0x74,0x69,0x65,0x3d,0xb7,0x79, +0xeb,0x2a,0x65,0x5a,0xf6,0x86,0x96,0xbd,0x91,0x65,0xcf,0xb2,0xec,0x8d,0x2d,0x7b, +0x13,0xcb,0xde,0xd4,0xb2,0x37,0xb3,0xec,0xcd,0x2d,0x7b,0x0b,0xcb,0x7e,0x9e,0x65, +0x6f,0x69,0xd9,0xcf,0xb7,0xec,0xad,0x2c,0x7b,0x6b,0xcb,0xde,0xc6,0xb2,0x5f,0x60, +0xd9,0xdb,0x5a,0xf6,0x0b,0x2d,0x7b,0x3b,0xcb,0xde,0xde,0xb2,0x77,0xb0,0xec,0x17, +0x59,0xf6,0x8e,0x96,0xfd,0x62,0xd9,0xcd,0x58,0xa5,0x89,0xdf,0x8c,0x57,0x36,0xd4, +0x79,0xbd,0xe7,0xde,0x0e,0x0a,0xf7,0x67,0x3d,0x0f,0x37,0xf5,0x7d,0xd7,0xdd,0x56, +0xe7,0x6b,0x2b,0xbc,0xef,0x98,0xbd,0x63,0x1b,0x2a,0xac,0xa7,0xde,0x1a,0xe5,0x17, +0xc8,0x6e,0xd2,0x64,0xd6,0x6c,0x6c,0xa1,0xb1,0x0a,0x6f,0xbc,0xc2,0xac,0x7b,0xda, +0xa1,0x93,0xe3,0xbc,0xd5,0xf6,0xc8,0x9a,0x28,0x66,0x4d,0xa8,0x33,0x48,0xc8,0xb6, +0x5b,0xdc,0x35,0xf1,0x9e,0xc4,0x5d,0x8e,0x87,0xf1,0xf2,0x03,0xdd,0x6f,0x0e,0x5b, +0x12,0xe9,0xed,0x9d,0x1d,0xe7,0x0e,0x32,0x33,0x13,0xf7,0x59,0xe6,0x1b,0xcc,0xeb, +0xdc,0x35,0x4b,0xa7,0xdd,0xee,0x38,0xfb,0xc8,0x48,0x3a,0x99,0x2b,0xc9,0xc3,0xf9, +0x44,0xe2,0x6f,0xd7,0xdd,0x2d,0x04,0xb3,0xce,0x54,0xf3,0x09,0xee,0xda,0x4e,0x66, +0x9d,0x27,0xb3,0xbe,0x53,0x74,0x77,0x77,0x2d,0xd0,0xb6,0x84,0x1b,0xc5,0x43,0xfa, +0x35,0x3c,0xa4,0xe7,0xe3,0xd8,0x91,0xfd,0xdd,0x75,0xa5,0x72,0xd7,0x56,0x22,0xde, +0x41,0x9c,0xe3,0x25,0x0a,0xab,0xe5,0x5d,0xee,0x75,0xaa,0xd6,0xcb,0xbd,0x4e,0xc6, +0x6e,0xe2,0xf5,0xec,0xb7,0x5b,0xf6,0x5b,0x3a,0x1d,0xb1,0x9b,0x75,0x1e,0x3c,0xbb, +0x39,0x97,0x67,0xdf,0x30,0xf4,0x88,0xfd,0xe3,0x0b,0x8e,0xd8,0x3b,0xf4,0x70,0xed, +0xf7,0x93,0xcf,0xbd,0x6d,0x4f,0xfc,0xfe,0x57,0x97,0xf3,0xd7,0x34,0xeb,0x66,0x41, +0x85,0x40,0xd0,0xe9,0xd2,0xca,0xfd,0x1e,0xf0,0x15,0x08,0x72,0xc1,0xae,0x81,0x49, +0xad,0xdd,0xef,0x03,0xdf,0x81,0x47,0x53,0x4c,0x5f,0x10,0xcc,0xfd,0x56,0xf0,0x42, +0xb8,0x1c,0x86,0x99,0x6f,0x6f,0x43,0x41,0x67,0x01,0xfb,0x7a,0xb5,0x71,0xcb,0xb9, +0x05,0xee,0xfb,0xd1,0x27,0xcd,0xb7,0xb9,0xc4,0xfd,0x5c,0x1b,0xf7,0x5b,0xbb,0xcd, +0x77,0x05,0x73,0xd7,0xdd,0x8d,0x20,0xed,0x9b,0x09,0x5f,0x1b,0x6d,0x7c,0x81,0x5b, +0x5e,0xc3,0x4c,0x7e,0x52,0xdd,0xef,0xef,0xbc,0xef,0x10,0xcd,0x77,0x78,0x21,0xf2, +0x13,0xd5,0xd6,0xfd,0x56,0xb7,0x59,0x5b,0xf7,0xdb,0xc4,0x8b,0x61,0x30,0x5c,0x07, +0x37,0x58,0x54,0xcb,0x1f,0x74,0xb2,0x29,0xbb,0x55,0xd8,0x37,0x43,0xf7,0x02,0x41, +0x67,0x37,0xba,0xdf,0xc4,0xc1,0x75,0x7a,0x14,0x6a,0x42,0x53,0xb8,0xc2,0xac,0xdf, +0x04,0xdf,0x41,0x51,0xae,0x55,0x5b,0xe8,0x0e,0x37,0x0a,0xf3,0xdd,0xdf,0x74,0x98, +0x03,0xcb,0xe0,0x94,0x0e,0xee,0xf7,0x90,0xa7,0xa2,0x6d,0xd0,0x21,0xed,0xdd,0x6f, +0x39,0xbf,0xa2,0xfe,0xbc,0x8d,0xdf,0x37,0x50,0x08,0xfb,0x6d,0x68,0x12,0x9a,0x08, +0xcf,0xc1,0xf6,0x92,0x41,0xe7,0x6b,0xf4,0x7b,0x88,0xea,0xe8,0xd6,0xd5,0x0a,0xe6, +0xfb,0x41,0x98,0x7a,0x4a,0xd0,0xd9,0x05,0x5f,0x62,0x2f,0x4d,0x43,0xaa,0x04,0x1b, +0xb1,0xf7,0x44,0xbf,0xe2,0x62,0x1d,0x86,0x7c,0xd4,0x8b,0x7a,0x62,0xe5,0xe9,0x41, +0xe7,0x35,0x74,0x63,0x27,0xf7,0xfb,0xdc,0x03,0x70,0x5a,0xe9,0xa0,0xf3,0x0b,0x1a, +0x75,0x09,0x79,0xe8,0xec,0xae,0x37,0x3c,0x8a,0x8b,0xdc,0x45,0xdf,0x6a,0x2e,0x81, +0x3b,0x60,0xfb,0x59,0x41,0xa7,0x21,0x75,0x79,0x07,0xda,0x1f,0xed,0x03,0x23,0xe0, +0x53,0xd8,0x0a,0xd5,0xa9,0x14,0x3f,0xa1,0x95,0x2f,0xa3,0x5e,0x98,0xef,0x19,0xa1, +0x1b,0x7e,0x63,0xca,0x07,0x9d,0x11,0xe8,0x4c,0xdc,0x73,0xe0,0xa5,0xcb,0xdc,0x6f, +0xc4,0xef,0x7e,0x22,0x98,0xbb,0x56,0x71,0x62,0x6c,0x30,0x97,0xc0,0x68,0xce,0xdd, +0xd9,0x65,0x05,0xe1,0xe7,0x27,0x05,0x9d,0x8f,0xba,0x06,0x9d,0x6e,0xb8,0xfb,0xc0, +0x36,0xfc,0x1e,0x44,0xd7,0xc0,0x06,0x38,0x08,0xa3,0xba,0x50,0x9f,0xa8,0x88,0x67, +0xa6,0xbb,0xdf,0x94,0xbe,0x57,0x31,0xe8,0xac,0x40,0x9b,0xf2,0x03,0xfb,0xbc,0xae, +0xee,0x77,0x94,0x46,0xaf,0xd1,0xb7,0x94,0xb3,0xe1,0x49,0x98,0x01,0x9f,0xe8,0xbb, +0x4a,0xf3,0x6d,0xbc,0x59,0xaf,0xa4,0x34,0x5c,0x0a,0xb3,0xe0,0x3d,0x68,0x4d,0x5b, +0x2d,0x58,0x35,0xe8,0xd4,0x45,0x0f,0xe3,0xbe,0x02,0x1d,0x03,0xdb,0x61,0x3f,0xfe, +0x15,0xf8,0xe1,0xfe,0x06,0xf6,0x69,0x10,0x5f,0x8b,0xfc,0xe2,0xbe,0x1e,0x1e,0x81, +0x61,0xd0,0xb7,0x96,0xfb,0x5d,0x6b,0xdf,0x1e,0x66,0x6e,0x4a,0xd0,0xd9,0x86,0xfe, +0x40,0xbf,0xd2,0x0c,0x4e,0xaf,0xed,0x7e,0xeb,0x9a,0x0f,0xdd,0x4e,0xb8,0xbb,0xa9, +0xd3,0x13,0xdb,0xb8,0x2f,0x00,0x1e,0xc6,0xff,0xf9,0x91,0x3c,0xef,0x35,0x3c,0xf2, +0x6d,0x67,0x79,0xb8,0x0c,0xda,0xc2,0x6b,0xc9,0x41,0xa7,0x19,0xc7,0x1d,0xc2,0x3e, +0x16,0x2e,0xb8,0xc2,0xfd,0x66,0xb6,0x5f,0x4a,0xd0,0xb9,0x13,0x2d,0x0b,0x25,0x7b, +0x3b,0xb9,0xdf,0x45,0x66,0xa2,0x4f,0xc0,0x2e,0x98,0x7a,0x25,0xf6,0xb4,0xa0,0xb3, +0x09,0x3d,0xad,0x0e,0x71,0xf6,0xe1,0xf7,0x41,0xcd,0xa0,0x73,0x21,0x7a,0x3e,0xee, +0x41,0x66,0x5d,0x6c,0x7d,0x3f,0xfa,0x0a,0xdc,0x51,0x2b,0xe8,0x14,0xe0,0x5a,0x1f, +0x42,0xcf,0xef,0xcb,0xef,0x81,0x3a,0x41,0x67,0x31,0xba,0x06,0x7a,0xc1,0x29,0xfd, +0xa8,0x53,0xfd,0xdc,0x6f,0x75,0xcd,0xf7,0xa6,0xbd,0x61,0x38,0x8c,0x85,0x32,0x75, +0x83,0x4e,0x0a,0x5a,0x9d,0x7e,0xad,0x3f,0x24,0xd7,0x75,0xbf,0x45,0x5d,0x01,0xef, +0xd6,0x0b,0x3a,0x07,0xd9,0xd7,0x9f,0xfe,0xf2,0xb2,0xfa,0xa4,0x19,0x96,0x63,0x4f, +0xcf,0x76,0xbf,0x53,0x2d,0x0d,0xf7,0x11,0xbe,0x39,0x7a,0x1d,0x0c,0x83,0xe7,0xe1, +0x1c,0xfa,0x84,0x2c,0xfa,0xe4,0xee,0x99,0x41,0xe7,0x61,0x74,0x7a,0xc3,0xa0,0x53, +0x79,0x90,0xfb,0x3d,0x6b,0x6b,0xc8,0xd7,0x38,0xe8,0x8c,0x44,0x27,0x1a,0xbf,0x26, +0x41,0xa7,0x64,0xd3,0xa0,0x73,0xcd,0x60,0xda,0x13,0x3c,0x57,0x8f,0xdf,0x44,0xe8, +0xfc,0x7a,0x2e,0x4d,0x86,0x38,0xce,0x25,0x43,0xdc,0xef,0x5f,0xc7,0x9a,0xef,0xdf, +0xa1,0x74,0x7d,0xc7,0x39,0x9b,0xbe,0x37,0xed,0xbc,0xa0,0x53,0xcf,0xac,0x41,0x8d, +0x9a,0x6f,0xfc,0x1f,0xa3,0xfe,0x16,0xa5,0xdf,0x9c,0xd2,0x2a,0xe8,0xcc,0x87,0x46, +0xad,0x83,0xce,0x61,0xc2,0xe6,0xcb,0x70,0xbf,0x91,0x3d,0x80,0xfb,0x6b,0x38,0xbd, +0x4d,0xd0,0x49,0x86,0x32,0xc3,0xb8,0x06,0xc2,0x7c,0x3f,0x6b,0xbe,0x4b,0xbd,0x0d, +0x6d,0x8c,0xde,0x97,0x61,0xbe,0x05,0xa7,0x3c,0x87,0xbb,0x6b,0x1b,0x98,0xef,0x6a, +0xb7,0xe1,0x57,0xb1,0x7d,0x30,0xf7,0x3b,0xe6,0x07,0xd1,0x37,0xc0,0x7c,0x8b,0xbd, +0x1b,0xaa,0x37,0x70,0xbf,0x67,0x6e,0x0e,0xad,0x60,0x44,0xc7,0xa0,0xf3,0xcc,0xc5, +0x2e,0x5f,0xe1,0x0e,0x72,0x73,0x9e,0xde,0x89,0xf2,0xbb,0x96,0x3e,0x0f,0x2a,0xe1, +0x1e,0x79,0x49,0xd0,0x59,0x37,0x82,0xdf,0x85,0xd8,0x77,0xa2,0xdb,0x34,0x49,0xe0, +0xa6,0xce,0x41,0xa7,0x3b,0x1a,0xa0,0x5e,0xad,0x40,0x83,0xd7,0x73,0x3f,0x87,0x14, +0xdc,0x95,0xbb,0x05,0x9d,0x26,0xd0,0x11,0xfb,0x87,0xe8,0x35,0x37,0x70,0x6d,0xbb, +0x07,0x9d,0x89,0xe8,0x21,0x7d,0xe3,0xfb,0xd1,0xe5,0x41,0x27,0xb6,0x07,0x7d,0x3c, +0xf6,0xa9,0x68,0x36,0xda,0x99,0xba,0xf8,0x3e,0xc7,0xcc,0xc6,0x1e,0x31,0xca,0x71, +0x0a,0x70,0xf3,0xad,0x87,0xce,0xa5,0xff,0x79,0xa6,0x57,0xd0,0x99,0x0b,0xf7,0x10, +0xe6,0xe1,0x64,0xb7,0x7d,0x47,0xc2,0xa3,0xe3,0x69,0xcf,0x84,0xbb,0x0b,0xfb,0x6d, +0xf0,0x08,0xcc,0xa1,0x1f,0x9c,0x65,0x14,0x16,0xc2,0x0e,0xa8,0xd3,0x27,0x98,0xbb, +0x36,0xc2,0x59,0x63,0xb8,0xe6,0xf0,0x3c,0xc4,0xc2,0x42,0xf8,0x7c,0x8c,0xfb,0xed, +0x76,0x5b,0x74,0x15,0xbc,0x05,0x39,0x90,0xd6,0x37,0xe8,0xf4,0xe9,0x47,0x9a,0xd0, +0xaa,0x3c,0xac,0xec,0x27,0xcc,0x01,0x38,0x65,0x2c,0xe1,0x06,0x07,0x9d,0xcb,0xd1, +0x6a,0x03,0x82,0xce,0xa5,0xec,0xeb,0x0a,0xb3,0xb0,0xaf,0xcb,0xe6,0x18,0xec,0xad, +0xb5,0x06,0x45,0x2f,0xe8,0x0d,0xd3,0x60,0x1c,0x14,0xbe,0x99,0xfe,0xed,0x26,0xf7, +0xdb,0xe6,0xca,0xd0,0x07,0x6e,0x82,0x0d,0x1c,0xf3,0x29,0x1a,0x18,0x47,0x5f,0x84, +0xbd,0x8b,0xd6,0x04,0xef,0x35,0x34,0xe8,0x6c,0x40,0x3f,0x81,0x54,0x1e,0x96,0x0e, +0xa1,0xaf,0x70,0xaf,0x7a,0x61,0x78,0xd0,0xe9,0x79,0x75,0xd0,0x59,0x84,0xdf,0x0a, +0x98,0xac,0x6f,0xa1,0xcd,0x77,0xd0,0x66,0xbd,0xf0,0xa9,0x23,0x82,0xce,0x74,0x74, +0x29,0x94,0xe6,0x19,0x61,0x18,0x54,0xbf,0x21,0xe8,0x44,0xe6,0x0b,0x3a,0xab,0xb1, +0xbf,0x0a,0xfb,0xe0,0x13,0xdc,0xef,0xdd,0xe9,0x7e,0x37,0xbd,0x6e,0x6c,0xd0,0xd9, +0x03,0xf7,0xf2,0x9c,0xb1,0x1f,0x8a,0xf1,0xbc,0x10,0x7f,0x73,0xd0,0x29,0x8d,0xd6, +0xbc,0x9b,0x34,0xc2,0x46,0xf3,0x4d,0x35,0x1c,0xbc,0x87,0xfb,0xe3,0xbd,0xa4,0xe7, +0xb6,0xa0,0x73,0xdb,0x44,0xda,0x09,0x0f,0x6f,0xf3,0x26,0x9a,0xf3,0x04,0x9d,0x1d, +0xd8,0x5f,0xbb,0x8f,0xeb,0x48,0xff,0x1d,0x7b,0x3f,0xf5,0x82,0xfb,0xec,0x19,0x77, +0xd3,0xcf,0xf3,0x20,0x35,0x14,0xb6,0xe0,0x97,0xff,0xde,0xa0,0x33,0x1b,0xfb,0x7d, +0xa8,0xf9,0x1e,0xdb,0x70,0x2e,0xbc,0x34,0x31,0xe8,0x6c,0x45,0x93,0x79,0x08,0x3c, +0x77,0x12,0xd7,0x1d,0x96,0xc1,0xcf,0xf0,0x36,0x7e,0x09,0x0f,0x05,0x73,0xbf,0xdb, +0xce,0x78,0x98,0xfb,0x03,0xbc,0xcd,0x83,0xe2,0x1e,0xe8,0xf5,0x08,0xf6,0xc9,0x41, +0xe7,0x07,0xec,0xa1,0x29,0x41,0xa7,0xf0,0xe3,0x41,0xe7,0x2e,0x30,0x6b,0x8f,0xb7, +0x6f,0xe9,0xae,0x39,0xfe,0x33,0x84,0x1e,0x73,0x9c,0x22,0x70,0x8a,0xd6,0x1c,0xcf, +0x9d,0x30,0x40,0xb1,0x07,0x23,0x22,0x43,0x51,0xd1,0xf9,0x62,0xf2,0x17,0x28,0x58, +0xa8,0x30,0x41,0x72,0x97,0xda,0x2d,0x5e,0xa2,0x64,0xa9,0x53,0xe8,0x37,0x9d,0x23, +0xdb,0x69,0xa7,0x73,0xcf,0x74,0xfe,0x17,0x5b,0x69,0xe7,0xcc,0xb3,0xca,0x94,0xfd, +0x83,0x23,0x75,0xff,0xaa,0x55,0x85,0xd8,0xb3,0x5d,0xe7,0x39,0x74,0x1e,0x95,0x2a, +0x9f,0x5b,0xa5,0x6a,0xb5,0xb8,0xf8,0xea,0x09,0x89,0x49,0xc9,0x4e,0x4a,0x6a,0xee, +0x63,0xda,0x1f,0xb4,0xd5,0xf0,0x1e,0xf5,0xfe,0xb0,0xad,0xd6,0xb1,0x3c,0x6b,0xd7, +0x39,0xca,0x59,0xb7,0x66,0x3d,0x77,0x3e,0x57,0x03,0x27,0xbc,0x85,0xb7,0xf0,0x16, +0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b, +0x78,0x0b,0x6f,0xff,0xd2,0x6d,0xc7,0xb1,0xb6,0x9d,0x39,0x6c,0x3b,0x37,0x9a,0xff, +0x73,0x56,0xad,0x3a,0xf2,0xbf,0xb6,0x80,0xd9,0x8c,0xc5,0x0b,0xbf,0x6f,0x87,0xeb, +0xc8,0xc9,0x71,0x72,0xff,0xc7,0x41,0x14,0x3b,0xbe,0xd8,0xb5,0xcb,0xfc,0x3b,0x2a, +0xea,0x70,0x89,0x1f,0xfb,0x12,0x84,0x8b,0x41,0x5b,0x6e,0xa5,0x32,0xff,0x7d,0xa2, +0xea,0xe5,0xd6,0xb9,0x5c,0xbf,0x4f,0xb6,0xef,0xc8,0x7d,0x47,0x59,0xc4,0xbc,0x9e, +0xcc,0x7d,0x3f,0x79,0xaa,0x79,0x29,0xb9,0x23,0xc7,0x29,0xfe,0x47,0xb7,0x87,0x32, +0x65,0xcb,0x9d,0xec,0xa1,0xa5,0xcd,0x3b,0xca,0x72,0xe5,0x2b,0x98,0x24,0xef,0x50, +0x2e,0x72,0xfc,0x81,0x62,0xff,0xcc,0x56,0xed,0x5a,0x72,0x72,0xd5,0x39,0x56,0x6a, +0x8e,0xb1,0x9d,0x7d,0x9c,0x98,0xdd,0x2b,0x61,0xae,0x88,0xf9,0x97,0x1b,0xbd,0x6b, +0x76,0xfc,0x4d,0xba,0xba,0x9c,0x23,0x09,0xcd,0xf9,0x4f,0x41,0x8f,0x74,0x8d,0xce, +0xaf,0xae,0x93,0xa9,0xc7,0x39,0x39,0xbf,0x2b,0xb1,0xea,0x5e,0x4f,0x32,0x7b,0x39, +0x76,0xb7,0xac,0xd4,0xeb,0x8a,0xb9,0x7b,0xa9,0xa4,0xaa,0x99,0x39,0xbf,0xbb,0xdf, +0x89,0xf6,0x7b,0xc4,0xa8,0x82,0xfc,0x49,0x17,0xf4,0x98,0xe7,0x3f,0xb9,0x52,0xfe, +0x1f,0x9f,0xdf,0x09,0x9f,0xff,0x8f,0xdc,0xfe,0x2a,0xf9,0xbf,0xb0,0xd3,0xbf,0xa1, +0xfc,0x63,0x62,0xfe,0x52,0xd7,0xff,0xcf,0x3d,0x79,0xaf,0x5e,0x47,0x9f,0xaf,0x0f, +0xdb,0x9f,0x79,0xfe,0xa1,0x43,0x8f,0x3e,0xff,0x35,0xd7,0x98,0x19,0x70,0x7f,0xe0, +0x63,0xd8,0x7f,0xba,0x7b,0xe5,0x60,0x36,0xfe,0xc6,0x88,0x47,0x8d,0x76,0x6e,0xcc, +0xb5,0x8c,0x66,0xe3,0x7f,0xee,0x5b,0x31,0xce,0xef,0xbd,0x65,0xe4,0xfc,0xd9,0x95, +0x2d,0xfa,0x18,0xb5,0xff,0x0f,0x28,0xf4,0x7f,0xde,0x2f,0x9b,0xbf,0x63,0xb2,0x8f, +0x77,0x69,0x63,0xfe,0xda,0xa9,0xff,0xa3,0x1e,0x6f,0xfe,0x5a,0xdb,0xf6,0xbf,0x58, +0x7a,0x3e,0xd9,0xf1,0x4f,0x6b,0xad,0x47,0xff,0xfc,0xf8,0x6f,0xde,0x95,0x8f,0xbc, +0x0c,0x3a,0xe9,0xd3,0x1c,0xfd,0x4a,0xc0,0xc9,0xc9,0xb1,0x7f,0x6d,0xff,0x49,0xdd, +0x4d,0xf4,0x6f,0xeb,0x0f,0x76,0xe4,0xfc,0xae,0x77,0x60,0xbf,0xe7,0x86,0x13,0xfd, +0x07,0xc5,0x93,0xf7,0xa3,0xe7,0x5f,0xe9,0x96,0x13,0xf0,0xaa,0x87,0xf9,0xdf,0x09, +0xb8,0x9b,0x75,0x7f,0xdd,0x91,0x1b,0xee,0x9f,0x72,0x8b,0xcd,0xf9,0xf5,0xbd,0xc6, +0x8e,0x5d,0x1f,0xe4,0xac,0xda,0x71,0x22,0xdb,0xce,0xed,0xdb,0x73,0x3e,0xda,0xf1, +0x45,0xce,0x3f,0xaf,0x0f,0xdb,0xb1,0x23,0x10,0x30,0x39,0x0c,0x18,0xf1,0x2e,0x36, +0xf6,0x9c,0x1d,0x7a,0x65,0xed,0xfc,0xab,0xb7,0xbf,0xda,0x13,0x59,0xcc,0x9f,0x90, +0xe1,0xff,0xb8,0x9d,0x78,0x4c,0x1f,0x6d,0xdf,0xf9,0xc9,0x96,0x2d,0x7f,0x5a,0xc9, +0xe4,0xcb,0xf7,0x8f,0xac,0x7f,0x47,0x5f,0x93,0xe3,0x5f,0xbd,0x3f,0xbe,0x3e,0xfc, +0xf6,0x6a,0xf8,0x57,0x7d,0xee,0x8f,0x39,0xa9,0xfa,0xff,0x3b,0x5e,0x09,0xe4,0xfc, +0x25,0x8a,0x29,0xfa,0xef,0xf3,0x5b,0xec,0xbf,0xd1,0x80,0x72,0x87,0x71,0x74,0x19, +0xcd,0xb8,0xc4,0x5f,0xb2,0xdb,0xfd,0xfb,0x35,0x94,0x63,0x6e,0x67,0x38,0xff,0xf6, +0x6d,0x87,0x3d,0x08,0x9b,0x13,0x1e,0xa7,0xfe,0x47,0x6d,0x39,0xe1,0x2c,0xfe,0x0f, +0x5b,0xd5,0x5f,0xb1,0xb0,0x4e,0x38,0x51,0x3b,0x02,0x39,0x7f,0x9f,0x1b,0xc9,0xef, +0xfc,0x99,0x1b,0x9e,0x9f,0xf3,0x17,0x69,0x34,0x7f,0x78,0x7d,0xcf,0xc9,0xf9,0xa3, +0x22,0x72,0x27,0xc2,0xfc,0x96,0x08,0x77,0xfc,0x03,0xde,0xc2,0xc4,0xfc,0xd6,0x90, +0xbf,0xbd,0xff,0x88,0x89,0xfe,0x83,0x2a,0xd5,0x49,0xd7,0xaa,0xdf,0xfb,0x02,0x35, +0xfa,0xbf,0x53,0xf2,0x7f,0xe2,0x2b,0xd9,0x98,0xe8,0xbf,0x5f,0x15,0x8d,0xfe,0xc3, +0x6f,0x55,0xd1,0x27,0x3e,0xff,0xe2,0xc8,0x4f,0xef,0x7f,0xde,0x64,0xcf,0x98,0xff, +0x50,0xf7,0x76,0x84,0x2b,0xe3,0x3f,0x3b,0xf3,0x31,0xff,0xa2,0x6c,0xc7,0x38,0xe1, +0x2d,0xdc,0xec,0xfe,0xff,0x93,0xc0,0x5f,0xba,0x20,0x62,0xfe,0x9c,0x38,0x63,0xfe, +0xa5,0xad,0x2d,0xdc,0x27,0xfc,0x77,0xa6,0xc2,0xc5,0xfc,0xcd,0xfa,0x80,0xf0,0xf6, +0x37,0xd9,0x7e,0x9d,0x0b,0xf2,0xdb,0x7f,0x2f,0x86,0x5f,0x07,0xfd,0x8d,0xb7,0xa8, +0xa8,0xbf,0x55,0x6d,0xfd,0x67,0x14,0xfa,0xc6,0x8d,0x6e,0xa3,0xdb,0xba,0xd1,0x6c, +0x9e,0xaf,0xf7,0x39,0xe9,0xaf,0x93,0xfa,0x8e,0xdf,0xf2,0xfe,0x8a,0x99,0xfb,0x7b, +0xf7,0x06,0xd6,0x27,0x6e,0xfe,0x69,0x02,0x47,0x76,0xfd,0x79,0x6f,0x2d,0xc2,0x1d, +0xeb,0x7f,0xb1,0x78,0xfe,0xed,0x37,0xae,0x9d,0x3b,0xff,0xf9,0xd3,0xff,0x7e,0xed, +0x53,0xff,0xf4,0x3e,0x24,0xfc,0x3e,0xe0,0xef,0xf9,0x40,0x9c,0xbb,0xfa,0x67,0x28, +0x14,0x1d,0xca,0x17,0x93,0x3f,0x14,0x2a,0x10,0xfa,0x75,0x2b,0x18,0x0a,0x15,0x2a, +0x1c,0x2a,0x52,0x34,0x64,0x6f,0xc5,0x42,0xff,0xec,0xad,0x78,0x89,0x50,0xc9,0x52, +0xa7,0x60,0x39,0x35,0x14,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7, +0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0x7f,0xc8,0x16, +0x70,0xfe,0x57,0x26,0xc2,0x09,0x39,0xd1,0xb9,0xa6,0x92,0x13,0xe7,0xd4,0x70,0x1a, +0x3a,0x3d,0x9c,0x5e,0xce,0x55,0xce,0x18,0x67,0x8a,0xf3,0x84,0xf3,0xbc,0xb3,0xc0, +0x59,0xec,0xbc,0xeb,0xec,0x77,0xbe,0xc5,0x84,0x02,0x25,0x02,0xe5,0x03,0x4d,0x02, +0x2d,0x02,0x1d,0x02,0x9d,0x02,0xfd,0x02,0x57,0x1f,0x65,0x26,0x05,0x1e,0x0b,0x4c, +0x0b,0xcc,0x0d,0x6c,0x08,0x7c,0x18,0xf8,0x3c,0xf0,0x7d,0xa0,0x44,0xf0,0xd4,0x60, +0xf9,0x60,0x5c,0x30,0x39,0x98,0x15,0xec,0x11,0xec,0x8d,0xb9,0x3a,0x78,0x73,0xf0, +0xfe,0xe0,0xc2,0xe0,0xd2,0xe0,0x3b,0xc1,0xf5,0xc1,0xcf,0x83,0x07,0xfe,0x8b,0xe6, +0xe0,0x6f,0x30,0x81,0x88,0x40,0x44,0x44,0x44,0x28,0x22,0x26,0xa2,0x40,0xae,0x29, +0xf1,0xab,0x29,0xf5,0xab,0x39,0x2b,0x22,0x36,0xe2,0x1c,0x4c,0x25,0x99,0xea,0x96, +0xa9,0x81,0x49,0x8f,0xa8,0x1d,0x51,0x3f,0xa2,0x41,0xae,0x69,0xf6,0xab,0x69,0xf1, +0xab,0x69,0x1b,0xd1,0x31,0xa2,0x13,0xe6,0x52,0x99,0x1e,0x47,0x99,0x7e,0x11,0x57, +0xfd,0x47,0x73,0x75,0xc4,0x75,0x7f,0xba,0x19,0x15,0x31,0x36,0x4f,0x73,0x73,0xc4, +0x2d,0xbf,0x9a,0xdb,0x22,0xee,0x38,0xca,0x8c,0x8f,0xb8,0x2b,0xe2,0x9e,0x88,0x89, +0x27,0x68,0xee,0xff,0xdd,0x66,0x4a,0xc4,0xf4,0xff,0x60,0xe6,0x46,0x2c,0x3e,0xca, +0x2c,0xfd,0x53,0xcc,0x6b,0x11,0x6f,0xfc,0x8f,0xcc,0x8a,0x88,0x37,0x23,0x56,0x47, +0xac,0xf9,0xd5,0xbc,0x13,0xf1,0xee,0x3f,0xc2,0xac,0x0f,0x9b,0x7f,0xb5,0xf9,0x54, +0xe6,0x0b,0xcc,0x01,0x4c,0x20,0xf2,0x88,0x89,0xc1,0x14,0x90,0x39,0x55,0xa6,0x7c, +0xae,0x89,0xc5,0x9c,0x93,0x6b,0x52,0x65,0xea,0x62,0x9a,0x61,0x3a,0x5a,0xa6,0x2b, +0xa6,0x87,0xcc,0x55,0x32,0xa3,0x22,0x6f,0x8e,0xbc,0x23,0xd7,0x8c,0x97,0xb9,0xe7, +0x4f,0x33,0x13,0x8f,0x61,0x26,0xe5,0x9a,0x87,0x30,0x53,0x22,0x9f,0x8a,0x7c,0x26, +0x72,0x06,0x66,0x96,0xcc,0x9c,0x5f,0xcd,0x2b,0x32,0x0b,0x65,0x16,0x63,0x96,0xe6, +0x9a,0x37,0x72,0xcd,0x0a,0xcc,0x9a,0xc8,0x77,0x23,0xd7,0x47,0x6e,0xc2,0x7c,0x2c, +0xb3,0xf9,0x57,0xf3,0xb9,0xcc,0x17,0x32,0xbb,0x31,0x7b,0xfe,0x9f,0xd9,0xfb,0x3b, +0xcc,0xfe,0xc8,0x03,0xff,0x08,0xf3,0x6d,0xe4,0xf7,0xff,0xd1,0x1c,0x8c,0xfc,0xf1, +0xa4,0x4c,0x78,0x28,0xf0,0xdf,0xbe,0xfd,0x18,0xf9,0xc7,0x9a,0x40,0xe8,0xf7,0x1a, +0x1e,0x89,0xff,0x65,0xbf,0xc7,0xa2,0x8f,0x6b,0x62,0x72,0x4d,0x81,0xbf,0x89,0x29, +0xe4,0x33,0x45,0x72,0x4d,0xb1,0xb0,0x39,0x21,0x53,0xea,0x5f,0x6f,0x4a,0xff,0x25, +0xcd,0x59,0x7f,0x92,0x29,0x1f,0x8a,0xfd,0x97,0x9b,0x73,0xfe,0x75,0xa6,0xd2,0x51, +0x26,0x4e,0xa6,0xfa,0xbf,0xd6,0x24,0x87,0x52,0xc3,0xe6,0xb8,0xa6,0x76,0xae,0xa9, +0xfb,0x17,0x34,0xf5,0xc3,0xe6,0x6f,0x6e,0x1a,0x60,0x1a,0x62,0xb2,0x30,0x4d,0x30, +0xcd,0x64,0x5a,0xfc,0xe1,0xa6,0x25,0xa6,0x15,0xa6,0x4d,0xa8,0x6d,0xae,0x69,0x17, +0x36,0xff,0x12,0xd3,0x21,0xd4,0xf1,0x0f,0x31,0x9d,0x42,0x97,0x1e,0x65,0x3a,0x87, +0xba,0xfe,0xcf,0x4c,0x8f,0x50,0xef,0x93,0x32,0x7d,0x42,0xfd,0x4e,0xc8,0x0c,0x08, +0x0d,0xfc,0x93,0xcc,0xd5,0xa1,0x51,0xa1,0x31,0xa1,0xb1,0xa1,0x9b,0x43,0xb7,0x84, +0x6e,0x0b,0xdd,0x11,0x9a,0x18,0x7a,0x24,0xf4,0x58,0x68,0x4a,0xe8,0x89,0xd0,0x53, +0xa1,0x67,0x42,0xd3,0x42,0xcf,0x87,0x66,0x1d,0x65,0xe6,0x86,0x16,0x1c,0x65,0x96, +0x86,0xde,0x0c,0xad,0x0e,0xad,0x09,0xbd,0x13,0x7a,0x37,0xb4,0x3e,0xf4,0x7e,0xe8, +0xe3,0xd0,0x67,0xa1,0xcf,0x43,0x5f,0x84,0x76,0x87,0xf6,0x84,0xf6,0x86,0xf6,0x87, +0xbe,0x0f,0xfd,0x74,0x94,0x89,0x88,0x8a,0x39,0xca,0x14,0x8a,0x2a,0x76,0x94,0x29, +0x15,0x75,0xfa,0x51,0xa6,0x6c,0xd4,0x39,0x3e,0x53,0xf5,0x28,0x93,0x1c,0x55,0x3b, +0xaa,0x6e,0x54,0xfd,0xa8,0x06,0x51,0x0d,0xa3,0xb2,0xa2,0x9a,0x44,0xb5,0x8a,0xea, +0x10,0xd5,0x31,0xaa,0x53,0xd4,0xa5,0x51,0x9d,0xa3,0xba,0x46,0x75,0x8f,0xea,0x21, +0xd3,0xcb,0x67,0x7a,0xff,0x0f,0x4c,0x9f,0xff,0x67,0x06,0x1e,0x65,0x06,0xff,0x97, +0xcd,0x55,0x3e,0x73,0x6d,0xd8,0x9c,0x80,0xb9,0x0e,0x73,0x03,0x66,0xd4,0xff,0xc8, +0x8c,0xc1,0x8c,0xc5,0xdc,0xfc,0x5f,0x36,0xb7,0xfc,0x6a,0x6e,0xcb,0x35,0x77,0x9c, +0xa4,0x19,0x8f,0xb9,0xeb,0xa4,0xcc,0x3d,0x47,0x99,0x89,0x98,0xfb,0x73,0xcd,0xa4, +0x5f,0xcd,0x43,0x27,0x68,0x1e,0xc9,0x35,0x8f,0x45,0x4d,0xc9,0xd3,0x3c,0x11,0xf5, +0x54,0xae,0x79,0x26,0x6a,0x5a,0xae,0x99,0x1e,0xf5,0x7c,0xd4,0x8c,0xa8,0x59,0xbf, +0x9a,0x39,0x51,0x73,0x73,0xcd,0xbc,0xa8,0x05,0xc7,0x30,0xaf,0x44,0x2d,0x3c,0x8e, +0x59,0x6c,0x99,0xa5,0x51,0xaf,0x61,0xde,0x38,0xca,0xac,0x88,0x7a,0x33,0x6a,0x75, +0xd4,0x9a,0xb0,0x39,0xae,0x79,0xe7,0x57,0xf3,0x2e,0x66,0x3d,0xe6,0x7d,0xcc,0x06, +0xcc,0x87,0x98,0x4d,0x98,0x8f,0x31,0x9b,0x31,0x9f,0x62,0xb6,0x61,0x3e,0xc3,0x7c, +0x9e,0x6b,0xbe,0xc0,0xec,0xc6,0xec,0x39,0xca,0xec,0xcf,0x35,0xdf,0xe6,0x9a,0x83, +0xb9,0xe6,0xa7,0x5c,0x13,0x88,0xfe,0xfd,0x26,0xe2,0xff,0x99,0x23,0x2f,0x72,0xcd, +0x16,0x83,0x29,0x80,0x29,0x84,0x29,0x82,0x29,0x86,0x29,0x81,0x29,0x85,0x39,0x15, +0x73,0x3a,0xa6,0x34,0xe6,0xac,0x5c,0x53,0x16,0x53,0x1e,0x13,0x7b,0x94,0xa9,0x94, +0x6b,0xaa,0xe6,0x9a,0xea,0xb9,0x26,0x39,0xd7,0xd4,0x38,0x41,0x93,0x1e,0x5d,0x3b, +0xba,0x6e,0x74,0xfd,0x63,0x9a,0x06,0x61,0xf3,0x1b,0x4d,0x43,0x4c,0xd6,0x31,0x4c, +0x93,0xb0,0xc9,0xc3,0x34,0x8b,0x6e,0x11,0x36,0x61,0x73,0x82,0xa6,0x55,0xd8,0x84, +0xcd,0x3f,0xde,0xb4,0x0b,0x9b,0x7f,0xb5,0xe9,0x10,0xdd,0xf1,0x5f,0x6b,0x3a,0x85, +0xcd,0x5f,0xd0,0x84,0x67,0x49,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f, +0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc, +0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0, +0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2, +0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b, +0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d, +0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7, +0xf0,0x16,0xde,0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde, +0xc2,0x5b,0x78,0x0b,0x6f,0xe1,0x2d,0xbc,0x85,0xb7,0xf0,0x16,0xde,0xc2,0xdb,0xdf, +0x6f,0xab,0x19,0xe1,0x38,0xfd,0x2b,0xb8,0xda,0x45,0x3a,0x00,0x75,0xd0,0x25,0x48, +0x00,0x5d,0x8a,0x06,0xd1,0x65,0xc6,0x1b,0x7d,0x0d,0x8d,0x8c,0x30,0x3b,0x1d,0x27, +0x0a,0x0d,0xa2,0xd1,0x68,0xc5,0xa0,0xe3,0xe4,0x43,0x5f,0x67,0x57,0x0c,0xfa,0x78, +0x19,0xc7,0xc9,0x8f,0xbe,0x81,0xbb,0x20,0xba,0x86,0x70,0x45,0xcc,0x71,0x84,0x2b, +0x66,0x8e,0x43,0x63,0xd1,0xc9,0x84,0x3b,0xc7,0xf8,0xa3,0x95,0xd1,0x48,0xc5,0x17, +0x2c,0xe3,0xee,0x8f,0x44,0x13,0xd1,0xa8,0x32,0x6e,0x7a,0xa2,0x02,0x6e,0x7a,0xf2, +0x29,0x5c,0xfe,0x80,0x1b,0x7f,0x41,0xb4,0x12,0xba,0xc2,0x91,0x7f,0x19,0xd7,0xbf, +0x70,0xc0,0x8d,0xa7,0x60,0x19,0x77,0x7f,0x51,0x34,0x0e,0x2d,0xae,0x78,0x0b,0x97, +0x71,0xf3,0xbb,0x52,0xf9,0x7d,0x53,0xf9,0x5d,0xa5,0xfc,0xbe,0x5a,0xc6,0xcd,0x6f, +0x71,0xe5,0xb7,0xa4,0xce,0x7b,0x4a,0xc0,0xcd,0xef,0x6a,0xe5,0xf7,0x65,0x9d,0xef, +0x0c,0xe5,0x33,0x52,0xf9,0x8c,0x52,0x3e,0xe7,0xeb,0xfc,0x95,0x83,0x6e,0x3e,0x4f, +0x0b,0xb8,0xe9,0x38,0x0d,0xff,0x04,0x73,0x5c,0x19,0x37,0xde,0x32,0xca,0xe7,0x37, +0xca,0xe7,0x99,0x01,0xf7,0xfc,0xe5,0xca,0xb8,0xe7,0x2f,0xa3,0xf3,0x97,0x53,0xbe, +0x77,0x28,0xdf,0x15,0x14,0xfe,0x6c,0xed,0xaf,0x50,0xc6,0x4d,0x5f,0x45,0xa5,0xab, +0x8c,0xd2,0x71,0xb6,0x97,0x0e,0x34,0x1e,0xad,0xa2,0xfc,0xbf,0xa5,0xfc,0xaf,0x51, +0xfe,0xdf,0x56,0xfe,0x2b,0xeb,0xfc,0x55,0x94,0xff,0x6a,0x8a,0x3f,0x41,0xf9,0x7f, +0x47,0xf9,0x5f,0xa9,0xf3,0xbc,0xa3,0xfc,0xe7,0x53,0xfe,0xf3,0xeb,0xbc,0xab,0x74, +0x7d,0xe3,0x03,0x6e,0x7e,0xab,0x95,0x71,0xcf,0x93,0x12,0x70,0xcf,0x9b,0xa0,0xe3, +0x77,0xea,0x7a,0x25,0x29,0x9d,0x69,0x01,0xf7,0x3a,0xa5,0xa8,0x5c,0xd2,0x95,0xef, +0xba,0x0a,0x97,0xa6,0x70,0xb5,0x55,0x9e,0x75,0x74,0x5d,0x6b,0x29,0x7c,0x3d,0x95, +0x6b,0x86,0xea,0x53,0xa6,0xf2,0xfb,0x83,0xce,0xdb,0x30,0xe0,0xe6,0xf3,0x5d,0xd5, +0x9b,0x46,0x4a,0x47,0x13,0xc5,0xdf,0x58,0xf1,0x67,0x29,0xfe,0xe6,0x8a,0xbf,0xa9, +0xe2,0x59,0xa7,0x72,0x5b,0xaf,0x72,0x7b,0x4f,0xe5,0xf6,0xbe,0xda,0xc9,0x79,0x2a, +0xb7,0xf3,0x55,0x6e,0xf1,0x6a,0x27,0x1f,0xa8,0xdc,0xde,0x26,0x9e,0x02,0x68,0x6b, +0xe5,0xeb,0x5d,0x95,0x5f,0x41,0x95,0x5f,0x61,0xb4,0xb4,0x69,0x27,0x4a,0xcf,0x5b, +0x2a,0xc7,0x5d,0x4a,0xff,0x85,0xca,0x5f,0x7b,0xe5,0xf7,0x42,0x9d,0xe7,0x22,0xe5, +0xe3,0x22,0xc5,0x57,0x54,0xf1,0x15,0xd7,0xf5,0xb8,0x58,0xf9,0x6a,0xaf,0xf2,0xbd, +0x4c,0xc7,0x5f,0xac,0x7a,0x74,0x89,0xe2,0xe9,0xa2,0x78,0xba,0xe8,0xfc,0xdd,0x70, +0x57,0x34,0xf5,0x36,0xe8,0x1e,0x7f,0x99,0xc2,0x5d,0xa9,0x70,0x97,0x2b,0x5c,0x5f, +0x85,0x3b,0x43,0xe1,0xba,0xa9,0xfc,0xb2,0x55,0x7e,0xfd,0x55,0x7e,0x1f,0xaa,0xfc, +0x3e,0x52,0xf9,0x6d,0x52,0xf9,0x5d,0xa1,0x7a,0x77,0xa5,0xca,0xaf,0xaf,0xea,0x5b, +0x8e,0xca,0x6d,0x87,0xfa,0x97,0xfe,0x01,0xb7,0xfc,0xb2,0x55,0x7e,0xeb,0x95,0xdf, +0x92,0xca,0xef,0x29,0x2a,0xbf,0x19,0x4a,0xd7,0x76,0x8e,0x3b,0x1b,0x1d,0xa4,0x72, +0x1c,0xa4,0x74,0x0d,0x55,0x3b,0x1c,0x52,0xc6,0x3d,0xff,0x08,0xd5,0x97,0xeb,0x95, +0xce,0x91,0x2a,0x9f,0xd1,0xaa,0xb7,0x43,0x94,0xef,0x9b,0xd4,0xce,0x6e,0x54,0xf8, +0x71,0xba,0x1e,0xb7,0xca,0xff,0x76,0x1d,0xff,0xb5,0x8e,0xff,0x58,0xf9,0x1c,0xaa, +0x7a,0xf7,0x83,0xfa,0x97,0xa4,0xa0,0x7b,0xdc,0x9d,0x3a,0x6e,0x78,0xc0,0xcd,0xe7, +0x77,0x8a,0xf7,0x1b,0x1d,0x7f,0xb5,0xae,0xcf,0x04,0x9d,0xe7,0x5a,0xe5,0xfb,0x3a, +0xe5,0xef,0x6e,0x95,0xef,0xbd,0x3a,0xef,0x16,0x95,0xef,0xa7,0x3a,0xef,0x56,0x95, +0xef,0x36,0xd5,0xcf,0x80,0xca,0x37,0x42,0xf9,0xa9,0xa4,0xfa,0xb9,0x5d,0xe5,0xfc, +0x84,0xca,0xf9,0x33,0xf5,0xe3,0x6f,0xab,0x7c,0x03,0x2a,0xdf,0x08,0xd5,0xa7,0x29, +0xea,0xc7,0x03,0x2a,0xd7,0x90,0xe2,0x8b,0x50,0xfa,0x43,0x4a,0x57,0xb4,0xf2,0x11, +0xad,0x7c,0xc4,0x28,0x5c,0x01,0xe5,0xa3,0x90,0xfa,0xb3,0xcf,0xd5,0x1e,0x0b,0xa8, +0x5e,0x15,0x51,0xfe,0x0a,0xa9,0xde,0x16,0x53,0x3f,0x5e,0x42,0xf1,0x16,0x51,0x7e, +0x77,0x2a,0xbf,0x5f,0x28,0xbf,0xbb,0x94,0xdf,0x85,0x2a,0xe7,0x12,0xca,0x6f,0x29, +0x9d,0xf7,0x54,0xd5,0xab,0xdd,0xca,0xef,0x2b,0x3a,0x5f,0x69,0xe5,0x33,0xa4,0x7c, +0x46,0x2b,0x9f,0x0b,0x74,0xfe,0x73,0xd5,0x8f,0x9f,0xae,0xfa,0x73,0xba,0xea,0x4f, +0x69,0x5d,0x97,0xb2,0xca,0xe7,0xb7,0xca,0xe7,0x59,0xaa,0xcf,0xe5,0xd5,0x8f,0x97, +0xd5,0xf9,0xcb,0x2b,0xdf,0x9f,0x2b,0xdf,0xb1,0x0a,0x7f,0x8e,0xf6,0xc7,0xaa,0x3e, +0x54,0x52,0xba,0xca,0x2a,0x1d,0xe7,0x78,0xe9,0x50,0x3f,0x5e,0x55,0xe5,0x70,0x9f, +0xca,0xe1,0x4b,0x95,0xc3,0x1e,0x95,0xc3,0x57,0x2a,0x87,0x73,0x95,0x8e,0xaa,0x2a, +0x87,0x38,0xe5,0x7f,0xaf,0xf2,0xff,0xa6,0xce,0xb3,0x56,0xf9,0x8f,0x51,0xfe,0x0b, +0xe8,0xbc,0xab,0x75,0x7d,0xab,0xab,0x1f,0x8f,0x53,0x7b,0x48,0x55,0x3e,0xf6,0xa9, +0x5f,0x4a,0x54,0x3c,0x5f,0xe8,0xba,0x25,0x2b,0xbd,0x35,0xd4,0xdf,0xa4,0xaa,0x7c, +0x6a,0xe9,0xb8,0x7a,0x0a,0x57,0x43,0xe1,0xea,0xa8,0x5c,0xeb,0x2a,0x5f,0xb5,0x15, +0xbe,0xbe,0xca,0xb7,0x81,0xea,0x55,0x43,0xe5,0xf7,0xa0,0xce,0xdb,0x48,0xed,0x6a, +0xbf,0xea,0x4f,0x96,0xd2,0xd1,0x54,0xf1,0x37,0x51,0xfc,0x8d,0x15,0x7f,0x0b,0xc5, +0xdf,0xcc,0x6b,0xa7,0x2a,0xb7,0x03,0x2a,0xb7,0x6f,0x54,0x6e,0xdf,0xaa,0xbd,0xb4, +0x54,0xb9,0xb5,0xd2,0xf5,0xa9,0xae,0xf6,0xf2,0x9d,0xca,0xef,0x1d,0xf5,0xe7,0x6d, +0x94,0xaf,0x75,0x2a,0xc7,0x42,0x2a,0xc7,0x22,0xea,0x8f,0xa6,0x28,0x3d,0x6b,0x54, +0x9e,0xbb,0x95,0xfe,0x76,0xca,0x5f,0x07,0xe5,0xb7,0x9d,0xce,0xd3,0x51,0xf9,0xe8, +0xa8,0xf8,0x8a,0x29,0xbe,0x12,0xba,0x2e,0x9d,0x94,0xaf,0x0e,0x2a,0xdf,0xce,0x3a, +0xbe,0x93,0xea,0xd3,0xa5,0x8a,0xa7,0xab,0xe2,0xe9,0xaa,0xf3,0x77,0x57,0x3f,0x7d, +0xba,0xfa,0xe9,0xce,0x0a,0xd7,0x47,0xf5,0xee,0x7e,0x85,0xef,0xa1,0xf0,0xfd,0x14, +0xbe,0xb4,0xc2,0x77,0x57,0x39,0x0e,0x54,0x39,0x0e,0xf0,0xae,0x87,0xca,0xf1,0x90, +0xca,0xf1,0x47,0x95,0x63,0x6f,0xd5,0xbf,0x3e,0x2a,0xc7,0x7e,0xaa,0x7f,0x87,0x55, +0x7e,0x9f,0xab,0xbf,0x19,0xa0,0x7e,0x7d,0xa0,0xca,0xf1,0x3d,0xe5,0xbb,0x94,0xf2, +0x7d,0xaa,0xca,0x71,0xa6,0xd2,0xf5,0x99,0xfa,0xf5,0xc1,0x2a,0xcf,0xc1,0x4a,0xd7, +0x30,0xb5,0xcb,0xab,0xd4,0xaf,0x5f,0xa7,0x7a,0x73,0x83,0xd2,0x39,0x4a,0xe5,0x34, +0x46,0xf5,0xf8,0x2a,0xe5,0xff,0x66,0xe5,0x7f,0xac,0xd2,0xf3,0x80,0x8e,0xbb,0x45, +0xd7,0xe7,0x36,0xed,0xbf,0x43,0xf1,0x1c,0x50,0x3c,0x3f,0x29,0xbf,0xc3,0x54,0x0f, +0x0f,0xaa,0xdf,0x49,0x56,0xff,0x3e,0x5e,0xc7,0xfd,0xa2,0xfc,0x7e,0xaf,0xf8,0x27, +0x29,0xfe,0x6f,0x15,0xcf,0x35,0xba,0x6e,0x77,0xe9,0x7c,0x23,0x54,0x0e,0xd7,0x2b, +0xbf,0xf7,0xa8,0xbc,0x27,0xea,0xfc,0x7b,0xca,0xba,0xc7,0x8d,0x35,0xcf,0x38,0xe6, +0xb9,0xbd,0xac,0xeb,0xff,0xb4,0xe2,0x7b,0x52,0xf9,0x7f,0xb6,0x8c,0x7b,0xde,0xa9, +0x4a,0xd7,0x27,0xaa,0x77,0x87,0xa4,0x87,0x75,0x7d,0xb6,0xca,0x9d,0x4f,0xf1,0x2f, +0x51,0x3c,0x8b,0x14,0xcf,0xeb,0x8a,0x67,0x99,0xfc,0xe3,0xbd,0xe7,0x21,0xb9,0xd7, +0x2a,0xdc,0x07,0x0a,0xf7,0x9e,0xfc,0xcf,0xd3,0x79,0xab,0xa9,0xdd,0x9c,0x2f,0x77, +0x95,0xa0,0xbb,0xff,0xe7,0x80,0x1b,0xcf,0x26,0x9d,0x7f,0x83,0xd2,0xf3,0xbe,0xf2, +0xff,0xa1,0xf6,0x3f,0xa3,0xf8,0x9e,0xd2,0x79,0xa6,0xeb,0x3c,0xd3,0x14,0xdf,0x66, +0x1d,0xff,0xa3,0xf4,0x27,0xc5,0xb3,0x4d,0xee,0x18,0xa5,0x77,0xa9,0xe2,0x59,0xac, +0x78,0xde,0x50,0x3c,0xaf,0xc9,0xbf,0xba,0xc2,0xad,0x97,0xfb,0x5d,0x85,0xdb,0xa0, +0x70,0xef,0xcb,0xbf,0xa5,0xce,0x1b,0xa7,0x7c,0xb5,0x92,0xbb,0xaa,0xf2,0xf5,0x8b, +0xd2,0x9d,0xa3,0xf3,0x6f,0x54,0x7a,0x3e,0x50,0xbe,0x3e,0xd2,0xfe,0x99,0x8a,0xef, +0x05,0x9d,0xe7,0x45,0x9d,0x67,0xb6,0xd2,0x31,0x4b,0xfb,0x67,0x68,0xff,0x5c,0xed, +0x9f,0xa3,0xfd,0x25,0xb5,0xff,0x14,0xb9,0x4b,0xc9,0x7d,0xaa,0xdc,0xad,0xe5,0xbe, +0x40,0xee,0x36,0x72,0xb7,0x55,0x3d,0xbb,0x5c,0xda,0x43,0xda,0x53,0xda,0x4b,0xe1, +0x86,0x7b,0xcf,0x21,0xaa,0xc7,0xd7,0x48,0xaf,0x55,0xb8,0x87,0x14,0x6f,0x8e,0xc2, +0x7d,0xa4,0x74,0x6e,0x51,0x3a,0x3f,0x51,0x3d,0xdf,0xaa,0x70,0x1f,0x2b,0xdc,0x26, +0x85,0xfb,0x54,0xe1,0x36,0x2b,0xdc,0x36,0x85,0xdb,0xa5,0x70,0x3b,0x15,0xee,0x2b, +0x85,0xfb,0x52,0xe1,0xf6,0x29,0xdc,0x6e,0x85,0xfb,0x42,0xe1,0xf6,0x2a,0xdc,0x1e, +0x85,0xdb,0xaf,0xfe,0xec,0x2b,0x95,0xff,0x97,0xd2,0x3d,0xd2,0x2d,0xd2,0x4f,0xd5, +0x3f,0x9d,0xa9,0xfb,0xf5,0x59,0xba,0x9e,0x09,0x41,0x57,0x13,0x83,0x6e,0x3c,0x7b, +0x75,0xdd,0x5e,0x56,0xfb,0xbb,0x29,0xc2,0xdd,0xbf,0xa0,0xac,0x7b,0xdc,0x7c,0xb4, +0x84,0x69,0x47,0x68,0x49,0x53,0xef,0xd0,0x2c,0xf3,0xbb,0x52,0xed,0x73,0xa5,0x8e, +0x1b,0x17,0xe1,0x86,0x3b,0x4d,0xe1,0x4e,0xd7,0xfe,0x55,0xda,0x7f,0x8b,0xf6,0x57, +0xd6,0xfe,0x73,0x15,0xcf,0x5b,0x0a,0xf7,0x91,0xc2,0xdd,0xaa,0xf3,0x7f,0xa8,0xf3, +0x6f,0x2c,0xeb,0x5e,0x9f,0x67,0x75,0x7c,0x4d,0x1d,0x9f,0xae,0xe3,0x7e,0xd0,0x71, +0xb7,0x6b,0x7f,0x53,0xed,0x6f,0x26,0xfd,0x52,0xe1,0x76,0x29,0xdc,0x9d,0x8a,0xff, +0x0b,0xc5,0xbf,0x53,0xf1,0x4f,0x8f,0x70,0xc3,0x77,0x54,0xf8,0x43,0x0a,0x3f,0x5e, +0xf1,0x5e,0xa1,0xf8,0x7a,0x2b,0xdd,0x87,0xa5,0x2f,0x4a,0x5f,0xd7,0x71,0xd9,0x3a, +0xee,0x39,0x9d,0x67,0x96,0xce,0x33,0x53,0xe5,0xe8,0x28,0x9e,0x40,0x59,0xb7,0x9f, +0x7b,0x49,0xc7,0xcf,0xd1,0xf1,0x83,0x74,0xfc,0xf3,0x3a,0x6f,0x51,0x85,0x2f,0xa6, +0xfd,0x43,0xb4,0xff,0x05,0xed,0x2f,0xa7,0xfd,0xe5,0x15,0xdf,0x72,0xc5,0xf7,0x9a, +0xc2,0x0f,0x55,0xf8,0x19,0x4a,0xcf,0xbb,0x4a,0xcf,0x5a,0xe5,0x7b,0x95,0xe2,0x49, +0x50,0x3c,0x89,0x8a,0xe7,0x03,0x1d,0x3f,0x5c,0xc7,0xbf,0xa5,0x70,0x19,0x0a,0xd7, +0x40,0xf9,0xd9,0x2e,0xf7,0x67,0x0a,0x7f,0x8d,0xc2,0xaf,0xd1,0xf9,0x3e,0xd5,0xf9, +0xb6,0xe8,0x7c,0xab,0x15,0x4f,0x6b,0x1d,0xd7,0x46,0xe7,0xdb,0xa1,0xe3,0x47,0xe8, +0xf8,0xb7,0x15,0xae,0x8b,0xc2,0x75,0x55,0xb8,0xef,0x94,0xbf,0x03,0x0a,0xbf,0x4e, +0xe1,0x27,0xe8,0xbe,0xb1,0x41,0xfe,0x5b,0xe5,0x3f,0x53,0xfe,0x9f,0xeb,0xb8,0x6f, +0xe4,0xbf,0x3e,0xc2,0x4d,0xcf,0x7b,0xd2,0xe8,0x48,0x95,0x4b,0xa4,0xeb,0x5e,0x17, +0xe9,0x86,0x8b,0x88,0x74,0xe3,0x73,0xb4,0xff,0x03,0xed,0x0f,0xc8,0xbd,0x54,0xee, +0x1c,0xe9,0x27,0x0a,0x5f,0x28,0x52,0xf7,0x21,0x85,0x3b,0x5d,0xfb,0xb7,0x2b,0xde, +0x82,0x72,0xef,0x50,0xb8,0xaf,0x14,0xae,0xb0,0xfc,0xf7,0x45,0xba,0xcf,0x0f,0x5f, +0xcb,0xfd,0x8d,0xf4,0x07,0xe9,0x97,0x0a,0xff,0xae,0xdc,0xeb,0x15,0x6f,0x5b,0x9d, +0xbf,0xb5,0xf6,0x6f,0xd0,0xfe,0x36,0x72,0x2f,0x93,0xfb,0x63,0xe9,0x66,0x85,0xbf, +0x54,0xe9,0xd8,0xa6,0x70,0xe9,0xda,0xff,0x99,0xe2,0xbd,0x44,0xee,0xcf,0x15,0x6e, +0xaf,0xc2,0x5d,0x26,0xff,0xfd,0x4a,0xef,0x01,0xb9,0xbf,0x95,0x1e,0x94,0xee,0x91, +0x76,0x88,0x74,0x9f,0x83,0x86,0x4a,0x87,0xc9,0xff,0x23,0xe9,0x26,0xe9,0x2e,0xe9, +0x6e,0xb4,0x6d,0x94,0xe3,0x54,0x80,0x0b,0x21,0x16,0xda,0xc1,0x39,0x72,0x9f,0x2d, +0xad,0x28,0x5d,0x26,0x5d,0x2f,0x5d,0x02,0x75,0x62,0xe8,0x6f,0x62,0x5c,0x4d,0x94, +0xa6,0xc0,0x22,0x58,0x0d,0x1b,0xe0,0x2d,0xa8,0x57,0x80,0xe7,0x69,0x68,0x0f,0x4d, +0xa1,0x03,0x9c,0x07,0x1b,0xe0,0x5e,0x58,0x04,0xab,0xe4,0x7e,0x4b,0xee,0xd5,0x26, +0x7c,0x41,0xc2,0xc3,0xfb,0xb0,0x04,0x96,0xc1,0x2a,0xb9,0x57,0xc0,0x07,0xb0,0x52, +0xee,0xd5,0x50,0xaf,0x90,0xe3,0x34,0x87,0x0e,0x70,0x5e,0x21,0xd7,0xdd,0x02,0x56, +0xc1,0x47,0xf0,0x0e,0xe4,0xc0,0x66,0xf8,0x44,0xfe,0x1f,0x43,0x7c,0x51,0xf2,0x09, +0xa9,0xa5,0x29,0xfb,0xd2,0xae,0xe6,0x93,0xe6,0x97,0x16,0x94,0x16,0x96,0x16,0x97, +0xd6,0x96,0xd6,0x95,0x66,0x48,0x1b,0x48,0x1b,0x96,0x76,0xaf,0x6b,0x4d,0xdd,0x27, +0xd2,0xa5,0x97,0x48,0x2f,0xd5,0xfd,0xf1,0x0a,0x69,0x6f,0x3d,0x6f,0x3e,0xa7,0xfb, +0xcb,0x4b,0x72,0x3f,0x2f,0xf7,0x3c,0xb9,0x97,0x4b,0x57,0x48,0x37,0x4a,0x3f,0xd4, +0xfd,0x2e,0xa8,0xf6,0x18,0xa9,0xf6,0x1d,0xa5,0x76,0x3a,0x52,0xed,0x38,0x42,0xfb, +0x43,0xda,0x1f,0xad,0xfd,0xa3,0xa4,0xa3,0xa5,0x63,0xa4,0x37,0x4a,0xc7,0x4a,0x6f, +0x92,0xde,0xac,0xf8,0xf2,0x2b,0xbe,0x82,0x8a,0xaf,0xb0,0xf6,0x8f,0xd3,0xfe,0x02, +0xda,0x5f,0x48,0xfb,0x8b,0x68,0xff,0x2d,0xd2,0x5b,0xa5,0xb7,0x49,0x6f,0x97,0xde, +0x21,0xbd,0x53,0x3a,0x5e,0xf1,0x15,0x57,0x7c,0x25,0xe5,0x2e,0x21,0x77,0x29,0xb9, +0xcf,0x90,0xfb,0x4c,0xb9,0x4b,0xcb,0x7d,0x96,0xdc,0x15,0xe4,0x3e,0x5b,0xe9,0xa9, +0xa8,0xf8,0x27,0x68,0x7f,0xac,0xf6,0x9f,0xa3,0xfd,0x95,0xb4,0xff,0x2e,0xe9,0xdd, +0xd2,0x7b,0xa4,0xf7,0x4a,0x27,0x4a,0xef,0x93,0xde,0xaf,0xf8,0xaa,0x28,0xbe,0x6a, +0x8a,0x2f,0x5e,0xfb,0x1f,0xd0,0xfe,0xaa,0xda,0x1f,0xa7,0xfd,0xd5,0xb5,0x7f,0x92, +0xf4,0x41,0xe9,0x43,0xd2,0x87,0xa5,0x8f,0x48,0x1f,0x95,0x3e,0xa6,0xf8,0x92,0x14, +0x5f,0x8a,0xe2,0x4b,0x93,0x7f,0xb2,0xfc,0x53,0xe5,0x5f,0x43,0xfe,0xb5,0xe4,0x5f, +0x47,0xfe,0xf5,0xe4,0x5f,0x5b,0xfe,0x75,0xe5,0x5f,0x5f,0xfe,0x99,0xf2,0x6f,0x24, +0x77,0x43,0xb9,0xb3,0xe4,0x6e,0x2e,0xf7,0x79,0x72,0xb7,0x90,0xbb,0xa5,0xdc,0x17, +0xc8,0x7d,0xa1,0xe2,0x6d,0x2f,0xff,0xb6,0xf2,0x6f,0x27,0xff,0x0e,0xf2,0xef,0x24, +0xff,0x4b,0xe5,0xdf,0x59,0xfe,0xdd,0xe4,0x7f,0xb9,0xfc,0x7b,0xaa,0x1c,0x26,0x6b, +0x7f,0x77,0xed,0xef,0xa1,0xfd,0xbd,0xb4,0x7f,0x8a,0xf4,0x71,0xe9,0x13,0xd2,0x27, +0xa5,0x4f,0x49,0x9f,0x96,0x3e,0xa3,0xf8,0xae,0x54,0x7c,0x7d,0x15,0x5f,0x7f,0xed, +0x9f,0xaa,0xfd,0x7d,0xb4,0xbf,0x9f,0xf6,0x0f,0xd0,0xfe,0x69,0xd2,0x67,0xa5,0xd3, +0xa5,0xcf,0x49,0x9f,0x97,0xbe,0x20,0x9d,0x21,0x9d,0x2d,0x5d,0x26,0xfd,0x5a,0x3a, +0x4f,0xe7,0x5b,0xe3,0xdd,0xd7,0x75,0xbe,0x77,0xb4,0x7f,0x85,0xf4,0x7b,0x85,0xfb, +0x58,0xe1,0x3e,0x51,0xb8,0xcd,0x65,0xdd,0x71,0x9d,0x07,0xcb,0xbb,0xfa,0x90,0xf4, +0x05,0xe9,0x1a,0xe9,0x3b,0xd2,0xb7,0xa5,0x91,0x1a,0x0f,0x8a,0x91,0x16,0x94,0x9e, +0x2d,0xad,0x28,0x6d,0x20,0x6d,0x24,0x6d,0x22,0x6d,0x26,0xed,0x27,0xed,0x26,0xcd, +0x96,0x0e,0x94,0x0e,0x91,0x5e,0x25,0x1d,0x2e,0xbd,0x5a,0x3a,0x52,0x3a,0x4a,0xba, +0x45,0xfa,0xa9,0xf4,0x46,0xe9,0x58,0xe9,0x38,0xe9,0x2d,0xd2,0xad,0xd2,0x6d,0xd2, +0xe7,0xa4,0xcf,0x4b,0x5f,0x90,0xce,0x90,0xee,0x92,0xee,0x96,0x7e,0x29,0xdd,0x83, +0x4e,0x4a,0xa0,0xfd,0x27,0xb8,0x7a,0x9e,0xf4,0x7c,0x69,0x6b,0xe9,0x05,0xd2,0x0b, +0xa5,0xed,0xa5,0x17,0x49,0x2f,0x96,0x5e,0x22,0xbd,0x4c,0xda,0x45,0xda,0x4d,0xda, +0x43,0xda,0x4b,0xda,0x5b,0x9a,0x0d,0x0f,0xc2,0x40,0xb9,0x07,0xcb,0x3d,0x44,0xee, +0xa1,0x72,0x0f,0x93,0xfb,0x6a,0xb9,0xaf,0x91,0x7b,0x84,0xdc,0xd7,0xc9,0xfd,0xa8, +0xf4,0x1b,0xe9,0x73,0xd2,0x17,0xa4,0x33,0xa5,0xb3,0xa5,0x2f,0x4a,0x5f,0x92,0xce, +0x97,0xbe,0x2c,0x7d,0x55,0xba,0x48,0xba,0x44,0xba,0x4c,0xfa,0x86,0x74,0x85,0xf4, +0x4d,0xe9,0x5a,0xa5,0xeb,0x5d,0xb9,0xd7,0xcb,0xfd,0x9e,0xdc,0x1f,0xc8,0xbd,0x41, +0xee,0x0f,0xe5,0xfe,0x48,0xee,0x1c,0xb9,0x3f,0x96,0xfb,0x7b,0xe9,0x0f,0xd2,0x83, +0xd2,0x43,0xd2,0x9f,0x4d,0x9a,0x8b,0x06,0x9c,0x07,0xc1,0xe8,0xc3,0xd2,0xe9,0x50, +0xa9,0x58,0xc0,0x89,0x2f,0xe6,0x6a,0x75,0xa8,0x57,0x22,0xe0,0xb4,0x80,0x0e,0x70, +0x1e,0xcc,0x2c,0x19,0x70,0x5e,0x85,0x97,0xe1,0x15,0x58,0x08,0x8b,0x60,0x46,0x29, +0xfc,0x4a,0xb9,0xfa,0x0a,0x24,0x9c,0x1e,0x70,0x6a,0x02,0xa7,0x72,0xd2,0xa1,0x01, +0x5c,0x0c,0x9d,0x45,0x57,0xb8,0x06,0x9e,0x15,0x73,0xc5,0x3c,0xf1,0xb2,0x30,0x63, +0xb1,0x66,0xbc,0x68,0xa3,0xe3,0xbe,0x67,0xfc,0xc1,0xf8,0xf3,0xbb,0xf3,0x15,0xf1, +0x2a,0x2c,0x86,0x25,0xf0,0x1a,0xbc,0x0e,0xf7,0xf0,0xfb,0xf4,0x5e,0x98,0x08,0xf7, +0xc1,0x0c,0x98,0x09,0x4b,0x61,0x39,0xbc,0x0b,0x5b,0x60,0x3b,0x7c,0x29,0xbe,0x12, +0xa6,0x1f,0x19,0x60,0xda,0xaa,0x79,0x8f,0x66,0xda,0xa8,0x18,0x6a,0x9e,0x37,0xcd, +0x6f,0x14,0x71,0xad,0x79,0x9f,0x66,0xde,0xa5,0x89,0x9b,0xc4,0xcd,0x62,0x9c,0x7e, +0x8f,0xde,0x2e,0xcc,0x6f,0xc7,0x29,0xa6,0x0f,0x36,0xcf,0xb7,0xa6,0xcf,0x32,0xed, +0x9a,0xe7,0xd3,0x31,0x70,0x33,0xdc,0x0a,0xd5,0x43,0x3c,0x63,0x42,0x7b,0xe8,0x28, +0xba,0xc0,0x38,0xb8,0x0b,0x16,0xc2,0x62,0xb1,0x14,0x96,0xc1,0xeb,0xf0,0x06,0xac, +0x10,0x6b,0x61,0x17,0xec,0x85,0xaf,0xa1,0x28,0xcf,0xb0,0x67,0x40,0x39,0xa8,0x0f, +0x19,0xa2,0x01,0x34,0x87,0x16,0xd0,0x19,0xba,0x40,0x6f,0xe8,0x0f,0x03,0x20,0x5b, +0x0c,0xd4,0xf3,0xf0,0xfb,0xe2,0x03,0xc8,0x81,0xcd,0xb0,0x1d,0x3e,0x83,0x1d,0xf0, +0x39,0xec,0x84,0x5d,0xb0,0x07,0xbe,0x82,0xbd,0xb0,0x0f,0x0e,0xc2,0x21,0x38,0x0c, +0xbf,0x88,0xa2,0xd1,0x2e,0xc5,0x44,0x71,0xa8,0x0e,0x09,0xd0,0x1c,0x5a,0xc2,0x53, +0xf0,0x34,0xcc,0x84,0x59,0x62,0x09,0xbc,0x09,0xab,0x60,0x17,0xec,0x86,0x03,0xf0, +0x0d,0x7c,0x0b,0x87,0xc4,0x4f,0xc2,0xc9,0xc7,0xf3,0x12,0x9c,0x02,0xa7,0xc3,0x19, +0xa2,0x34,0xc4,0xc2,0xd9,0xe2,0x1c,0xa8,0x04,0x95,0xc5,0xb9,0x10,0x07,0x19,0x70, +0x11,0x74,0x84,0x4e,0xd0,0x05,0xae,0x84,0x6c,0xb8,0x19,0x6e,0x81,0xf1,0x70,0x3f, +0x3c,0x06,0x93,0x61,0x25,0xbc,0x29,0x56,0xc1,0xa7,0xb0,0x0d,0x82,0xfc,0x4e,0x88, +0x10,0x91,0x90,0x0e,0xb5,0x44,0x6d,0x51,0x47,0xd4,0x15,0xf5,0x20,0x03,0x1a,0x40, +0x53,0x68,0x06,0xe7,0x41,0x4b,0x71,0x3e,0xb4,0x82,0xd6,0xa2,0x0d,0x74,0x80,0x8b, +0xa0,0x2b,0x74,0x83,0xee,0xd0,0x13,0x06,0xc0,0x40,0x31,0x08,0x46,0xc2,0x28,0x31, +0x1a,0xc6,0xc0,0x58,0xb8,0x1d,0xc6,0xc3,0x04,0xb8,0x07,0xa6,0xc2,0xb3,0x30,0x13, +0x66,0x8b,0x97,0x60,0x01,0xbc,0x2a,0x16,0x0a,0xf3,0xbb,0x68,0x09,0x2c,0x85,0xd7, +0x61,0x05,0xac,0xd4,0x6f,0x25,0xf3,0x3b,0x69,0x8d,0x78,0x5b,0x6c,0x10,0x39,0xf0, +0x31,0x6c,0x86,0x4f,0x61,0x2b,0x6c,0x83,0x1d,0xb0,0x17,0xf6,0xc1,0x7e,0x38,0x2c, +0x7e,0x16,0x81,0xfc,0x94,0x2b,0x44,0x88,0x10,0xe4,0x87,0x22,0x50,0x14,0x4a,0x40, +0x65,0xa8,0x02,0x09,0x90,0x04,0xc9,0x90,0x0a,0x69,0x50,0x13,0xd2,0xa1,0x8e,0xa8, +0x07,0x19,0xd0,0x00,0x32,0xa1,0x09,0x34,0x85,0x16,0xd0,0x12,0xda,0x88,0x8e,0x70, +0x09,0x5c,0x26,0x7a,0xc2,0x00,0xc8,0x86,0x81,0x30,0x08,0x86,0xc0,0x55,0x62,0x14, +0x8c,0x86,0x31,0x62,0x2c,0xdc,0x01,0xe3,0xe1,0x2e,0xb8,0x07,0xa6,0xc2,0xb3,0x30, +0x13,0x66,0xc3,0x1c,0x98,0x0b,0x0b,0xe0,0x55,0xb1,0x50,0x2c,0x82,0x25,0xb0,0x14, +0xde,0x80,0x15,0xb0,0x12,0xde,0x14,0xab,0xe1,0x2d,0x58,0x23,0xd6,0x8a,0x2d,0xf0, +0x29,0x6c,0x85,0x6d,0xb0,0x03,0xf6,0xc2,0x41,0x71,0x08,0x7e,0x81,0x40,0x01,0x97, +0x20,0x44,0x40,0x08,0x0a,0x42,0x11,0x28,0x0a,0x25,0xa0,0x32,0x54,0x81,0x04,0x48, +0x82,0x64,0x48,0x85,0x74,0xa8,0x23,0xea,0x8a,0x7a,0xa2,0xbe,0xc8,0x10,0x0d,0xa0, +0x11,0x34,0xd1,0xef,0xe6,0x16,0xfa,0xdd,0xdc,0x52,0xb4,0xd3,0x6f,0xea,0x0e,0xe2, +0x12,0xb8,0x14,0x3a,0x43,0x57,0xe8,0x06,0xdd,0xa1,0x27,0x0c,0x80,0x81,0x62,0xb4, +0x18,0x23,0xc6,0xc2,0xad,0x70,0x27,0x4c,0x80,0xbb,0x61,0x22,0x4c,0x82,0x07,0xe1, +0x61,0xf1,0x28,0x3c,0x06,0x4f,0xc0,0x93,0x30,0x15,0x9e,0x85,0x17,0x60,0x81,0x7e, +0xb7,0x2f,0x86,0x25,0x62,0x29,0x2c,0x83,0xe5,0xb0,0x52,0xbf,0xf1,0xcd,0xef,0xfb, +0x35,0x62,0xad,0xd8,0x20,0x76,0xc0,0xde,0x02,0x66,0x40,0xd9,0x25,0x00,0x11,0x10, +0x29,0x42,0x50,0x10,0x0a,0x43,0x51,0x28,0x0e,0x95,0xa1,0x0a,0xa4,0x43,0x1d,0x51, +0x57,0xd4,0x83,0x0c,0x68,0x00,0x8d,0xa0,0xb1,0xde,0x27,0x34,0x87,0x96,0xd0,0xae, +0xa0,0xfb,0x8e,0xe1,0x22,0xb8,0x18,0x2e,0x81,0x4b,0xa1,0x0b,0x74,0x85,0x6e,0xd0, +0x1d,0x7a,0xc2,0x00,0x18,0x29,0x46,0x89,0xd1,0x30,0x06,0xc6,0xc2,0xed,0x70,0x27, +0x4c,0x80,0xbb,0x61,0x2a,0x3c,0x0b,0x73,0x60,0x2e,0x2c,0x80,0x57,0xc5,0x42,0xb1, +0x48,0x2c,0x16,0xe6,0x1d,0xc7,0xeb,0xb0,0x5c,0xac,0xd0,0xfb,0x8d,0x55,0x7a,0xbf, +0xf1,0x16,0xac,0xd1,0xfb,0x0e,0xf3,0xee,0x23,0x07,0x3e,0x81,0x2d,0xf0,0x29,0x6c, +0x85,0x6d,0xb0,0x03,0xf6,0xc2,0x7e,0xf8,0x1a,0x0e,0x08,0xa7,0x10,0x65,0x0a,0x41, +0x88,0x80,0x48,0x28,0x08,0x85,0xa1,0x28,0x14,0x87,0x5a,0x50,0x1b,0xea,0x40,0x5d, +0x61,0xde,0xa3,0x64,0x40,0x03,0x68,0x04,0x8d,0xa1,0xa9,0xde,0xb5,0x98,0xf7,0x2c, +0x2d,0xc5,0xf9,0xe2,0x42,0x68,0xaf,0xf7,0x30,0x86,0xce,0xd0,0x15,0xba,0x41,0x77, +0xe8,0x09,0x03,0xe0,0x1a,0xb8,0x01,0x46,0x89,0xd1,0x30,0x06,0xc6,0xc2,0x7d,0xf0, +0x20,0xcc,0x82,0x39,0xf0,0x0a,0x2c,0x14,0x4b,0x60,0xb9,0xde,0xdf,0xac,0xd2,0x7b, +0x9d,0x77,0x61,0x1d,0xbc,0x07,0x1f,0x88,0x8d,0x7a,0xd7,0xb3,0x03,0xf6,0xc2,0xd7, +0x70,0xc0,0x94,0x41,0x61,0xda,0x25,0x24,0x8a,0x24,0x48,0x86,0x14,0xa8,0x05,0x19, +0x90,0x05,0x8d,0x45,0x13,0x38,0x1f,0x5a,0x43,0x47,0x18,0x05,0xa3,0xe1,0x46,0x71, +0x13,0xdc,0x0a,0xb7,0xc3,0x13,0xf0,0x94,0x78,0x06,0x66,0xc2,0x2c,0x31,0x1b,0xe6, +0xc0,0x8b,0xf0,0x2a,0x2c,0x14,0x4b,0xe0,0x75,0x58,0x2e,0x56,0xc2,0xdb,0xb0,0x16, +0x3e,0x84,0x1c,0xd8,0x0c,0x4e,0x11,0x97,0xd3,0xe0,0x74,0x28,0x07,0xe7,0x42,0xaa, +0xa8,0x21,0xd2,0x45,0x3d,0xa8,0x0f,0x19,0xd0,0x04,0x9a,0x41,0x5f,0x18,0x08,0xd7, +0xc3,0x0d,0x62,0x24,0xdc,0x08,0x37,0xc1,0xcd,0x30,0x0e,0x6e,0x87,0x3b,0xe0,0x7e, +0x98,0x04,0xaf,0xc2,0x72,0xe1,0x14,0xa5,0xcd,0x41,0x55,0xa8,0x06,0x71,0x90,0x00, +0x89,0x22,0x09,0x6a,0x40,0x4d,0x91,0x0e,0xb5,0xa0,0x36,0xd4,0x81,0xba,0x50,0x0f, +0xea,0x8b,0x0c,0x68,0x06,0xad,0xa1,0x1d,0xb4,0x87,0x0e,0x70,0x11,0x74,0x84,0x8b, +0xe1,0x52,0xb8,0x0c,0xba,0x40,0x57,0xd1,0x0d,0x2e,0x87,0x1e,0xd0,0x13,0x7a,0x41, +0x3f,0xe8,0x0f,0xd9,0x30,0x10,0x86,0xc0,0x55,0x30,0x0a,0x46,0x8b,0x31,0x70,0x23, +0x8c,0x85,0x9b,0xe0,0x66,0xb8,0x1d,0xee,0x10,0x77,0x8a,0xf1,0x62,0x02,0x4c,0x82, +0x07,0xe1,0x61,0x78,0x44,0x4c,0x86,0x37,0x60,0x85,0x58,0x23,0xd6,0xc2,0x21,0x38, +0x2c,0x7e,0x82,0x5f,0xc0,0x29,0x46,0xbb,0x29,0x4e,0xbb,0x81,0x96,0xd0,0x1a,0xda, +0xc3,0x45,0xe2,0x62,0xb8,0x14,0xba,0xc0,0x38,0xb8,0x15,0xee,0x80,0x09,0x30,0x13, +0x66,0xc3,0x5c,0x98,0x0f,0x8b,0x60,0x89,0x58,0x06,0x6f,0xc0,0x4a,0xf8,0x00,0x36, +0x42,0xd1,0x12,0xb4,0x67,0x28,0x05,0xa7,0xc1,0xc5,0x70,0x29,0x74,0x86,0xde,0x30, +0x10,0x46,0xc2,0x78,0x98,0x0c,0xdf,0xc2,0x0f,0xf0,0x13,0x04,0x4a,0x52,0x4f,0x4e, +0xa1,0x8d,0xc2,0x0d,0x30,0x0a,0x1e,0x84,0xc9,0xb0,0x0b,0xbe,0x82,0x7d,0xb0,0x1f, +0x7e,0x00,0xe7,0x54,0xb2,0x06,0xc5,0xa1,0x24,0x94,0x12,0x65,0x21,0x11,0x92,0x20, +0x19,0x52,0x44,0x06,0xb4,0x81,0x0b,0xa0,0x2d,0x74,0x81,0xbe,0xd0,0x1f,0xb2,0x61, +0x10,0x0c,0x86,0x91,0x30,0x07,0x5e,0x84,0xb9,0xf0,0x92,0x98,0x07,0x0b,0x61,0x11, +0xbc,0x01,0xcb,0xc5,0x0a,0x58,0x09,0x6f,0xc2,0x7a,0xd8,0x20,0x72,0xc4,0xc7,0x62, +0x0b,0x7c,0x01,0x05,0x4e,0xa3,0x4b,0x84,0x22,0xa2,0x28,0x9c,0x0e,0xe5,0x20,0x13, +0x1a,0x8a,0x46,0x30,0x1c,0x46,0xc2,0x8d,0x30,0x16,0x6e,0x82,0x9b,0x61,0x2a,0x4c, +0x13,0xcf,0x8a,0x99,0xf0,0x2d,0x38,0xa7,0x3b,0x4e,0x19,0x28,0x07,0x15,0x20,0x16, +0x2a,0x42,0x25,0xa8,0x0c,0xe7,0x42,0x55,0x48,0x80,0x44,0x48,0x12,0xc9,0x50,0x13, +0xd2,0xa1,0x36,0x34,0x86,0x56,0xd0,0x1a,0xfa,0x41,0x36,0x0c,0x81,0x91,0x30,0x1d, +0x66,0xc2,0x9b,0xb0,0x16,0x3e,0x84,0x8f,0x84,0x73,0x06,0xcf,0xf6,0x70,0x2a,0x9c, +0x06,0xa7,0xc3,0x19,0x50,0x5a,0x94,0x83,0x0b,0xa1,0x9d,0x68,0x2f,0x3a,0x88,0x8b, +0xe0,0x32,0xe8,0x22,0xba,0x8a,0x6e,0xa2,0x3b,0x5c,0x0e,0x3d,0xa0,0x2f,0xf4,0x83, +0x41,0x30,0x18,0x46,0xc0,0x0d,0x62,0x24,0xdc,0x02,0x13,0x60,0x12,0x3c,0x23,0x66, +0xc2,0x42,0x58,0x0c,0x1f,0xc3,0x16,0xd8,0x0d,0x4e,0x69,0xee,0x4f,0xe6,0xbd,0xb9, +0x08,0x41,0x32,0xa4,0x88,0x54,0x91,0x06,0xb5,0xf4,0x0e,0xde,0x50,0x47,0xd4,0xd5, +0xfb,0xf7,0x4c,0x61,0xde,0xc1,0x37,0x82,0x2c,0x38,0x0f,0x5a,0x43,0x47,0xe8,0x03, +0x83,0x61,0x24,0x8c,0x82,0xd1,0x62,0x0c,0x4c,0x86,0x29,0xe2,0x71,0x78,0x0a,0x9e, +0x86,0x67,0x60,0x2a,0x4c,0x83,0x67,0xc5,0x74,0x78,0x1e,0x5e,0x80,0x19,0x30,0x13, +0x16,0xc0,0xcb,0xf0,0x19,0xec,0x10,0x9f,0x8b,0x9d,0xf0,0x05,0xec,0x82,0x2f,0x61, +0x8f,0xf8,0x4a,0xec,0x85,0xfd,0xf0,0x35,0x1c,0x00,0xe7,0x4c,0xea,0x0e,0x9c,0x0d, +0x55,0xa1,0x1a,0x24,0x43,0x0a,0xa4,0x42,0x1a,0xd4,0x80,0x0c,0x68,0x06,0x2d,0xa1, +0x15,0xb4,0x86,0x8e,0x70,0x31,0x0c,0x83,0xe1,0x70,0x1d,0x8c,0x84,0x5b,0x61,0x02, +0xbc,0x0c,0x0b,0x61,0x31,0xac,0x85,0x75,0xf0,0x1e,0x6c,0x81,0x4f,0xc5,0x56,0xd8, +0x09,0x5f,0xc0,0x97,0xb0,0x47,0x7c,0x05,0x07,0xe0,0x1b,0xf1,0x2d,0x7c,0x07,0xdf, +0x8b,0x1f,0xe0,0x20,0x1c,0x12,0xce,0x59,0xa4,0x1f,0xaa,0xc1,0x95,0xd0,0x07,0x86, +0xc1,0x70,0x71,0x35,0x3c,0x08,0x0f,0xc1,0x62,0x58,0x02,0xbf,0x9c,0xe5,0xce,0x01, +0x37,0xef,0xf5,0xcd,0x18,0xb8,0x79,0x7f,0x6f,0xc6,0x66,0xcd,0x7b,0x66,0x33,0x26, +0x6d,0xde,0x27,0x9b,0x31,0x4f,0xf3,0x9e,0xb8,0xa3,0xe8,0x24,0x2e,0x15,0xe6,0x5d, +0xf1,0x75,0x65,0xdd,0xb1,0x0f,0x33,0xae,0x6c,0xc6,0x86,0xcd,0x38,0xfb,0x22,0x61, +0xde,0xad,0x9a,0x71,0x66,0x33,0xc6,0x6b,0xc6,0xcd,0xcd,0x18,0xee,0xfa,0xb2,0xee, +0x58,0xed,0xa6,0xb2,0xee,0x18,0xab,0x19,0xef,0x36,0xef,0x5e,0xcd,0x38,0xa7,0x19, +0x2b,0x35,0xe3,0xd4,0x05,0xcb,0xd1,0x7f,0x40,0x7d,0xc8,0x80,0x0b,0xc5,0x40,0x71, +0x83,0x98,0x00,0x0f,0xc3,0x5a,0xc8,0x81,0x4f,0xc5,0x67,0xb0,0x0f,0x82,0xe5,0x5d, +0xa2,0x45,0x7e,0x28,0x01,0xa5,0xc4,0x69,0xe2,0x74,0x38,0x0b,0xce,0x16,0x15,0x45, +0x65,0x51,0x05,0xe2,0x20,0x5e,0x54,0x87,0x14,0x48,0x35,0xef,0x6e,0x21,0x5d,0xd4, +0x81,0xfa,0x90,0x05,0xcd,0xe0,0x7c,0xd1,0x05,0x46,0xc3,0x18,0xb8,0x11,0xc6,0xc2, +0x38,0x70,0xaa,0x39,0xce,0xb5,0x30,0x02,0xae,0x83,0xeb,0x61,0x3b,0xec,0x86,0xaf, +0x60,0x2f,0xec,0x87,0xaf,0xe1,0x00,0x38,0x71,0x8e,0x73,0x0e,0x54,0x12,0x71,0x22, +0x01,0x7a,0xc1,0x00,0x71,0x83,0x18,0x09,0xf7,0xc1,0x64,0x78,0x1a,0xa6,0xc2,0x0b, +0x30,0x13,0x5e,0x82,0xf9,0xb0,0x08,0x96,0xc0,0x72,0x58,0x09,0x6f,0xc3,0x5a,0xf8, +0x00,0x36,0xc2,0x27,0xb0,0x05,0x7e,0x81,0x50,0x82,0x4b,0x94,0x88,0x16,0xe5,0xe1, +0x5c,0xa8,0x02,0x71,0x10,0x0f,0xd5,0x21,0x11,0x52,0xa1,0x26,0xd4,0x82,0xda,0xa2, +0x8e,0x68,0x00,0xf7,0xe9,0xfd,0xa0,0x79,0x97,0xf8,0x10,0x3c,0x0c,0x8f,0xe8,0x3d, +0xe9,0x63,0x62,0x8a,0xde,0x23,0xfe,0x28,0x0e,0xeb,0x7d,0xe2,0x2f,0x22,0x94,0xc8, +0xf9,0x20,0x11,0xee,0x84,0xc9,0xb0,0x18,0xf6,0xc1,0x2f,0xe0,0xa4,0xe0,0x6e,0x89, +0x9e,0xcf,0x7d,0x74,0x32,0xd7,0x5e,0x9c,0x02,0xb7,0x3f,0x49,0x7e,0xe1,0x7b,0xf8, +0x01,0x7e,0x02,0xe7,0x29,0xee,0x61,0x4f,0x53,0x0f,0x45,0x51,0x28,0x0b,0xe5,0xe0, +0x5c,0xa8,0x02,0x55,0x21,0x03,0xfa,0x41,0x7f,0x31,0x40,0x0c,0x81,0xeb,0xe0,0x06, +0x31,0x12,0x1e,0x82,0x87,0xe1,0x11,0x78,0x14,0x1e,0x83,0xc9,0xf0,0x19,0xec,0x80, +0xbd,0xb0,0x0f,0xf6,0xc3,0xa9,0xcf,0x70,0x3e,0xa8,0x00,0x03,0x20,0x5b,0x0c,0x84, +0x9b,0x61,0x9c,0xb8,0x0d,0xee,0x84,0xf1,0x62,0x02,0xe4,0xc0,0x7e,0xf8,0x06,0xbe, +0x85,0xef,0xe0,0x7b,0xf1,0x03,0x1c,0x84,0x43,0xe2,0x47,0x08,0x4c,0xa5,0x8d,0x88, +0x08,0x08,0x41,0x94,0x88,0x86,0xfc,0x50,0x40,0x14,0x84,0x0a,0x10,0x0b,0x67,0xc3, +0x39,0x50,0x11,0x2a,0x89,0x6a,0x22,0x03,0x06,0xc3,0x48,0x18,0x05,0xa3,0x61,0x0e, +0xbc,0x08,0xaf,0xc1,0xeb,0xf0,0x06,0xac,0x85,0x0f,0x61,0x0b,0xec,0x87,0xaf,0xe1, +0x7b,0xf8,0x51,0xfc,0x04,0x3f,0xc3,0x2f,0xc2,0x99,0xe6,0x38,0x31,0x90,0x1f,0xce, +0x81,0x8a,0x10,0x07,0x09,0xd0,0x18,0x9a,0x40,0x1b,0xb8,0x00,0xda,0x42,0x17,0x18, +0x01,0x23,0x61,0x34,0x8c,0x11,0x37,0xc2,0x6c,0x98,0x23,0x5e,0x84,0xb9,0xf0,0x12, +0x2c,0x80,0x97,0xe1,0x15,0x78,0x15,0x16,0xc2,0x22,0x58,0x02,0xef,0x88,0xb5,0xf0, +0x21,0x6c,0x81,0xed,0xf0,0x99,0xd8,0x21,0x3e,0x87,0xbd,0xb0,0x0f,0x0e,0xc2,0x21, +0xf8,0x79,0x9a,0xfb,0xd2,0xb9,0x32,0x9c,0x0b,0xf1,0x50,0x1d,0x12,0x20,0x11,0x92, +0x20,0x19,0x52,0x20,0x15,0xd2,0x20,0x03,0x32,0xa1,0xa1,0x68,0x04,0x2d,0xe0,0x3c, +0xd1,0x52,0xb4,0x86,0x8e,0xd0,0x05,0x06,0x40,0xb6,0x18,0x08,0x43,0xe1,0x1a,0x71, +0xad,0x18,0x21,0xae,0x13,0xd7,0xc3,0x0c,0x98,0x29,0x66,0x89,0xd9,0xf0,0x22,0xcc, +0x85,0x97,0x60,0x1e,0xcc,0x87,0x05,0xb0,0x10,0x16,0xc1,0x62,0x58,0x22,0x96,0x8a, +0x65,0x62,0x13,0xe4,0xc0,0xc7,0x62,0x0b,0xec,0x82,0xdd,0xe2,0x4b,0xd8,0x03,0x5f, +0xc1,0x5e,0xf8,0x5a,0x1c,0x80,0x6f,0xe0,0x5b,0xf1,0x9d,0x08,0x4c,0xa7,0x5e,0x42, +0x0c,0x14,0x86,0x62,0x70,0x0a,0x94,0x83,0x8a,0x50,0x19,0xe2,0x21,0x01,0x2e,0x86, +0x4b,0xa0,0x33,0x74,0x81,0x2b,0xa0,0xb7,0xc8,0x86,0xc5,0xb0,0x04,0xb6,0xc2,0x36, +0xd8,0x0e,0x9f,0x89,0x1d,0xf0,0x39,0xec,0x14,0x5f,0xc0,0x2e,0xf8,0x52,0xec,0x11, +0xfb,0xe0,0x20,0x38,0xcf,0xf1,0xfb,0x74,0x03,0x65,0x07,0xcb,0x61,0x35,0xfc,0x08, +0x66,0x52,0x6e,0xbf,0x43,0x9c,0x0f,0x3e,0x34,0x13,0x73,0x7f,0x24,0xfd,0x50,0x02, +0x4e,0x85,0xb3,0x44,0x19,0x51,0x16,0x2a,0x43,0x15,0x48,0x83,0x9a,0x50,0x07,0xea, +0x89,0x0c,0x68,0x00,0x0d,0xa1,0x11,0x34,0x86,0x59,0xb0,0x1e,0xea,0xfe,0x44,0x3d, +0x80,0xf1,0x70,0x37,0xac,0x80,0x7d,0xf0,0xa3,0x99,0x20,0xfb,0x33,0xcf,0xe1,0x50, +0x0e,0xaa,0x43,0x32,0xa4,0x40,0x4b,0x68,0x05,0xd9,0x30,0x04,0x86,0xc2,0x61,0x28, +0xfa,0x0b,0xf7,0x44,0x28,0x0f,0xb5,0xa0,0xbe,0x68,0x00,0x17,0x43,0x0f,0xd1,0x13, +0x06,0x40,0xb6,0x18,0x08,0x8f,0xc0,0xa3,0xf0,0x18,0x4c,0x86,0x45,0xb0,0x0c,0x56, +0xc0,0x2a,0x78,0x07,0xd6,0xc1,0x06,0xf8,0x08,0x72,0xcc,0xc4,0x5c,0x27,0xe0,0x14, +0x80,0x42,0x50,0x11,0x2a,0x43,0x2d,0xa8,0x03,0x75,0xa1,0x3e,0xb4,0x84,0xd6,0x70, +0x29,0x8c,0x84,0x43,0x90,0x11,0x08,0x38,0x43,0xe0,0x27,0x31,0x32,0x18,0x70,0x1e, +0x86,0xc9,0xb0,0x16,0xb6,0x08,0xf3,0xb1,0x45,0x59,0x88,0x83,0x0c,0x68,0x20,0x32, +0xa1,0x19,0x34,0x17,0xad,0xe1,0x2a,0x18,0x0a,0xd7,0xc0,0x48,0x78,0x04,0x26,0xc3, +0x6b,0xb0,0x12,0xde,0x81,0x77,0xe1,0x7d,0xf3,0x01,0x47,0x64,0xc0,0x69,0x05,0xad, +0xe1,0x11,0x98,0x0c,0xd3,0x60,0x26,0xac,0x87,0x8d,0xf0,0xa3,0xf9,0xc0,0x2e,0x14, +0x70,0x2a,0x41,0x02,0x74,0x87,0x6c,0xb8,0x06,0x46,0xc0,0xad,0x70,0x3b,0xdc,0x0d, +0xf7,0xc2,0x44,0xb8,0x1f,0xa6,0xc0,0x13,0x30,0x0b,0xe6,0xc0,0x02,0x78,0x05,0x5e, +0x85,0x25,0x70,0xc0,0x7c,0xf0,0x11,0x15,0x70,0xd2,0xa2,0xc9,0x13,0xb4,0x83,0x2e, +0xd0,0x0b,0x46,0xc2,0x58,0xb8,0x19,0x66,0xc2,0x6c,0x78,0xd9,0x7c,0x00,0x92,0x2f, +0xe0,0x84,0x20,0x9f,0xc8,0x0f,0xa9,0x50,0x03,0x6a,0x42,0x1d,0x51,0x1f,0xda,0x41, +0x17,0x18,0x0a,0x23,0xe1,0x51,0xd8,0x02,0x5f,0xc3,0x37,0xf0,0xad,0xf9,0x20,0x30, +0x26,0xe0,0x94,0x82,0x72,0x90,0x0e,0x19,0xd0,0x11,0x46,0xc2,0x3c,0x58,0x04,0x8b, +0xcd,0x07,0x27,0xf9,0x5d,0x02,0x10,0x01,0x21,0x88,0x82,0x82,0x50,0x04,0x8a,0x42, +0x09,0x28,0x05,0xa7,0xc2,0xe9,0x90,0x0a,0x35,0xa1,0x16,0xd4,0x17,0x5d,0x60,0x04, +0x8c,0x84,0x87,0x61,0x09,0xac,0x80,0x37,0x61,0x3b,0x7c,0x06,0x3b,0xcc,0xb9,0x0a, +0x70,0x3c,0x64,0x40,0x3b,0xe8,0x02,0x83,0x60,0x24,0xdc,0x95,0xfb,0xe1,0x4b,0xc0, +0x69,0x0a,0x23,0x61,0x36,0x2c,0x81,0xaf,0xcd,0x07,0x8d,0x85,0x02,0x4e,0x2c,0x9c, +0x0d,0x95,0x20,0x01,0xd2,0x21,0x03,0x9a,0x41,0x73,0x68,0x09,0xe7,0x8b,0x56,0xa2, +0x35,0xf4,0x80,0xde,0xd0,0x0f,0x06,0x88,0x6c,0x18,0x0b,0x23,0x0b,0x53,0x2f,0x60, +0x3a,0x3c,0x07,0x33,0x61,0x16,0x2c,0x83,0xd7,0xe1,0x0d,0xb1,0x1c,0x56,0xc0,0x21, +0xf8,0xc5,0x7c,0x48,0x59,0x24,0xe0,0x9c,0x09,0x95,0x44,0x02,0x64,0x41,0x63,0x68, +0x0d,0xd9,0x30,0x0a,0x46,0xc3,0x58,0x98,0x09,0xaf,0xc3,0x16,0xf8,0xce,0x7c,0xc0, +0x53,0xd4,0x25,0x20,0x82,0x22,0x02,0x6a,0x40,0x4d,0x68,0x0c,0x3d,0x61,0x00,0x64, +0x8b,0x81,0x30,0x08,0x06,0xc3,0x10,0xb8,0x4a,0xdc,0x00,0xa3,0x60,0xb4,0x18,0x03, +0x33,0x60,0x26,0xcc,0x86,0x39,0xf0,0x12,0xcc,0x83,0xf9,0xb0,0x40,0x63,0xbc,0xcb, +0xc4,0x5a,0xd8,0x09,0xfb,0xe0,0xa0,0x49,0x5b,0x31,0xd2,0x03,0x11,0x50,0x51,0xe3, +0xbf,0x55,0xa1,0x9a,0x88,0x83,0x14,0x48,0x83,0xfa,0xd0,0x48,0x64,0x41,0x63,0x68, +0x22,0x5a,0xc3,0x20,0x18,0x2c,0x86,0x8a,0x91,0x30,0x0a,0x46,0x8b,0x31,0x30,0x1b, +0xe6,0xc0,0x5c,0x78,0x09,0x16,0xc1,0x62,0x58,0x02,0x4b,0xe1,0x75,0x78,0x13,0xde, +0x82,0xb7,0xc5,0x3b,0x62,0x2d,0x7c,0x08,0x1f,0x89,0x1c,0x61,0x3e,0x56,0x2d,0x06, +0x25,0xa0,0x2a,0x54,0x83,0x78,0xa8,0x0e,0x89,0x90,0x04,0xc9,0x90,0x22,0x52,0x45, +0x1a,0xd4,0x80,0x7a,0xa2,0x3e,0x64,0x40,0x03,0x31,0x12,0x6e,0x82,0x71,0xe2,0x56, +0xb8,0x03,0xc6,0xc3,0x23,0xf0,0x18,0x4c,0x85,0x99,0xf0,0x09,0x6c,0x16,0x5b,0x60, +0x2b,0x6c,0x83,0x5d,0xb0,0x0f,0x0e,0x9a,0x0f,0x6a,0x4b,0x50,0x0f,0x20,0x08,0x11, +0x10,0x82,0x82,0x50,0x04,0x8a,0x42,0x09,0xa8,0x0c,0x55,0x20,0x01,0x92,0x20,0x19, +0x52,0x21,0x1d,0x6a,0x43,0x1d,0xa8,0x2b,0xcc,0x38,0x7d,0x7d,0xc8,0x10,0x0d,0xa0, +0x11,0x34,0x81,0xa6,0x1a,0xc3,0x6f,0x09,0xad,0x45,0x07,0x71,0x29,0x74,0x85,0x6e, +0xd0,0x1d,0x7a,0x42,0x5f,0xc8,0x86,0x21,0x30,0x12,0x6e,0x81,0xdb,0xc4,0x9d,0x62, +0x02,0xcc,0x85,0x79,0x62,0x3e,0xbc,0x0c,0xaf,0xc0,0x12,0x58,0x26,0xde,0x10,0x2b, +0x60,0x15,0xbc,0x05,0x6b,0xe0,0x6d,0xf1,0x8e,0x58,0x2b,0xde,0x15,0xeb,0xc4,0x7a, +0xf1,0x29,0x6c,0x35,0x1f,0xb0,0x95,0xe4,0xba,0x41,0x2a,0xd4,0x80,0x9a,0x50,0x1f, +0x32,0xa0,0x01,0x64,0x42,0x23,0xc8,0x12,0x8d,0x45,0x13,0x68,0x0e,0xad,0xa1,0x23, +0x5c,0x26,0x3a,0x43,0x57,0x18,0x69,0xe6,0x30,0x94,0x74,0xe7,0x37,0xcc,0x86,0x39, +0x30,0x1f,0x16,0x88,0x97,0xad,0x39,0x0f,0x66,0xbe,0xc3,0x62,0x58,0x02,0x4b,0xc5, +0x32,0x78,0x0d,0x5e,0x87,0x37,0x60,0x85,0x58,0x0b,0x1f,0x9a,0xf8,0x4b,0x05,0x9c, +0x17,0x34,0x3f,0x62,0x16,0xcc,0x86,0xb9,0x30,0x5f,0xf3,0x25,0x5e,0x85,0x85,0xb0, +0x48,0x2c,0x86,0x25,0xb0,0x11,0x36,0x41,0x0e,0x7c,0x6c,0x3e,0xdc,0x3b,0x85,0xba, +0x0c,0x09,0x90,0x04,0xc9,0x50,0x0b,0x6a,0x43,0x1d,0xa8,0x2b,0xea,0x89,0xfa,0x90, +0x01,0x8d,0x44,0x6b,0xe8,0x08,0x23,0xe1,0x59,0x98,0x2e,0x9e,0x13,0xcf,0x8b,0x17, +0x60,0x06,0xcc,0x84,0xb9,0xf0,0x92,0x98,0x27,0xe6,0x8b,0x25,0xf0,0x26,0xac,0x85, +0x6d,0xe6,0xc3,0xf0,0x53,0x03,0xce,0x19,0x70,0x96,0x28,0x23,0xca,0x8a,0x72,0x50, +0x1e,0x2a,0xc0,0x39,0x50,0x51,0x54,0x82,0xaa,0x90,0x00,0xe9,0x90,0x01,0x8d,0xcd, +0x07,0x8a,0xa7,0xe1,0x0f,0xd5,0x20,0x1e,0xaa,0x43,0x0d,0xa8,0x29,0xd2,0xa1,0x16, +0x4c,0x86,0xcd,0xb0,0x05,0xbe,0x80,0x5f,0x20,0xea,0xf4,0x80,0x13,0x23,0x0a,0x42, +0x09,0x28,0x05,0xa7,0xc0,0x69,0x50,0xfd,0x74,0x77,0x9e,0x4a,0x2a,0xd4,0xd0,0x7c, +0x95,0xda,0x50,0x07,0xea,0x8a,0x7a,0xa2,0xbe,0xc8,0x10,0x0d,0x44,0xa6,0x68,0x28, +0x5a,0x43,0x47,0x98,0x0c,0xcf,0xc0,0xb3,0xb0,0x16,0xde,0x85,0xf5,0xf0,0x1e,0x6c, +0x80,0x8f,0x60,0x13,0xe4,0xc0,0x66,0xd8,0x22,0x3e,0x15,0xdb,0xc4,0x76,0x91,0xfb, +0x71,0x3d,0x04,0x20,0x3f,0x14,0x80,0x24,0x48,0x86,0x9a,0x90,0x2e,0x6a,0x89,0xda, +0x50,0x0f,0x9a,0x88,0xd6,0xa2,0x0d,0xb4,0x87,0x0e,0x70,0x11,0x74,0x84,0x4e,0x70, +0x09,0xdc,0x02,0xb7,0xc2,0x7d,0x70,0xbf,0x78,0x00,0x26,0xc1,0x23,0x62,0x26,0xfc, +0x00,0x5d,0x4a,0xbb,0x74,0x15,0xdd,0xe0,0x72,0xe8,0x21,0x7a,0x8a,0x5e,0x62,0x09, +0x6c,0x81,0x7d,0x70,0xd0,0x7c,0x60,0x7a,0x26,0xcf,0x3d,0x90,0x1f,0xe2,0xa1,0xba, +0x48,0x80,0x34,0xa8,0x09,0x75,0xa1,0x9e,0xa8,0x2f,0x32,0x44,0x6b,0xe8,0x08,0x83, +0x60,0x3c,0xdc,0x0d,0xcf,0xc0,0x34,0xf1,0x2c,0xcc,0x84,0x59,0x62,0x36,0xcc,0x81, +0x17,0xc5,0x5c,0x78,0xc9,0x2c,0x30,0x70,0x16,0xf5,0x04,0xf2,0x41,0x0c,0x14,0x80, +0x04,0x48,0x84,0x34,0xa8,0x25,0xea,0x40,0x5d,0xa8,0x0f,0x59,0xd0,0x58,0x34,0x11, +0xad,0xa1,0x23,0x74,0x81,0x1e,0xd0,0x0b,0xae,0x80,0x2b,0xe1,0x16,0xb8,0x15,0xee, +0x84,0x09,0x70,0x17,0xdc,0x03,0xf7,0xc2,0x44,0x71,0x9f,0xb8,0x5f,0x3c,0x20,0x26, +0xc3,0x34,0x98,0x09,0x1b,0xe1,0x43,0xf1,0x11,0x6c,0x82,0x2d,0xf0,0x85,0xd1,0x32, +0x3c,0x37,0xc1,0x01,0xf8,0x06,0xbe,0x85,0xef,0xcc,0x82,0x09,0x65,0xa9,0x33,0x10, +0x14,0x11,0x22,0x12,0x8a,0x42,0x71,0x48,0x86,0x14,0x48,0x85,0x34,0xa8,0x05,0xf5, +0xa0,0x3e,0x64,0x88,0x06,0x22,0x53,0xb4,0x86,0x8e,0x70,0xb1,0x98,0x29,0xcc,0xe2, +0x0c,0x93,0xcc,0x87,0xbc,0x67,0x07,0x9c,0xfe,0x30,0x12,0x1a,0x9e,0x43,0xbe,0xab, +0x73,0xed,0x73,0x3f,0x9c,0xe5,0x3a,0xa7,0x10,0xa7,0x68,0x00,0x8d,0xa1,0x09,0xb4, +0x83,0x2e,0x70,0xc8,0x2c,0x4c,0xd0,0x08,0x7f,0xf3,0xa1,0x6a,0x57,0xfa,0x11,0x28, +0x03,0xe7,0x42,0x15,0xa8,0x06,0x71,0x50,0x1d,0x12,0x20,0xdd,0x7c,0xd0,0x79,0x05, +0x75,0xe6,0x4a,0xe2,0x84,0xcb,0xa0,0x0b,0xf4,0x86,0x6c,0x58,0x04,0x4b,0xe0,0x4d, +0x58,0x0b,0x7b,0x60,0x1f,0x7c,0x63,0x3e,0xb0,0xef,0x43,0x3c,0x90,0x00,0x69,0x90, +0x01,0x0d,0xa1,0x35,0x74,0x84,0xee,0x30,0x0c,0xae,0x83,0xf1,0x66,0x7f,0x3f,0xf2, +0x0f,0x0d,0xe1,0x4a,0xe8,0x03,0x7d,0x21,0x1b,0xae,0x86,0x8c,0xfe,0x3c,0x9b,0xc1, +0x64,0x98,0x0f,0xaf,0xc0,0x7a,0xf3,0xa1,0xfe,0x00,0xee,0x3f,0xd0,0x4a,0xb4,0x16, +0x6d,0xe0,0x66,0x18,0x0f,0x77,0xc3,0x3d,0xf0,0x18,0x6c,0x81,0x4f,0x61,0x9b,0xd8, +0x2e,0xf6,0xc1,0x7e,0xf8,0x1a,0x0e,0xc0,0x37,0xf0,0x9d,0xf9,0x60,0x34,0x9b,0xdf, +0x41,0xb7,0xd3,0xef,0x41,0x99,0x3b,0x28,0x77,0xf8,0x1a,0xf6,0xcd,0x20,0x1c,0x7c, +0x0b,0x3f,0xc2,0x4f,0xf0,0xb3,0x59,0x10,0x60,0x26,0x7d,0xf0,0x2c,0xfa,0x10,0xd1, +0x1a,0x2e,0x80,0x76,0xe2,0x72,0xe8,0x05,0xd9,0xf0,0xe3,0x6c,0x77,0xa2,0xdd,0x95, +0x90,0x0d,0x23,0x60,0x24,0x8c,0x83,0x09,0x30,0x09,0x1e,0x81,0x47,0x61,0xdf,0x5b, +0xb4,0x6f,0x30,0x8b,0x61,0xc4,0x41,0x02,0x34,0x86,0x1e,0xef,0xd2,0x1f,0x40,0x2f, +0xe8,0x0d,0xfd,0x60,0x10,0x5c,0x0b,0xa3,0x61,0x2c,0xdc,0x06,0xcf,0xc2,0xf3,0x90, +0xb9,0x8e,0xfb,0x95,0xf9,0x80,0xf8,0xbd,0x80,0x73,0x21,0xb4,0x87,0x87,0xe1,0x51, +0x78,0x0c,0x1e,0x17,0x4f,0xc1,0xd3,0x30,0x0d,0x9e,0x83,0x17,0x60,0x01,0xbc,0x22, +0x16,0xc2,0x6b,0xf0,0x06,0x84,0xde,0x0f,0x38,0xd1,0x90,0x1f,0x0a,0x41,0x49,0x38, +0x05,0xce,0x84,0x32,0x90,0x0e,0xb5,0xa1,0x1e,0x64,0x40,0x23,0x68,0x2c,0x9a,0x43, +0x6b,0xb8,0x00,0x9e,0xfa,0x80,0x67,0x3d,0x58,0x02,0xcb,0xe0,0x23,0xc8,0x81,0x43, +0x70,0x18,0x4a,0x6e,0x20,0x5e,0x48,0x81,0x34,0x38,0x1f,0x5a,0x43,0x7f,0xc8,0x86, +0x71,0x70,0x2b,0x4c,0x85,0x67,0x61,0x19,0xbc,0x0e,0xab,0xe1,0x6d,0xf8,0xc5,0x7c, +0xf8,0xf9,0x11,0xc7,0x42,0x6d,0xe8,0x0b,0x57,0x89,0x1b,0xc5,0x43,0xf0,0x18,0x4c, +0x81,0x19,0xe6,0x03,0xca,0xcd,0xf4,0x5f,0x90,0x5f,0x14,0x80,0x32,0x70,0x0e,0x54, +0x31,0x1f,0x84,0x6e,0xa1,0x9f,0x83,0x7c,0x70,0x1a,0x94,0x86,0xf2,0x10,0x0b,0x67, +0x43,0x45,0xa8,0x02,0x09,0xd0,0x0f,0xc6,0x0b,0xf3,0x31,0x60,0x35,0x48,0x80,0x34, +0xa8,0x01,0x75,0x21,0x03,0x9a,0xc1,0xf9,0x62,0xc2,0x56,0xae,0x1b,0xbc,0x20,0x96, +0xc0,0x6e,0xf8,0x12,0xf6,0xc2,0x3e,0x38,0x08,0x6b,0xb7,0xf3,0x1c,0x0c,0xbb,0xc5, +0x97,0xb0,0x17,0xf6,0xc1,0x41,0x58,0xfb,0x19,0xed,0x13,0xbe,0x82,0xbd,0xb0,0x4f, +0xec,0x87,0x43,0xb0,0x64,0x07,0xcf,0xd7,0xb0,0x05,0xb6,0xc2,0x36,0xb1,0x1d,0x3e, +0x83,0x1d,0xe2,0x73,0xd8,0x03,0x5f,0xc1,0x5e,0xd8,0x07,0xdf,0xc0,0xb7,0xe2,0x67, +0xf1,0x8b,0xd8,0xf2,0x39,0xc7,0xc1,0x4e,0xd8,0x0d,0x7b,0xe0,0x2b,0xd8,0x07,0x3f, +0x9b,0x05,0x0a,0x76,0x72,0x8d,0x60,0x2d,0x7c,0x60,0x16,0x6a,0xf9,0x82,0x3e,0x00, +0x1a,0x41,0x73,0x68,0x21,0x5a,0x43,0x47,0xf3,0xe1,0xff,0x57,0xf4,0xb3,0x10,0x82, +0xb2,0x50,0x1e,0x2a,0xc0,0xd9,0xa2,0x92,0x38,0x17,0x92,0x20,0x05,0x6a,0x40,0xba, +0xa8,0x2d,0x32,0x45,0x13,0xd1,0x4c,0xb4,0x10,0x2d,0xa1,0x15,0xb4,0x81,0x0b,0xe0, +0x42,0xd1,0x41,0x74,0x14,0x9d,0xc4,0xa5,0xa2,0xb3,0xe8,0x0a,0xdd,0xe0,0x72,0xd1, +0x0b,0xae,0x84,0xbe,0x30,0x08,0x86,0xc0,0x30,0xb8,0x1a,0x46,0xc0,0xf5,0x62,0x24, +0xdc,0x02,0xb7,0xc1,0x43,0x30,0x05,0x9e,0x80,0xa7,0x60,0x1a,0x4c,0x87,0x57,0x60, +0xdf,0x8f,0x5c,0x57,0xf3,0x21,0xb2,0x13,0x74,0x36,0x3f,0x1d,0x74,0x9c,0x67,0x82, +0xce,0x59,0xf3,0x83,0x4e,0x39,0x78,0xfe,0xed,0xa0,0x33,0x13,0xb6,0xec,0x0e,0x3a, +0xfb,0xe0,0x52,0x33,0x01,0xf7,0x07,0xf6,0x1f,0x72,0x27,0xe2,0x36,0x2f,0x11,0xc1, +0x6f,0x95,0x08,0xe7,0xea,0x94,0x88,0xdc,0x09,0x2d,0x7b,0xc1,0x9b,0x47,0x9c,0xd7, +0xfc,0xe1,0xff,0xd5,0xbc,0xe1,0xdf,0x3a,0x5f,0xf8,0x44,0xe7,0x09,0x1f,0x6f,0x7e, +0xb0,0x7f,0xde,0x6f,0x5e,0xf3,0x7d,0xbd,0xf9,0xbd,0xfe,0x79,0xbd,0xde,0x3c,0x5e, +0x6f,0xde,0x6e,0x5e,0xf3,0x75,0xbd,0x79,0xba,0xde,0xfc,0x5c,0x6f,0x5e,0xae,0x37, +0x1f,0xd7,0x3f,0x0f,0xd7,0x9b,0x7f,0xeb,0xcd,0xbb,0xf5,0xe6,0xdb,0x7a,0xf3,0x6c, +0xbd,0xf9,0xb5,0x79,0xcd,0xab,0xf5,0xcf,0xa7,0xf5,0xe6,0xcd,0x7a,0xf3,0x63,0xbd, +0x79,0xaf,0xde,0x7c,0x57,0xff,0xfc,0xd6,0x93,0x9d,0xcf,0xea,0xcd,0x63,0xf5,0xe6, +0xa7,0xfa,0xe7,0xa5,0xfa,0xe7,0xa1,0xfe,0xd6,0xf9,0xa6,0xfe,0xf9,0xa3,0xde,0x7c, +0xd1,0x93,0x9d,0x17,0xea,0xcd,0x07,0xf5,0xcf,0xef,0xf4,0xe6,0x73,0x9e,0xec,0xbc, +0x4d,0x6f,0xbe,0xa6,0x7f,0x9e,0xa5,0x37,0xaf,0xf2,0x8f,0x9e,0x4f,0xe9,0xcd,0x8f, +0x3c,0xde,0xbc,0x47,0x6f,0xbe,0x63,0x5e,0xf3,0x18,0xbd,0x79,0x8b,0x27,0x3a,0x4f, +0xd1,0x9b,0x9f,0xe8,0x9f,0x5f,0xe8,0xcd,0x27,0xcc,0x6b,0xde,0xa0,0x37,0x5f,0xd0, +0x3f,0x0f,0xd0,0x9b,0xff,0xe7,0xcd,0xf7,0x3b,0xd1,0xf9,0x7d,0xde,0x3c,0x3d,0x6f, +0x7e,0x9e,0x7f,0x5e,0xde,0xc9,0xce,0xc3,0xf3,0xe6,0xdf,0xe5,0x35,0xef,0xce,0x3f, +0xcf,0xce,0x3f,0x6f,0xce,0x9b,0x17,0xe7,0xcd,0x7f,0xf3,0xe6,0xaf,0x79,0xf3,0xd6, +0xbc,0x79,0x6a,0xde,0xfc,0x34,0x6f,0x5e,0x9a,0x37,0x1f,0xcd,0x9b,0x87,0xe6,0xcd, +0x2f,0xfb,0xbb,0xcd,0x1f,0xfb,0xa3,0xe7,0x8b,0x79,0xf3,0xc3,0xbc,0xf9,0x60,0xfe, +0x79,0x60,0xde,0xfc,0x2f,0xff,0x3c,0xae,0x93,0x9d,0x9f,0x95,0xd7,0xbc,0xac,0xe3, +0xcd,0xa7,0xf2,0xe6,0x4f,0x79,0xf3,0xa4,0xbc,0x79,0x4b,0xde,0x7c,0x24,0x6f,0x3e, +0x91,0x37,0x5f,0xc8,0x9b,0xff,0xe3,0xcd,0xfb,0xf1,0xe6,0xed,0x78,0xf3,0x71,0x4e, +0x74,0x1e,0x8e,0x37,0xcf,0xc6,0x9b,0x5f,0xe3,0xcd,0xab,0xf9,0xad,0xf3,0x68,0xfe, +0xaa,0xf3,0x67,0xf2,0x9a,0x27,0xf3,0x77,0x9f,0x0f,0x73,0xb2,0xf3,0x60,0xfe,0xa8, +0xf9,0x2f,0xc7,0x9b,0xf7,0x72,0xa2,0xf3,0x5c,0x8e,0x37,0xbf,0xe5,0x7f,0x35,0xaf, +0x25,0xaf,0xf9,0x2c,0x79,0xcd,0x5f,0xf1,0xcf,0x5b,0xf9,0xb3,0xe7,0xab,0x78,0xf3, +0x54,0xbc,0xf9,0x29,0xde,0xbc,0x14,0x6f,0xde,0x89,0x37,0xdf,0x24,0xaf,0xf9,0x24, +0xde,0xfc,0x11,0x6f,0xde,0x88,0x37,0x4f,0xc4,0x9b,0x17,0xe2,0xcd,0xf3,0xf0,0xe6, +0x77,0xf8,0xe7,0x75,0xf8,0xe7,0x73,0x78,0xf3,0x34,0xbc,0xf9,0x19,0xc7,0x9b,0x87, +0xe1,0xcd,0xb7,0xf0,0xe6,0x59,0x78,0xf3,0x2b,0xbc,0x79,0x15,0xde,0x7c,0x8a,0xe3, +0xcd,0xa3,0xf0,0xcf,0x97,0xf8,0x6f,0xcd,0x8f,0xf8,0xbd,0xf3,0x1b,0xfe,0x5b,0xf3, +0x1a,0xfc,0xf3,0x16,0xbc,0xf9,0x0a,0xde,0x3c,0x85,0xbf,0xca,0xfc,0x04,0xff,0xbc, +0x84,0x93,0x9d,0x8f,0x70,0xb2,0xf3,0x10,0xc2,0xf3,0x0f,0x8e,0x3d,0xff,0x20,0xaf, +0x79,0x06,0xc7,0x9b,0x57,0xf0,0x7b,0xe7,0x13,0x1c,0x6f,0xde,0x40,0x5e,0xf3,0x05, +0x8e,0x37,0x4f,0x20,0xaf,0xf9,0x01,0xde,0xbc,0x00,0xff,0x7c,0x00,0x6f,0xdc,0xdf, +0x1b,0xdf,0xf7,0xc6,0xf5,0xbd,0x71,0x7c,0x6f,0x7c,0xde,0x1b,0x8f,0xf7,0xc6,0xdb, +0xfd,0xe3,0xec,0xde,0xf8,0xba,0x37,0x9e,0xee,0x8d,0x9b,0x1f,0x6f,0x5c,0xdc,0x1b, +0xdf,0x3e,0xd9,0x71,0xed,0x93,0x1d,0xa7,0xf6,0xc6,0xa7,0xbd,0x71,0x67,0x6f,0xbc, +0xf9,0x44,0xc7,0x95,0xbd,0xf1,0x60,0x6f,0x1c,0xd8,0x1b,0xff,0xf5,0xc6,0x73,0xfd, +0xe3,0xb7,0xfe,0xf1,0x57,0x6f,0xdc,0xd5,0x1b,0x47,0xf5,0xc6,0x4f,0xbd,0xf1,0x50, +0x6f,0x1c,0xd4,0x1b,0xcf,0xf4,0xc6,0x2f,0xfd,0xe3,0x8f,0xde,0xf8,0xe2,0x89,0x8e, +0x2b,0x7a,0xe3,0x85,0xde,0x38,0xa1,0x7f,0x3c,0xd0,0x3f,0xce,0xe7,0x8d,0xef,0x79, +0xe3,0x7a,0xde,0x38,0x9e,0x37,0x6e,0xe7,0x8d,0xcf,0xf9,0xc7,0xe1,0xbc,0x71,0x35, +0xff,0x78,0x9a,0x37,0x4e,0xe6,0x8d,0x8f,0xe5,0x35,0xce,0xe5,0x8d,0x63,0xe5,0x35, +0x6e,0xe5,0x8d,0x43,0xe5,0x39,0xfe,0xa4,0x71,0x27,0x6f,0x7c,0xc9,0x3f,0xae,0x74, +0xb2,0xe3,0x42,0xde,0x78,0x50,0x5e,0xe3,0x40,0xfe,0x71,0x1e,0x6f,0x7c,0xc7,0x1b, +0xd7,0xf1,0xc6,0x73,0xbc,0x71,0x9c,0x13,0x1d,0xbf,0x39,0xde,0xb8,0x8d,0x37,0x5e, +0x93,0xd7,0xf8,0xcc,0x5f,0x6d,0x3c,0xe6,0xdf,0x36,0x6e,0x72,0xbc,0xf1,0x0f,0x6f, +0x5c,0xc3,0x1b,0xcf,0xf0,0xc6,0x31,0xfc,0xe3,0x17,0xde,0xb8,0x85,0x7f,0x9c,0xc2, +0x1b,0x97,0xf0,0xc6,0x23,0xfc,0xe3,0x10,0xde,0xf8,0x83,0x37,0xee,0xe0,0x8d,0x37, +0xfc,0xd6,0x71,0x06,0x6f,0x7c,0xc1,0x1b,0x57,0x08,0x8f,0x27,0xb8,0xe3,0x09,0xbf, +0x7b,0x1c,0xc1,0xac,0x3d,0x0b,0xf9,0xc1,0xfb,0x0c,0xbb,0x10,0x14,0x76,0x5f,0x65, +0x98,0x25,0x16,0x1d,0x7e,0x9e,0x3b,0xe6,0x27,0x70,0x2c,0x54,0x84,0xaa,0xee,0xcf, +0x61,0xf3,0x53,0xd7,0x89,0x07,0xb3,0xa6,0x49,0x2d,0xa8,0xad,0x75,0x4d,0x3a,0x69, +0x3c,0xe2,0x5a,0xb8,0x01,0xc6,0xc2,0x4d,0xc0,0x4f,0x3f,0x67,0x0a,0x3c,0x0e,0x4f, +0x6b,0x9c,0xc2,0x3c,0xc2,0x3f,0x0f,0x2f,0xc0,0x4c,0x98,0x0d,0x2f,0x6a,0xec,0xe2, +0x25,0x58,0xa0,0xf1,0x8b,0x57,0x34,0x86,0xb1,0x41,0x63,0x18,0xdf,0x6b,0x0c,0x63, +0x01,0x59,0x7a,0x05,0x96,0xc1,0x5a,0x58,0xa7,0x31,0x89,0xcf,0x34,0x0e,0xb1,0x57, +0x6b,0x98,0x64,0x5b,0xe3,0x10,0x66,0xfc,0xe1,0x7a,0x8d,0x3b,0xdc,0x68,0xad,0x53, +0x32,0xce,0x1a,0x73,0x30,0xe3,0x0d,0xdf,0x69,0xbc,0x61,0x8c,0xc6,0x1b,0x12,0x35, +0xc6,0x70,0x2b,0xdc,0x01,0xe3,0xb5,0x0e,0xc9,0x22,0xad,0x41,0xb2,0x44,0xeb,0x90, +0xbc,0xa6,0x75,0x48,0x96,0x5b,0x6b,0x90,0x98,0x71,0x08,0x27,0x8a,0x7f,0x90,0x0f, +0x62,0xa0,0x00,0x14,0x84,0x42,0x50,0x38,0xca,0x5d,0x9b,0xa4,0x34,0x94,0xd1,0x3a, +0x24,0x66,0x0d,0x92,0x2b,0xa1,0x0f,0xf4,0xb3,0xd6,0x1f,0x31,0x6b,0x8e,0x7c,0x0c, +0x9f,0x68,0xdd,0x91,0xcf,0xb4,0xde,0xc8,0x17,0x5a,0x6f,0xe4,0x2b,0xad,0x33,0x62, +0xc6,0x2c,0x8a,0x58,0xeb,0x89,0x24,0x68,0x9c,0xe2,0x69,0x6b,0xed,0x90,0xdd,0x1a, +0xa3,0xf8,0xce,0x5a,0x27,0xe4,0xe7,0x68,0x77,0x7d,0x10,0x6f,0x5d,0x10,0x6f,0x3d, +0x10,0x6f,0x1d,0x90,0x04,0x8d,0x53,0x98,0x35,0x40,0x2e,0xd3,0x58,0x85,0x19,0x97, +0x78,0x09,0xd6,0xc3,0x56,0xad,0xef,0x11,0x61,0xad,0xe5,0xe1,0xad,0xe1,0xd1,0x40, +0x6b,0x76,0x78,0x6b,0x75,0xb4,0xd1,0x58,0x85,0x59,0x97,0xe3,0x72,0x6b,0xed,0x8d, +0xb1,0x1a,0xa3,0xb8,0x47,0x63,0x13,0xde,0x98,0x84,0xb7,0xb6,0xc6,0x52,0xad,0xa5, +0xb1,0xda,0x5a,0x3f,0xc3,0x5b,0x37,0x63,0xb3,0xd6,0xcb,0x30,0x6b,0x65,0x7c,0x0d, +0xdf,0xc0,0x8f,0xd6,0x3a,0x19,0x01,0x6b,0x6d,0x8c,0x22,0x1a,0xa3,0xa8,0xa2,0xb1, +0x89,0x54,0x8d,0x49,0x78,0x6b,0x5f,0x34,0xd0,0x9a,0x17,0x2d,0xac,0x75,0x2e,0xbc, +0xf5,0x2d,0xb2,0x35,0x4e,0x61,0xd6,0xb3,0x18,0xaa,0x35,0x2d,0xbc,0xb5,0x2c,0xc6, +0x6b,0xac,0xe2,0x59,0x8d,0x51,0xcc,0xb5,0xd6,0xab,0x58,0xaa,0xf5,0x29,0xbc,0x75, +0x29,0xd6,0x58,0x63,0x15,0x5b,0xb5,0x06,0xc5,0x7e,0x6b,0xfd,0x09,0x6f,0xdd,0x89, +0x90,0xc6,0x2d,0x4a,0x68,0xbc,0x22,0x49,0xe3,0x14,0xde,0xba,0x12,0xf5,0xad,0x35, +0x24,0x9a,0x68,0xed,0x08,0x6f,0xcd,0x08,0x6f,0xad,0x88,0xce,0x5a,0x23,0xa2,0xa7, +0xb5,0x1e,0xc4,0x58,0x8d,0x5b,0xdc,0xad,0xf1,0x0a,0x6f,0x9c,0xe2,0x09,0x8d,0x4f, +0xbc,0xa0,0x75,0x1e,0xbc,0xf5,0x1d,0x96,0x6b,0x5d,0x87,0x35,0xd6,0x5a,0x0e,0x66, +0x1d,0x87,0x03,0x70,0x10,0x0e,0x15,0x38,0xb2,0x96,0x83,0xb7,0x86,0x43,0x61,0x8d, +0x61,0x54,0xb1,0xd6,0x69,0x68,0xa0,0xf5,0x19,0x9a,0x6b,0x5d,0x86,0x8b,0x34,0x7e, +0xd1,0x4d,0xeb,0x2f,0x0c,0x83,0xe1,0x70,0x83,0xb5,0xf6,0xc2,0x9d,0x1a,0xc3,0x78, +0x56,0x63,0x17,0xde,0xda,0x0a,0xcb,0xb5,0x66,0xc2,0x5b,0x5a,0x2b,0xc1,0x1b,0xc3, +0xd8,0xaa,0xb5,0x11,0xf6,0xab,0x63,0x0b,0x6a,0x0c,0xa3,0xb8,0xd6,0x3c,0xa8,0xab, +0x35,0x0e,0x1a,0x6b,0x6d,0x83,0x96,0xd6,0x38,0x46,0x37,0xad,0x5b,0xe0,0xad,0x53, +0x30,0x56,0xe3,0x17,0x73,0xac,0x31,0x0b,0x6f,0x2d,0x82,0x75,0xd6,0xfa,0x03,0x3b, +0xb4,0xee,0x40,0xc0,0x5a,0x6b,0xc0,0xac,0x33,0x50,0x5f,0xe3,0x19,0x66,0x6d,0x81, +0x56,0x1a,0xcb,0xf0,0xc6,0x30,0x6e,0xb7,0xc6,0x2d,0xbc,0x75,0x03,0x5e,0xb4,0xc6, +0x2c,0xbc,0x35,0x02,0xd6,0x6a,0xcc,0xc2,0x5b,0x13,0xe0,0x0c,0xad,0x03,0x90,0xa6, +0x75,0x00,0x6a,0x6a,0x1d,0x80,0x5a,0x5a,0x0b,0xa0,0x99,0xbe,0xfd,0xf7,0xbe,0xf9, +0x1f,0xab,0x6f,0xfe,0xc7,0xe9,0x5b,0x7f,0xf3,0x9d,0xff,0x22,0x7d,0xe3,0xbf,0x02, +0xde,0xd6,0x58,0x47,0x9c,0xf5,0x5d,0xbf,0xf7,0x3d,0x7f,0x6d,0x7d,0xc7,0x5f,0x5f, +0xdf,0xe9,0x5f,0xac,0xef,0xf3,0xbb,0xea,0xbb,0xfb,0xab,0xac,0x6f,0xed,0xc7,0xea, +0x1b,0x7b,0xef,0xdb,0x7a,0xf3,0xed,0xfc,0xa3,0xd6,0x98,0x87,0x19,0xef,0x68,0xae, +0xf1,0x0c,0x6f,0x1c,0xa3,0x8b,0xc6,0x2f,0x26,0x68,0xdc,0x62,0xbe,0x35,0x56,0xb1, +0x52,0x63,0x14,0xc5,0x35,0x36,0x61,0xbe,0x6b,0xef,0xa2,0xf1,0x89,0x09,0x1a,0x9f, +0x30,0x63,0x13,0x4e,0x49,0x77,0x6c,0x62,0xa4,0xc6,0x24,0x1e,0xd2,0x98,0x84,0x19, +0x7f,0x28,0xac,0xef,0xd5,0xcb,0xe9,0xfb,0xf4,0x54,0x8d,0x43,0x5c,0xa0,0x71,0x88, +0xfe,0xff,0x57,0xd9,0xb9,0x40,0x47,0x59,0x98,0x69,0x78,0x26,0x4c,0x92,0x49,0xc2, +0x25,0x56,0x11,0xaf,0x88,0x82,0x02,0xa2,0x24,0x87,0x84,0x8b,0x5c,0xe3,0x0a,0xca, +0xd9,0x2e,0x27,0x41,0x2b,0x95,0x65,0x95,0xb8,0x8a,0x56,0x6a,0x0b,0xd5,0x54,0xad, +0x5a,0x8c,0xa0,0x45,0x50,0x2c,0xa7,0xab,0xed,0xd1,0xe2,0x82,0x6b,0xbd,0x50,0x45, +0xc2,0xa2,0xd6,0xae,0x0a,0x51,0xcb,0x6a,0xab,0x14,0x14,0xad,0xbb,0x5a,0x05,0xb4, +0xed,0x52,0x95,0xca,0x4d,0x91,0x9b,0xd9,0xf7,0x9b,0xff,0xf9,0x92,0x2f,0x63,0x50, +0x3b,0x39,0x6f,0x12,0x26,0x21,0x33,0xf9,0x33,0x13,0x7e,0xde,0xef,0x7d,0x9f,0x8f, +0x1e,0x7a,0x23,0xfd,0x73,0xef,0x9d,0xaf,0x0a,0x5d,0x73,0xeb,0x99,0xbf,0x26,0xbd, +0x15,0xfa,0xe5,0xd6,0x2d,0xdf,0x26,0xa5,0x8e,0x48,0xfa,0xe5,0x5d,0xe9,0x95,0xf7, +0x62,0x3e,0x71,0x33,0x73,0x89,0xa5,0x61,0x26,0x91,0xa2,0x23,0xde,0x9b,0x6e,0x78, +0x7f,0x3a,0xe1,0xde,0x05,0xb7,0x1e,0x78,0x8d,0x34,0x96,0x2e,0xf8,0x4c,0x66,0x15, +0x4d,0x74,0xbe,0xdf,0x61,0x56,0xd1,0x83,0x8e,0xb7,0x75,0xbb,0x7b,0x86,0x2e,0xf7, +0x79,0xa1,0xbf,0xed,0xbd,0xed,0x69,0xf4,0xb5,0xaf,0x0c,0x1d,0x6d,0xeb,0x67,0x2f, +0xa1,0x97,0x9d,0xa2,0x7b,0x5d,0x1d,0xba,0xd6,0x23,0x42,0xbf,0xda,0x7b,0xd5,0x75, +0xf4,0xa8,0x1b,0xe8,0x51,0xcf,0xa6,0x2f,0xfd,0x00,0x3d,0x69,0xef,0x47,0x3f,0x1a, +0x3a,0xd0,0x5b,0xe8,0x3e,0x6f,0x0d,0x7d,0x67,0xeb,0x3a,0xef,0x3f,0x3a,0xe9,0x36, +0x57,0xd3,0x69,0x1e,0xc1,0xec,0x64,0x21,0xb3,0x11,0xeb,0x27,0x6f,0xa0,0x9f,0xec, +0xbd,0xe4,0xbf,0x86,0x2e,0xb2,0x77,0x90,0x3f,0x0d,0x73,0x12,0xeb,0x10,0xef,0x63, +0x06,0x72,0x04,0xb3,0x8f,0xf1,0xcc,0x3c,0x26,0x87,0x39,0xc7,0x54,0xe6,0x1b,0x36, +0xdb,0x78,0x86,0xb9,0xc6,0x6a,0x66,0x1b,0x36,0xd7,0x58,0xcb,0x5c,0xc3,0x66,0x1a, +0x6f,0x33,0xd3,0xd8,0xca,0x4c,0xc3,0xe6,0x19,0x07,0x38,0x39,0x2a,0x93,0xba,0x4a, +0xdd,0xa4,0x72,0xa9,0x9f,0xd4,0x5f,0x3a,0x59,0x1a,0x20,0x9d,0x22,0x9d,0x2a,0x0d, +0x94,0x2a,0xa4,0x4a,0x69,0xb0,0x34,0x56,0x1a,0x27,0x4d,0x95,0xea,0xa5,0x4b,0xa4, +0x4b,0xa5,0x6f,0x49,0x97,0x49,0xd3,0xa5,0x99,0xcc,0x4b,0x1a,0xa4,0x6b,0xa5,0xeb, +0x99,0x9b,0x34,0x4a,0xf3,0xa5,0xdb,0x98,0xa1,0x2c,0xa1,0x6b,0x9c,0x62,0x8e,0xd2, +0x89,0x39,0x4a,0x96,0x59,0xca,0x61,0xcc,0x51,0x0e,0x67,0x86,0xd2,0x93,0xf9,0xc9, +0x89,0xcc,0x4f,0xfa,0x32,0x3f,0xe9,0xcf,0x0c,0xc5,0x67,0x27,0xc3,0x99,0x95,0xd4, +0x30,0x2b,0xf9,0x47,0xe6,0x24,0x75,0xcc,0x4a,0xe6,0x49,0x0b,0xa5,0xaf,0x9d,0xa0, +0x7f,0x97,0xa4,0xc3,0xa4,0x21,0x3a,0x51,0xbc,0x4e,0xba,0x53,0xfa,0xa9,0x54,0xd3, +0x47,0x9f,0x2b,0xdd,0x22,0x2d,0x92,0xde,0x97,0x1e,0xd1,0x89,0xe4,0x32,0x3b,0x99, +0xec,0x27,0xf5,0xd7,0xbf,0x9f,0x3a,0xa9,0xfc,0x19,0x27,0x96,0x95,0x52,0xbd,0xf4, +0x67,0xe6,0x2b,0x1f,0x31,0x5f,0xd9,0xc3,0x49,0x67,0xdf,0x30,0x53,0x99,0x11,0xfa, +0xc4,0x4b,0x98,0xa3,0x34,0x31,0x3f,0x69,0x66,0x6e,0xb2,0x9e,0x79,0xc9,0x26,0x4e, +0x58,0x1b,0xa5,0x9f,0xdb,0x89,0x6b,0x85,0x9e,0xb7,0x15,0xc9,0x09,0x6c,0x9a,0x39, +0x4a,0x96,0xd9,0xc9,0xc9,0x74,0x85,0x2b,0x99,0xa1,0x0c,0x61,0x86,0x32,0x8a,0x99, +0xc9,0x5d,0xcc,0x4c,0x6c,0x5e,0xb2,0x84,0x39,0x89,0xf7,0x7f,0x0b,0x99,0x8b,0x2c, +0x94,0x9a,0x99,0x89,0x1c,0x3b,0x48,0x0f,0x15,0xa9,0x4e,0xaa,0x97,0xae,0x97,0x6e, +0x90,0x56,0x48,0xcd,0xd2,0xcb,0xd2,0x7a,0xe9,0xea,0x2a,0x1d,0x3b,0xe9,0x1d,0x69, +0x93,0xd4,0x52,0x95,0xcc,0x52,0x9a,0x99,0xa5,0xd8,0x49,0xf4,0x42,0xe6,0x27,0x5d, +0x98,0x93,0xd4,0xd0,0xed,0xbd,0x92,0x7e,0xef,0x2c,0xe6,0x22,0xff,0xce,0x3c,0xc4, +0xba,0xbb,0x3b,0xec,0x84,0x9b,0x39,0x88,0xcd,0x3b,0xe6,0x49,0xcf,0x31,0xd7,0xf0, +0x7e,0xad,0xf7,0x6a,0xbd,0x4f,0x7b,0x22,0xdd,0xd9,0x7e,0x74,0x67,0x2b,0xa5,0x61, +0xcc,0x32,0x1a,0xe8,0xd0,0x5a,0x5f,0xf6,0xf7,0xf4,0x64,0x77,0x84,0x2e,0xac,0xf5, +0x5f,0x07,0xd2,0x7b,0xb5,0xce,0xeb,0x54,0xba,0xae,0x73,0x42,0xaf,0xf5,0x09,0xfa, +0xac,0x4f,0xd3,0x63,0xb5,0xb9,0xc6,0x3b,0xa1,0xaf,0x9a,0xa2,0x8f,0x5a,0x41,0x0f, +0xb5,0x8a,0xfe,0x69,0x4d,0xe8,0x9c,0xfe,0x53,0xe8,0x99,0xfe,0x4b,0xe8,0x8e,0x36, +0x85,0x9e,0xe8,0xe3,0xf4,0x43,0x7f,0x4d,0x2f,0xb4,0x39,0x74,0x41,0xdf,0xa2,0xeb, +0xf9,0xb7,0xd0,0xe3,0x2c,0x61,0x3e,0xd1,0x8b,0xb9,0x84,0xcd,0x24,0xa6,0x33,0x7b, +0xf0,0x0e,0xa6,0x77,0x2f,0xbd,0x6b,0x69,0x73,0x88,0x26,0xe6,0x0f,0xf6,0x1f,0x94, +0x99,0xcc,0x1c,0x0e,0x0d,0x3d,0x4a,0x9b,0x35,0xf4,0x67,0xd6,0x30,0x2c,0xcc,0x17, +0xce,0x60,0xae,0x50,0xc7,0x5c,0x61,0x34,0x73,0x85,0x9f,0x30,0x4f,0x38,0x40,0x4f, +0xb2,0x9c,0x9e,0x64,0xa5,0x54,0x27,0x4d,0x94,0xce,0x96,0xbe,0x21,0x9d,0x2b,0x4d, +0x92,0xa6,0x4a,0xf5,0xd2,0xbf,0x4a,0x17,0x4b,0xdf,0x92,0x2e,0x93,0xbe,0x4d,0x97, +0xd2,0xe6,0x11,0x2d,0x52,0xba,0x45,0x3f,0x73,0xa9,0x48,0x2a,0x93,0x3a,0x4b,0x5d, +0xa4,0xae,0x2d,0x49,0xc7,0xf2,0x28,0xe9,0x68,0x7a,0x96,0x23,0x98,0x5b,0x4c,0x61, +0x6e,0xf1,0x1c,0xf3,0x88,0x57,0x99,0x43,0x6c,0x92,0xde,0x95,0xfe,0x2c,0x6d,0x91, +0xf6,0x30,0x97,0xe8,0xc2,0x3c,0x62,0x24,0x73,0x88,0x3a,0xe6,0x0f,0xb6,0x68,0x2a, +0x2d,0x15,0x48,0xc5,0xd2,0xd0,0x74,0x32,0x8f,0x58,0x20,0x2d,0x94,0x96,0x48,0xeb, +0x43,0x6f,0x72,0x09,0x5d,0xc9,0xcd,0xcc,0x27,0x4e,0x65,0xfe,0x70,0x15,0xf3,0x87, +0xc5,0xcc,0x1d,0x52,0xf4,0x1c,0x9b,0x98,0x2f,0xa4,0x98,0x2b,0xcc,0x60,0x1e,0x50, +0xc3,0x1c,0x20,0x15,0x3c,0xfe,0xa1,0xc1,0xd7,0xff,0xa6,0xf4,0x20,0x5e,0xbe,0xf9, +0xf8,0xfb,0xa4,0xe3,0xf0,0xf0,0xc7,0xe0,0xdd,0x3f,0x2d,0xbd,0x5a,0x92,0xf4,0x05, +0x0b,0xe9,0x09,0x96,0xe3,0xdb,0x1f,0x49,0x2f,0xd0,0xfa,0x80,0x35,0x52,0x1d,0xfe, +0x7d,0x33,0xfd,0xbf,0x0f,0xf0,0xeb,0x4f,0xc3,0xaf,0x3f,0x4f,0xba,0x46,0xba,0x4b, +0x5a,0x8a,0x57,0xdf,0x88,0x47,0xbf,0x17,0x8f,0xbe,0x0f,0x5d,0xbf,0xfa,0xae,0x89, +0xf7,0x6e,0x3d,0xbd,0x65,0xf8,0xef,0x29,0x7c,0x75,0xeb,0xdc,0x4d,0xc4,0x53,0xdf, +0xd4,0xad,0xad,0x57,0x57,0x40,0x8f,0xee,0x2c,0xe9,0x6c,0xba,0x74,0x37,0xd0,0x8f, +0x5b,0x49,0x17,0xce,0x7a,0x70,0x4f,0x49,0x6b,0xf1,0xd8,0xb7,0xd1,0x7d,0xeb,0x44, +0xe7,0xcd,0xbb,0x6e,0x43,0xf0,0xd8,0xad,0xc3,0xd6,0x40,0x7f,0x6d,0x36,0x3d,0xb5, +0xd5,0xf4,0xd2,0xd6,0x86,0x2e,0xda,0x66,0x3c,0xf6,0x43,0xe9,0x9a,0x0d,0x0a,0xfd, +0x32,0xeb,0x96,0x0d,0xa3,0x57,0xd6,0x18,0x7c,0xf6,0x1f,0xe3,0xaf,0x37,0x85,0xae, +0xd8,0x7b,0x74,0xc4,0x52,0x74,0xc3,0x0a,0xf1,0xda,0x0f,0xc5,0x63,0x1f,0x84,0xb7, +0x3e,0x02,0x5f,0xdd,0xbb,0x5e,0x67,0xd1,0xf1,0xaa,0x0b,0xbd,0xae,0x4b,0xe8,0x71, +0xa5,0xe8,0x49,0xd5,0xd0,0x8f,0x1a,0x17,0x3a,0x51,0xe7,0x87,0x1e,0x54,0x23,0xbd, +0xa7,0x5f,0x87,0xae,0xd3,0xea,0xd0,0x6f,0xfa,0x0d,0x7d,0xa6,0x46,0xfa,0x4b,0x4f, +0xd2,0x5b,0xf2,0xbe,0xd2,0xb3,0xf4,0x94,0x52,0xf4,0x92,0x46,0x84,0x2e,0x92,0xf5, +0x90,0x4e,0xa7,0x7f,0x54,0x8f,0xef,0xfe,0x70,0xe8,0x1c,0x3d,0x4a,0xd7,0xe8,0x89, +0xd0,0x2f,0x6a,0xc6,0x8f,0x3f,0x96,0xde,0xd0,0x09,0xa1,0x2b,0x54,0x89,0x37,0x5f, +0x11,0x7a,0x40,0x23,0xf0,0xe9,0xcd,0xa3,0x77,0x6f,0xbe,0x3b,0x9e,0xfc,0x50,0xba, +0x3d,0xa3,0x42,0x9f,0xc7,0xfa,0x3a,0x63,0xe9,0xec,0x2c,0xc1,0x9b,0x7f,0x8d,0x6e, +0xce,0x1f,0x43,0x1f,0xc7,0x7b,0x37,0xc5,0x52,0x09,0x1e,0x7d,0x15,0x7d,0x1b,0xeb, +0xd9,0x8c,0x09,0x1d,0x9b,0x89,0x74,0x6b,0x26,0xe3,0xd9,0xcf,0x0f,0x3d,0x9a,0xbb, +0xcd,0xaf,0x3f,0x2a,0xf1,0xea,0x4b,0xe9,0xba,0x0c,0xa3,0xdf,0x62,0x7d,0x96,0x99, +0xf4,0x58,0xbc,0xbf,0xe2,0xbd,0x15,0xef,0xab,0xa4,0xf0,0xef,0xcb,0xe8,0xa7,0x78, +0x2f,0x65,0x4c,0xe8,0xa2,0xd4,0xe1,0xe5,0x5f,0x8a,0x87,0xbf,0x90,0xae,0xc9,0x9d, +0xa1,0x5f,0xe2,0xbd,0x92,0x4d,0xf4,0x45,0xac,0x2b,0x62,0x1e,0x7d,0xb3,0xf4,0xba, +0xf4,0xb6,0xb4,0x59,0x6a,0x39,0x2e,0xf1,0xeb,0x67,0xe2,0xd7,0x9b,0x47,0x5f,0x59, +0x9d,0x78,0xf2,0xe6,0xc3,0xd7,0xd0,0xb3,0xf8,0x2e,0xfe,0xbb,0x75,0x2a,0x3e,0xc6, +0x83,0xb7,0x3e,0xc5,0x50,0x7a,0x14,0x53,0xf0,0xe1,0xcd,0x83,0xaf,0xc1,0x53,0xf7, +0x0e,0xc4,0x8f,0xf1,0xd4,0xcd,0x4f,0x7f,0x37,0x74,0x1d,0xb6,0xe1,0xa1,0xa7,0x6e, +0x91,0x16,0x24,0xfe,0x78,0x1d,0x3e,0xb8,0x79,0xe0,0x29,0xbc,0xef,0x46,0x3c,0xef, +0x45,0x74,0x10,0x16,0x4b,0x4b,0xcc,0xff,0xb6,0x25,0x6e,0xaf,0xa4,0x53,0xfd,0xe9, +0x1c,0x4c,0x97,0xae,0xa4,0x6f,0x30,0x87,0xbe,0xc1,0x6d,0xf4,0x0d,0x1e,0xb5,0xc5, +0x93,0xaf,0x26,0x9d,0x83,0x71,0xd2,0x26,0xeb,0x1d,0x6c,0xd0,0xf7,0xb6,0x21,0xf1, +0xd1,0x27,0xe1,0x9f,0xbb,0x6f,0xbe,0x14,0xbf,0xdc,0x7d,0x72,0xf3,0xc8,0x8b,0xf1, +0xc6,0x0f,0xc7,0x13,0x1f,0x81,0x17,0xee,0x1e,0xb8,0xf9,0xdf,0xe6,0x7d,0xbf,0x85, +0xe7,0xdd,0x1d,0xaf,0xbb,0x16,0x8f,0x7b,0x1e,0xde,0xf6,0xf3,0x78,0xda,0xd6,0x03, +0xc8,0x2d,0x4a,0x7a,0x53,0xc7,0x91,0x1e,0xc0,0x77,0xe8,0x00,0x5c,0x45,0x07,0xe0, +0x66,0x7a,0x00,0xd6,0x01,0x48,0x91,0xed,0x3f,0x9a,0x4c,0xff,0x49,0x78,0xdd,0x95, +0x78,0xdd,0x35,0xf8,0xdc,0xcd,0x64,0xf2,0x2d,0x8f,0xdf,0xf2,0x6e,0xe2,0x37,0xbf, +0x40,0xae,0x3d,0x45,0x9e,0xdd,0x73,0xec,0x17,0x48,0xdf,0xfb,0x50,0x8f,0xfd,0xad, +0x89,0xff,0x5c,0x88,0xef,0xdc,0x27,0x78,0xcd,0xd5,0xc1,0x5f,0xfe,0x87,0xe0,0x29, +0xbb,0x97,0x3c,0x31,0xf8,0xc7,0x93,0x83,0x67,0xec,0x5e,0xb1,0x7b,0xc4,0x97,0xe3, +0x0d,0xff,0x20,0xf8,0xc1,0xb7,0xe2,0x03,0xdf,0x8f,0xff,0xbb,0xcd,0xfc,0xdf,0x6d, +0xfa,0x9e,0xa4,0x25,0xd2,0x0a,0xe9,0x59,0xe9,0x15,0x5b,0xbc,0xb7,0x5d,0xcf,0x0b, +0xa9,0x5c,0xaa,0x90,0x2a,0xa5,0xe9,0xd2,0x4c,0x69,0x99,0xf4,0x17,0xfb,0xd8,0x0e, +0x1d,0x07,0xa9,0x4e,0xaa,0x97,0x52,0x3b,0xf5,0xb3,0xfe,0x44,0x5f,0x57,0x4a,0xed, +0xd6,0x6d,0x4a,0x9b,0x24,0x5b,0x90,0x5a,0x2e,0xd5,0x49,0xf5,0xd2,0x42,0xa9,0xc9, +0x96,0xa6,0xee,0x49,0xa7,0xae,0x95,0xd6,0x4a,0xf5,0x7b,0xf5,0xb5,0xa5,0x6b,0xa4, +0x46,0x69,0xa1,0xd4,0x24,0x35,0x4b,0xeb,0x6d,0xa1,0xd8,0xbe,0x74,0xea,0x8e,0x7d, +0x49,0xfe,0x3d,0xb7,0xf8,0xf7,0xc1,0x82,0x54,0xcd,0xaf,0x12,0xbf,0xda,0xbc,0x6a, +0xf3,0xa7,0xcd,0xa8,0x4d,0xa7,0xba,0xea,0xbf,0x54,0x5d,0x13,0xf3,0x24,0x95,0x98, +0x11,0xd9,0x83,0x78,0xd4,0x47,0x27,0xff,0xc5,0x6b,0xf5,0xa8,0x6d,0x5d,0xf1,0x89, +0xd2,0xc9,0x79,0x1e,0x75,0x05,0xcc,0x6d,0xf3,0xa8,0x6b,0xc8,0xcb,0xd7,0x93,0x97, +0x9f,0x25,0xdd,0x84,0x47,0xbd,0x38,0x78,0xd4,0xf7,0x27,0xa7,0xb1,0x39,0x8f,0xfa, +0x11,0x3c,0xea,0xe5,0xd2,0x0a,0x69,0x65,0xf0,0xa8,0x9f,0x0c,0x1e,0xf5,0x6a,0x32, +0xf6,0x6f,0x90,0xb1,0x37,0x8f,0x5a,0xdf,0x5e,0xea,0xbf,0xc8,0xcc,0xaf,0x23,0x33, +0xbf,0x91,0xcc,0xfc,0x56,0x3c,0xea,0x96,0x82,0x84,0xb1,0x6d,0x79,0xf9,0xef,0x93, +0x93,0xff,0x61,0xf0,0xa8,0x6f,0x0e,0x1e,0xb5,0x67,0xe3,0xef,0x25,0x0f,0x6f,0x1e, +0xf5,0xec,0x8c,0xce,0xe7,0xc9,0xc3,0x5b,0x16,0x7e,0x1e,0x1e,0xf5,0xed,0x78,0xd4, +0xcf,0xe4,0x79,0xd4,0xcf,0xe1,0x51,0xaf,0x09,0x1e,0xb5,0x65,0xe5,0x77,0x49,0x85, +0x45,0xfa,0x3f,0x00,0x1e,0x75,0x69,0x9e,0x47,0xdd,0x0d,0x76,0xf6,0x31,0x64,0xe7, +0xa7,0xc2,0xc8,0x36,0x8f,0xfa,0xf2,0xc0,0xc9,0x7e,0x1d,0x26,0xb6,0x7b,0xd4,0x7f, +0x22,0x4b,0xbf,0x05,0x8f,0x7a,0x2b,0x99,0x7a,0xe3,0x60,0x77,0x09,0xdc,0xeb,0x0a, +0x58,0xd7,0xf7,0x07,0xc6,0xf5,0xfb,0xf0,0xac,0x2d,0x43,0xbf,0x27,0x78,0xd4,0xdd, +0x03,0xbf,0xda,0xb9,0xd5,0xce,0xab,0x36,0x4e,0xf5,0x68,0x72,0xf4,0x53,0xf0,0xa8, +0x2d,0x4b,0xff,0x98,0xf4,0x02,0xfc,0xe9,0x77,0xe1,0x4f,0x9f,0x96,0xe7,0x51,0xd7, +0xc0,0x95,0x76,0xa6,0x74,0x1d,0xfc,0xe8,0x0b,0xe1,0x46,0x3b,0x23,0x7a,0x0e,0x39, +0xfa,0x85,0xe4,0xe7,0x3d,0x3b,0xef,0x0c,0xe8,0x66,0x78,0xcf,0x2f,0x06,0xce,0xb3, +0x7b,0xd4,0x6f,0x93,0x9d,0x7f,0x8f,0xec,0xfc,0x4e,0x69,0x2f,0x1e,0xf5,0x01,0x3c, +0x6a,0x67,0x38,0x97,0x92,0xa3,0xef,0x47,0x7e,0xbe,0x8a,0xdc,0xbc,0x33,0x9a,0x6b, +0xe0,0x32,0x8f,0x0f,0x3c,0x66,0xcf,0xd1,0xcf,0x80,0xbd,0xdc,0x10,0x3c,0x6a,0x67, +0x2e,0x2f,0x20,0x4f,0xff,0x10,0x39,0xfa,0x95,0x81,0xab,0xdc,0x0c,0x43,0xd9,0xf9, +0xc9,0x2f,0x07,0x8f,0x7a,0x33,0x9c,0xe4,0x6d,0xc1,0xa3,0x76,0x3e,0x72,0x27,0xb2, +0xf5,0xe5,0x64,0xea,0x2b,0xc9,0xd2,0x3b,0xff,0x78,0x74,0xf0,0xa8,0xc7,0xc2,0x37, +0x76,0xb6,0xb1,0x33,0x8d,0xcf,0x27,0x5f,0x6f,0x0c,0xe3,0xab,0x83,0x47,0x3d,0x9f, +0x5c,0xfd,0x9d,0x21,0x4f,0xbf,0x98,0x0c,0xfd,0x2f,0xc9,0xce,0x3b,0x87,0xf8,0x39, +0xd8,0xc3,0x2f,0xe7,0x79,0xd4,0x3b,0xa4,0x4f,0xf3,0x3c,0x6a,0x67,0x0d,0x77,0x26, +0x67,0xdf,0x2f,0xe4,0xeb,0x6b,0x60,0x08,0x8f,0x87,0x1d,0x3c,0x89,0xac,0xfd,0x85, +0x30,0x82,0x67,0xe0,0x51,0xcf,0x0a,0x8c,0xe0,0xdb,0xc8,0xd9,0x3f,0x44,0xbe,0xde, +0x19,0xc0,0xbf,0x81,0xeb,0xfb,0x12,0x3c,0xdf,0x3f,0xe0,0x51,0x6f,0x86,0xdf,0xfb, +0x11,0x39,0xfb,0x34,0x39,0xfb,0x72,0xf2,0xf5,0x23,0xe1,0xf0,0x8e,0x85,0xbf,0xeb, +0xec,0xdd,0x5a,0xf2,0xf5,0x17,0x05,0x9e,0xee,0x1c,0x32,0xf6,0x2b,0x42,0xb6,0xde, +0x99,0xb9,0xaf,0x04,0x4e,0xee,0x46,0xd8,0xb8,0xbb,0xba,0xb4,0x31,0x71,0xab,0xe0, +0xe0,0x8e,0x21,0x67,0x6f,0xec,0xdb,0x29,0x21,0x6b,0x3f,0x3f,0xe4,0xeb,0x9d,0x6f, +0xbb,0x32,0x30,0x6d,0x3d,0x53,0xbf,0x16,0x7e,0xad,0x65,0xea,0x7b,0xc0,0xac,0xad, +0x3e,0x88,0x47,0x3d,0x8a,0xac,0xfd,0xe5,0x81,0x4d,0x7b,0x13,0x1e,0xf5,0x5c,0x72, +0xf7,0x3f,0x83,0x43,0xbb,0x06,0x8f,0xfa,0x65,0xe9,0xcd,0x6e,0x09,0x83,0xd6,0xf9, +0xb3,0xce,0x9d,0x1d,0x0e,0x6b,0x76,0x34,0x2c,0xd9,0xc9,0x64,0xf3,0xeb,0xc9,0xe2, +0x37,0x04,0x26,0xec,0x4d,0x70,0x60,0x9d,0x01,0xeb,0x8c,0xd7,0x35,0xc1,0xa3,0x1e, +0x4f,0xe6,0xde,0xf3,0xf6,0xe7,0x93,0xb1,0x5f,0x40,0xb6,0xfe,0xf1,0x90,0xa9,0x5f, +0x43,0x8e,0xbe,0x9c,0xfc,0xfc,0x3f,0xc3,0x5d,0xbd,0x9e,0xfc,0xfc,0x5d,0xe4,0xe7, +0x0f,0xe0,0x51,0x5b,0x66,0xbe,0x91,0xcc,0xfc,0x22,0x32,0xf2,0x9d,0xc9,0xc8,0x1f, +0x46,0x46,0xde,0xb8,0xa9,0x43,0xc8,0xc9,0x9f,0x43,0x4e,0x7e,0x26,0x9c,0xd4,0x95, +0x81,0x8f,0xfa,0x4c,0x60,0xa2,0xbe,0x08,0x07,0xf5,0xcd,0x3c,0x8f,0xda,0xd8,0xa7, +0x7b,0xa4,0x52,0xf8,0xa7,0x5d,0xe1,0x9e,0x5e,0x43,0x7e,0xfe,0x47,0x81,0x6b,0xfa, +0x4b,0x32,0xf3,0x3d,0x61,0x98,0x9e,0x04,0xbb,0x74,0x40,0x60,0x96,0x0e,0x83,0x53, +0x6a,0x1e,0xf5,0x38,0x32,0xf5,0x0d,0x64,0xe9,0x7f,0x0b,0x8b,0xb4,0xe5,0xc8,0x24, +0x4b,0x7f,0x44,0x60,0x90,0x9e,0x1b,0x3c,0xea,0x0b,0xf2,0x3c,0xea,0x8b,0x61,0x8a, +0x5e,0x11,0x58,0xa2,0xf3,0xe0,0x87,0x2e,0x93,0x9a,0x8f,0x4a,0x18,0xa1,0x55,0xc1, +0xa3,0x1e,0x1e,0x3c,0x6a,0xe7,0x7f,0x7e,0x5d,0x9a,0x0e,0xe7,0xf3,0x7a,0x38,0x9f, +0xf7,0xc2,0xf3,0x7c,0x30,0x70,0x3c,0x97,0x05,0x56,0xe7,0xff,0xc1,0xe7,0xfc,0x30, +0x78,0xd4,0xdb,0x61,0x71,0x0e,0x80,0xbd,0x39,0x18,0xe6,0xa6,0xf1,0x36,0x6f,0x21, +0xbf,0xff,0x02,0xfc,0xcc,0x0d,0x81,0x9f,0xb9,0x25,0x30,0x33,0x9d,0x95,0xb9,0x3b, +0x70,0x31,0x2d,0x9f,0xbf,0x07,0xce,0x65,0x77,0xf2,0xf9,0xe3,0xc8,0xe5,0x7f,0x33, +0xcf,0xa3,0xfe,0x21,0xf9,0xfb,0xa7,0x83,0x47,0xfd,0x2c,0xd9,0x7b,0xcb,0xdd,0xaf, +0x23,0x77,0x6f,0x99,0xfb,0x8d,0x64,0xee,0x3f,0x22,0x73,0x6f,0x79,0xfb,0xcf,0xa4, +0x52,0x98,0x95,0xee,0x51,0xf7,0xfd,0x0a,0x1e,0x75,0xb5,0x74,0x06,0x1e,0xf5,0x05, +0x78,0xd4,0x17,0x77,0xe0,0x51,0xcf,0x08,0x1e,0xf5,0x0f,0xa4,0xeb,0xa4,0x59,0x78, +0xd4,0xf3,0xa4,0x5b,0xa5,0xdb,0xc9,0xf8,0xaf,0x86,0x7d,0x99,0xc6,0xa3,0x2e,0xc2, +0xa3,0x2e,0x21,0xeb,0x7f,0x58,0xc8,0xfa,0x5b,0xc6,0xbf,0xf7,0x17,0x78,0xd4,0x9e, +0xf1,0xb7,0x2c,0xff,0x08,0xb2,0xfc,0x63,0xc9,0xf2,0x4f,0x90,0x6a,0xa5,0xa9,0x64, +0xf7,0x6f,0x95,0x0e,0x39,0xa1,0xcd,0xa3,0x1e,0xdc,0x5b,0xe7,0x7e,0xd2,0x1d,0x78, +0xd4,0x27,0xf5,0xd1,0x79,0x87,0x34,0x57,0xfa,0xb9,0xf4,0x57,0xe9,0xe1,0x93,0x12, +0x8f,0xba,0xa5,0xaf,0xd4,0x4f,0x8f,0x25,0x9d,0x50,0xde,0x29,0xb5,0x48,0x03,0x75, +0x62,0x79,0x01,0xf9,0xff,0xf7,0xc9,0xff,0x6f,0x27,0xff,0xdf,0x72,0x4a,0x5b,0xfe, +0xff,0x54,0x32,0xff,0x33,0xf1,0xa8,0x7f,0x4a,0xd6,0xff,0x51,0x32,0xfe,0xab,0xc8, +0xf6,0xff,0x9e,0x4c,0xff,0x3b,0xb0,0x2c,0xcf,0x1e,0xa8,0xc7,0xbc,0xb4,0x53,0x7a, +0x5d,0x27,0xaf,0xfb,0xf0,0xa8,0x33,0x64,0xfb,0x7b,0x91,0xed,0x3f,0x15,0x96,0x65, +0x25,0x19,0xff,0xa1,0x64,0xfa,0xc7,0x90,0xe9,0xbf,0x9b,0x4c,0xff,0x62,0x3c,0x6a, +0xe7,0x54,0x5a,0x7e,0xbf,0x82,0xdc,0xbe,0x65,0xf6,0xdf,0x93,0x8e,0x19,0xa4,0xe7, +0xbb,0x54,0x2b,0x4d,0x95,0xae,0x93,0x66,0x49,0x4d,0xd2,0x6a,0xe9,0x25,0x69,0x9d, +0x74,0x55,0x95,0x8e,0x9d,0xf4,0xb6,0xb4,0x51,0xfa,0x0c,0x8f,0xda,0xb2,0xfe,0x2d, +0xd2,0xfe,0xc5,0x49,0xbe,0xff,0xbf,0x7f,0x91,0xe4,0xf8,0xbb,0x91,0xdf,0xb7,0xcc, +0xfe,0x15,0x78,0xd4,0xce,0x9f,0xbc,0x07,0xd6,0xe4,0x47,0xb0,0x25,0x77,0x4b,0xc7, +0x87,0x5c,0xfe,0x6a,0xe9,0x77,0x81,0x03,0xe9,0xfc,0x47,0xe7,0x3e,0xf6,0x09,0x8c, +0xc7,0x01,0x78,0xd4,0x43,0xa5,0xd3,0xc8,0xda,0x5f,0x0d,0xd3,0x71,0x0d,0x2c,0xc7, +0xed,0x81,0xd9,0x78,0x22,0x7c,0xc6,0x33,0xe1,0x32,0x9e,0x43,0xce,0x7e,0x76,0xe0, +0x2f,0x3e,0x0e,0x73,0xf1,0x29,0x58,0x8b,0x6b,0x61,0x2b,0x3a,0x57,0xd1,0x72,0xf6, +0xfd,0xe0,0x25,0x56,0xc2,0x49,0xac,0x86,0x8f,0xe8,0x6c,0xc4,0xaf,0x07,0x8f,0x7a, +0x72,0x60,0x1c,0x2e,0x0f,0x1e,0xf5,0x63,0x64,0xec,0x9f,0x24,0x63,0xbf,0x3a,0xcf, +0xa3,0xfe,0x00,0x16,0xa1,0xf3,0x06,0x8b,0xc8,0xd0,0x1f,0x4e,0x76,0x7e,0x20,0xd9, +0xf8,0x6f,0x07,0x56,0xa0,0x33,0x02,0x9d,0x09,0x68,0x2c,0xc0,0xfb,0xc8,0xc8,0x5b, +0x3e,0xfe,0x3b,0xe4,0xe2,0x8b,0x42,0x1e,0xbe,0x27,0x59,0xf8,0xfe,0x64,0xe1,0x3d, +0x07,0x7f,0x3a,0xd9,0xf7,0x5a,0xe9,0x59,0x72,0xef,0x63,0xc8,0xbd,0x5b,0xe6,0x7d, +0x3f,0x1e,0xb5,0x71,0xfc,0x8e,0x84,0xe3,0x57,0x7b,0x10,0x8f,0xfa,0x02,0x3c,0xea, +0x0b,0xa5,0x8b,0xa4,0x4b,0xf0,0xa8,0xa7,0xe3,0x51,0x37,0x90,0x97,0x37,0x8f,0xba, +0xa0,0x45,0x3f,0x73,0xa9,0x34,0xcf,0xa3,0xee,0x06,0x03,0xd0,0x3c,0xea,0x5e,0xe4, +0xea,0x6b,0x02,0xff,0x6f,0x15,0x99,0xf9,0x75,0x64,0xe5,0x2d,0x27,0xbf,0x59,0xfa, +0x93,0xf4,0x17,0xe9,0x6f,0xd2,0x01,0xfb,0x9a,0x64,0xe6,0x87,0x93,0x95,0x9f,0x40, +0x46,0x7e,0x6f,0x9e,0x47,0x5d,0x25,0x8d,0x91,0x6e,0x93,0x6e,0x97,0x16,0xe1,0x51, +0xef,0xc7,0xa3,0x5e,0x14,0x98,0x7e,0xfb,0xa4,0xde,0x64,0xe4,0xbf,0x0f,0xab,0xef, +0x1e,0xb2,0xf1,0x96,0x87,0xbf,0x07,0x0e,0xdf,0x06,0xf2,0xef,0x7d,0xc9,0xbd,0x9b, +0x47,0x3d,0x84,0xac,0xba,0xe5,0xd4,0x3d,0x8b,0x3e,0x38,0xe4,0xcf,0xcf,0x25,0x6b, +0xbe,0x9c,0xac,0xb9,0xe5,0xcc,0x8f,0x2e,0x49,0x3c,0xea,0xd3,0xf0,0xa8,0x2d,0x5b, +0xbe,0x8e,0x5c,0x79,0x27,0x58,0x76,0xdd,0xc8,0x96,0xf7,0x20,0x53,0xee,0xdc,0xba, +0xf1,0xd2,0x79,0xd2,0x62,0xb2,0xe4,0xc6,0xa7,0xfb,0xa4,0x34,0xc9,0x93,0x8f,0x21, +0x4f,0x7e,0x05,0x39,0xf2,0x45,0xd2,0xf2,0xb2,0x24,0x4b,0xfe,0x9f,0x64,0xc8,0x5b, +0x3a,0x27,0x19,0xf2,0xbe,0xb0,0xe8,0x66,0x91,0x0d,0x7f,0x04,0x8f,0xda,0xf2,0xe1, +0x7d,0xc9,0x7d,0x1b,0x13,0x6e,0xb2,0xf4,0x52,0xe0,0xbf,0xa5,0xc9,0x7c,0x1b,0xe7, +0x6d,0x82,0x34,0x0d,0xd6,0xdb,0x8d,0x30,0xdb,0x9e,0x80,0xd5,0x66,0x9c,0xb6,0x67, +0xf1,0xa8,0xb7,0xc0,0x67,0x2b,0x20,0x07,0xee,0x4c,0xb6,0x6a,0x72,0xe0,0x57,0x04, +0xce,0xda,0x8d,0xb0,0xd4,0x8c,0xa3,0xf6,0x62,0xe0,0xa6,0x99,0x47,0xbd,0x51,0xda, +0x75,0x48,0x92,0x01,0x1f,0x08,0x0b,0xad,0x2a,0x78,0xd4,0xc6,0x3e,0x1b,0x85,0x47, +0xed,0x79,0xf0,0x05,0x64,0xc0,0x97,0x06,0xa6,0xd9,0xbb,0x70,0xcc,0x8c,0x61,0x96, +0x86,0x5d,0xd6,0x99,0x2c,0x78,0x3f,0x32,0xe0,0x55,0x64,0xbf,0x47,0x06,0x26,0xd9, +0x58,0x38,0x64,0x13,0x82,0x47,0x7d,0x11,0xac,0x31,0xe3,0x8c,0x0d,0x85,0xe3,0x75, +0x7a,0xe0,0x77,0x99,0x47,0x3d,0x25,0x78,0xd4,0x17,0xc2,0xe6,0x7a,0x32,0x78,0xd4, +0xab,0x02,0x87,0xeb,0x79,0x32,0xdf,0xc6,0xdb,0x5a,0x01,0x5f,0xeb,0xa9,0xc0,0xd5, +0x6a,0x26,0x03,0x6e,0x1c,0xad,0x41,0x70,0xb3,0x46,0x06,0x8f,0xda,0x39,0x59,0xc6, +0xc7,0xba,0x3c,0xf0,0xb1,0xdc,0xa3,0x5e,0x1e,0x58,0x58,0xee,0x51,0x1b,0xfb,0xea, +0x28,0xd8,0x56,0xc7,0x07,0xa6,0x95,0xb1,0xac,0xc6,0xf4,0x48,0x98,0x55,0xce,0xab, +0x1a,0x8e,0x47,0xbd,0x23,0x64,0xc8,0x0f,0x25,0x37,0x3e,0x18,0xfe,0xd4,0xc8,0xe0, +0x51,0x3b,0x57,0xea,0x4c,0x98,0x52,0x0f,0xc2,0x90,0x7a,0x03,0x76,0x94,0x73,0xa3, +0x9c,0x0f,0x55,0x24,0x65,0xe1,0x43,0x0d,0x82,0x0b,0x35,0x1c,0x0e,0xd4,0x99,0xc1, +0xa3,0x9e,0x04,0xfb,0x69,0x0a,0x99,0x72,0xe7,0x3d,0x19,0xe7,0xe9,0x3f,0xc8,0x95, +0x67,0xe1,0x31,0x0d,0x81,0xc3,0x34,0x4e,0xba,0x9c,0x2c,0xb9,0x73,0x96,0x9c,0xaf, +0xe4,0x5c,0x25,0xe3,0x29,0x15,0x91,0x2f,0xaf,0x0c,0xfc,0xa4,0x51,0x81,0x99,0x74, +0x16,0x9c,0xa4,0x69,0xe4,0xcc,0x6f,0x87,0x87,0x74,0x47,0x07,0x1e,0xb5,0x71,0x8f, +0x76,0xc0,0x33,0xfa,0x14,0x8f,0xfa,0x35,0xe9,0x8f,0xd2,0x26,0x69,0xfb,0x71,0x49, +0xa6,0xdc,0xf2,0xe4,0x0d,0xe4,0xc9,0x07,0x56,0xeb,0xfb,0xae,0x4e,0x32,0xe3,0xc3, +0xc8,0x88,0x1b,0x07,0x68,0x06,0xf9,0xf0,0x5d,0x78,0xd4,0x15,0xf0,0x7e,0xc6,0xc1, +0xf9,0xb9,0x90,0x9c,0xb8,0x65,0xc4,0xef,0xfe,0x6e,0x1b,0xab,0x67,0x2e,0x5c,0x9e, +0xc5,0xe4,0xbd,0xa3,0x47,0x6d,0x1c,0x9e,0xdd,0x73,0x93,0x9c,0x77,0x76,0x41,0x3a, +0xd5,0x93,0xcc,0xf6,0xa5,0x64,0xb4,0xa7,0x93,0xcd,0xbe,0x85,0x4c,0xf6,0x22,0x18, +0x39,0xe6,0x51,0xdf,0x27,0x7d,0xbc,0x5e,0x8f,0x15,0xb8,0x38,0x97,0xc1,0xc3,0xb9, +0x16,0x1e,0xce,0x4d,0xf0,0x70,0x96,0xc2,0xc3,0xd9,0x22,0x9d,0x0e,0x13,0xc7,0x3c, +0xea,0x9d,0xd2,0xa4,0x0d,0xe9,0xd4,0x35,0x1b,0x92,0x9c,0xf7,0xa2,0x90,0xef,0x7e, +0x80,0x4c,0xb7,0xe7,0xb9,0x9f,0x27,0xc3,0x5d,0x4a,0x76,0xfb,0x18,0x32,0xdb,0xa3, +0x43,0x56,0xbb,0x8e,0x7c,0xf6,0x9b,0x78,0xd4,0x96,0xc5,0xee,0x4e,0x06,0xbb,0x96, +0xec,0xf5,0x3c,0x32,0xd7,0xcf,0x93,0xb9,0x36,0x4e,0x4d,0xcb,0xff,0x26,0x9c,0x9a, +0xe1,0x70,0x6a,0x1a,0xf0,0xa8,0xe7,0xe0,0x51,0xdf,0x0a,0xa7,0xc6,0x18,0x35,0x45, +0xb0,0x67,0x8e,0x87,0x39,0x63,0xbc,0x99,0x53,0xe0,0xca,0x8c,0x82,0x27,0x53,0xbb, +0x39,0xc9,0x5f,0x7f,0x04,0x2f,0xc6,0x3c,0x6a,0xcb,0x43,0xaf,0x83,0xbb,0x72,0x46, +0xe0,0xad,0x18,0x67,0x65,0xaa,0xf4,0xd8,0x87,0xfa,0xfb,0x5b,0x93,0x7c,0xf4,0x71, +0x21,0x17,0xdd,0x97,0x2c,0xf4,0xd0,0x2f,0xf0,0xa8,0x6b,0x43,0xce,0xb9,0x23,0x8f, +0xda,0xb3,0xcc,0xd3,0xc9,0x2f,0x5f,0x1d,0x72,0xcb,0xf3,0xc8,0x2a,0xdf,0x47,0x46, +0xd9,0xf2,0xc9,0xdb,0xa5,0x01,0xdb,0xd2,0xa9,0x7f,0x93,0x1e,0x95,0x56,0x4b,0xeb, +0xa4,0x8f,0xa5,0xd2,0xed,0xfa,0xb7,0x49,0x1a,0x88,0x47,0x7d,0x99,0x34,0x43,0x7a, +0x04,0x8f,0xba,0x60,0x87,0xee,0xa3,0x34,0x5e,0x9a,0x28,0x4d,0x93,0xde,0xf8,0x24, +0x9d,0xfa,0x50,0xda,0x2f,0x5d,0xb9,0x3b,0x9d,0xfa,0x1f,0xe9,0x03,0xa9,0xec,0x53, +0x7d,0x1f,0xd2,0x64,0x69,0xae,0xb4,0x4c,0x5a,0x21,0x5d,0xb3,0x47,0x3f,0x1b,0xe9, +0x9c,0xbd,0x69,0x9d,0xf3,0xe8,0xe7,0x21,0x5d,0x2b,0xfd,0x48,0x7a,0x48,0x7a,0x42, +0x7a,0x4e,0xfa,0x83,0xf4,0x93,0x7d,0xe9,0xd4,0xef,0xe0,0xb3,0xbc,0xfd,0x40,0x41, +0xaa,0xfa,0x57,0x49,0xa6,0xfa,0x5e,0xb2,0xd4,0x96,0x9f,0xb6,0xec,0xb4,0x79,0xd4, +0x37,0xa4,0x12,0xfe,0xca,0x81,0x96,0x6e,0x52,0x79,0x2a,0x7d,0x78,0xf7,0xc3,0x3b, +0x77,0x4f,0xeb,0x55,0xa6,0x2c,0xd3,0xa9,0xa0,0x53,0x41,0x61,0x41,0xa6,0x48,0x2f, +0xe9,0xee,0xe9,0x02,0x5d,0xa3,0x77,0x32,0x65,0x85,0x7a,0x53,0x58,0x94,0x69,0xff, +0x92,0xd5,0x2b,0xde,0x2f,0xb2,0x77,0xb2,0xf6,0x3a,0x53,0x96,0x2d,0xf6,0x97,0xe2, +0xd2,0x4c,0x49,0x59,0x49,0x41,0x49,0x26,0x5b,0x52,0x92,0x2d,0x2d,0x2b,0x2d,0xc9, +0xea,0x8d,0xfe,0x90,0x95,0x0a,0x4b,0xec,0x4f,0x7a,0xd1,0xe7,0x65,0x8a,0xc3,0xdf, +0xc9,0x16,0x97,0xd8,0x67,0x67,0x8b,0xda,0xbf,0x24,0x97,0xdc,0x7b,0xd9,0xe4,0xbd, +0x32,0xbd,0x64,0xfd,0x03,0xf6,0x91,0x6c,0xee,0x4f,0x79,0x9f,0x9e,0x7c,0x7e,0x36, +0x7e,0x2e,0x9f,0xd1,0xfa,0xd9,0x6d,0x97,0x2c,0xd2,0xb7,0xed,0x1f,0xc8,0x7d,0xdd, +0xdc,0xb5,0x99,0xd6,0x6b,0x5a,0x95,0x0d,0x77,0xa9,0xf5,0x2b,0x65,0xb9,0x25,0xbd, +0x2d,0x6b,0x7f,0xc7,0x8b,0xda,0xee,0x5f,0x36,0xd3,0xfa,0x5e,0x36,0x5e,0xdd,0xe1, +0x77,0x5d,0xd4,0xfe,0x2e,0xe6,0x8e,0x7a,0xe7,0xdc,0x51,0x8f,0x37,0x9e,0xbc,0xd8, +0x4d,0x66,0x32,0xd9,0x74,0xb8,0xcd,0xe4,0xe3,0x99,0xdc,0x4f,0x29,0xf7,0x5d,0xb4, +0xde,0x2c,0x77,0x35,0x1b,0x6e,0xb0,0x83,0xfb,0x90,0xf5,0x23,0x1e,0xaf,0x8b,0xf7, +0x2d,0x93,0xdc,0x25,0xde,0x76,0x4e,0x17,0x15,0x67,0x3a,0x77,0xef,0x51,0xde,0xad, +0x6b,0x97,0x82,0xb2,0x4c,0x81,0xae,0x38,0xec,0x90,0xaf,0x1d,0x9a,0x2e,0x2c,0x2a, +0xec,0x94,0xc9,0xa9,0x2c,0x9b,0xc9,0x7f,0x2c,0xe9,0x7e,0xb7,0xbe,0x9f,0xe9,0x54, +0x96,0xbc,0xf5,0x87,0x5c,0xee,0xae,0xdb,0x1d,0xcf,0xb4,0xfe,0x00,0x38,0x18,0x19, +0xbb,0x74,0xce,0xf0,0xc1,0xdc,0xdb,0xf0,0x80,0xfc,0xfc,0x4b,0xf2,0x4a,0x8f,0xbf, +0xe4,0x30,0x64,0x5a,0x0f,0x62,0xee,0x4f,0xd9,0xdc,0xbd,0xe8,0xe0,0x60,0xe4,0x1d, +0xe3,0xa2,0x0e,0x8f,0x4f,0xdb,0xb1,0xe5,0xa2,0x87,0x72,0xa7,0xe2,0xdc,0xa5,0xa4, +0x24,0xa3,0x07,0x75,0xc6,0x6e,0xb7,0x20,0xf7,0xa2,0x27,0x9a,0x9e,0x29,0xba,0x32, +0xdd,0xfe,0x39,0x97,0xfb,0x7b,0x65,0xba,0x2e,0xd3,0x76,0x6c,0x73,0x77,0x3a,0xf7, +0xe0,0xcb,0x16,0xb6,0xfb,0xee,0x73,0xb7,0xd1,0x76,0xc9,0xe4,0x5e,0xeb,0xd1,0x9a, +0x7b,0x9d,0x7b,0xdf,0xaf,0xcc,0xdd,0x87,0x6c,0x69,0xa9,0x5d,0x53,0x6c,0xcf,0xb9, +0x62,0xbe,0xfd,0x6c,0xfb,0x1f,0x6e,0xfb,0x47,0x5e,0xbb,0x07,0xe1,0xe7,0x9e,0x85, +0x45,0xf1,0x81,0x93,0x7f,0xb0,0xda,0x1d,0x9f,0xcc,0xe7,0x3e,0x14,0x8f,0x52,0xdb, +0xcd,0x1d,0xec,0xf1,0x17,0x9e,0xaa,0x7c,0x91,0x6c,0xb6,0xfd,0xdd,0xf6,0x27,0x6d, +0xde,0x13,0xa5,0xdd,0xfd,0xcd,0xe4,0x1d,0xb9,0x6c,0x51,0xf2,0x1c,0x49,0xfb,0x0f, +0xdf,0x0f,0x7f,0xfe,0xa5,0xed,0xd1,0x53,0xd8,0x76,0xaf,0x92,0x4b,0xeb,0xaf,0xa2, +0xe2,0xe4,0x77,0x97,0xfd,0xea,0xfa,0xb2,0x4b,0x26,0xb9,0x14,0x66,0xc2,0xaf,0xce, +0x83,0x5e,0x0a,0xb9,0x0f,0x69,0xdd,0xcb,0xa2,0x54,0xdb,0x4e,0xdb,0x39,0xcc,0xcd, +0xbe,0xea,0x2e,0x59,0xdf,0x1d,0xeb,0x3b,0x62,0x7d,0x27,0x6c,0xfe,0x0e,0xd8,0xfc, +0xdd,0xaf,0xbe,0xd3,0xd5,0x77,0xb9,0xfa,0x0e,0x57,0xdf,0xd5,0xea,0xbb,0x59,0x7d, +0x27,0xab,0xef,0x62,0xf5,0x1d,0xac,0xbe,0x7b,0xd5,0x77,0xae,0x6e,0x08,0x3b,0x54, +0xbd,0x63,0x31,0x92,0xdd,0xa8,0xb5,0x61,0xe7,0xa9,0xef,0x3a,0xf5,0x79,0x95,0xef, +0x26,0x5d,0xd5,0xc1,0x2e,0xd2,0xb5,0x61,0xf7,0xa8,0xef,0x1a,0xfd,0x2c,0xaf,0x2f, +0x11,0x77,0x82,0x7e,0xd1,0x2e,0x50,0xdf,0xf9,0x19,0x77,0x7d,0xce,0x09,0x3b,0x3b, +0x57,0x85,0x1d,0x9d,0xb1,0x03,0xe1,0x3b,0x38,0xf7,0xe6,0xcd,0x94,0x46,0x86,0xf9, +0x51,0xfe,0x6e,0xcc,0xd8,0x6f,0xf0,0xdd,0x97,0xbe,0xeb,0x72,0x55,0x07,0xbb,0x28, +0xd7,0x86,0xdd,0x93,0x29,0x66,0x3f,0xa3,0xbf,0x64,0x57,0xa4,0xef,0x84,0xbc,0x91, +0xdd,0x8f,0xbe,0xd3,0x71,0x55,0xd8,0xdd,0xe8,0x3b,0x1b,0xe3,0xae,0x46,0xdf,0xcd, +0x98,0x62,0xf7,0xa2,0xef,0x58,0x1c,0xdd,0xc1,0x4e,0xc5,0x09,0x61,0x77,0xa2,0xef, +0x4c,0xf4,0x99,0x4e,0xdc,0x79,0xd8,0xd1,0xae,0x43,0xdf,0x71,0xe8,0xbb,0x0d,0x7d, +0xa7,0xa1,0xef,0x30,0xf4,0x5d,0x84,0xbe,0x83,0xf0,0x45,0xe6,0x34,0xbe,0x53,0xf0, +0xcb,0x76,0x09,0x7e,0x2f,0x6f,0x57,0xe0,0xc1,0x76,0x04,0x0e,0x60,0xf6,0x32,0x89, +0xd9,0x8b,0xef,0xee,0xf3,0x9d,0x7d,0xbe,0xab,0xcf,0x77,0xf4,0xcd,0x66,0xf6,0xe2, +0x3b,0xf7,0xee,0x66,0x06,0xe3,0x3b,0xeb,0x7c,0xb7,0xdc,0x20,0x66,0x21,0xbe,0x3b, +0xce,0x77,0xc5,0x3d,0xc6,0xac,0xc3,0x77,0xbc,0xf9,0x6e,0x37,0x67,0x01,0xf9,0x8e, +0xb6,0x5e,0x61,0xe7,0x9a,0xcd,0x2c,0x7a,0x84,0x59,0x84,0xcf,0x20,0xe2,0xee,0xb2, +0x26,0x66,0x0d,0x31,0x0f,0x3f,0x36,0x6f,0x77,0xd8,0x6c,0x66,0x0a,0xcb,0x98,0x1f, +0xd8,0x9c,0xa0,0x0f,0xf3,0x81,0xb8,0x53,0x6b,0x4b,0xd8,0x9d,0xb5,0x2b,0x6f,0x16, +0xd0,0xcc,0x1c,0x60,0x1f,0xb3,0x80,0xf5,0xf8,0xe3,0xbe,0x5b,0xc9,0x77,0x25,0xf9, +0x8e,0xa3,0x93,0xf1,0x7b,0x7d,0x27,0xd1,0x0c,0x3c,0x55,0xdf,0xe9,0xe3,0xbb,0x7b, +0x7c,0x57,0x8f,0xef,0xce,0xf1,0x9d,0x39,0xbe,0x2b,0xa7,0x77,0xde,0x4e,0x1c,0xdf, +0x85,0xf3,0x18,0x5e,0xa9,0xef,0xbc,0xf1,0xdd,0x36,0xbe,0xcb,0xe6,0x2c,0x7c,0xd2, +0x98,0xe3,0x6d,0x0e,0x3b,0x66,0xfa,0xe3,0x7d,0xfa,0x4e,0x18,0xf7,0x3d,0xaf,0x0b, +0x99,0xdc,0xa6,0xb0,0xbb,0xc5,0x77,0xb6,0xf8,0xae,0x16,0xdf,0xd1,0xf2,0x01,0x3b, +0x57,0xdc,0xef,0x7c,0x2f,0xec,0x38,0x31,0x2f,0xd3,0x77,0x92,0xe4,0xef,0x0e,0xf1, +0x5d,0x1b,0xbe,0x5b,0xc3,0x77,0x65,0x1c,0x6c,0xb7,0x43,0xfe,0x0e,0x07,0xdf,0xd1, +0xe0,0x3b,0x16,0x7c,0x27,0x82,0xef,0x34,0x48,0x85,0x4c,0xe5,0x99,0x21,0x4b,0xd9, +0x84,0x47,0xe5,0x3b,0x03,0xfa,0xe2,0x47,0xf9,0x2e,0x00,0x67,0xff,0x7b,0x66,0x72, +0x25,0x4c,0xff,0xdf,0xe6,0x79,0x52,0xa7,0xe4,0x31,0xf7,0x37,0xe2,0x2d,0xa5,0xf0, +0x95,0x9c,0x71,0x3f,0xfa,0x20,0x2c,0x7b,0x67,0xd8,0x1f,0x8c,0x5d,0x3f,0x18,0x0f, +0xc9,0x59,0xef,0x4d,0x78,0x44,0xcb,0x03,0x7b,0xbd,0x39,0xb0,0xd5,0x2b,0xf1,0x80, +0x1e,0xc6,0xdf,0x39,0x16,0x1f,0xe7,0x14,0xbc,0x9b,0x8e,0x58,0xe1,0xa3,0x03,0x13, +0xdc,0xfd,0x9a,0x57,0x02,0xe3,0x7b,0x53,0x60,0x78,0x3b,0xbb,0x3b,0x66,0x07,0x23, +0xa3,0x7b,0x22,0x9e,0xcc,0x7c,0xbc,0x98,0x8a,0xc0,0xc2,0x1e,0x93,0xc7,0xb8,0x36, +0xaf,0xe5,0xcb,0x18,0xd5,0xce,0xa6,0xee,0x88,0x3d,0x6d,0x1e,0xcb,0x4e,0x18,0xd1, +0xce,0x42,0x76,0x06,0xb2,0x33,0x8a,0xf3,0xd9,0xc4,0xf9,0x0c,0x62,0x67,0xfe,0x4e, +0xfb,0x7b,0x99,0xbe,0x7f,0x2f,0xdb,0xf6,0xab,0xb2,0x6b,0xf1,0x12,0x9c,0x39,0xeb, +0xac,0x56,0x67,0xb4,0x3a,0x43,0xf4,0xff,0x01, +}; +} // namespace ada::idna::table_blob +#endif +/* end file src/table_blob.inc */ + +#include +#include +#include +#include +#include + +namespace ada::idna { + +// table_blob.inc is packed little-endian (see scripts/pack_tables.py). After +// inflate the multi-byte sections must be converted to host endianness so +// big-endian platforms (s390x) can load uint16_t/uint32_t/uint64_t natively. +// CRC is checked on the raw little-endian payload before any conversion. +namespace detail { + +template +inline void bswap_inplace(T* data, size_t count) noexcept { + if constexpr (std::endian::native == std::endian::little) { + (void)data; + (void)count; + return; + } + for (size_t i = 0; i < count; ++i) { + if constexpr (sizeof(T) == 2) { +#if defined(__GNUC__) || defined(__clang__) + data[i] = + static_cast(__builtin_bswap16(static_cast(data[i]))); +#else + const auto v = static_cast(data[i]); + data[i] = static_cast(static_cast((v >> 8) | (v << 8))); +#endif + } else if constexpr (sizeof(T) == 4) { +#if defined(__GNUC__) || defined(__clang__) + data[i] = + static_cast(__builtin_bswap32(static_cast(data[i]))); +#else + auto v = static_cast(data[i]); + v = ((v & 0x000000FFu) << 24) | ((v & 0x0000FF00u) << 8) | + ((v & 0x00FF0000u) >> 8) | ((v & 0xFF000000u) >> 24); + data[i] = static_cast(v); +#endif + } else if constexpr (sizeof(T) == 8) { +#if defined(__GNUC__) || defined(__clang__) + data[i] = + static_cast(__builtin_bswap64(static_cast(data[i]))); +#else + auto v = static_cast(data[i]); + v = ((v & 0x00000000000000FFull) << 56) | + ((v & 0x000000000000FF00ull) << 40) | + ((v & 0x0000000000FF0000ull) << 24) | + ((v & 0x00000000FF000000ull) << 8) | + ((v & 0x000000FF00000000ull) >> 8) | + ((v & 0x0000FF0000000000ull) >> 24) | + ((v & 0x00FF000000000000ull) >> 40) | + ((v & 0xFF00000000000000ull) >> 56); + data[i] = static_cast(v); +#endif + } else { + static_assert(sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8); + } + } +} + +// Convert every multi-byte section of the inflated little-endian blob to host +// order. Single-byte sections are left unchanged. Safe no-op on little-endian. +inline void convert_table_blob_to_host_endian(uint8_t* buffer) noexcept { + if constexpr (std::endian::native == std::endian::little) { + (void)buffer; + return; + } + auto u16 = [&](size_t off, size_t count) { + bswap_inplace(reinterpret_cast(buffer + off), count); + }; + auto u32 = [&](size_t off, size_t count) { + bswap_inplace(reinterpret_cast(buffer + off), count); + }; + auto u64 = [&](size_t off, size_t count) { + bswap_inplace(reinterpret_cast(buffer + off), count); + }; + + u16(table_blob::off_idna_stage1, table_blob::count_idna_stage1); + u16(table_blob::off_idna_stage2, table_blob::count_idna_stage2); + u64(table_blob::off_idna_bool_blocks, table_blob::count_idna_bool_blocks); + u16(table_blob::off_decomposition_block, + table_blob::count_decomposition_block); + u32(table_blob::off_decomposition_data, table_blob::count_decomposition_data); + u16(table_blob::off_composition_block, table_blob::count_composition_block); + u32(table_blob::off_composition_data, table_blob::count_composition_data); + u32(table_blob::off_id_continue_flat, table_blob::count_id_continue_flat); + u32(table_blob::off_id_start_flat, table_blob::count_id_start_flat); + u32(table_blob::off_dir_start, table_blob::count_dir_start); + u32(table_blob::off_dir_final, table_blob::count_dir_final); + u32(table_blob::off_combining_flat, table_blob::count_combining_flat); +} + +} // namespace detail + +// --- Blob layout invariants -------------------------------------------------- +static_assert(table_blob::count_decomposition_index == 4352); +static_assert(table_blob::count_ccc_index == 4352); +static_assert(table_blob::count_composition_index == 4352); +static_assert(table_blob::count_decomposition_block == + table_blob::decomposition_block_rows * + table_blob::decomposition_block_cols); +static_assert(table_blob::count_ccc_block == + table_blob::ccc_block_rows * table_blob::ccc_block_cols); +static_assert(table_blob::count_composition_block == + table_blob::composition_block_rows * + table_blob::composition_block_cols); +static_assert(table_blob::count_dir_start == table_blob::dir_table_count && + table_blob::count_dir_final == table_blob::dir_table_count && + table_blob::count_dir_value == table_blob::dir_table_count); +static_assert(table_blob::count_id_continue_flat == + table_blob::id_continue_count * 2); +static_assert(table_blob::count_id_start_flat == + table_blob::id_start_count * 2); +static_assert(table_blob::count_combining_flat == + table_blob::combining_range_count * 2); +static_assert(table_blob::off_idna_stage1 % alignof(uint16_t) == 0); +static_assert(table_blob::off_idna_stage2 % alignof(uint16_t) == 0); +static_assert(table_blob::off_idna_bool_blocks % alignof(uint64_t) == 0); +static_assert(table_blob::off_decomposition_block % alignof(uint16_t) == 0); +static_assert(table_blob::off_decomposition_data % alignof(char32_t) == 0); +static_assert(table_blob::off_composition_block % alignof(uint16_t) == 0); +static_assert(table_blob::off_composition_data % alignof(char32_t) == 0); +static_assert(table_blob::off_id_continue_flat % alignof(uint32_t) == 0); +static_assert(table_blob::off_id_start_flat % alignof(uint32_t) == 0); +static_assert(table_blob::off_dir_start % alignof(uint32_t) == 0); +static_assert(table_blob::off_dir_final % alignof(uint32_t) == 0); +static_assert(table_blob::off_combining_flat % alignof(uint32_t) == 0); +static_assert(table_blob::compressed_size == sizeof(table_blob::compressed)); + +// Every section must lie entirely inside the uncompressed buffer. +#define ADA_IDNA_SECTION_IN_BOUNDS(off, count, width) \ + static_assert((off) + (count) * (width) <= table_blob::uncompressed_size, \ + #off " overflows uncompressed buffer") +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_stage1, + table_blob::count_idna_stage1, 2); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_stage2, + table_blob::count_idna_stage2, 2); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_bool_blocks, + table_blob::count_idna_bool_blocks, 8); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_idna_utf8_mappings, + table_blob::count_idna_utf8_mappings, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_index, + table_blob::count_decomposition_index, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_block, + table_blob::count_decomposition_block, 2); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_decomposition_data, + table_blob::count_decomposition_data, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_ccc_index, + table_blob::count_ccc_index, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_ccc_block, + table_blob::count_ccc_block, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_index, + table_blob::count_composition_index, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_block, + table_blob::count_composition_block, 2); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_composition_data, + table_blob::count_composition_data, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_id_continue_flat, + table_blob::count_id_continue_flat, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_id_start_flat, + table_blob::count_id_start_flat, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_start, + table_blob::count_dir_start, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_final, + table_blob::count_dir_final, 4); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_dir_value, + table_blob::count_dir_value, 1); +ADA_IDNA_SECTION_IN_BOUNDS(table_blob::off_combining_flat, + table_blob::count_combining_flat, 4); +#undef ADA_IDNA_SECTION_IN_BOUNDS + +// --- Mapping ----------------------------------------------------------------- +inline const uint16_t* idna_stage1 = nullptr; +inline const uint16_t* idna_stage2 = nullptr; +inline const uint64_t* idna_bool_blocks = nullptr; +inline const uint8_t* idna_utf8_mappings = nullptr; + +// --- Normalization (O(1) multi-stage) ---------------------------------------- +inline const uint8_t* decomposition_index = nullptr; +inline const uint16_t* decomposition_block_flat = nullptr; +inline const char32_t* decomposition_data = nullptr; +inline const uint8_t* ccc_index = nullptr; +inline const uint8_t* ccc_block_flat = nullptr; +inline const uint8_t* composition_index = nullptr; +inline const uint16_t* composition_block_flat = nullptr; +inline const char32_t* composition_data = nullptr; + +// --- Identifier -------------------------------------------------------------- +// Pointer-to-array alias. CF17 vs CF22 disagree on spacing inside (*)[2]. +// clang-format off +using range_pair_ptr = const uint32_t(*)[2]; +// clang-format on +inline range_pair_ptr id_continue = nullptr; +inline range_pair_ptr id_start = nullptr; + +// --- Validity (const SoA) ---------------------------------------------------- +inline const uint32_t* dir_start = nullptr; +inline const uint32_t* dir_final = nullptr; +inline const uint8_t* dir_value = nullptr; +inline range_pair_ptr combining_ranges = nullptr; + +inline constexpr size_t id_continue_count = table_blob::id_continue_count; +inline constexpr size_t id_start_count = table_blob::id_start_count; +inline constexpr size_t dir_table_count = table_blob::dir_table_count; +inline constexpr size_t combining_range_count = + table_blob::combining_range_count; +inline constexpr size_t idna_utf8_mappings_size = + table_blob::count_idna_utf8_mappings; +inline constexpr size_t decomposition_data_size = + table_blob::count_decomposition_data; +inline constexpr size_t composition_data_size = + table_blob::count_composition_data; + +inline constexpr size_t kDecompBlockCols = + table_blob::decomposition_block_cols; // 257 +inline constexpr size_t kCccBlockCols = table_blob::ccc_block_cols; // 256 +inline constexpr size_t kCompBlockCols = + table_blob::composition_block_cols; // 257 +inline constexpr size_t kDecompBlockRows = table_blob::decomposition_block_rows; +inline constexpr size_t kCccBlockRows = table_blob::ccc_block_rows; +inline constexpr size_t kCompBlockRows = table_blob::composition_block_rows; + +// Init state: 0=uninit, 1=in progress, 2=ready, 3=failed. +inline constexpr uint8_t kTablesUninit = 0; +inline constexpr uint8_t kTablesInProgress = 1; +inline constexpr uint8_t kTablesReady = 2; +inline constexpr uint8_t kTablesFailed = 3; + +inline std::atomic tables_init_state{kTablesUninit}; +// Process-lifetime allocation published only by the winning init thread. +// Never freed: shared read-only data for the process. Do not dlclose a DSO +// that owns this buffer while other code may still call into ada::idna. +inline uint8_t* tables_buffer = nullptr; + +// Cap spin-wait so a stuck peer cannot hang the process forever. +inline constexpr uint64_t kTablesSpinLimit = 1'000'000'000ull; + +// ISO HDLC / zlib CRC-32 of the uncompressed table payload. +[[nodiscard]] inline uint32_t crc32_ieee(const uint8_t* data, + size_t len) noexcept { + uint32_t c = 0xFFFFFFFFu; + for (size_t i = 0; i < len; ++i) { + c ^= data[i]; + for (int k = 0; k < 8; ++k) { + const uint32_t mask = 0u - (c & 1u); + c = (c >> 1) ^ (0xEDB88320u & mask); + } + } + return ~c; +} + +[[nodiscard]] inline bool tables_are_ready() noexcept { + return tables_init_state.load(std::memory_order_acquire) == kTablesReady; +} + +// Returns true only when all table pointers are safe to use. +[[nodiscard]] inline bool ensure_tables() noexcept { + uint8_t state = tables_init_state.load(std::memory_order_acquire); + if (state == kTablesReady) { + return true; + } + if (state == kTablesFailed) { + return false; + } + + uint8_t expected = kTablesUninit; + if (tables_init_state.compare_exchange_strong(expected, kTablesInProgress, + std::memory_order_acq_rel, + std::memory_order_acquire)) { + uint8_t* buffer = new (std::nothrow) uint8_t[table_blob::uncompressed_size]; + if (buffer == nullptr) { + tables_init_state.store(kTablesFailed, std::memory_order_release); + return false; + } + + const size_t n = deflate::inflate_raw(table_blob::compressed, + table_blob::compressed_size, buffer, + table_blob::uncompressed_size); + if (n != table_blob::uncompressed_size || + crc32_ieee(buffer, n) != table_blob::uncompressed_crc32) { + delete[] buffer; + tables_init_state.store(kTablesFailed, std::memory_order_release); + return false; + } + + // LE payload verified; convert multi-byte fields for big-endian hosts. + detail::convert_table_blob_to_host_endian(buffer); + + auto at = [&](size_t off) noexcept -> const uint8_t* { + return buffer + off; + }; + + // Publish all non-atomic pointers before READY. Waiters synchronize via + // acquire on tables_init_state and then observe these writes. + idna_stage1 = + reinterpret_cast(at(table_blob::off_idna_stage1)); + idna_stage2 = + reinterpret_cast(at(table_blob::off_idna_stage2)); + idna_bool_blocks = + reinterpret_cast(at(table_blob::off_idna_bool_blocks)); + idna_utf8_mappings = at(table_blob::off_idna_utf8_mappings); + + decomposition_index = at(table_blob::off_decomposition_index); + decomposition_block_flat = reinterpret_cast( + at(table_blob::off_decomposition_block)); + decomposition_data = reinterpret_cast( + at(table_blob::off_decomposition_data)); + ccc_index = at(table_blob::off_ccc_index); + ccc_block_flat = at(table_blob::off_ccc_block); + composition_index = at(table_blob::off_composition_index); + composition_block_flat = reinterpret_cast( + at(table_blob::off_composition_block)); + composition_data = + reinterpret_cast(at(table_blob::off_composition_data)); + + id_continue = + reinterpret_cast(at(table_blob::off_id_continue_flat)); + id_start = + reinterpret_cast(at(table_blob::off_id_start_flat)); + + dir_start = + reinterpret_cast(at(table_blob::off_dir_start)); + dir_final = + reinterpret_cast(at(table_blob::off_dir_final)); + dir_value = at(table_blob::off_dir_value); + combining_ranges = + reinterpret_cast(at(table_blob::off_combining_flat)); + + tables_buffer = buffer; + tables_init_state.store(kTablesReady, std::memory_order_release); + return true; + } + + // Another thread owns init (or finished between our loads). + for (uint64_t spins = 0; spins < kTablesSpinLimit; ++spins) { + state = tables_init_state.load(std::memory_order_acquire); + if (state == kTablesReady) { + return true; + } + if (state == kTablesFailed) { + return false; + } +#if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || \ + defined(_M_IX86) +#if defined(__GNUC__) || defined(__clang__) + __builtin_ia32_pause(); +#endif +#elif defined(__aarch64__) || defined(_M_ARM64) +#if defined(__GNUC__) || defined(__clang__) + asm volatile("yield" ::: "memory"); +#endif +#endif + } + // Timed out waiting for a peer - treat as failure rather than hang. + return false; +} + +// O(1) multi-stage accessors. Block indices from the tables are uint8_t and +// theoretically can be out of range if the blob is corrupt; clamp to a valid +// empty/default row (index 0) instead of reading OOB. +inline const uint16_t* decomposition_block_row(uint8_t bi) noexcept { + if (bi >= kDecompBlockRows) { + bi = 0; + } + return decomposition_block_flat + static_cast(bi) * kDecompBlockCols; +} + +inline const uint8_t* ccc_block_row(uint8_t bi) noexcept { + if (bi >= kCccBlockRows) { + bi = 0; + } + return ccc_block_flat + static_cast(bi) * kCccBlockCols; +} + +inline const uint16_t* composition_block_row(uint8_t bi) noexcept { + if (bi >= kCompBlockRows) { + bi = 0; + } + return composition_block_flat + static_cast(bi) * kCompBlockCols; +} + +} // namespace ada::idna +/* end file src/table_store.hpp */ /* begin file src/mapping_tables.cpp */ -// IDNA 17.0.0 +// IDNA 17.0.0 +// Two-level compressed mapping table. +// All constants are derived from the table data; no hardcoded boundaries. +// Total binary size: 48659 bytes (47.5 KB) +// stage1: 6564 bytes (3282 uint16_t entries) +// stage2: 22912 bytes (179 mixed blocks x 64) +// bool_blocks: 1800 bytes (225 uint64_t words) +// utf8 maps: 17383 bytes // clang-format off -#ifndef ADA_IDNA_TABLES_H -#define ADA_IDNA_TABLES_H +#ifndef ADA_IDNA_MAPPING_TABLE_H +#define ADA_IDNA_MAPPING_TABLE_H #include namespace ada::idna { -const uint32_t mappings[5264] = -{ - 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 32, 32, 776, 32, 772, 50, 51, 32, 769, - 956, 32, 807, 49, 49, 8260, 52, 49, 8260, 50, 51, 8260, 52, 224, 225, 226, 227, - 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, - 244, 245, 246, 248, 249, 250, 251, 252, 253, 254, 257, 259, 261, 263, 265, 267, - 269, 271, 273, 275, 277, 279, 281, 283, 285, 287, 289, 291, 293, 295, 297, 299, - 301, 303, 105, 775, 309, 311, 314, 316, 318, 108, 183, 322, 324, 326, 328, 700, - 110, 331, 333, 335, 337, 339, 341, 343, 345, 347, 349, 351, 353, 355, 357, 359, - 361, 363, 365, 367, 369, 371, 373, 375, 255, 378, 380, 382, 595, 387, 389, 596, - 392, 598, 599, 396, 477, 601, 603, 402, 608, 611, 617, 616, 409, 623, 626, 629, - 417, 419, 421, 640, 424, 643, 429, 648, 432, 650, 651, 436, 438, 658, 441, 445, - 100, 382, 108, 106, 110, 106, 462, 464, 466, 468, 470, 472, 474, 476, 479, 481, - 483, 485, 487, 489, 491, 493, 495, 100, 122, 501, 405, 447, 505, 507, 509, 511, - 513, 515, 517, 519, 521, 523, 525, 527, 529, 531, 533, 535, 537, 539, 541, 543, - 414, 547, 549, 551, 553, 555, 557, 559, 561, 563, 11365, 572, 410, 11366, 578, 384, - 649, 652, 583, 585, 587, 589, 591, 614, 633, 635, 641, 32, 774, 32, 775, 32, 778, - 32, 808, 32, 771, 32, 779, 661, 768, 787, 776, 769, 953, 881, 883, 697, 887, 32, - 953, 59, 1011, 32, 776, 769, 940, 941, 942, 943, 972, 973, 974, 945, 946, 947, 948, - 949, 950, 951, 952, 954, 955, 957, 958, 959, 960, 961, 963, 964, 965, 966, 967, - 968, 969, 970, 971, 983, 985, 987, 989, 991, 993, 995, 997, 999, 1001, 1003, 1005, - 1007, 1016, 1019, 891, 892, 893, 1104, 1105, 1106, 1107, 1108, 1109, 1110, 1111, - 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1072, 1073, 1074, 1075, 1076, 1077, - 1078, 1079, 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, 1121, 1123, - 1125, 1127, 1129, 1131, 1133, 1135, 1137, 1139, 1141, 1143, 1145, 1147, 1149, 1151, - 1153, 1163, 1165, 1167, 1169, 1171, 1173, 1175, 1177, 1179, 1181, 1183, 1185, 1187, - 1189, 1191, 1193, 1195, 1197, 1199, 1201, 1203, 1205, 1207, 1209, 1211, 1213, 1215, - 1231, 1218, 1220, 1222, 1224, 1226, 1228, 1230, 1233, 1235, 1237, 1239, 1241, 1243, - 1245, 1247, 1249, 1251, 1253, 1255, 1257, 1259, 1261, 1263, 1265, 1267, 1269, 1271, - 1273, 1275, 1277, 1279, 1281, 1283, 1285, 1287, 1289, 1291, 1293, 1295, 1297, 1299, - 1301, 1303, 1305, 1307, 1309, 1311, 1313, 1315, 1317, 1319, 1321, 1323, 1325, 1327, - 1377, 1378, 1379, 1380, 1381, 1382, 1383, 1384, 1385, 1386, 1387, 1388, 1389, 1390, - 1391, 1392, 1393, 1394, 1395, 1396, 1397, 1398, 1399, 1400, 1401, 1402, 1403, 1404, - 1405, 1406, 1407, 1408, 1409, 1410, 1411, 1412, 1413, 1414, 1381, 1410, 1575, 1652, - 1608, 1652, 1735, 1652, 1610, 1652, 2325, 2364, 2326, 2364, 2327, 2364, 2332, 2364, - 2337, 2364, 2338, 2364, 2347, 2364, 2351, 2364, 2465, 2492, 2466, 2492, 2479, 2492, - 2610, 2620, 2616, 2620, 2582, 2620, 2583, 2620, 2588, 2620, 2603, 2620, 2849, 2876, - 2850, 2876, 3661, 3634, 3789, 3762, 3755, 3737, 3755, 3745, 3851, 3906, 4023, 3916, - 4023, 3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, 3953, 3954, 3953, 3956, 4018, - 3968, 4018, 3953, 3968, 4019, 3968, 4019, 3953, 3968, 3986, 4023, 3996, 4023, 4001, - 4023, 4006, 4023, 4011, 4023, 3984, 4021, 11520, 11521, 11522, 11523, 11524, 11525, - 11526, 11527, 11528, 11529, 11530, 11531, 11532, 11533, 11534, 11535, 11536, 11537, - 11538, 11539, 11540, 11541, 11542, 11543, 11544, 11545, 11546, 11547, 11548, 11549, - 11550, 11551, 11552, 11553, 11554, 11555, 11556, 11557, 11559, 11565, 4316, 5104, - 5105, 5106, 5107, 5108, 5109, 42571, 7306, 4304, 4305, 4306, 4307, 4308, 4309, 4310, - 4311, 4312, 4313, 4314, 4315, 4317, 4318, 4319, 4320, 4321, 4322, 4323, 4324, 4325, - 4326, 4327, 4328, 4329, 4330, 4331, 4332, 4333, 4334, 4335, 4336, 4337, 4338, 4339, - 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4349, 4350, 4351, 592, 593, 7426, 604, - 7446, 7447, 7453, 7461, 594, 597, 607, 609, 613, 618, 7547, 669, 621, 7557, 671, - 625, 624, 627, 628, 632, 642, 427, 7452, 656, 657, 7681, 7683, 7685, 7687, 7689, - 7691, 7693, 7695, 7697, 7699, 7701, 7703, 7705, 7707, 7709, 7711, 7713, 7715, 7717, - 7719, 7721, 7723, 7725, 7727, 7729, 7731, 7733, 7735, 7737, 7739, 7741, 7743, 7745, - 7747, 7749, 7751, 7753, 7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, - 7775, 7777, 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, 7801, - 7803, 7805, 7807, 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, 7825, 7827, 7829, - 97, 702, 223, 7841, 7843, 7845, 7847, 7849, 7851, 7853, 7855, 7857, 7859, 7861, - 7863, 7865, 7867, 7869, 7871, 7873, 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, - 7891, 7893, 7895, 7897, 7899, 7901, 7903, 7905, 7907, 7909, 7911, 7913, 7915, 7917, - 7919, 7921, 7923, 7925, 7927, 7929, 7931, 7933, 7935, 7936, 7937, 7938, 7939, 7940, - 7941, 7942, 7943, 7952, 7953, 7954, 7955, 7956, 7957, 7968, 7969, 7970, 7971, 7972, - 7973, 7974, 7975, 7984, 7985, 7986, 7987, 7988, 7989, 7990, 7991, 8000, 8001, 8002, - 8003, 8004, 8005, 8017, 8019, 8021, 8023, 8032, 8033, 8034, 8035, 8036, 8037, 8038, - 8039, 7936, 953, 7937, 953, 7938, 953, 7939, 953, 7940, 953, 7941, 953, 7942, 953, - 7943, 953, 7968, 953, 7969, 953, 7970, 953, 7971, 953, 7972, 953, 7973, 953, 7974, - 953, 7975, 953, 8032, 953, 8033, 953, 8034, 953, 8035, 953, 8036, 953, 8037, 953, - 8038, 953, 8039, 953, 8048, 953, 945, 953, 940, 953, 8118, 953, 8112, 8113, 32, - 787, 32, 834, 32, 776, 834, 8052, 953, 951, 953, 942, 953, 8134, 953, 8050, 32, - 787, 768, 32, 787, 769, 32, 787, 834, 912, 8144, 8145, 8054, 32, 788, 768, 32, 788, - 769, 32, 788, 834, 944, 8160, 8161, 8058, 8165, 32, 776, 768, 96, 8060, 953, 969, - 953, 974, 953, 8182, 953, 8056, 8208, 32, 819, 8242, 8242, 8242, 8242, 8242, 8245, - 8245, 8245, 8245, 8245, 33, 33, 32, 773, 63, 63, 63, 33, 33, 63, 48, 53, 54, 55, - 56, 57, 43, 8722, 61, 40, 41, 97, 47, 99, 97, 47, 115, 176, 99, 99, 47, 111, 99, - 47, 117, 176, 102, 115, 109, 116, 101, 108, 116, 109, 8526, 1488, 1489, 1490, 1491, - 102, 97, 120, 8721, 49, 8260, 55, 49, 8260, 57, 49, 8260, 49, 48, 49, 8260, 51, - 50, 8260, 51, 49, 8260, 53, 50, 8260, 53, 51, 8260, 53, 52, 8260, 53, 49, 8260, - 54, 53, 8260, 54, 49, 8260, 56, 51, 8260, 56, 53, 8260, 56, 55, 8260, 56, 105, 105, - 105, 105, 105, 105, 118, 118, 105, 118, 105, 105, 118, 105, 105, 105, 105, 120, - 120, 105, 120, 105, 105, 8580, 48, 8260, 51, 8747, 8747, 8747, 8747, 8747, 8750, - 8750, 8750, 8750, 8750, 12296, 12297, 49, 50, 49, 51, 49, 52, 49, 53, 49, 54, 49, - 55, 49, 56, 49, 57, 50, 48, 40, 49, 41, 40, 50, 41, 40, 51, 41, 40, 52, 41, 40, - 53, 41, 40, 54, 41, 40, 55, 41, 40, 56, 41, 40, 57, 41, 40, 49, 48, 41, 40, 49, - 49, 41, 40, 49, 50, 41, 40, 49, 51, 41, 40, 49, 52, 41, 40, 49, 53, 41, 40, 49, - 54, 41, 40, 49, 55, 41, 40, 49, 56, 41, 40, 49, 57, 41, 40, 50, 48, 41, 40, 97, - 41, 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101, 41, 40, 102, 41, 40, 103, 41, - 40, 104, 41, 40, 105, 41, 40, 106, 41, 40, 107, 41, 40, 108, 41, 40, 109, 41, 40, - 110, 41, 40, 111, 41, 40, 112, 41, 40, 113, 41, 40, 114, 41, 40, 115, 41, 40, 116, - 41, 40, 117, 41, 40, 118, 41, 40, 119, 41, 40, 120, 41, 40, 121, 41, 40, 122, 41, - 58, 58, 61, 61, 61, 10973, 824, 11312, 11313, 11314, 11315, 11316, 11317, 11318, - 11319, 11320, 11321, 11322, 11323, 11324, 11325, 11326, 11327, 11328, 11329, 11330, - 11331, 11332, 11333, 11334, 11335, 11336, 11337, 11338, 11339, 11340, 11341, 11342, - 11343, 11344, 11345, 11346, 11347, 11348, 11349, 11350, 11351, 11352, 11353, 11354, - 11355, 11356, 11357, 11358, 11359, 11361, 619, 7549, 637, 11368, 11370, 11372, 11379, - 11382, 575, 576, 11393, 11395, 11397, 11399, 11401, 11403, 11405, 11407, 11409, - 11411, 11413, 11415, 11417, 11419, 11421, 11423, 11425, 11427, 11429, 11431, 11433, - 11435, 11437, 11439, 11441, 11443, 11445, 11447, 11449, 11451, 11453, 11455, 11457, - 11459, 11461, 11463, 11465, 11467, 11469, 11471, 11473, 11475, 11477, 11479, 11481, - 11483, 11485, 11487, 11489, 11491, 11500, 11502, 11507, 11617, 27597, 40863, 19968, - 20008, 20022, 20031, 20057, 20101, 20108, 20128, 20154, 20799, 20837, 20843, 20866, - 20886, 20907, 20960, 20981, 20992, 21147, 21241, 21269, 21274, 21304, 21313, 21340, - 21353, 21378, 21430, 21448, 21475, 22231, 22303, 22763, 22786, 22794, 22805, 22823, - 22899, 23376, 23424, 23544, 23567, 23586, 23608, 23662, 23665, 24027, 24037, 24049, - 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, 24400, 24417, 24435, 24515, - 25096, 25142, 25163, 25903, 25908, 25991, 26007, 26020, 26041, 26080, 26085, 26352, - 26376, 26408, 27424, 27490, 27513, 27571, 27595, 27604, 27611, 27663, 27668, 27700, - 28779, 29226, 29238, 29243, 29247, 29255, 29273, 29275, 29356, 29572, 29577, 29916, - 29926, 29976, 29983, 29992, 30000, 30091, 30098, 30326, 30333, 30382, 30399, 30446, - 30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435, 31481, 31859, 31992, 32566, - 32593, 32650, 32701, 32769, 32780, 32786, 32819, 32895, 32905, 33251, 33258, 33267, - 33276, 33292, 33307, 33311, 33390, 33394, 33400, 34381, 34411, 34880, 34892, 34915, - 35198, 35211, 35282, 35328, 35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, - 36523, 36554, 36763, 36784, 36789, 37009, 37193, 37318, 37324, 37329, 38263, 38272, - 38428, 38582, 38585, 38632, 38737, 38750, 38754, 38761, 38859, 38893, 38899, 38913, - 39080, 39131, 39135, 39318, 39321, 39340, 39592, 39640, 39647, 39717, 39727, 39730, - 39740, 39770, 40165, 40565, 40575, 40613, 40635, 40643, 40653, 40657, 40697, 40701, - 40718, 40723, 40736, 40763, 40778, 40786, 40845, 40860, 40864, 46, 12306, 21316, - 21317, 32, 12441, 32, 12442, 12424, 12426, 12467, 12488, 4352, 4353, 4522, 4354, - 4524, 4525, 4355, 4356, 4357, 4528, 4529, 4530, 4531, 4532, 4533, 4378, 4358, 4359, - 4360, 4385, 4361, 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, - 4451, 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463, 4464, - 4465, 4466, 4467, 4468, 4469, 4372, 4373, 4551, 4552, 4556, 4558, 4563, 4567, 4569, - 4380, 4573, 4575, 4381, 4382, 4384, 4386, 4387, 4391, 4393, 4395, 4396, 4397, 4398, - 4399, 4402, 4406, 4416, 4423, 4428, 4593, 4594, 4439, 4440, 4441, 4484, 4485, 4488, - 4497, 4498, 4500, 4510, 4513, 19977, 22235, 19978, 20013, 19979, 30002, 19993, 19969, - 22825, 22320, 40, 4352, 41, 40, 4354, 41, 40, 4355, 41, 40, 4357, 41, 40, 4358, - 41, 40, 4359, 41, 40, 4361, 41, 40, 4363, 41, 40, 4364, 41, 40, 4366, 41, 40, 4367, - 41, 40, 4368, 41, 40, 4369, 41, 40, 4370, 41, 40, 44032, 41, 40, 45208, 41, 40, - 45796, 41, 40, 46972, 41, 40, 47560, 41, 40, 48148, 41, 40, 49324, 41, 40, 50500, - 41, 40, 51088, 41, 40, 52264, 41, 40, 52852, 41, 40, 53440, 41, 40, 54028, 41, 40, - 54616, 41, 40, 51452, 41, 40, 50724, 51204, 41, 40, 50724, 54980, 41, 40, 19968, - 41, 40, 20108, 41, 40, 19977, 41, 40, 22235, 41, 40, 20116, 41, 40, 20845, 41, 40, - 19971, 41, 40, 20843, 41, 40, 20061, 41, 40, 21313, 41, 40, 26376, 41, 40, 28779, - 41, 40, 27700, 41, 40, 26408, 41, 40, 37329, 41, 40, 22303, 41, 40, 26085, 41, 40, - 26666, 41, 40, 26377, 41, 40, 31038, 41, 40, 21517, 41, 40, 29305, 41, 40, 36001, - 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, 41, 40, 21628, 41, 40, 23398, 41, 40, - 30435, 41, 40, 20225, 41, 40, 36039, 41, 40, 21332, 41, 40, 31085, 41, 40, 20241, - 41, 40, 33258, 41, 40, 33267, 41, 21839, 24188, 31631, 112, 116, 101, 50, 50, 50, - 52, 50, 53, 50, 54, 50, 55, 50, 56, 50, 57, 51, 48, 51, 51, 51, 52, 51, 53, 52280, - 44256, 51452, 51032, 50864, 31192, 30007, 36969, 20778, 21360, 27880, 38917, 20889, - 27491, 24038, 21491, 21307, 23447, 22812, 51, 54, 51, 55, 51, 56, 51, 57, 52, 48, - 52, 52, 52, 53, 52, 54, 52, 55, 52, 56, 52, 57, 53, 48, 49, 26376, 50, 26376, 51, - 26376, 52, 26376, 53, 26376, 54, 26376, 55, 26376, 56, 26376, 57, 26376, 49, 48, - 26376, 49, 49, 26376, 49, 50, 26376, 104, 103, 101, 114, 103, 101, 118, 108, 116, - 100, 12450, 12452, 12454, 12456, 12458, 12459, 12461, 12463, 12465, 12469, 12471, - 12473, 12475, 12477, 12479, 12481, 12484, 12486, 12490, 12491, 12492, 12493, 12494, - 12495, 12498, 12501, 12504, 12507, 12510, 12511, 12512, 12513, 12514, 12516, 12518, - 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12528, 12529, 12530, 20196, 21644, - 12450, 12497, 12540, 12488, 12450, 12523, 12501, 12449, 12450, 12531, 12506, 12450, - 12450, 12540, 12523, 12452, 12491, 12531, 12464, 12452, 12531, 12481, 12454, 12457, - 12531, 12456, 12473, 12463, 12540, 12489, 12456, 12540, 12459, 12540, 12458, 12531, - 12473, 12458, 12540, 12512, 12459, 12452, 12522, 12459, 12521, 12483, 12488, 12459, - 12525, 12522, 12540, 12460, 12525, 12531, 12460, 12531, 12510, 12462, 12460, 12462, - 12491, 12540, 12461, 12517, 12522, 12540, 12462, 12523, 12480, 12540, 12461, 12525, - 12461, 12525, 12464, 12521, 12512, 12461, 12525, 12513, 12540, 12488, 12523, 12461, - 12525, 12527, 12483, 12488, 12464, 12521, 12512, 12488, 12531, 12463, 12523, 12476, - 12452, 12525, 12463, 12525, 12540, 12493, 12465, 12540, 12473, 12467, 12523, 12490, - 12467, 12540, 12509, 12469, 12452, 12463, 12523, 12469, 12531, 12481, 12540, 12512, - 12471, 12522, 12531, 12464, 12475, 12531, 12481, 12475, 12531, 12488, 12480, 12540, - 12473, 12487, 12471, 12489, 12523, 12490, 12494, 12494, 12483, 12488, 12495, 12452, - 12484, 12497, 12540, 12475, 12531, 12488, 12497, 12540, 12484, 12496, 12540, 12524, - 12523, 12500, 12450, 12473, 12488, 12523, 12500, 12463, 12523, 12500, 12467, 12499, - 12523, 12501, 12449, 12521, 12483, 12489, 12501, 12451, 12540, 12488, 12502, 12483, - 12471, 12455, 12523, 12501, 12521, 12531, 12504, 12463, 12479, 12540, 12523, 12506, - 12477, 12506, 12491, 12498, 12504, 12523, 12484, 12506, 12531, 12473, 12506, 12540, - 12472, 12505, 12540, 12479, 12509, 12452, 12531, 12488, 12508, 12523, 12488, 12507, - 12531, 12509, 12531, 12489, 12507, 12540, 12523, 12507, 12540, 12531, 12510, 12452, - 12463, 12525, 12510, 12452, 12523, 12510, 12483, 12495, 12510, 12523, 12463, 12510, - 12531, 12471, 12519, 12531, 12511, 12463, 12525, 12531, 12511, 12522, 12511, 12522, - 12496, 12540, 12523, 12513, 12460, 12513, 12460, 12488, 12531, 12516, 12540, 12489, - 12516, 12540, 12523, 12518, 12450, 12531, 12522, 12483, 12488, 12523, 12522, 12521, - 12523, 12500, 12540, 12523, 12540, 12502, 12523, 12524, 12512, 12524, 12531, 12488, - 12466, 12531, 48, 28857, 49, 28857, 50, 28857, 51, 28857, 52, 28857, 53, 28857, - 54, 28857, 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, 49, 49, 28857, 49, 50, - 28857, 49, 51, 28857, 49, 52, 28857, 49, 53, 28857, 49, 54, 28857, 49, 55, 28857, - 49, 56, 28857, 49, 57, 28857, 50, 48, 28857, 50, 49, 28857, 50, 50, 28857, 50, 51, - 28857, 50, 52, 28857, 104, 112, 97, 100, 97, 97, 117, 98, 97, 114, 111, 118, 112, - 99, 100, 109, 100, 109, 50, 100, 109, 51, 105, 117, 24179, 25104, 26157, 21644, - 22823, 27491, 26126, 27835, 26666, 24335, 20250, 31038, 110, 97, 956, 97, 109, 97, - 107, 97, 107, 98, 109, 98, 103, 98, 99, 97, 108, 107, 99, 97, 108, 112, 102, 110, - 102, 956, 102, 956, 103, 109, 103, 107, 103, 104, 122, 107, 104, 122, 109, 104, - 122, 116, 104, 122, 956, 108, 109, 108, 100, 108, 102, 109, 110, 109, 956, 109, - 109, 109, 99, 109, 107, 109, 109, 109, 50, 99, 109, 50, 107, 109, 50, 109, 109, - 51, 99, 109, 51, 107, 109, 51, 109, 8725, 115, 109, 8725, 115, 50, 107, 112, 97, - 109, 112, 97, 103, 112, 97, 114, 97, 100, 114, 97, 100, 8725, 115, 114, 97, 100, - 8725, 115, 50, 112, 115, 110, 115, 956, 115, 109, 115, 112, 118, 110, 118, 956, - 118, 109, 118, 107, 118, 112, 119, 110, 119, 956, 119, 109, 119, 107, 119, 107, - 969, 109, 969, 98, 113, 99, 8725, 107, 103, 100, 98, 103, 121, 104, 97, 105, 110, - 107, 107, 107, 116, 108, 110, 108, 111, 103, 108, 120, 109, 105, 108, 109, 111, - 108, 112, 104, 112, 112, 109, 112, 114, 115, 118, 119, 98, 118, 8725, 109, 97, 8725, - 109, 49, 26085, 50, 26085, 51, 26085, 52, 26085, 53, 26085, 54, 26085, 55, 26085, - 56, 26085, 57, 26085, 49, 48, 26085, 49, 49, 26085, 49, 50, 26085, 49, 51, 26085, - 49, 52, 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, 26085, 49, 56, 26085, 49, 57, - 26085, 50, 48, 26085, 50, 49, 26085, 50, 50, 26085, 50, 51, 26085, 50, 52, 26085, - 50, 53, 26085, 50, 54, 26085, 50, 55, 26085, 50, 56, 26085, 50, 57, 26085, 51, 48, - 26085, 51, 49, 26085, 103, 97, 108, 42561, 42563, 42565, 42567, 42569, 42573, 42575, - 42577, 42579, 42581, 42583, 42585, 42587, 42589, 42591, 42593, 42595, 42597, 42599, - 42601, 42603, 42605, 42625, 42627, 42629, 42631, 42633, 42635, 42637, 42639, 42641, - 42643, 42645, 42647, 42649, 42651, 42787, 42789, 42791, 42793, 42795, 42797, 42799, - 42803, 42805, 42807, 42809, 42811, 42813, 42815, 42817, 42819, 42821, 42823, 42825, - 42827, 42829, 42831, 42833, 42835, 42837, 42839, 42841, 42843, 42845, 42847, 42849, - 42851, 42853, 42855, 42857, 42859, 42861, 42863, 42874, 42876, 7545, 42879, 42881, - 42883, 42885, 42887, 42892, 42897, 42899, 42903, 42905, 42907, 42909, 42911, 42913, - 42915, 42917, 42919, 42921, 620, 670, 647, 43859, 42933, 42935, 42937, 42939, 42941, - 42943, 42945, 42947, 42900, 7566, 42952, 42954, 612, 42957, 42959, 42961, 42963, - 42965, 42967, 42969, 42971, 411, 42998, 43831, 43858, 653, 5024, 5025, 5026, 5027, - 5028, 5029, 5030, 5031, 5032, 5033, 5034, 5035, 5036, 5037, 5038, 5039, 5040, 5041, - 5042, 5043, 5044, 5045, 5046, 5047, 5048, 5049, 5050, 5051, 5052, 5053, 5054, 5055, - 5056, 5057, 5058, 5059, 5060, 5061, 5062, 5063, 5064, 5065, 5066, 5067, 5068, 5069, - 5070, 5071, 5072, 5073, 5074, 5075, 5076, 5077, 5078, 5079, 5080, 5081, 5082, 5083, - 5084, 5085, 5086, 5087, 5088, 5089, 5090, 5091, 5092, 5093, 5094, 5095, 5096, 5097, - 5098, 5099, 5100, 5101, 5102, 5103, 35912, 26356, 36040, 28369, 20018, 21477, 22865, - 21895, 22856, 25078, 30313, 32645, 34367, 34746, 35064, 37007, 27138, 27931, 28889, - 29662, 33853, 37226, 39409, 20098, 21365, 27396, 29211, 34349, 40478, 23888, 28651, - 34253, 35172, 25289, 33240, 34847, 24266, 26391, 28010, 29436, 37070, 20358, 20919, - 21214, 25796, 27347, 29200, 30439, 34310, 34396, 36335, 38706, 39791, 40442, 30860, - 31103, 32160, 33737, 37636, 35542, 22751, 24324, 31840, 32894, 29282, 30922, 36034, - 38647, 22744, 23650, 27155, 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956, - 20940, 31260, 32190, 33777, 38517, 35712, 25295, 35582, 20025, 23527, 24594, 29575, - 30064, 21271, 30971, 20415, 24489, 19981, 27852, 25976, 32034, 21443, 22622, 30465, - 33865, 35498, 27578, 27784, 25342, 33509, 25504, 30053, 20142, 20841, 20937, 26753, - 31975, 33391, 35538, 37327, 21237, 21570, 24300, 26053, 28670, 31018, 38317, 39530, - 40599, 40654, 26310, 27511, 36706, 24180, 24976, 25088, 25754, 28451, 29001, 29833, - 31178, 32244, 32879, 36646, 34030, 36899, 37706, 21015, 21155, 21693, 28872, 35010, - 24265, 24565, 25467, 27566, 31806, 29557, 22265, 23994, 24604, 29618, 29801, 32666, - 32838, 37428, 38646, 38728, 38936, 20363, 31150, 37300, 38584, 24801, 20102, 20698, - 23534, 23615, 26009, 29134, 30274, 34044, 36988, 26248, 38446, 21129, 26491, 26611, - 27969, 28316, 29705, 30041, 30827, 32016, 39006, 25134, 38520, 20523, 23833, 28138, - 36650, 24459, 24900, 26647, 38534, 21033, 21519, 23653, 26131, 26446, 26792, 27877, - 29702, 30178, 32633, 35023, 35041, 38626, 21311, 28346, 21533, 29136, 29848, 34298, - 38563, 40023, 40607, 26519, 28107, 33256, 31520, 31890, 29376, 28825, 35672, 20160, - 33590, 21050, 20999, 24230, 25299, 31958, 23429, 27934, 26292, 36667, 38477, 24275, - 20800, 21952, 22618, 26228, 20958, 29482, 30410, 31036, 31070, 31077, 31119, 38742, - 31934, 34322, 35576, 36920, 37117, 39151, 39164, 39208, 40372, 37086, 38583, 20398, - 20711, 20813, 21193, 21220, 21329, 21917, 22022, 22120, 22592, 22696, 23652, 24724, - 24936, 24974, 25074, 25935, 26082, 26257, 26757, 28023, 28186, 28450, 29038, 29227, - 29730, 30865, 31049, 31048, 31056, 31062, 31117, 31118, 31296, 31361, 31680, 32265, - 32321, 32626, 32773, 33261, 33401, 33879, 35088, 35222, 35585, 35641, 36051, 36104, - 36790, 38627, 38911, 38971, 24693, 148206, 33304, 20006, 20917, 20840, 20352, 20805, - 20864, 21191, 21242, 21845, 21913, 21986, 22707, 22852, 22868, 23138, 23336, 24274, - 24281, 24425, 24493, 24792, 24910, 24840, 24928, 25140, 25540, 25628, 25682, 25942, - 26395, 26454, 28379, 28363, 28702, 30631, 29237, 29359, 29809, 29958, 30011, 30237, - 30239, 30427, 30452, 30538, 30528, 30924, 31409, 31867, 32091, 32574, 33618, 33775, - 34681, 35137, 35206, 35519, 35531, 35565, 35722, 36664, 36978, 37273, 37494, 38524, - 38875, 38923, 39698, 141386, 141380, 144341, 15261, 16408, 16441, 152137, 154832, - 163539, 40771, 40846, 102, 102, 102, 105, 102, 108, 102, 102, 108, 1396, 1398, 1396, - 1381, 1396, 1387, 1406, 1398, 1396, 1389, 1497, 1460, 1522, 1463, 1506, 1492, 1499, - 1500, 1501, 1512, 1514, 1513, 1473, 1513, 1474, 1513, 1468, 1473, 1513, 1468, 1474, - 1488, 1463, 1488, 1464, 1488, 1468, 1489, 1468, 1490, 1468, 1491, 1468, 1492, 1468, - 1493, 1468, 1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499, 1468, 1500, 1468, - 1502, 1468, 1504, 1468, 1505, 1468, 1507, 1468, 1508, 1468, 1510, 1468, 1511, 1468, - 1512, 1468, 1514, 1468, 1493, 1465, 1489, 1471, 1499, 1471, 1508, 1471, 1488, 1500, - 1649, 1659, 1662, 1664, 1658, 1663, 1657, 1700, 1702, 1668, 1667, 1670, 1671, 1677, - 1676, 1678, 1672, 1688, 1681, 1705, 1711, 1715, 1713, 1722, 1723, 1728, 1729, 1726, - 1746, 1747, 1709, 1734, 1736, 1739, 1733, 1737, 1744, 1609, 1574, 1575, 1574, 1749, - 1574, 1608, 1574, 1735, 1574, 1734, 1574, 1736, 1574, 1744, 1574, 1609, 1740, 1574, - 1580, 1574, 1581, 1574, 1605, 1574, 1610, 1576, 1580, 1576, 1581, 1576, 1582, 1576, - 1605, 1576, 1609, 1576, 1610, 1578, 1580, 1578, 1581, 1578, 1582, 1578, 1605, 1578, - 1609, 1578, 1610, 1579, 1580, 1579, 1605, 1579, 1609, 1579, 1610, 1580, 1581, 1580, - 1605, 1581, 1605, 1582, 1580, 1582, 1581, 1582, 1605, 1587, 1580, 1587, 1581, 1587, - 1582, 1587, 1605, 1589, 1581, 1589, 1605, 1590, 1580, 1590, 1581, 1590, 1582, 1590, - 1605, 1591, 1581, 1591, 1605, 1592, 1605, 1593, 1580, 1593, 1605, 1594, 1580, 1594, - 1605, 1601, 1580, 1601, 1581, 1601, 1582, 1601, 1605, 1601, 1609, 1601, 1610, 1602, - 1581, 1602, 1605, 1602, 1609, 1602, 1610, 1603, 1575, 1603, 1580, 1603, 1581, 1603, - 1582, 1603, 1604, 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, 1604, 1581, 1604, - 1582, 1604, 1605, 1604, 1609, 1604, 1610, 1605, 1580, 1605, 1605, 1605, 1609, 1605, - 1610, 1606, 1580, 1606, 1581, 1606, 1582, 1606, 1605, 1606, 1609, 1606, 1610, 1607, - 1580, 1607, 1605, 1607, 1609, 1607, 1610, 1610, 1581, 1610, 1582, 1610, 1609, 1584, - 1648, 1585, 1648, 1609, 1648, 32, 1612, 1617, 32, 1613, 1617, 32, 1614, 1617, 32, - 1615, 1617, 32, 1616, 1617, 32, 1617, 1648, 1574, 1585, 1574, 1586, 1574, 1606, - 1576, 1585, 1576, 1586, 1576, 1606, 1578, 1585, 1578, 1586, 1578, 1606, 1579, 1585, - 1579, 1586, 1579, 1606, 1605, 1575, 1606, 1585, 1606, 1586, 1606, 1606, 1610, 1585, - 1610, 1586, 1574, 1582, 1574, 1607, 1576, 1607, 1578, 1607, 1589, 1582, 1604, 1607, - 1606, 1607, 1607, 1648, 1579, 1607, 1587, 1607, 1588, 1605, 1588, 1607, 1600, 1614, - 1617, 1600, 1615, 1617, 1600, 1616, 1617, 1591, 1609, 1591, 1610, 1593, 1609, 1593, - 1610, 1594, 1609, 1594, 1610, 1587, 1609, 1587, 1610, 1588, 1609, 1588, 1610, 1581, - 1609, 1580, 1609, 1580, 1610, 1582, 1609, 1589, 1609, 1589, 1610, 1590, 1609, 1590, - 1610, 1588, 1580, 1588, 1581, 1588, 1582, 1588, 1585, 1587, 1585, 1589, 1585, 1590, - 1585, 1575, 1611, 1578, 1580, 1605, 1578, 1581, 1580, 1578, 1581, 1605, 1578, 1582, - 1605, 1578, 1605, 1580, 1578, 1605, 1581, 1578, 1605, 1582, 1581, 1605, 1610, 1581, - 1605, 1609, 1587, 1581, 1580, 1587, 1580, 1581, 1587, 1580, 1609, 1587, 1605, 1581, - 1587, 1605, 1580, 1587, 1605, 1605, 1589, 1581, 1581, 1589, 1605, 1605, 1588, 1581, - 1605, 1588, 1580, 1610, 1588, 1605, 1582, 1588, 1605, 1605, 1590, 1581, 1609, 1590, - 1582, 1605, 1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605, 1610, 1593, 1580, 1605, - 1593, 1605, 1605, 1593, 1605, 1609, 1594, 1605, 1605, 1594, 1605, 1610, 1594, 1605, - 1609, 1601, 1582, 1605, 1602, 1605, 1581, 1602, 1605, 1605, 1604, 1581, 1605, 1604, - 1581, 1610, 1604, 1581, 1609, 1604, 1580, 1580, 1604, 1582, 1605, 1604, 1605, 1581, - 1605, 1581, 1580, 1605, 1581, 1610, 1605, 1580, 1581, 1605, 1582, 1605, 1605, 1580, - 1582, 1607, 1605, 1580, 1607, 1605, 1605, 1606, 1581, 1605, 1606, 1581, 1609, 1606, - 1580, 1605, 1606, 1580, 1609, 1606, 1605, 1610, 1606, 1605, 1609, 1610, 1605, 1605, - 1576, 1582, 1610, 1578, 1580, 1610, 1578, 1580, 1609, 1578, 1582, 1610, 1578, 1582, - 1609, 1578, 1605, 1610, 1578, 1605, 1609, 1580, 1605, 1610, 1580, 1581, 1609, 1580, - 1605, 1609, 1587, 1582, 1609, 1589, 1581, 1610, 1588, 1581, 1610, 1590, 1581, 1610, - 1604, 1580, 1610, 1604, 1605, 1610, 1610, 1580, 1610, 1610, 1605, 1610, 1605, 1605, - 1610, 1602, 1605, 1610, 1606, 1581, 1610, 1593, 1605, 1610, 1603, 1605, 1610, 1606, - 1580, 1581, 1605, 1582, 1610, 1604, 1580, 1605, 1603, 1605, 1605, 1580, 1581, 1610, - 1581, 1580, 1610, 1605, 1580, 1610, 1601, 1605, 1610, 1576, 1581, 1610, 1587, 1582, - 1610, 1606, 1580, 1610, 1589, 1604, 1746, 1602, 1604, 1746, 1575, 1604, 1604, 1607, - 1575, 1603, 1576, 1585, 1605, 1581, 1605, 1583, 1589, 1604, 1593, 1605, 1585, 1587, - 1608, 1604, 1593, 1604, 1610, 1607, 1608, 1587, 1604, 1605, 1589, 1604, 1609, 1589, - 1604, 1609, 32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, - 1604, 1605, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1585, 1740, 1575, 1604, - 44, 12289, 12310, 12311, 8212, 8211, 95, 123, 125, 12308, 12309, 12304, 12305, 12298, - 12299, 12300, 12301, 12302, 12303, 91, 93, 35, 38, 42, 45, 60, 62, 92, 36, 37, 64, - 32, 1611, 1600, 1611, 1600, 1617, 32, 1618, 1600, 1618, 1569, 1570, 1571, 1572, - 1573, 1577, 1604, 1570, 1604, 1571, 1604, 1573, 34, 39, 94, 124, 126, 10629, 10630, - 12539, 12453, 12515, 162, 163, 172, 166, 165, 8361, 9474, 8592, 8593, 8594, 8595, - 9632, 9675, 66600, 66601, 66602, 66603, 66604, 66605, 66606, 66607, 66608, 66609, - 66610, 66611, 66612, 66613, 66614, 66615, 66616, 66617, 66618, 66619, 66620, 66621, - 66622, 66623, 66624, 66625, 66626, 66627, 66628, 66629, 66630, 66631, 66632, 66633, - 66634, 66635, 66636, 66637, 66638, 66639, 66776, 66777, 66778, 66779, 66780, 66781, - 66782, 66783, 66784, 66785, 66786, 66787, 66788, 66789, 66790, 66791, 66792, 66793, - 66794, 66795, 66796, 66797, 66798, 66799, 66800, 66801, 66802, 66803, 66804, 66805, - 66806, 66807, 66808, 66809, 66810, 66811, 66967, 66968, 66969, 66970, 66971, 66972, - 66973, 66974, 66975, 66976, 66977, 66979, 66980, 66981, 66982, 66983, 66984, 66985, - 66986, 66987, 66988, 66989, 66990, 66991, 66992, 66993, 66995, 66996, 66997, 66998, - 66999, 67000, 67001, 67003, 67004, 720, 721, 665, 675, 43878, 677, 676, 7569, 600, - 606, 681, 610, 667, 668, 615, 644, 682, 683, 122628, 42894, 622, 122629, 654, 122630, - 630, 631, 634, 122632, 638, 680, 678, 43879, 679, 11377, 655, 673, 674, 664, 448, - 449, 450, 122634, 122654, 68800, 68801, 68802, 68803, 68804, 68805, 68806, 68807, - 68808, 68809, 68810, 68811, 68812, 68813, 68814, 68815, 68816, 68817, 68818, 68819, - 68820, 68821, 68822, 68823, 68824, 68825, 68826, 68827, 68828, 68829, 68830, 68831, - 68832, 68833, 68834, 68835, 68836, 68837, 68838, 68839, 68840, 68841, 68842, 68843, - 68844, 68845, 68846, 68847, 68848, 68849, 68850, 68976, 68977, 68978, 68979, 68980, - 68981, 68982, 68983, 68984, 68985, 68986, 68987, 68988, 68989, 68990, 68991, 68992, - 68993, 68994, 68995, 68996, 68997, 71872, 71873, 71874, 71875, 71876, 71877, 71878, - 71879, 71880, 71881, 71882, 71883, 71884, 71885, 71886, 71887, 71888, 71889, 71890, - 71891, 71892, 71893, 71894, 71895, 71896, 71897, 71898, 71899, 71900, 71901, 71902, - 71903, 93792, 93793, 93794, 93795, 93796, 93797, 93798, 93799, 93800, 93801, 93802, - 93803, 93804, 93805, 93806, 93807, 93808, 93809, 93810, 93811, 93812, 93813, 93814, - 93815, 93816, 93817, 93818, 93819, 93820, 93821, 93822, 93823, 93883, 93884, 93885, - 93886, 93887, 93888, 93889, 93890, 93891, 93892, 93893, 93894, 93895, 93896, 93897, - 93898, 93899, 93900, 93901, 93902, 93903, 93904, 93905, 93906, 93907, 119127, 119141, - 119128, 119141, 119128, 119141, 119150, 119128, 119141, 119151, 119128, 119141, - 119152, 119128, 119141, 119153, 119128, 119141, 119154, 119225, 119141, 119226, - 119141, 119225, 119141, 119150, 119226, 119141, 119150, 119225, 119141, 119151, - 119226, 119141, 119151, 305, 567, 8711, 8706, 125218, 125219, 125220, 125221, 125222, - 125223, 125224, 125225, 125226, 125227, 125228, 125229, 125230, 125231, 125232, - 125233, 125234, 125235, 125236, 125237, 125238, 125239, 125240, 125241, 125242, - 125243, 125244, 125245, 125246, 125247, 125248, 125249, 125250, 125251, 1646, 1697, - 1647, 48, 44, 49, 44, 50, 44, 51, 44, 52, 44, 53, 44, 54, 44, 55, 44, 56, 44, 57, - 44, 12308, 115, 12309, 119, 122, 104, 118, 115, 100, 115, 115, 112, 112, 118, 119, - 99, 109, 114, 100, 106, 12411, 12363, 12467, 12467, 23383, 21452, 22810, 35299, - 20132, 26144, 28961, 21069, 24460, 20877, 26032, 21021, 32066, 36009, 22768, 21561, - 28436, 25237, 25429, 36938, 25351, 25171, 31105, 31354, 21512, 28288, 30003, 21106, - 21942, 37197, 12308, 26412, 12309, 12308, 19977, 12309, 12308, 20108, 12309, 12308, - 23433, 12309, 12308, 28857, 12309, 12308, 25171, 12309, 12308, 30423, 12309, 12308, - 21213, 12309, 12308, 25943, 12309, 24471, 21487, 20029, 20024, 20033, 131362, 20320, - 20411, 20482, 20602, 20633, 20687, 13470, 132666, 20820, 20836, 20855, 132380, 13497, - 20839, 132427, 20887, 20900, 20172, 20908, 168415, 20995, 13535, 21051, 21062, 21111, - 13589, 21253, 21254, 21321, 21338, 21363, 21373, 21375, 133676, 28784, 21450, 21471, - 133987, 21483, 21489, 21510, 21662, 21560, 21576, 21608, 21666, 21750, 21776, 21843, - 21859, 21892, 21931, 21939, 21954, 22294, 22295, 22097, 22132, 22766, 22478, 22516, - 22541, 22411, 22578, 22577, 22700, 136420, 22770, 22775, 22790, 22818, 22882, 136872, - 136938, 23020, 23067, 23079, 23000, 23142, 14062, 14076, 23304, 23358, 137672, 23491, - 23512, 23539, 138008, 23551, 23558, 24403, 14209, 23648, 23744, 23693, 138724, 23875, - 138726, 23918, 23915, 23932, 24033, 24034, 14383, 24061, 24104, 24125, 24169, 14434, - 139651, 14460, 24240, 24243, 24246, 172946, 140081, 33281, 24354, 14535, 144056, - 156122, 24418, 24427, 14563, 24474, 24525, 24535, 24569, 24705, 14650, 14620, 141012, - 24775, 24904, 24908, 24954, 25010, 24996, 25007, 25054, 25115, 25181, 25265, 25300, - 25424, 142092, 25405, 25340, 25448, 25475, 25572, 142321, 25634, 25541, 25513, 14894, - 25705, 25726, 25757, 25719, 14956, 25964, 143370, 26083, 26360, 26185, 15129, 15112, - 15076, 20882, 20885, 26368, 26268, 32941, 17369, 26401, 26462, 26451, 144323, 15177, - 26618, 26501, 26706, 144493, 26766, 26655, 26900, 26946, 27043, 27114, 27304, 145059, - 27355, 15384, 27425, 145575, 27476, 15438, 27506, 27551, 27579, 146061, 138507, - 146170, 27726, 146620, 27839, 27853, 27751, 27926, 27966, 28009, 28024, 28037, 146718, - 27956, 28207, 28270, 15667, 28359, 147153, 28153, 28526, 147294, 147342, 28614, - 28729, 28699, 15766, 28746, 28797, 28791, 28845, 132389, 28997, 148067, 29084, 148395, - 29224, 29264, 149000, 29312, 29333, 149301, 149524, 29562, 29579, 16044, 29605, - 16056, 29767, 29788, 29829, 29898, 16155, 29988, 150582, 30014, 150674, 139679, - 30224, 151457, 151480, 151620, 16380, 16392, 151795, 151794, 151833, 151859, 30494, - 30495, 30603, 16454, 16534, 152605, 30798, 16611, 153126, 153242, 153285, 31211, - 16687, 31306, 31311, 153980, 154279, 31470, 16898, 154539, 31686, 31689, 16935, - 154752, 31954, 17056, 31976, 31971, 32000, 155526, 32099, 17153, 32199, 32258, 32325, - 17204, 156200, 156231, 17241, 156377, 32634, 156478, 32661, 32762, 156890, 156963, - 32864, 157096, 32880, 144223, 17365, 32946, 33027, 17419, 33086, 23221, 157607, - 157621, 144275, 144284, 33284, 36766, 17515, 33425, 33419, 33437, 21171, 33457, - 33459, 33469, 33510, 158524, 33565, 33635, 33709, 33571, 33725, 33767, 33619, 33738, - 33740, 33756, 158774, 159083, 158933, 17707, 34033, 34035, 34070, 160714, 34148, - 159532, 17757, 17761, 159665, 159954, 17771, 34384, 34407, 34409, 34473, 34440, - 34574, 34530, 34600, 34667, 34694, 17879, 34785, 34817, 17913, 34912, 161383, 35031, - 35038, 17973, 35066, 13499, 161966, 162150, 18110, 18119, 35488, 162984, 36011, - 36033, 36123, 36215, 163631, 133124, 36299, 36284, 36336, 133342, 36564, 165330, - 165357, 37012, 37105, 37137, 165678, 37147, 37432, 37591, 37592, 37500, 37881, 37909, - 166906, 38283, 18837, 38327, 167287, 18918, 38595, 23986, 38691, 168261, 168474, - 19054, 19062, 38880, 168970, 19122, 169110, 38953, 169398, 39138, 19251, 39209, - 39335, 39362, 39422, 19406, 170800, 40000, 40189, 19662, 19693, 40295, 172238, 19704, - 172293, 172558, 172689, 19798, 40702, 40709, 40719, 40726, 173568, +// Block size for two-level table (2^6 = 64 code points per block). +constexpr uint32_t IDNA_BLOCK_BITS = 6u; +constexpr uint32_t IDNA_BLOCK_SIZE = 64u; +constexpr uint32_t IDNA_BLOCK_MASK = 63u; -}; -const uint32_t table[8198][2] = -{ - {0, 1}, {65, 16777219}, {66, 16777475}, {67, 16777731}, - {68, 16777987}, {69, 16778243}, {70, 16778499}, {71, 16778755}, - {72, 16779011}, {73, 16779267}, {74, 16779523}, {75, 16779779}, - {76, 16780035}, {77, 16780291}, {78, 16780547}, {79, 16780803}, - {80, 16781059}, {81, 16781315}, {82, 16781571}, {83, 16781827}, - {84, 16782083}, {85, 16782339}, {86, 16782595}, {87, 16782851}, - {88, 16783107}, {89, 16783363}, {90, 16783619}, {91, 1}, - {128, 2}, {160, 16783875}, {161, 1}, {168, 33561347}, - {169, 1}, {170, 16777219}, {171, 1}, {173, 0}, - {174, 1}, {175, 33561859}, {176, 1}, {178, 16785155}, - {179, 16785411}, {180, 33562883}, {181, 16786179}, {182, 1}, - {184, 33563651}, {185, 16786947}, {186, 16780803}, {187, 1}, - {188, 50341635}, {189, 50342403}, {190, 50343171}, {191, 1}, - {192, 16789507}, {193, 16789763}, {194, 16790019}, {195, 16790275}, - {196, 16790531}, {197, 16790787}, {198, 16791043}, {199, 16791299}, - {200, 16791555}, {201, 16791811}, {202, 16792067}, {203, 16792323}, - {204, 16792579}, {205, 16792835}, {206, 16793091}, {207, 16793347}, - {208, 16793603}, {209, 16793859}, {210, 16794115}, {211, 16794371}, - {212, 16794627}, {213, 16794883}, {214, 16795139}, {215, 1}, - {216, 16795395}, {217, 16795651}, {218, 16795907}, {219, 16796163}, - {220, 16796419}, {221, 16796675}, {222, 16796931}, {223, 1}, - {256, 16797187}, {257, 1}, {258, 16797443}, {259, 1}, - {260, 16797699}, {261, 1}, {262, 16797955}, {263, 1}, - {264, 16798211}, {265, 1}, {266, 16798467}, {267, 1}, - {268, 16798723}, {269, 1}, {270, 16798979}, {271, 1}, - {272, 16799235}, {273, 1}, {274, 16799491}, {275, 1}, - {276, 16799747}, {277, 1}, {278, 16800003}, {279, 1}, - {280, 16800259}, {281, 1}, {282, 16800515}, {283, 1}, - {284, 16800771}, {285, 1}, {286, 16801027}, {287, 1}, - {288, 16801283}, {289, 1}, {290, 16801539}, {291, 1}, - {292, 16801795}, {293, 1}, {294, 16802051}, {295, 1}, - {296, 16802307}, {297, 1}, {298, 16802563}, {299, 1}, - {300, 16802819}, {301, 1}, {302, 16803075}, {303, 1}, - {304, 33580547}, {305, 1}, {306, 33556483}, {308, 16803843}, - {309, 1}, {310, 16804099}, {311, 1}, {313, 16804355}, - {314, 1}, {315, 16804611}, {316, 1}, {317, 16804867}, - {318, 1}, {319, 33582339}, {321, 16805635}, {322, 1}, - {323, 16805891}, {324, 1}, {325, 16806147}, {326, 1}, - {327, 16806403}, {328, 1}, {329, 33583875}, {330, 16807171}, - {331, 1}, {332, 16807427}, {333, 1}, {334, 16807683}, - {335, 1}, {336, 16807939}, {337, 1}, {338, 16808195}, - {339, 1}, {340, 16808451}, {341, 1}, {342, 16808707}, - {343, 1}, {344, 16808963}, {345, 1}, {346, 16809219}, - {347, 1}, {348, 16809475}, {349, 1}, {350, 16809731}, - {351, 1}, {352, 16809987}, {353, 1}, {354, 16810243}, - {355, 1}, {356, 16810499}, {357, 1}, {358, 16810755}, - {359, 1}, {360, 16811011}, {361, 1}, {362, 16811267}, - {363, 1}, {364, 16811523}, {365, 1}, {366, 16811779}, - {367, 1}, {368, 16812035}, {369, 1}, {370, 16812291}, - {371, 1}, {372, 16812547}, {373, 1}, {374, 16812803}, - {375, 1}, {376, 16813059}, {377, 16813315}, {378, 1}, - {379, 16813571}, {380, 1}, {381, 16813827}, {382, 1}, - {383, 16781827}, {384, 1}, {385, 16814083}, {386, 16814339}, - {387, 1}, {388, 16814595}, {389, 1}, {390, 16814851}, - {391, 16815107}, {392, 1}, {393, 16815363}, {394, 16815619}, - {395, 16815875}, {396, 1}, {398, 16816131}, {399, 16816387}, - {400, 16816643}, {401, 16816899}, {402, 1}, {403, 16817155}, - {404, 16817411}, {405, 1}, {406, 16817667}, {407, 16817923}, - {408, 16818179}, {409, 1}, {412, 16818435}, {413, 16818691}, - {414, 1}, {415, 16818947}, {416, 16819203}, {417, 1}, - {418, 16819459}, {419, 1}, {420, 16819715}, {421, 1}, - {422, 16819971}, {423, 16820227}, {424, 1}, {425, 16820483}, - {426, 1}, {428, 16820739}, {429, 1}, {430, 16820995}, - {431, 16821251}, {432, 1}, {433, 16821507}, {434, 16821763}, - {435, 16822019}, {436, 1}, {437, 16822275}, {438, 1}, - {439, 16822531}, {440, 16822787}, {441, 1}, {444, 16823043}, - {445, 1}, {452, 33600515}, {455, 33601027}, {458, 33601539}, - {461, 16824835}, {462, 1}, {463, 16825091}, {464, 1}, - {465, 16825347}, {466, 1}, {467, 16825603}, {468, 1}, - {469, 16825859}, {470, 1}, {471, 16826115}, {472, 1}, - {473, 16826371}, {474, 1}, {475, 16826627}, {476, 1}, - {478, 16826883}, {479, 1}, {480, 16827139}, {481, 1}, - {482, 16827395}, {483, 1}, {484, 16827651}, {485, 1}, - {486, 16827907}, {487, 1}, {488, 16828163}, {489, 1}, - {490, 16828419}, {491, 1}, {492, 16828675}, {493, 1}, - {494, 16828931}, {495, 1}, {497, 33606403}, {500, 16829699}, - {501, 1}, {502, 16829955}, {503, 16830211}, {504, 16830467}, - {505, 1}, {506, 16830723}, {507, 1}, {508, 16830979}, - {509, 1}, {510, 16831235}, {511, 1}, {512, 16831491}, - {513, 1}, {514, 16831747}, {515, 1}, {516, 16832003}, - {517, 1}, {518, 16832259}, {519, 1}, {520, 16832515}, - {521, 1}, {522, 16832771}, {523, 1}, {524, 16833027}, - {525, 1}, {526, 16833283}, {527, 1}, {528, 16833539}, - {529, 1}, {530, 16833795}, {531, 1}, {532, 16834051}, - {533, 1}, {534, 16834307}, {535, 1}, {536, 16834563}, - {537, 1}, {538, 16834819}, {539, 1}, {540, 16835075}, - {541, 1}, {542, 16835331}, {543, 1}, {544, 16835587}, - {545, 1}, {546, 16835843}, {547, 1}, {548, 16836099}, - {549, 1}, {550, 16836355}, {551, 1}, {552, 16836611}, - {553, 1}, {554, 16836867}, {555, 1}, {556, 16837123}, - {557, 1}, {558, 16837379}, {559, 1}, {560, 16837635}, - {561, 1}, {562, 16837891}, {563, 1}, {570, 16838147}, - {571, 16838403}, {572, 1}, {573, 16838659}, {574, 16838915}, - {575, 1}, {577, 16839171}, {578, 1}, {579, 16839427}, - {580, 16839683}, {581, 16839939}, {582, 16840195}, {583, 1}, - {584, 16840451}, {585, 1}, {586, 16840707}, {587, 1}, - {588, 16840963}, {589, 1}, {590, 16841219}, {591, 1}, - {688, 16779011}, {689, 16841475}, {690, 16779523}, {691, 16781571}, - {692, 16841731}, {693, 16841987}, {694, 16842243}, {695, 16782851}, - {696, 16783363}, {697, 1}, {728, 33619715}, {729, 33620227}, - {730, 33620739}, {731, 33621251}, {732, 33621763}, {733, 33622275}, - {734, 1}, {736, 16817411}, {737, 16780035}, {738, 16781827}, - {739, 16783107}, {740, 16845571}, {741, 1}, {832, 16845827}, - {833, 16785923}, {834, 1}, {835, 16846083}, {836, 33623555}, - {837, 16846851}, {838, 1}, {847, 0}, {848, 1}, - {880, 16847107}, {881, 1}, {882, 16847363}, {883, 1}, - {884, 16847619}, {885, 1}, {886, 16847875}, {887, 1}, - {888, 2}, {890, 33625347}, {891, 1}, {894, 16848643}, - {895, 16848899}, {896, 2}, {900, 33562883}, {901, 50403587}, - {902, 16849923}, {903, 16805379}, {904, 16850179}, {905, 16850435}, - {906, 16850691}, {907, 2}, {908, 16850947}, {909, 2}, - {910, 16851203}, {911, 16851459}, {912, 1}, {913, 16851715}, - {914, 16851971}, {915, 16852227}, {916, 16852483}, {917, 16852739}, - {918, 16852995}, {919, 16853251}, {920, 16853507}, {921, 16846851}, - {922, 16853763}, {923, 16854019}, {924, 16786179}, {925, 16854275}, - {926, 16854531}, {927, 16854787}, {928, 16855043}, {929, 16855299}, - {930, 2}, {931, 16855555}, {932, 16855811}, {933, 16856067}, - {934, 16856323}, {935, 16856579}, {936, 16856835}, {937, 16857091}, - {938, 16857347}, {939, 16857603}, {940, 1}, {975, 16857859}, - {976, 16851971}, {977, 16853507}, {978, 16856067}, {979, 16851203}, - {980, 16857603}, {981, 16856323}, {982, 16855043}, {983, 1}, - {984, 16858115}, {985, 1}, {986, 16858371}, {987, 1}, - {988, 16858627}, {989, 1}, {990, 16858883}, {991, 1}, - {992, 16859139}, {993, 1}, {994, 16859395}, {995, 1}, - {996, 16859651}, {997, 1}, {998, 16859907}, {999, 1}, - {1000, 16860163}, {1001, 1}, {1002, 16860419}, {1003, 1}, - {1004, 16860675}, {1005, 1}, {1006, 16860931}, {1007, 1}, - {1008, 16853763}, {1009, 16855299}, {1010, 16855555}, {1011, 1}, - {1012, 16853507}, {1013, 16852739}, {1014, 1}, {1015, 16861187}, - {1016, 1}, {1017, 16855555}, {1018, 16861443}, {1019, 1}, - {1021, 16861699}, {1022, 16861955}, {1023, 16862211}, {1024, 16862467}, - {1025, 16862723}, {1026, 16862979}, {1027, 16863235}, {1028, 16863491}, - {1029, 16863747}, {1030, 16864003}, {1031, 16864259}, {1032, 16864515}, - {1033, 16864771}, {1034, 16865027}, {1035, 16865283}, {1036, 16865539}, - {1037, 16865795}, {1038, 16866051}, {1039, 16866307}, {1040, 16866563}, - {1041, 16866819}, {1042, 16867075}, {1043, 16867331}, {1044, 16867587}, - {1045, 16867843}, {1046, 16868099}, {1047, 16868355}, {1048, 16868611}, - {1049, 16868867}, {1050, 16869123}, {1051, 16869379}, {1052, 16869635}, - {1053, 16869891}, {1054, 16870147}, {1055, 16870403}, {1056, 16870659}, - {1057, 16870915}, {1058, 16871171}, {1059, 16871427}, {1060, 16871683}, - {1061, 16871939}, {1062, 16872195}, {1063, 16872451}, {1064, 16872707}, - {1065, 16872963}, {1066, 16873219}, {1067, 16873475}, {1068, 16873731}, - {1069, 16873987}, {1070, 16874243}, {1071, 16874499}, {1072, 1}, - {1120, 16874755}, {1121, 1}, {1122, 16875011}, {1123, 1}, - {1124, 16875267}, {1125, 1}, {1126, 16875523}, {1127, 1}, - {1128, 16875779}, {1129, 1}, {1130, 16876035}, {1131, 1}, - {1132, 16876291}, {1133, 1}, {1134, 16876547}, {1135, 1}, - {1136, 16876803}, {1137, 1}, {1138, 16877059}, {1139, 1}, - {1140, 16877315}, {1141, 1}, {1142, 16877571}, {1143, 1}, - {1144, 16877827}, {1145, 1}, {1146, 16878083}, {1147, 1}, - {1148, 16878339}, {1149, 1}, {1150, 16878595}, {1151, 1}, - {1152, 16878851}, {1153, 1}, {1162, 16879107}, {1163, 1}, - {1164, 16879363}, {1165, 1}, {1166, 16879619}, {1167, 1}, - {1168, 16879875}, {1169, 1}, {1170, 16880131}, {1171, 1}, - {1172, 16880387}, {1173, 1}, {1174, 16880643}, {1175, 1}, - {1176, 16880899}, {1177, 1}, {1178, 16881155}, {1179, 1}, - {1180, 16881411}, {1181, 1}, {1182, 16881667}, {1183, 1}, - {1184, 16881923}, {1185, 1}, {1186, 16882179}, {1187, 1}, - {1188, 16882435}, {1189, 1}, {1190, 16882691}, {1191, 1}, - {1192, 16882947}, {1193, 1}, {1194, 16883203}, {1195, 1}, - {1196, 16883459}, {1197, 1}, {1198, 16883715}, {1199, 1}, - {1200, 16883971}, {1201, 1}, {1202, 16884227}, {1203, 1}, - {1204, 16884483}, {1205, 1}, {1206, 16884739}, {1207, 1}, - {1208, 16884995}, {1209, 1}, {1210, 16885251}, {1211, 1}, - {1212, 16885507}, {1213, 1}, {1214, 16885763}, {1215, 1}, - {1216, 16886019}, {1217, 16886275}, {1218, 1}, {1219, 16886531}, - {1220, 1}, {1221, 16886787}, {1222, 1}, {1223, 16887043}, - {1224, 1}, {1225, 16887299}, {1226, 1}, {1227, 16887555}, - {1228, 1}, {1229, 16887811}, {1230, 1}, {1232, 16888067}, - {1233, 1}, {1234, 16888323}, {1235, 1}, {1236, 16888579}, - {1237, 1}, {1238, 16888835}, {1239, 1}, {1240, 16889091}, - {1241, 1}, {1242, 16889347}, {1243, 1}, {1244, 16889603}, - {1245, 1}, {1246, 16889859}, {1247, 1}, {1248, 16890115}, - {1249, 1}, {1250, 16890371}, {1251, 1}, {1252, 16890627}, - {1253, 1}, {1254, 16890883}, {1255, 1}, {1256, 16891139}, - {1257, 1}, {1258, 16891395}, {1259, 1}, {1260, 16891651}, - {1261, 1}, {1262, 16891907}, {1263, 1}, {1264, 16892163}, - {1265, 1}, {1266, 16892419}, {1267, 1}, {1268, 16892675}, - {1269, 1}, {1270, 16892931}, {1271, 1}, {1272, 16893187}, - {1273, 1}, {1274, 16893443}, {1275, 1}, {1276, 16893699}, - {1277, 1}, {1278, 16893955}, {1279, 1}, {1280, 16894211}, - {1281, 1}, {1282, 16894467}, {1283, 1}, {1284, 16894723}, - {1285, 1}, {1286, 16894979}, {1287, 1}, {1288, 16895235}, - {1289, 1}, {1290, 16895491}, {1291, 1}, {1292, 16895747}, - {1293, 1}, {1294, 16896003}, {1295, 1}, {1296, 16896259}, - {1297, 1}, {1298, 16896515}, {1299, 1}, {1300, 16896771}, - {1301, 1}, {1302, 16897027}, {1303, 1}, {1304, 16897283}, - {1305, 1}, {1306, 16897539}, {1307, 1}, {1308, 16897795}, - {1309, 1}, {1310, 16898051}, {1311, 1}, {1312, 16898307}, - {1313, 1}, {1314, 16898563}, {1315, 1}, {1316, 16898819}, - {1317, 1}, {1318, 16899075}, {1319, 1}, {1320, 16899331}, - {1321, 1}, {1322, 16899587}, {1323, 1}, {1324, 16899843}, - {1325, 1}, {1326, 16900099}, {1327, 1}, {1328, 2}, - {1329, 16900355}, {1330, 16900611}, {1331, 16900867}, {1332, 16901123}, - {1333, 16901379}, {1334, 16901635}, {1335, 16901891}, {1336, 16902147}, - {1337, 16902403}, {1338, 16902659}, {1339, 16902915}, {1340, 16903171}, - {1341, 16903427}, {1342, 16903683}, {1343, 16903939}, {1344, 16904195}, - {1345, 16904451}, {1346, 16904707}, {1347, 16904963}, {1348, 16905219}, - {1349, 16905475}, {1350, 16905731}, {1351, 16905987}, {1352, 16906243}, - {1353, 16906499}, {1354, 16906755}, {1355, 16907011}, {1356, 16907267}, - {1357, 16907523}, {1358, 16907779}, {1359, 16908035}, {1360, 16908291}, - {1361, 16908547}, {1362, 16908803}, {1363, 16909059}, {1364, 16909315}, - {1365, 16909571}, {1366, 16909827}, {1367, 2}, {1369, 1}, - {1415, 33687299}, {1416, 1}, {1419, 2}, {1421, 1}, - {1424, 2}, {1425, 1}, {1480, 2}, {1488, 1}, - {1515, 2}, {1519, 1}, {1525, 2}, {1542, 1}, - {1564, 2}, {1565, 1}, {1653, 33687811}, {1654, 33688323}, - {1655, 33688835}, {1656, 33689347}, {1657, 1}, {1757, 2}, - {1758, 1}, {1806, 2}, {1808, 1}, {1867, 2}, - {1869, 1}, {1970, 2}, {1984, 1}, {2043, 2}, - {2045, 1}, {2094, 2}, {2096, 1}, {2111, 2}, - {2112, 1}, {2140, 2}, {2142, 1}, {2143, 2}, - {2144, 1}, {2155, 2}, {2160, 1}, {2192, 2}, - {2199, 1}, {2274, 2}, {2275, 1}, {2392, 33689859}, - {2393, 33690371}, {2394, 33690883}, {2395, 33691395}, {2396, 33691907}, - {2397, 33692419}, {2398, 33692931}, {2399, 33693443}, {2400, 1}, - {2436, 2}, {2437, 1}, {2445, 2}, {2447, 1}, - {2449, 2}, {2451, 1}, {2473, 2}, {2474, 1}, - {2481, 2}, {2482, 1}, {2483, 2}, {2486, 1}, - {2490, 2}, {2492, 1}, {2501, 2}, {2503, 1}, - {2505, 2}, {2507, 1}, {2511, 2}, {2519, 1}, - {2520, 2}, {2524, 33693955}, {2525, 33694467}, {2526, 2}, - {2527, 33694979}, {2528, 1}, {2532, 2}, {2534, 1}, - {2559, 2}, {2561, 1}, {2564, 2}, {2565, 1}, - {2571, 2}, {2575, 1}, {2577, 2}, {2579, 1}, - {2601, 2}, {2602, 1}, {2609, 2}, {2610, 1}, - {2611, 33695491}, {2612, 2}, {2613, 1}, {2614, 33696003}, - {2615, 2}, {2616, 1}, {2618, 2}, {2620, 1}, - {2621, 2}, {2622, 1}, {2627, 2}, {2631, 1}, - {2633, 2}, {2635, 1}, {2638, 2}, {2641, 1}, - {2642, 2}, {2649, 33696515}, {2650, 33697027}, {2651, 33697539}, - {2652, 1}, {2653, 2}, {2654, 33698051}, {2655, 2}, - {2662, 1}, {2679, 2}, {2689, 1}, {2692, 2}, - {2693, 1}, {2702, 2}, {2703, 1}, {2706, 2}, - {2707, 1}, {2729, 2}, {2730, 1}, {2737, 2}, - {2738, 1}, {2740, 2}, {2741, 1}, {2746, 2}, - {2748, 1}, {2758, 2}, {2759, 1}, {2762, 2}, - {2763, 1}, {2766, 2}, {2768, 1}, {2769, 2}, - {2784, 1}, {2788, 2}, {2790, 1}, {2802, 2}, - {2809, 1}, {2816, 2}, {2817, 1}, {2820, 2}, - {2821, 1}, {2829, 2}, {2831, 1}, {2833, 2}, - {2835, 1}, {2857, 2}, {2858, 1}, {2865, 2}, - {2866, 1}, {2868, 2}, {2869, 1}, {2874, 2}, - {2876, 1}, {2885, 2}, {2887, 1}, {2889, 2}, - {2891, 1}, {2894, 2}, {2901, 1}, {2904, 2}, - {2908, 33698563}, {2909, 33699075}, {2910, 2}, {2911, 1}, - {2916, 2}, {2918, 1}, {2936, 2}, {2946, 1}, - {2948, 2}, {2949, 1}, {2955, 2}, {2958, 1}, - {2961, 2}, {2962, 1}, {2966, 2}, {2969, 1}, - {2971, 2}, {2972, 1}, {2973, 2}, {2974, 1}, - {2976, 2}, {2979, 1}, {2981, 2}, {2984, 1}, - {2987, 2}, {2990, 1}, {3002, 2}, {3006, 1}, - {3011, 2}, {3014, 1}, {3017, 2}, {3018, 1}, - {3022, 2}, {3024, 1}, {3025, 2}, {3031, 1}, - {3032, 2}, {3046, 1}, {3067, 2}, {3072, 1}, - {3085, 2}, {3086, 1}, {3089, 2}, {3090, 1}, - {3113, 2}, {3114, 1}, {3130, 2}, {3132, 1}, - {3141, 2}, {3142, 1}, {3145, 2}, {3146, 1}, - {3150, 2}, {3157, 1}, {3159, 2}, {3160, 1}, - {3163, 2}, {3164, 1}, {3166, 2}, {3168, 1}, - {3172, 2}, {3174, 1}, {3184, 2}, {3191, 1}, - {3213, 2}, {3214, 1}, {3217, 2}, {3218, 1}, - {3241, 2}, {3242, 1}, {3252, 2}, {3253, 1}, - {3258, 2}, {3260, 1}, {3269, 2}, {3270, 1}, - {3273, 2}, {3274, 1}, {3278, 2}, {3285, 1}, - {3287, 2}, {3292, 1}, {3295, 2}, {3296, 1}, - {3300, 2}, {3302, 1}, {3312, 2}, {3313, 1}, - {3316, 2}, {3328, 1}, {3341, 2}, {3342, 1}, - {3345, 2}, {3346, 1}, {3397, 2}, {3398, 1}, - {3401, 2}, {3402, 1}, {3408, 2}, {3412, 1}, - {3428, 2}, {3430, 1}, {3456, 2}, {3457, 1}, - {3460, 2}, {3461, 1}, {3479, 2}, {3482, 1}, - {3506, 2}, {3507, 1}, {3516, 2}, {3517, 1}, - {3518, 2}, {3520, 1}, {3527, 2}, {3530, 1}, - {3531, 2}, {3535, 1}, {3541, 2}, {3542, 1}, - {3543, 2}, {3544, 1}, {3552, 2}, {3558, 1}, - {3568, 2}, {3570, 1}, {3573, 2}, {3585, 1}, - {3635, 33699587}, {3636, 1}, {3643, 2}, {3647, 1}, - {3676, 2}, {3713, 1}, {3715, 2}, {3716, 1}, - {3717, 2}, {3718, 1}, {3723, 2}, {3724, 1}, - {3748, 2}, {3749, 1}, {3750, 2}, {3751, 1}, - {3763, 33700099}, {3764, 1}, {3774, 2}, {3776, 1}, - {3781, 2}, {3782, 1}, {3783, 2}, {3784, 1}, - {3791, 2}, {3792, 1}, {3802, 2}, {3804, 33700611}, - {3805, 33701123}, {3806, 1}, {3808, 2}, {3840, 1}, - {3852, 16924419}, {3853, 1}, {3907, 33701891}, {3908, 1}, - {3912, 2}, {3913, 1}, {3917, 33702403}, {3918, 1}, - {3922, 33702915}, {3923, 1}, {3927, 33703427}, {3928, 1}, - {3932, 33703939}, {3933, 1}, {3945, 33704451}, {3946, 1}, - {3949, 2}, {3953, 1}, {3955, 33704963}, {3956, 1}, - {3957, 33705475}, {3958, 33705987}, {3959, 50483715}, {3960, 33707267}, - {3961, 50484995}, {3962, 1}, {3969, 33706755}, {3970, 1}, - {3987, 33708547}, {3988, 1}, {3992, 2}, {3993, 1}, - {3997, 33709059}, {3998, 1}, {4002, 33709571}, {4003, 1}, - {4007, 33710083}, {4008, 1}, {4012, 33710595}, {4013, 1}, - {4025, 33711107}, {4026, 1}, {4029, 2}, {4030, 1}, - {4045, 2}, {4046, 1}, {4059, 2}, {4096, 1}, - {4256, 16934403}, {4257, 16934659}, {4258, 16934915}, {4259, 16935171}, - {4260, 16935427}, {4261, 16935683}, {4262, 16935939}, {4263, 16936195}, - {4264, 16936451}, {4265, 16936707}, {4266, 16936963}, {4267, 16937219}, - {4268, 16937475}, {4269, 16937731}, {4270, 16937987}, {4271, 16938243}, - {4272, 16938499}, {4273, 16938755}, {4274, 16939011}, {4275, 16939267}, - {4276, 16939523}, {4277, 16939779}, {4278, 16940035}, {4279, 16940291}, - {4280, 16940547}, {4281, 16940803}, {4282, 16941059}, {4283, 16941315}, - {4284, 16941571}, {4285, 16941827}, {4286, 16942083}, {4287, 16942339}, - {4288, 16942595}, {4289, 16942851}, {4290, 16943107}, {4291, 16943363}, - {4292, 16943619}, {4293, 16943875}, {4294, 2}, {4295, 16944131}, - {4296, 2}, {4301, 16944387}, {4302, 2}, {4304, 1}, - {4348, 16944643}, {4349, 1}, {4447, 0}, {4449, 1}, - {4681, 2}, {4682, 1}, {4686, 2}, {4688, 1}, - {4695, 2}, {4696, 1}, {4697, 2}, {4698, 1}, - {4702, 2}, {4704, 1}, {4745, 2}, {4746, 1}, - {4750, 2}, {4752, 1}, {4785, 2}, {4786, 1}, - {4790, 2}, {4792, 1}, {4799, 2}, {4800, 1}, - {4801, 2}, {4802, 1}, {4806, 2}, {4808, 1}, - {4823, 2}, {4824, 1}, {4881, 2}, {4882, 1}, - {4886, 2}, {4888, 1}, {4955, 2}, {4957, 1}, - {4989, 2}, {4992, 1}, {5018, 2}, {5024, 1}, - {5110, 2}, {5112, 16944899}, {5113, 16945155}, {5114, 16945411}, - {5115, 16945667}, {5116, 16945923}, {5117, 16946179}, {5118, 2}, - {5120, 1}, {5760, 2}, {5761, 1}, {5789, 2}, - {5792, 1}, {5881, 2}, {5888, 1}, {5910, 2}, - {5919, 1}, {5943, 2}, {5952, 1}, {5972, 2}, - {5984, 1}, {5997, 2}, {5998, 1}, {6001, 2}, - {6002, 1}, {6004, 2}, {6016, 1}, {6068, 0}, - {6070, 1}, {6110, 2}, {6112, 1}, {6122, 2}, - {6128, 1}, {6138, 2}, {6144, 1}, {6155, 0}, - {6160, 1}, {6170, 2}, {6176, 1}, {6265, 2}, - {6272, 1}, {6315, 2}, {6320, 1}, {6390, 2}, - {6400, 1}, {6431, 2}, {6432, 1}, {6444, 2}, - {6448, 1}, {6460, 2}, {6464, 1}, {6465, 2}, - {6468, 1}, {6510, 2}, {6512, 1}, {6517, 2}, - {6528, 1}, {6572, 2}, {6576, 1}, {6602, 2}, - {6608, 1}, {6619, 2}, {6622, 1}, {6684, 2}, - {6686, 1}, {6751, 2}, {6752, 1}, {6781, 2}, - {6783, 1}, {6794, 2}, {6800, 1}, {6810, 2}, - {6816, 1}, {6830, 2}, {6832, 1}, {6878, 2}, - {6880, 1}, {6892, 2}, {6912, 1}, {6989, 2}, - {6990, 1}, {7156, 2}, {7164, 1}, {7224, 2}, - {7227, 1}, {7242, 2}, {7245, 1}, {7296, 16867075}, - {7297, 16867587}, {7298, 16870147}, {7299, 16870915}, {7300, 16871171}, - {7302, 16873219}, {7303, 16875011}, {7304, 16946435}, {7305, 16946691}, - {7306, 1}, {7307, 2}, {7312, 16946947}, {7313, 16947203}, - {7314, 16947459}, {7315, 16947715}, {7316, 16947971}, {7317, 16948227}, - {7318, 16948483}, {7319, 16948739}, {7320, 16948995}, {7321, 16949251}, - {7322, 16949507}, {7323, 16949763}, {7324, 16944643}, {7325, 16950019}, - {7326, 16950275}, {7327, 16950531}, {7328, 16950787}, {7329, 16951043}, - {7330, 16951299}, {7331, 16951555}, {7332, 16951811}, {7333, 16952067}, - {7334, 16952323}, {7335, 16952579}, {7336, 16952835}, {7337, 16953091}, - {7338, 16953347}, {7339, 16953603}, {7340, 16953859}, {7341, 16954115}, - {7342, 16954371}, {7343, 16954627}, {7344, 16954883}, {7345, 16955139}, - {7346, 16955395}, {7347, 16955651}, {7348, 16955907}, {7349, 16956163}, - {7350, 16956419}, {7351, 16956675}, {7352, 16956931}, {7353, 16957187}, - {7354, 16957443}, {7355, 2}, {7357, 16957699}, {7358, 16957955}, - {7359, 16958211}, {7360, 1}, {7368, 2}, {7376, 1}, - {7419, 2}, {7424, 1}, {7468, 16777219}, {7469, 16791043}, - {7470, 16777475}, {7471, 1}, {7472, 16777987}, {7473, 16778243}, - {7474, 16816131}, {7475, 16778755}, {7476, 16779011}, {7477, 16779267}, - {7478, 16779523}, {7479, 16779779}, {7480, 16780035}, {7481, 16780291}, - {7482, 16780547}, {7483, 1}, {7484, 16780803}, {7485, 16835843}, - {7486, 16781059}, {7487, 16781571}, {7488, 16782083}, {7489, 16782339}, - {7490, 16782851}, {7491, 16777219}, {7492, 16958467}, {7493, 16958723}, - {7494, 16958979}, {7495, 16777475}, {7496, 16777987}, {7497, 16778243}, - {7498, 16816387}, {7499, 16816643}, {7500, 16959235}, {7501, 16778755}, - {7502, 1}, {7503, 16779779}, {7504, 16780291}, {7505, 16807171}, - {7506, 16780803}, {7507, 16814851}, {7508, 16959491}, {7509, 16959747}, - {7510, 16781059}, {7511, 16782083}, {7512, 16782339}, {7513, 16960003}, - {7514, 16818435}, {7515, 16782595}, {7516, 16960259}, {7517, 16851971}, - {7518, 16852227}, {7519, 16852483}, {7520, 16856323}, {7521, 16856579}, - {7522, 16779267}, {7523, 16781571}, {7524, 16782339}, {7525, 16782595}, - {7526, 16851971}, {7527, 16852227}, {7528, 16855299}, {7529, 16856323}, - {7530, 16856579}, {7531, 1}, {7544, 16869891}, {7545, 1}, - {7579, 16960515}, {7580, 16777731}, {7581, 16960771}, {7582, 16793603}, - {7583, 16959235}, {7584, 16778499}, {7585, 16961027}, {7586, 16961283}, - {7587, 16961539}, {7588, 16817923}, {7589, 16817667}, {7590, 16961795}, - {7591, 16962051}, {7592, 16962307}, {7593, 16962563}, {7594, 16962819}, - {7595, 16963075}, {7596, 16963331}, {7597, 16963587}, {7598, 16818691}, - {7599, 16963843}, {7600, 16964099}, {7601, 16818947}, {7602, 16964355}, - {7603, 16964611}, {7604, 16820483}, {7605, 16964867}, {7606, 16839683}, - {7607, 16821507}, {7608, 16965123}, {7609, 16821763}, {7610, 16839939}, - {7611, 16783619}, {7612, 16965379}, {7613, 16965635}, {7614, 16822531}, - {7615, 16853507}, {7616, 1}, {7680, 16965891}, {7681, 1}, - {7682, 16966147}, {7683, 1}, {7684, 16966403}, {7685, 1}, - {7686, 16966659}, {7687, 1}, {7688, 16966915}, {7689, 1}, - {7690, 16967171}, {7691, 1}, {7692, 16967427}, {7693, 1}, - {7694, 16967683}, {7695, 1}, {7696, 16967939}, {7697, 1}, - {7698, 16968195}, {7699, 1}, {7700, 16968451}, {7701, 1}, - {7702, 16968707}, {7703, 1}, {7704, 16968963}, {7705, 1}, - {7706, 16969219}, {7707, 1}, {7708, 16969475}, {7709, 1}, - {7710, 16969731}, {7711, 1}, {7712, 16969987}, {7713, 1}, - {7714, 16970243}, {7715, 1}, {7716, 16970499}, {7717, 1}, - {7718, 16970755}, {7719, 1}, {7720, 16971011}, {7721, 1}, - {7722, 16971267}, {7723, 1}, {7724, 16971523}, {7725, 1}, - {7726, 16971779}, {7727, 1}, {7728, 16972035}, {7729, 1}, - {7730, 16972291}, {7731, 1}, {7732, 16972547}, {7733, 1}, - {7734, 16972803}, {7735, 1}, {7736, 16973059}, {7737, 1}, - {7738, 16973315}, {7739, 1}, {7740, 16973571}, {7741, 1}, - {7742, 16973827}, {7743, 1}, {7744, 16974083}, {7745, 1}, - {7746, 16974339}, {7747, 1}, {7748, 16974595}, {7749, 1}, - {7750, 16974851}, {7751, 1}, {7752, 16975107}, {7753, 1}, - {7754, 16975363}, {7755, 1}, {7756, 16975619}, {7757, 1}, - {7758, 16975875}, {7759, 1}, {7760, 16976131}, {7761, 1}, - {7762, 16976387}, {7763, 1}, {7764, 16976643}, {7765, 1}, - {7766, 16976899}, {7767, 1}, {7768, 16977155}, {7769, 1}, - {7770, 16977411}, {7771, 1}, {7772, 16977667}, {7773, 1}, - {7774, 16977923}, {7775, 1}, {7776, 16978179}, {7777, 1}, - {7778, 16978435}, {7779, 1}, {7780, 16978691}, {7781, 1}, - {7782, 16978947}, {7783, 1}, {7784, 16979203}, {7785, 1}, - {7786, 16979459}, {7787, 1}, {7788, 16979715}, {7789, 1}, - {7790, 16979971}, {7791, 1}, {7792, 16980227}, {7793, 1}, - {7794, 16980483}, {7795, 1}, {7796, 16980739}, {7797, 1}, - {7798, 16980995}, {7799, 1}, {7800, 16981251}, {7801, 1}, - {7802, 16981507}, {7803, 1}, {7804, 16981763}, {7805, 1}, - {7806, 16982019}, {7807, 1}, {7808, 16982275}, {7809, 1}, - {7810, 16982531}, {7811, 1}, {7812, 16982787}, {7813, 1}, - {7814, 16983043}, {7815, 1}, {7816, 16983299}, {7817, 1}, - {7818, 16983555}, {7819, 1}, {7820, 16983811}, {7821, 1}, - {7822, 16984067}, {7823, 1}, {7824, 16984323}, {7825, 1}, - {7826, 16984579}, {7827, 1}, {7828, 16984835}, {7829, 1}, - {7834, 33762307}, {7835, 16978179}, {7836, 1}, {7838, 16985603}, - {7839, 1}, {7840, 16985859}, {7841, 1}, {7842, 16986115}, - {7843, 1}, {7844, 16986371}, {7845, 1}, {7846, 16986627}, - {7847, 1}, {7848, 16986883}, {7849, 1}, {7850, 16987139}, - {7851, 1}, {7852, 16987395}, {7853, 1}, {7854, 16987651}, - {7855, 1}, {7856, 16987907}, {7857, 1}, {7858, 16988163}, - {7859, 1}, {7860, 16988419}, {7861, 1}, {7862, 16988675}, - {7863, 1}, {7864, 16988931}, {7865, 1}, {7866, 16989187}, - {7867, 1}, {7868, 16989443}, {7869, 1}, {7870, 16989699}, - {7871, 1}, {7872, 16989955}, {7873, 1}, {7874, 16990211}, - {7875, 1}, {7876, 16990467}, {7877, 1}, {7878, 16990723}, - {7879, 1}, {7880, 16990979}, {7881, 1}, {7882, 16991235}, - {7883, 1}, {7884, 16991491}, {7885, 1}, {7886, 16991747}, - {7887, 1}, {7888, 16992003}, {7889, 1}, {7890, 16992259}, - {7891, 1}, {7892, 16992515}, {7893, 1}, {7894, 16992771}, - {7895, 1}, {7896, 16993027}, {7897, 1}, {7898, 16993283}, - {7899, 1}, {7900, 16993539}, {7901, 1}, {7902, 16993795}, - {7903, 1}, {7904, 16994051}, {7905, 1}, {7906, 16994307}, - {7907, 1}, {7908, 16994563}, {7909, 1}, {7910, 16994819}, - {7911, 1}, {7912, 16995075}, {7913, 1}, {7914, 16995331}, - {7915, 1}, {7916, 16995587}, {7917, 1}, {7918, 16995843}, - {7919, 1}, {7920, 16996099}, {7921, 1}, {7922, 16996355}, - {7923, 1}, {7924, 16996611}, {7925, 1}, {7926, 16996867}, - {7927, 1}, {7928, 16997123}, {7929, 1}, {7930, 16997379}, - {7931, 1}, {7932, 16997635}, {7933, 1}, {7934, 16997891}, - {7935, 1}, {7944, 16998147}, {7945, 16998403}, {7946, 16998659}, - {7947, 16998915}, {7948, 16999171}, {7949, 16999427}, {7950, 16999683}, - {7951, 16999939}, {7952, 1}, {7958, 2}, {7960, 17000195}, - {7961, 17000451}, {7962, 17000707}, {7963, 17000963}, {7964, 17001219}, - {7965, 17001475}, {7966, 2}, {7968, 1}, {7976, 17001731}, - {7977, 17001987}, {7978, 17002243}, {7979, 17002499}, {7980, 17002755}, - {7981, 17003011}, {7982, 17003267}, {7983, 17003523}, {7984, 1}, - {7992, 17003779}, {7993, 17004035}, {7994, 17004291}, {7995, 17004547}, - {7996, 17004803}, {7997, 17005059}, {7998, 17005315}, {7999, 17005571}, - {8000, 1}, {8006, 2}, {8008, 17005827}, {8009, 17006083}, - {8010, 17006339}, {8011, 17006595}, {8012, 17006851}, {8013, 17007107}, - {8014, 2}, {8016, 1}, {8024, 2}, {8025, 17007363}, - {8026, 2}, {8027, 17007619}, {8028, 2}, {8029, 17007875}, - {8030, 2}, {8031, 17008131}, {8032, 1}, {8040, 17008387}, - {8041, 17008643}, {8042, 17008899}, {8043, 17009155}, {8044, 17009411}, - {8045, 17009667}, {8046, 17009923}, {8047, 17010179}, {8048, 1}, - {8049, 16849923}, {8050, 1}, {8051, 16850179}, {8052, 1}, - {8053, 16850435}, {8054, 1}, {8055, 16850691}, {8056, 1}, - {8057, 16850947}, {8058, 1}, {8059, 16851203}, {8060, 1}, - {8061, 16851459}, {8062, 2}, {8064, 33787651}, {8065, 33788163}, - {8066, 33788675}, {8067, 33789187}, {8068, 33789699}, {8069, 33790211}, - {8070, 33790723}, {8071, 33791235}, {8072, 33787651}, {8073, 33788163}, - {8074, 33788675}, {8075, 33789187}, {8076, 33789699}, {8077, 33790211}, - {8078, 33790723}, {8079, 33791235}, {8080, 33791747}, {8081, 33792259}, - {8082, 33792771}, {8083, 33793283}, {8084, 33793795}, {8085, 33794307}, - {8086, 33794819}, {8087, 33795331}, {8088, 33791747}, {8089, 33792259}, - {8090, 33792771}, {8091, 33793283}, {8092, 33793795}, {8093, 33794307}, - {8094, 33794819}, {8095, 33795331}, {8096, 33795843}, {8097, 33796355}, - {8098, 33796867}, {8099, 33797379}, {8100, 33797891}, {8101, 33798403}, - {8102, 33798915}, {8103, 33799427}, {8104, 33795843}, {8105, 33796355}, - {8106, 33796867}, {8107, 33797379}, {8108, 33797891}, {8109, 33798403}, - {8110, 33798915}, {8111, 33799427}, {8112, 1}, {8114, 33799939}, - {8115, 33800451}, {8116, 33800963}, {8117, 2}, {8118, 1}, - {8119, 33801475}, {8120, 17024771}, {8121, 17025027}, {8122, 17022723}, - {8123, 16849923}, {8124, 33800451}, {8125, 33802499}, {8126, 16846851}, - {8127, 33802499}, {8128, 33803011}, {8129, 50580739}, {8130, 33804291}, - {8131, 33804803}, {8132, 33805315}, {8133, 2}, {8134, 1}, - {8135, 33805827}, {8136, 17029123}, {8137, 16850179}, {8138, 17027075}, - {8139, 16850435}, {8140, 33804803}, {8141, 50583811}, {8142, 50584579}, - {8143, 50585347}, {8144, 1}, {8147, 17031683}, {8148, 2}, - {8150, 1}, {8152, 17031939}, {8153, 17032195}, {8154, 17032451}, - {8155, 16850691}, {8156, 2}, {8157, 50587139}, {8158, 50587907}, - {8159, 50588675}, {8160, 1}, {8163, 17035011}, {8164, 1}, - {8168, 17035267}, {8169, 17035523}, {8170, 17035779}, {8171, 16851203}, - {8172, 17036035}, {8173, 50590723}, {8174, 50403587}, {8175, 17037059}, - {8176, 2}, {8178, 33814531}, {8179, 33815043}, {8180, 33815555}, - {8181, 2}, {8182, 1}, {8183, 33816067}, {8184, 17039363}, - {8185, 16850947}, {8186, 17037315}, {8187, 16851459}, {8188, 33815043}, - {8189, 33562883}, {8190, 33809923}, {8191, 2}, {8192, 16783875}, - {8203, 0}, {8204, 1}, {8206, 2}, {8208, 1}, - {8209, 17039619}, {8210, 1}, {8215, 33817091}, {8216, 1}, - {8228, 2}, {8231, 1}, {8232, 2}, {8239, 16783875}, - {8240, 1}, {8243, 33817603}, {8244, 50595331}, {8245, 1}, - {8246, 33818883}, {8247, 50596611}, {8248, 1}, {8252, 33820163}, - {8253, 1}, {8254, 33820675}, {8255, 1}, {8263, 33821187}, - {8264, 33821699}, {8265, 33822211}, {8266, 1}, {8279, 67372035}, - {8280, 1}, {8287, 16783875}, {8288, 0}, {8293, 2}, - {8298, 0}, {8304, 17045507}, {8305, 16779267}, {8306, 2}, - {8308, 16787715}, {8309, 17045763}, {8310, 17046019}, {8311, 17046275}, - {8312, 17046531}, {8313, 17046787}, {8314, 17047043}, {8315, 17047299}, - {8316, 17047555}, {8317, 17047811}, {8318, 17048067}, {8319, 16780547}, - {8320, 17045507}, {8321, 16786947}, {8322, 16785155}, {8323, 16785411}, - {8324, 16787715}, {8325, 17045763}, {8326, 17046019}, {8327, 17046275}, - {8328, 17046531}, {8329, 17046787}, {8330, 17047043}, {8331, 17047299}, - {8332, 17047555}, {8333, 17047811}, {8334, 17048067}, {8335, 2}, - {8336, 16777219}, {8337, 16778243}, {8338, 16780803}, {8339, 16783107}, - {8340, 16816387}, {8341, 16779011}, {8342, 16779779}, {8343, 16780035}, - {8344, 16780291}, {8345, 16780547}, {8346, 16781059}, {8347, 16781827}, - {8348, 16782083}, {8349, 2}, {8352, 1}, {8360, 33558787}, - {8361, 1}, {8386, 2}, {8400, 1}, {8433, 2}, - {8448, 50602755}, {8449, 50603523}, {8450, 16777731}, {8451, 33827075}, - {8452, 1}, {8453, 50604803}, {8454, 50605571}, {8455, 16816643}, - {8456, 1}, {8457, 33829123}, {8458, 16778755}, {8459, 16779011}, - {8463, 16802051}, {8464, 16779267}, {8466, 16780035}, {8468, 1}, - {8469, 16780547}, {8470, 33557763}, {8471, 1}, {8473, 16781059}, - {8474, 16781315}, {8475, 16781571}, {8478, 1}, {8480, 33829635}, - {8481, 50607363}, {8482, 33830915}, {8483, 1}, {8484, 16783619}, - {8485, 1}, {8486, 16857091}, {8487, 1}, {8488, 16783619}, - {8489, 1}, {8490, 16779779}, {8491, 16790787}, {8492, 16777475}, - {8493, 16777731}, {8494, 1}, {8495, 16778243}, {8497, 16778499}, - {8498, 17054211}, {8499, 16780291}, {8500, 16780803}, {8501, 17054467}, - {8502, 17054723}, {8503, 17054979}, {8504, 17055235}, {8505, 16779267}, - {8506, 1}, {8507, 50609923}, {8508, 16855043}, {8509, 16852227}, - {8511, 16855043}, {8512, 17056259}, {8513, 1}, {8517, 16777987}, - {8519, 16778243}, {8520, 16779267}, {8521, 16779523}, {8522, 1}, - {8528, 50610947}, {8529, 50611715}, {8530, 67389699}, {8531, 50613507}, - {8532, 50614275}, {8533, 50615043}, {8534, 50615811}, {8535, 50616579}, - {8536, 50617347}, {8537, 50618115}, {8538, 50618883}, {8539, 50619651}, - {8540, 50620419}, {8541, 50621187}, {8542, 50621955}, {8543, 33564419}, - {8544, 16779267}, {8545, 33845507}, {8546, 50623235}, {8547, 33846787}, - {8548, 16782595}, {8549, 33847299}, {8550, 50625027}, {8551, 67403011}, - {8552, 33849603}, {8553, 16783107}, {8554, 33850115}, {8555, 50627843}, - {8556, 16780035}, {8557, 16777731}, {8558, 16777987}, {8559, 16780291}, - {8560, 16779267}, {8561, 33845507}, {8562, 50622723}, {8563, 33846787}, - {8564, 16782595}, {8565, 33847299}, {8566, 50625027}, {8567, 67403011}, - {8568, 33849603}, {8569, 16783107}, {8570, 33850115}, {8571, 50627843}, - {8572, 16780035}, {8573, 16777731}, {8574, 16777987}, {8575, 16780291}, - {8576, 1}, {8579, 17074179}, {8580, 1}, {8585, 50628867}, - {8586, 1}, {8588, 2}, {8592, 1}, {8748, 33852419}, - {8749, 50630147}, {8750, 1}, {8751, 33853699}, {8752, 50631427}, - {8753, 1}, {9001, 17077763}, {9002, 17078019}, {9003, 1}, - {9258, 2}, {9280, 1}, {9291, 2}, {9312, 16786947}, - {9313, 16785155}, {9314, 16785411}, {9315, 16787715}, {9316, 17045763}, - {9317, 17046019}, {9318, 17046275}, {9319, 17046531}, {9320, 17046787}, - {9321, 33835779}, {9322, 33564163}, {9323, 33855491}, {9324, 33856003}, - {9325, 33856515}, {9326, 33857027}, {9327, 33857539}, {9328, 33858051}, - {9329, 33858563}, {9330, 33859075}, {9331, 33859587}, {9332, 50637315}, - {9333, 50638083}, {9334, 50638851}, {9335, 50639619}, {9336, 50640387}, - {9337, 50641155}, {9338, 50641923}, {9339, 50642691}, {9340, 50643459}, - {9341, 67421443}, {9342, 67422467}, {9343, 67423491}, {9344, 67424515}, - {9345, 67425539}, {9346, 67426563}, {9347, 67427587}, {9348, 67428611}, - {9349, 67429635}, {9350, 67430659}, {9351, 67431683}, {9352, 2}, - {9372, 50655491}, {9373, 50656259}, {9374, 50657027}, {9375, 50657795}, - {9376, 50658563}, {9377, 50659331}, {9378, 50660099}, {9379, 50660867}, - {9380, 50661635}, {9381, 50662403}, {9382, 50663171}, {9383, 50663939}, - {9384, 50664707}, {9385, 50665475}, {9386, 50666243}, {9387, 50667011}, - {9388, 50667779}, {9389, 50668547}, {9390, 50669315}, {9391, 50670083}, - {9392, 50670851}, {9393, 50671619}, {9394, 50672387}, {9395, 50673155}, - {9396, 50673923}, {9397, 50674691}, {9398, 16777219}, {9399, 16777475}, - {9400, 16777731}, {9401, 16777987}, {9402, 16778243}, {9403, 16778499}, - {9404, 16778755}, {9405, 16779011}, {9406, 16779267}, {9407, 16779523}, - {9408, 16779779}, {9409, 16780035}, {9410, 16780291}, {9411, 16780547}, - {9412, 16780803}, {9413, 16781059}, {9414, 16781315}, {9415, 16781571}, - {9416, 16781827}, {9417, 16782083}, {9418, 16782339}, {9419, 16782595}, - {9420, 16782851}, {9421, 16783107}, {9422, 16783363}, {9423, 16783619}, - {9424, 16777219}, {9425, 16777475}, {9426, 16777731}, {9427, 16777987}, - {9428, 16778243}, {9429, 16778499}, {9430, 16778755}, {9431, 16779011}, - {9432, 16779267}, {9433, 16779523}, {9434, 16779779}, {9435, 16780035}, - {9436, 16780291}, {9437, 16780547}, {9438, 16780803}, {9439, 16781059}, - {9440, 16781315}, {9441, 16781571}, {9442, 16781827}, {9443, 16782083}, - {9444, 16782339}, {9445, 16782595}, {9446, 16782851}, {9447, 16783107}, - {9448, 16783363}, {9449, 16783619}, {9450, 17045507}, {9451, 1}, - {10764, 67406851}, {10765, 1}, {10868, 50675459}, {10869, 33899011}, - {10870, 50675971}, {10871, 1}, {10972, 33899523}, {10973, 1}, - {11124, 2}, {11126, 1}, {11264, 17122819}, {11265, 17123075}, - {11266, 17123331}, {11267, 17123587}, {11268, 17123843}, {11269, 17124099}, - {11270, 17124355}, {11271, 17124611}, {11272, 17124867}, {11273, 17125123}, - {11274, 17125379}, {11275, 17125635}, {11276, 17125891}, {11277, 17126147}, - {11278, 17126403}, {11279, 17126659}, {11280, 17126915}, {11281, 17127171}, - {11282, 17127427}, {11283, 17127683}, {11284, 17127939}, {11285, 17128195}, - {11286, 17128451}, {11287, 17128707}, {11288, 17128963}, {11289, 17129219}, - {11290, 17129475}, {11291, 17129731}, {11292, 17129987}, {11293, 17130243}, - {11294, 17130499}, {11295, 17130755}, {11296, 17131011}, {11297, 17131267}, - {11298, 17131523}, {11299, 17131779}, {11300, 17132035}, {11301, 17132291}, - {11302, 17132547}, {11303, 17132803}, {11304, 17133059}, {11305, 17133315}, - {11306, 17133571}, {11307, 17133827}, {11308, 17134083}, {11309, 17134339}, - {11310, 17134595}, {11311, 17134851}, {11312, 1}, {11360, 17135107}, - {11361, 1}, {11362, 17135363}, {11363, 17135619}, {11364, 17135875}, - {11365, 1}, {11367, 17136131}, {11368, 1}, {11369, 17136387}, - {11370, 1}, {11371, 17136643}, {11372, 1}, {11373, 16958723}, - {11374, 16963331}, {11375, 16958467}, {11376, 16960515}, {11377, 1}, - {11378, 17136899}, {11379, 1}, {11381, 17137155}, {11382, 1}, - {11388, 16779523}, {11389, 16782595}, {11390, 17137411}, {11391, 17137667}, - {11392, 17137923}, {11393, 1}, {11394, 17138179}, {11395, 1}, - {11396, 17138435}, {11397, 1}, {11398, 17138691}, {11399, 1}, - {11400, 17138947}, {11401, 1}, {11402, 17139203}, {11403, 1}, - {11404, 17139459}, {11405, 1}, {11406, 17139715}, {11407, 1}, - {11408, 17139971}, {11409, 1}, {11410, 17140227}, {11411, 1}, - {11412, 17140483}, {11413, 1}, {11414, 17140739}, {11415, 1}, - {11416, 17140995}, {11417, 1}, {11418, 17141251}, {11419, 1}, - {11420, 17141507}, {11421, 1}, {11422, 17141763}, {11423, 1}, - {11424, 17142019}, {11425, 1}, {11426, 17142275}, {11427, 1}, - {11428, 17142531}, {11429, 1}, {11430, 17142787}, {11431, 1}, - {11432, 17143043}, {11433, 1}, {11434, 17143299}, {11435, 1}, - {11436, 17143555}, {11437, 1}, {11438, 17143811}, {11439, 1}, - {11440, 17144067}, {11441, 1}, {11442, 17144323}, {11443, 1}, - {11444, 17144579}, {11445, 1}, {11446, 17144835}, {11447, 1}, - {11448, 17145091}, {11449, 1}, {11450, 17145347}, {11451, 1}, - {11452, 17145603}, {11453, 1}, {11454, 17145859}, {11455, 1}, - {11456, 17146115}, {11457, 1}, {11458, 17146371}, {11459, 1}, - {11460, 17146627}, {11461, 1}, {11462, 17146883}, {11463, 1}, - {11464, 17147139}, {11465, 1}, {11466, 17147395}, {11467, 1}, - {11468, 17147651}, {11469, 1}, {11470, 17147907}, {11471, 1}, - {11472, 17148163}, {11473, 1}, {11474, 17148419}, {11475, 1}, - {11476, 17148675}, {11477, 1}, {11478, 17148931}, {11479, 1}, - {11480, 17149187}, {11481, 1}, {11482, 17149443}, {11483, 1}, - {11484, 17149699}, {11485, 1}, {11486, 17149955}, {11487, 1}, - {11488, 17150211}, {11489, 1}, {11490, 17150467}, {11491, 1}, - {11499, 17150723}, {11500, 1}, {11501, 17150979}, {11502, 1}, - {11506, 17151235}, {11507, 1}, {11508, 2}, {11513, 1}, - {11558, 2}, {11559, 1}, {11560, 2}, {11565, 1}, - {11566, 2}, {11568, 1}, {11624, 2}, {11631, 17151491}, - {11632, 1}, {11633, 2}, {11647, 1}, {11671, 2}, - {11680, 1}, {11687, 2}, {11688, 1}, {11695, 2}, - {11696, 1}, {11703, 2}, {11704, 1}, {11711, 2}, - {11712, 1}, {11719, 2}, {11720, 1}, {11727, 2}, - {11728, 1}, {11735, 2}, {11736, 1}, {11743, 2}, - {11744, 1}, {11870, 2}, {11904, 1}, {11930, 2}, - {11931, 1}, {11935, 17151747}, {11936, 1}, {12019, 17152003}, - {12020, 2}, {12032, 17152259}, {12033, 17152515}, {12034, 17152771}, - {12035, 17153027}, {12036, 17153283}, {12037, 17153539}, {12038, 17153795}, - {12039, 17154051}, {12040, 17154307}, {12041, 17154563}, {12042, 17154819}, - {12043, 17155075}, {12044, 17155331}, {12045, 17155587}, {12046, 17155843}, - {12047, 17156099}, {12048, 17156355}, {12049, 17156611}, {12050, 17156867}, - {12051, 17157123}, {12052, 17157379}, {12053, 17157635}, {12054, 17157891}, - {12055, 17158147}, {12056, 17158403}, {12057, 17158659}, {12058, 17158915}, - {12059, 17159171}, {12060, 17159427}, {12061, 17159683}, {12062, 17159939}, - {12063, 17160195}, {12064, 17160451}, {12065, 17160707}, {12066, 17160963}, - {12067, 17161219}, {12068, 17161475}, {12069, 17161731}, {12070, 17161987}, - {12071, 17162243}, {12072, 17162499}, {12073, 17162755}, {12074, 17163011}, - {12075, 17163267}, {12076, 17163523}, {12077, 17163779}, {12078, 17164035}, - {12079, 17164291}, {12080, 17164547}, {12081, 17164803}, {12082, 17165059}, - {12083, 17165315}, {12084, 17165571}, {12085, 17165827}, {12086, 17166083}, - {12087, 17166339}, {12088, 17166595}, {12089, 17166851}, {12090, 17167107}, - {12091, 17167363}, {12092, 17167619}, {12093, 17167875}, {12094, 17168131}, - {12095, 17168387}, {12096, 17168643}, {12097, 17168899}, {12098, 17169155}, - {12099, 17169411}, {12100, 17169667}, {12101, 17169923}, {12102, 17170179}, - {12103, 17170435}, {12104, 17170691}, {12105, 17170947}, {12106, 17171203}, - {12107, 17171459}, {12108, 17171715}, {12109, 17171971}, {12110, 17172227}, - {12111, 17172483}, {12112, 17172739}, {12113, 17172995}, {12114, 17173251}, - {12115, 17173507}, {12116, 17173763}, {12117, 17174019}, {12118, 17174275}, - {12119, 17174531}, {12120, 17174787}, {12121, 17175043}, {12122, 17175299}, - {12123, 17175555}, {12124, 17175811}, {12125, 17176067}, {12126, 17176323}, - {12127, 17176579}, {12128, 17176835}, {12129, 17177091}, {12130, 17177347}, - {12131, 17177603}, {12132, 17177859}, {12133, 17178115}, {12134, 17178371}, - {12135, 17178627}, {12136, 17178883}, {12137, 17179139}, {12138, 17179395}, - {12139, 17179651}, {12140, 17179907}, {12141, 17180163}, {12142, 17180419}, - {12143, 17180675}, {12144, 17180931}, {12145, 17181187}, {12146, 17181443}, - {12147, 17181699}, {12148, 17181955}, {12149, 17182211}, {12150, 17182467}, - {12151, 17182723}, {12152, 17182979}, {12153, 17183235}, {12154, 17183491}, - {12155, 17183747}, {12156, 17184003}, {12157, 17184259}, {12158, 17184515}, - {12159, 17184771}, {12160, 17185027}, {12161, 17185283}, {12162, 17185539}, - {12163, 17185795}, {12164, 17186051}, {12165, 17186307}, {12166, 17186563}, - {12167, 17186819}, {12168, 17187075}, {12169, 17187331}, {12170, 17187587}, - {12171, 17187843}, {12172, 17188099}, {12173, 17188355}, {12174, 17188611}, - {12175, 17188867}, {12176, 17189123}, {12177, 17189379}, {12178, 17189635}, - {12179, 17189891}, {12180, 17190147}, {12181, 17190403}, {12182, 17190659}, - {12183, 17190915}, {12184, 17191171}, {12185, 17191427}, {12186, 17191683}, - {12187, 17191939}, {12188, 17192195}, {12189, 17192451}, {12190, 17192707}, - {12191, 17192963}, {12192, 17193219}, {12193, 17193475}, {12194, 17193731}, - {12195, 17193987}, {12196, 17194243}, {12197, 17194499}, {12198, 17194755}, - {12199, 17195011}, {12200, 17195267}, {12201, 17195523}, {12202, 17195779}, - {12203, 17196035}, {12204, 17196291}, {12205, 17196547}, {12206, 17196803}, - {12207, 17197059}, {12208, 17197315}, {12209, 17197571}, {12210, 17197827}, - {12211, 17198083}, {12212, 17198339}, {12213, 17198595}, {12214, 17198851}, - {12215, 17199107}, {12216, 17199363}, {12217, 17199619}, {12218, 17199875}, - {12219, 17200131}, {12220, 17200387}, {12221, 17200643}, {12222, 17200899}, - {12223, 17201155}, {12224, 17201411}, {12225, 17201667}, {12226, 17201923}, - {12227, 17202179}, {12228, 17202435}, {12229, 17202691}, {12230, 17202947}, - {12231, 17203203}, {12232, 17203459}, {12233, 17203715}, {12234, 17203971}, - {12235, 17204227}, {12236, 17204483}, {12237, 17204739}, {12238, 17204995}, - {12239, 17205251}, {12240, 17205507}, {12241, 17205763}, {12242, 17206019}, - {12243, 17206275}, {12244, 17206531}, {12245, 17206787}, {12246, 2}, - {12288, 16783875}, {12289, 1}, {12290, 17207043}, {12291, 1}, - {12342, 17207299}, {12343, 1}, {12344, 17158147}, {12345, 17207555}, - {12346, 17207811}, {12347, 1}, {12352, 2}, {12353, 1}, - {12439, 2}, {12441, 1}, {12443, 33985283}, {12444, 33985795}, - {12445, 1}, {12447, 33986307}, {12448, 1}, {12543, 33986819}, - {12544, 2}, {12549, 1}, {12592, 2}, {12593, 17210115}, - {12594, 17210371}, {12595, 17210627}, {12596, 17210883}, {12597, 17211139}, - {12598, 17211395}, {12599, 17211651}, {12600, 17211907}, {12601, 17212163}, - {12602, 17212419}, {12603, 17212675}, {12604, 17212931}, {12605, 17213187}, - {12606, 17213443}, {12607, 17213699}, {12608, 17213955}, {12609, 17214211}, - {12610, 17214467}, {12611, 17214723}, {12612, 17214979}, {12613, 17215235}, - {12614, 17215491}, {12615, 17215747}, {12616, 17216003}, {12617, 17216259}, - {12618, 17216515}, {12619, 17216771}, {12620, 17217027}, {12621, 17217283}, - {12622, 17217539}, {12623, 17217795}, {12624, 17218051}, {12625, 17218307}, - {12626, 17218563}, {12627, 17218819}, {12628, 17219075}, {12629, 17219331}, - {12630, 17219587}, {12631, 17219843}, {12632, 17220099}, {12633, 17220355}, - {12634, 17220611}, {12635, 17220867}, {12636, 17221123}, {12637, 17221379}, - {12638, 17221635}, {12639, 17221891}, {12640, 17222147}, {12641, 17222403}, - {12642, 17222659}, {12643, 17222915}, {12644, 0}, {12645, 17223171}, - {12646, 17223427}, {12647, 17223683}, {12648, 17223939}, {12649, 17224195}, - {12650, 17224451}, {12651, 17224707}, {12652, 17224963}, {12653, 17225219}, - {12654, 17225475}, {12655, 17225731}, {12656, 17225987}, {12657, 17226243}, - {12658, 17226499}, {12659, 17226755}, {12660, 17227011}, {12661, 17227267}, - {12662, 17227523}, {12663, 17227779}, {12664, 17228035}, {12665, 17228291}, - {12666, 17228547}, {12667, 17228803}, {12668, 17229059}, {12669, 17229315}, - {12670, 17229571}, {12671, 17229827}, {12672, 17230083}, {12673, 17230339}, - {12674, 17230595}, {12675, 17230851}, {12676, 17231107}, {12677, 17231363}, - {12678, 17231619}, {12679, 17231875}, {12680, 17232131}, {12681, 17232387}, - {12682, 17232643}, {12683, 17232899}, {12684, 17233155}, {12685, 17233411}, - {12686, 17233667}, {12687, 2}, {12688, 1}, {12690, 17152259}, - {12691, 17153795}, {12692, 17233923}, {12693, 17234179}, {12694, 17234435}, - {12695, 17234691}, {12696, 17234947}, {12697, 17235203}, {12698, 17153283}, - {12699, 17235459}, {12700, 17235715}, {12701, 17235971}, {12702, 17236227}, - {12703, 17154307}, {12704, 1}, {12774, 2}, {12784, 1}, - {12800, 50790915}, {12801, 50791683}, {12802, 50792451}, {12803, 50793219}, - {12804, 50793987}, {12805, 50794755}, {12806, 50795523}, {12807, 50796291}, - {12808, 50797059}, {12809, 50797827}, {12810, 50798595}, {12811, 50799363}, - {12812, 50800131}, {12813, 50800899}, {12814, 50801667}, {12815, 50802435}, - {12816, 50803203}, {12817, 50803971}, {12818, 50804739}, {12819, 50805507}, - {12820, 50806275}, {12821, 50807043}, {12822, 50807811}, {12823, 50808579}, - {12824, 50809347}, {12825, 50810115}, {12826, 50810883}, {12827, 50811651}, - {12828, 50812419}, {12829, 67590403}, {12830, 67591427}, {12831, 2}, - {12832, 50815235}, {12833, 50816003}, {12834, 50816771}, {12835, 50817539}, - {12836, 50818307}, {12837, 50819075}, {12838, 50819843}, {12839, 50820611}, - {12840, 50821379}, {12841, 50822147}, {12842, 50822915}, {12843, 50823683}, - {12844, 50824451}, {12845, 50825219}, {12846, 50825987}, {12847, 50826755}, - {12848, 50827523}, {12849, 50828291}, {12850, 50829059}, {12851, 50829827}, - {12852, 50830595}, {12853, 50831363}, {12854, 50832131}, {12855, 50832899}, - {12856, 50833667}, {12857, 50834435}, {12858, 50835203}, {12859, 50835971}, - {12860, 50836739}, {12861, 50837507}, {12862, 50838275}, {12863, 50839043}, - {12864, 50839811}, {12865, 50840579}, {12866, 50841347}, {12867, 50842115}, - {12868, 17288451}, {12869, 17288707}, {12870, 17169155}, {12871, 17288963}, - {12872, 1}, {12880, 50843651}, {12881, 33855747}, {12882, 34067203}, - {12883, 33562371}, {12884, 34067715}, {12885, 34068227}, {12886, 34068739}, - {12887, 34069251}, {12888, 34069763}, {12889, 34070275}, {12890, 34070787}, - {12891, 33837571}, {12892, 33836803}, {12893, 34071299}, {12894, 34071811}, - {12895, 34072323}, {12896, 17210115}, {12897, 17210883}, {12898, 17211651}, - {12899, 17212163}, {12900, 17214211}, {12901, 17214467}, {12902, 17215235}, - {12903, 17215747}, {12904, 17216003}, {12905, 17216515}, {12906, 17216771}, - {12907, 17217027}, {12908, 17217283}, {12909, 17217539}, {12910, 17247491}, - {12911, 17248259}, {12912, 17249027}, {12913, 17249795}, {12914, 17250563}, - {12915, 17251331}, {12916, 17252099}, {12917, 17252867}, {12918, 17253635}, - {12919, 17254403}, {12920, 17255171}, {12921, 17255939}, {12922, 17256707}, - {12923, 17257475}, {12924, 34072835}, {12925, 34073347}, {12926, 17296643}, - {12927, 1}, {12928, 17152259}, {12929, 17153795}, {12930, 17233923}, - {12931, 17234179}, {12932, 17264131}, {12933, 17264899}, {12934, 17265667}, - {12935, 17155075}, {12936, 17267203}, {12937, 17158147}, {12938, 17170947}, - {12939, 17174019}, {12940, 17173763}, {12941, 17171203}, {12942, 17194755}, - {12943, 17160195}, {12944, 17170435}, {12945, 17274115}, {12946, 17274883}, - {12947, 17275651}, {12948, 17276419}, {12949, 17277187}, {12950, 17277955}, - {12951, 17278723}, {12952, 17279491}, {12953, 17296899}, {12954, 17297155}, - {12955, 17161731}, {12956, 17297411}, {12957, 17297667}, {12958, 17297923}, - {12959, 17298179}, {12960, 17298435}, {12961, 17286403}, {12962, 17298691}, - {12963, 17298947}, {12964, 17234435}, {12965, 17234691}, {12966, 17234947}, - {12967, 17299203}, {12968, 17299459}, {12969, 17299715}, {12970, 17299971}, - {12971, 17281795}, {12972, 17282563}, {12973, 17283331}, {12974, 17284099}, - {12975, 17284867}, {12976, 17300227}, {12977, 34077699}, {12978, 34078211}, - {12979, 34078723}, {12980, 34079235}, {12981, 34079747}, {12982, 33564931}, - {12983, 34067971}, {12984, 34072067}, {12985, 34080259}, {12986, 34080771}, - {12987, 34081283}, {12988, 34081795}, {12989, 34082307}, {12990, 34082819}, - {12991, 34083331}, {12992, 34083843}, {12993, 34084355}, {12994, 34084867}, - {12995, 34085379}, {12996, 34085891}, {12997, 34086403}, {12998, 34086915}, - {12999, 34087427}, {13000, 34087939}, {13001, 50865667}, {13002, 50866435}, - {13003, 50867203}, {13004, 34090755}, {13005, 50868483}, {13006, 34092035}, - {13007, 50869763}, {13008, 17316099}, {13009, 17316355}, {13010, 17316611}, - {13011, 17316867}, {13012, 17317123}, {13013, 17317379}, {13014, 17317635}, - {13015, 17317891}, {13016, 17318147}, {13017, 17209603}, {13018, 17318403}, - {13019, 17318659}, {13020, 17318915}, {13021, 17319171}, {13022, 17319427}, - {13023, 17319683}, {13024, 17319939}, {13025, 17320195}, {13026, 17320451}, - {13027, 17209859}, {13028, 17320707}, {13029, 17320963}, {13030, 17321219}, - {13031, 17321475}, {13032, 17321731}, {13033, 17321987}, {13034, 17322243}, - {13035, 17322499}, {13036, 17322755}, {13037, 17323011}, {13038, 17323267}, - {13039, 17323523}, {13040, 17323779}, {13041, 17324035}, {13042, 17324291}, - {13043, 17324547}, {13044, 17324803}, {13045, 17325059}, {13046, 17325315}, - {13047, 17325571}, {13048, 17325827}, {13049, 17326083}, {13050, 17326339}, - {13051, 17326595}, {13052, 17326851}, {13053, 17327107}, {13054, 17327363}, - {13055, 34104835}, {13056, 67659779}, {13057, 67660803}, {13058, 67661827}, - {13059, 50885635}, {13060, 67663619}, {13061, 50887427}, {13062, 50888195}, - {13063, 84443395}, {13064, 67667459}, {13065, 50891267}, {13066, 50892035}, - {13067, 50892803}, {13068, 67670787}, {13069, 67671811}, {13070, 50895619}, - {13071, 50896387}, {13072, 34119939}, {13073, 50897667}, {13074, 67675651}, - {13075, 67676675}, {13076, 34123267}, {13077, 84455427}, {13078, 101233923}, - {13079, 84458243}, {13080, 50901507}, {13081, 84459523}, {13082, 84460803}, - {13083, 67684867}, {13084, 50908675}, {13085, 50909443}, {13086, 50910211}, - {13087, 67688195}, {13088, 84466435}, {13089, 67690499}, {13090, 50914307}, - {13091, 50915075}, {13092, 50915843}, {13093, 34139395}, {13094, 34139907}, - {13095, 34128643}, {13096, 34140419}, {13097, 50918147}, {13098, 50918915}, - {13099, 84474115}, {13100, 50920963}, {13101, 67698947}, {13102, 84477187}, - {13103, 50924035}, {13104, 34147587}, {13105, 34148099}, {13106, 84480259}, - {13107, 67704323}, {13108, 84482563}, {13109, 50929411}, {13110, 84484611}, - {13111, 34154243}, {13112, 50931971}, {13113, 50932739}, {13114, 50933507}, - {13115, 50934275}, {13116, 50935043}, {13117, 67713027}, {13118, 50936835}, - {13119, 34160387}, {13120, 50938115}, {13121, 50938883}, {13122, 50939651}, - {13123, 67717635}, {13124, 50941443}, {13125, 50942211}, {13126, 50942979}, - {13127, 84498179}, {13128, 67722243}, {13129, 34168835}, {13130, 84500995}, - {13131, 34170627}, {13132, 67725571}, {13133, 67680003}, {13134, 50949379}, - {13135, 50950147}, {13136, 50950915}, {13137, 67728899}, {13138, 34175491}, - {13139, 50953219}, {13140, 67731203}, {13141, 34177795}, {13142, 84509955}, - {13143, 50904323}, {13144, 34179587}, {13145, 34180099}, {13146, 34180611}, - {13147, 34181123}, {13148, 34181635}, {13149, 34182147}, {13150, 34182659}, - {13151, 34183171}, {13152, 34183683}, {13153, 34184195}, {13154, 50961923}, - {13155, 50962691}, {13156, 50963459}, {13157, 50964227}, {13158, 50964995}, - {13159, 50965763}, {13160, 50966531}, {13161, 50967299}, {13162, 50968067}, - {13163, 50968835}, {13164, 50969603}, {13165, 50970371}, {13166, 50971139}, - {13167, 50971907}, {13168, 50972675}, {13169, 50973443}, {13170, 34196995}, - {13171, 34197507}, {13172, 50975235}, {13173, 34198787}, {13174, 34199299}, - {13175, 34199811}, {13176, 50977539}, {13177, 50978307}, {13178, 34201859}, - {13179, 34202371}, {13180, 34202883}, {13181, 34203395}, {13182, 34203907}, - {13183, 67758851}, {13184, 34196483}, {13185, 34205443}, {13186, 34205955}, - {13187, 34206467}, {13188, 34206979}, {13189, 34207491}, {13190, 34208003}, - {13191, 34208515}, {13192, 50986243}, {13193, 67764227}, {13194, 34210819}, - {13195, 34211331}, {13196, 34211843}, {13197, 34212355}, {13198, 34212867}, - {13199, 34213379}, {13200, 34213891}, {13201, 50991619}, {13202, 50992387}, - {13203, 50990851}, {13204, 50993155}, {13205, 34216707}, {13206, 34217219}, - {13207, 34217731}, {13208, 33556995}, {13209, 34218243}, {13210, 34218755}, - {13211, 34219267}, {13212, 34219779}, {13213, 34220291}, {13214, 34220803}, - {13215, 50998531}, {13216, 50999299}, {13217, 34200579}, {13218, 51000067}, - {13219, 51000835}, {13220, 51001603}, {13221, 34201347}, {13222, 51002371}, - {13223, 51003139}, {13224, 67781123}, {13225, 34196483}, {13226, 51004931}, - {13227, 51005699}, {13228, 51006467}, {13229, 51007235}, {13230, 84562435}, - {13231, 101340931}, {13232, 34233603}, {13233, 34234115}, {13234, 34234627}, - {13235, 34235139}, {13236, 34235651}, {13237, 34236163}, {13238, 34236675}, - {13239, 34237187}, {13240, 34237699}, {13241, 34237187}, {13242, 34238211}, - {13243, 34238723}, {13244, 34239235}, {13245, 34239747}, {13246, 34240259}, - {13247, 34239747}, {13248, 34240771}, {13249, 34241283}, {13250, 2}, - {13251, 34241795}, {13252, 33827331}, {13253, 33554947}, {13254, 67796739}, - {13255, 2}, {13256, 34243331}, {13257, 34243843}, {13258, 34244355}, - {13259, 34196227}, {13260, 34244867}, {13261, 34245379}, {13262, 34220803}, - {13263, 34245891}, {13264, 33557251}, {13265, 34246403}, {13266, 51024131}, - {13267, 34247683}, {13268, 34208003}, {13269, 51025411}, {13270, 51026179}, - {13271, 34249731}, {13272, 2}, {13273, 51027459}, {13274, 34251011}, - {13275, 34231811}, {13276, 34251523}, {13277, 34252035}, {13278, 51029763}, - {13279, 51030531}, {13280, 34254083}, {13281, 34254595}, {13282, 34255107}, - {13283, 34255619}, {13284, 34256131}, {13285, 34256643}, {13286, 34257155}, - {13287, 34257667}, {13288, 34258179}, {13289, 51035907}, {13290, 51036675}, - {13291, 51037443}, {13292, 51038211}, {13293, 51038979}, {13294, 51039747}, - {13295, 51040515}, {13296, 51041283}, {13297, 51042051}, {13298, 51042819}, - {13299, 51043587}, {13300, 51044355}, {13301, 51045123}, {13302, 51045891}, - {13303, 51046659}, {13304, 51047427}, {13305, 51048195}, {13306, 51048963}, - {13307, 51049731}, {13308, 51050499}, {13309, 51051267}, {13310, 51052035}, - {13311, 51052803}, {13312, 1}, {42125, 2}, {42128, 1}, - {42183, 2}, {42192, 1}, {42540, 2}, {42560, 17499139}, - {42561, 1}, {42562, 17499395}, {42563, 1}, {42564, 17499651}, - {42565, 1}, {42566, 17499907}, {42567, 1}, {42568, 17500163}, - {42569, 1}, {42570, 16946435}, {42571, 1}, {42572, 17500419}, - {42573, 1}, {42574, 17500675}, {42575, 1}, {42576, 17500931}, - {42577, 1}, {42578, 17501187}, {42579, 1}, {42580, 17501443}, - {42581, 1}, {42582, 17501699}, {42583, 1}, {42584, 17501955}, - {42585, 1}, {42586, 17502211}, {42587, 1}, {42588, 17502467}, - {42589, 1}, {42590, 17502723}, {42591, 1}, {42592, 17502979}, - {42593, 1}, {42594, 17503235}, {42595, 1}, {42596, 17503491}, - {42597, 1}, {42598, 17503747}, {42599, 1}, {42600, 17504003}, - {42601, 1}, {42602, 17504259}, {42603, 1}, {42604, 17504515}, - {42605, 1}, {42624, 17504771}, {42625, 1}, {42626, 17505027}, - {42627, 1}, {42628, 17505283}, {42629, 1}, {42630, 17505539}, - {42631, 1}, {42632, 17505795}, {42633, 1}, {42634, 17506051}, - {42635, 1}, {42636, 17506307}, {42637, 1}, {42638, 17506563}, - {42639, 1}, {42640, 17506819}, {42641, 1}, {42642, 17507075}, - {42643, 1}, {42644, 17507331}, {42645, 1}, {42646, 17507587}, - {42647, 1}, {42648, 17507843}, {42649, 1}, {42650, 17508099}, - {42651, 1}, {42652, 16873219}, {42653, 16873731}, {42654, 1}, - {42744, 2}, {42752, 1}, {42786, 17508355}, {42787, 1}, - {42788, 17508611}, {42789, 1}, {42790, 17508867}, {42791, 1}, - {42792, 17509123}, {42793, 1}, {42794, 17509379}, {42795, 1}, - {42796, 17509635}, {42797, 1}, {42798, 17509891}, {42799, 1}, - {42802, 17510147}, {42803, 1}, {42804, 17510403}, {42805, 1}, - {42806, 17510659}, {42807, 1}, {42808, 17510915}, {42809, 1}, - {42810, 17511171}, {42811, 1}, {42812, 17511427}, {42813, 1}, - {42814, 17511683}, {42815, 1}, {42816, 17511939}, {42817, 1}, - {42818, 17512195}, {42819, 1}, {42820, 17512451}, {42821, 1}, - {42822, 17512707}, {42823, 1}, {42824, 17512963}, {42825, 1}, - {42826, 17513219}, {42827, 1}, {42828, 17513475}, {42829, 1}, - {42830, 17513731}, {42831, 1}, {42832, 17513987}, {42833, 1}, - {42834, 17514243}, {42835, 1}, {42836, 17514499}, {42837, 1}, - {42838, 17514755}, {42839, 1}, {42840, 17515011}, {42841, 1}, - {42842, 17515267}, {42843, 1}, {42844, 17515523}, {42845, 1}, - {42846, 17515779}, {42847, 1}, {42848, 17516035}, {42849, 1}, - {42850, 17516291}, {42851, 1}, {42852, 17516547}, {42853, 1}, - {42854, 17516803}, {42855, 1}, {42856, 17517059}, {42857, 1}, - {42858, 17517315}, {42859, 1}, {42860, 17517571}, {42861, 1}, - {42862, 17517827}, {42863, 1}, {42864, 17517827}, {42865, 1}, - {42873, 17518083}, {42874, 1}, {42875, 17518339}, {42876, 1}, - {42877, 17518595}, {42878, 17518851}, {42879, 1}, {42880, 17519107}, - {42881, 1}, {42882, 17519363}, {42883, 1}, {42884, 17519619}, - {42885, 1}, {42886, 17519875}, {42887, 1}, {42891, 17520131}, - {42892, 1}, {42893, 16961539}, {42894, 1}, {42896, 17520387}, - {42897, 1}, {42898, 17520643}, {42899, 1}, {42902, 17520899}, - {42903, 1}, {42904, 17521155}, {42905, 1}, {42906, 17521411}, - {42907, 1}, {42908, 17521667}, {42909, 1}, {42910, 17521923}, - {42911, 1}, {42912, 17522179}, {42913, 1}, {42914, 17522435}, - {42915, 1}, {42916, 17522691}, {42917, 1}, {42918, 17522947}, - {42919, 1}, {42920, 17523203}, {42921, 1}, {42922, 16841475}, - {42923, 16959235}, {42924, 16961283}, {42925, 17523459}, {42926, 16961795}, - {42927, 1}, {42928, 17523715}, {42929, 17523971}, {42930, 16962307}, - {42931, 17524227}, {42932, 17524483}, {42933, 1}, {42934, 17524739}, - {42935, 1}, {42936, 17524995}, {42937, 1}, {42938, 17525251}, - {42939, 1}, {42940, 17525507}, {42941, 1}, {42942, 17525763}, - {42943, 1}, {42944, 17526019}, {42945, 1}, {42946, 17526275}, - {42947, 1}, {42948, 17526531}, {42949, 16964611}, {42950, 17526787}, - {42951, 17527043}, {42952, 1}, {42953, 17527299}, {42954, 1}, - {42955, 17527555}, {42956, 17527811}, {42957, 1}, {42958, 17528067}, - {42959, 1}, {42960, 17528323}, {42961, 1}, {42962, 17528579}, - {42963, 1}, {42964, 17528835}, {42965, 1}, {42966, 17529091}, - {42967, 1}, {42968, 17529347}, {42969, 1}, {42970, 17529603}, - {42971, 1}, {42972, 17529859}, {42973, 2}, {42993, 16781827}, - {42994, 16777731}, {42995, 16778499}, {42996, 16781315}, {42997, 17530115}, - {42998, 1}, {43000, 16802051}, {43001, 16808195}, {43002, 1}, - {43053, 2}, {43056, 1}, {43066, 2}, {43072, 1}, - {43128, 2}, {43136, 1}, {43206, 2}, {43214, 1}, - {43226, 2}, {43232, 1}, {43348, 2}, {43359, 1}, - {43389, 2}, {43392, 1}, {43470, 2}, {43471, 1}, - {43482, 2}, {43486, 1}, {43519, 2}, {43520, 1}, - {43575, 2}, {43584, 1}, {43598, 2}, {43600, 1}, - {43610, 2}, {43612, 1}, {43715, 2}, {43739, 1}, - {43767, 2}, {43777, 1}, {43783, 2}, {43785, 1}, - {43791, 2}, {43793, 1}, {43799, 2}, {43808, 1}, - {43815, 2}, {43816, 1}, {43823, 2}, {43824, 1}, - {43868, 17508867}, {43869, 17530371}, {43870, 17135363}, {43871, 17530627}, - {43872, 1}, {43881, 17530883}, {43882, 1}, {43884, 2}, - {43888, 17531139}, {43889, 17531395}, {43890, 17531651}, {43891, 17531907}, - {43892, 17532163}, {43893, 17532419}, {43894, 17532675}, {43895, 17532931}, - {43896, 17533187}, {43897, 17533443}, {43898, 17533699}, {43899, 17533955}, - {43900, 17534211}, {43901, 17534467}, {43902, 17534723}, {43903, 17534979}, - {43904, 17535235}, {43905, 17535491}, {43906, 17535747}, {43907, 17536003}, - {43908, 17536259}, {43909, 17536515}, {43910, 17536771}, {43911, 17537027}, - {43912, 17537283}, {43913, 17537539}, {43914, 17537795}, {43915, 17538051}, - {43916, 17538307}, {43917, 17538563}, {43918, 17538819}, {43919, 17539075}, - {43920, 17539331}, {43921, 17539587}, {43922, 17539843}, {43923, 17540099}, - {43924, 17540355}, {43925, 17540611}, {43926, 17540867}, {43927, 17541123}, - {43928, 17541379}, {43929, 17541635}, {43930, 17541891}, {43931, 17542147}, - {43932, 17542403}, {43933, 17542659}, {43934, 17542915}, {43935, 17543171}, - {43936, 17543427}, {43937, 17543683}, {43938, 17543939}, {43939, 17544195}, - {43940, 17544451}, {43941, 17544707}, {43942, 17544963}, {43943, 17545219}, - {43944, 17545475}, {43945, 17545731}, {43946, 17545987}, {43947, 17546243}, - {43948, 17546499}, {43949, 17546755}, {43950, 17547011}, {43951, 17547267}, - {43952, 17547523}, {43953, 17547779}, {43954, 17548035}, {43955, 17548291}, - {43956, 17548547}, {43957, 17548803}, {43958, 17549059}, {43959, 17549315}, - {43960, 17549571}, {43961, 17549827}, {43962, 17550083}, {43963, 17550339}, - {43964, 17550595}, {43965, 17550851}, {43966, 17551107}, {43967, 17551363}, - {43968, 1}, {44014, 2}, {44016, 1}, {44026, 2}, - {44032, 1}, {55204, 2}, {55216, 1}, {55239, 2}, - {55243, 1}, {55292, 2}, {63744, 17551619}, {63745, 17551875}, - {63746, 17192707}, {63747, 17552131}, {63748, 17552387}, {63749, 17552643}, - {63750, 17552899}, {63751, 17206531}, {63753, 17553155}, {63754, 17194755}, - {63755, 17553411}, {63756, 17553667}, {63757, 17553923}, {63758, 17554179}, - {63759, 17554435}, {63760, 17554691}, {63761, 17554947}, {63762, 17555203}, - {63763, 17555459}, {63764, 17555715}, {63765, 17555971}, {63766, 17556227}, - {63767, 17556483}, {63768, 17556739}, {63769, 17556995}, {63770, 17557251}, - {63771, 17557507}, {63772, 17557763}, {63773, 17558019}, {63774, 17558275}, - {63775, 17558531}, {63776, 17558787}, {63777, 17559043}, {63778, 17559299}, - {63779, 17559555}, {63780, 17559811}, {63781, 17560067}, {63782, 17560323}, - {63783, 17560579}, {63784, 17560835}, {63785, 17561091}, {63786, 17561347}, - {63787, 17561603}, {63788, 17561859}, {63789, 17562115}, {63790, 17562371}, - {63791, 17562627}, {63792, 17562883}, {63793, 17563139}, {63794, 17563395}, - {63795, 17563651}, {63796, 17184003}, {63797, 17563907}, {63798, 17564163}, - {63799, 17564419}, {63800, 17564675}, {63801, 17564931}, {63802, 17565187}, - {63803, 17565443}, {63804, 17565699}, {63805, 17565955}, {63806, 17566211}, - {63807, 17566467}, {63808, 17202691}, {63809, 17566723}, {63810, 17566979}, - {63811, 17567235}, {63812, 17567491}, {63813, 17567747}, {63814, 17568003}, - {63815, 17568259}, {63816, 17568515}, {63817, 17568771}, {63818, 17569027}, - {63819, 17569283}, {63820, 17569539}, {63821, 17569795}, {63822, 17570051}, - {63823, 17570307}, {63824, 17570563}, {63825, 17570819}, {63826, 17571075}, - {63827, 17571331}, {63828, 17571587}, {63829, 17571843}, {63830, 17572099}, - {63831, 17572355}, {63832, 17572611}, {63833, 17572867}, {63834, 17573123}, - {63835, 17573379}, {63836, 17555715}, {63837, 17573635}, {63838, 17573891}, - {63839, 17574147}, {63840, 17574403}, {63841, 17574659}, {63842, 17574915}, - {63843, 17575171}, {63844, 17575427}, {63845, 17575683}, {63846, 17575939}, - {63847, 17576195}, {63848, 17576451}, {63849, 17576707}, {63850, 17576963}, - {63851, 17577219}, {63852, 17577475}, {63853, 17577731}, {63854, 17577987}, - {63855, 17578243}, {63856, 17578499}, {63857, 17193219}, {63858, 17578755}, - {63859, 17579011}, {63860, 17579267}, {63861, 17579523}, {63862, 17579779}, - {63863, 17580035}, {63864, 17580291}, {63865, 17580547}, {63866, 17580803}, - {63867, 17581059}, {63868, 17581315}, {63869, 17581571}, {63870, 17581827}, - {63871, 17582083}, {63872, 17582339}, {63873, 17161731}, {63874, 17582595}, - {63875, 17582851}, {63876, 17583107}, {63877, 17583363}, {63878, 17583619}, - {63879, 17583875}, {63880, 17584131}, {63881, 17584387}, {63882, 17156867}, - {63883, 17584643}, {63884, 17584899}, {63885, 17585155}, {63886, 17585411}, - {63887, 17585667}, {63888, 17585923}, {63889, 17586179}, {63890, 17586435}, - {63891, 17586691}, {63892, 17586947}, {63893, 17587203}, {63894, 17587459}, - {63895, 17587715}, {63896, 17587971}, {63897, 17588227}, {63898, 17588483}, - {63899, 17588739}, {63900, 17588995}, {63901, 17589251}, {63902, 17589507}, - {63903, 17589763}, {63904, 17590019}, {63905, 17578243}, {63906, 17590275}, - {63907, 17590531}, {63908, 17590787}, {63909, 17591043}, {63910, 17591299}, - {63911, 17591555}, {63912, 17327619}, {63913, 17591811}, {63914, 17574147}, - {63915, 17592067}, {63916, 17592323}, {63917, 17592579}, {63918, 17592835}, - {63919, 17593091}, {63920, 17593347}, {63921, 17593603}, {63922, 17593859}, - {63923, 17594115}, {63924, 17594371}, {63925, 17594627}, {63926, 17594883}, - {63927, 17595139}, {63928, 17595395}, {63929, 17595651}, {63930, 17595907}, - {63931, 17596163}, {63932, 17596419}, {63933, 17596675}, {63934, 17596931}, - {63935, 17555715}, {63936, 17597187}, {63937, 17597443}, {63938, 17597699}, - {63939, 17597955}, {63940, 17206275}, {63941, 17598211}, {63942, 17598467}, - {63943, 17598723}, {63944, 17598979}, {63945, 17599235}, {63946, 17599491}, - {63947, 17599747}, {63948, 17600003}, {63949, 17600259}, {63950, 17600515}, - {63951, 17600771}, {63952, 17601027}, {63953, 17264899}, {63954, 17601283}, - {63955, 17601539}, {63956, 17601795}, {63957, 17602051}, {63958, 17602307}, - {63959, 17602563}, {63960, 17602819}, {63961, 17603075}, {63962, 17603331}, - {63963, 17574659}, {63964, 17603587}, {63965, 17603843}, {63966, 17604099}, - {63967, 17604355}, {63968, 17604611}, {63969, 17604867}, {63970, 17605123}, - {63971, 17605379}, {63972, 17605635}, {63973, 17605891}, {63974, 17606147}, - {63975, 17606403}, {63976, 17606659}, {63977, 17194499}, {63978, 17606915}, - {63979, 17607171}, {63980, 17607427}, {63981, 17607683}, {63982, 17607939}, - {63983, 17608195}, {63984, 17608451}, {63985, 17608707}, {63986, 17608963}, - {63987, 17609219}, {63988, 17609475}, {63989, 17609731}, {63990, 17609987}, - {63991, 17181955}, {63992, 17610243}, {63993, 17610499}, {63994, 17610755}, - {63995, 17611011}, {63996, 17611267}, {63997, 17611523}, {63998, 17611779}, - {63999, 17612035}, {64000, 17612291}, {64001, 17612547}, {64002, 17612803}, - {64003, 17613059}, {64004, 17613315}, {64005, 17613571}, {64006, 17613827}, - {64007, 17614083}, {64008, 17188867}, {64009, 17614339}, {64010, 17189635}, - {64011, 17614595}, {64012, 17614851}, {64013, 17615107}, {64014, 1}, - {64016, 17615363}, {64017, 1}, {64018, 17615619}, {64019, 1}, - {64021, 17615875}, {64022, 17616131}, {64023, 17616387}, {64024, 17616643}, - {64025, 17616899}, {64026, 17617155}, {64027, 17617411}, {64028, 17617667}, - {64029, 17617923}, {64030, 17183747}, {64031, 1}, {64032, 17618179}, - {64033, 1}, {64034, 17618435}, {64035, 1}, {64037, 17618691}, - {64038, 17618947}, {64039, 1}, {64042, 17619203}, {64043, 17619459}, - {64044, 17619715}, {64045, 17619971}, {64046, 17620227}, {64047, 17620483}, - {64048, 17620739}, {64049, 17620995}, {64050, 17621251}, {64051, 17621507}, - {64052, 17621763}, {64053, 17622019}, {64054, 17622275}, {64055, 17622531}, - {64056, 17622787}, {64057, 17623043}, {64058, 17623299}, {64059, 17623555}, - {64060, 17163523}, {64061, 17623811}, {64062, 17624067}, {64063, 17624323}, - {64064, 17624579}, {64065, 17624835}, {64066, 17625091}, {64067, 17625347}, - {64068, 17625603}, {64069, 17625859}, {64070, 17626115}, {64071, 17626371}, - {64072, 17626627}, {64073, 17626883}, {64074, 17627139}, {64075, 17627395}, - {64076, 17275651}, {64077, 17627651}, {64078, 17627907}, {64079, 17628163}, - {64080, 17628419}, {64081, 17278723}, {64082, 17628675}, {64083, 17628931}, - {64084, 17629187}, {64085, 17629443}, {64086, 17629699}, {64087, 17587459}, - {64088, 17629955}, {64089, 17630211}, {64090, 17630467}, {64091, 17630723}, - {64092, 17630979}, {64093, 17631235}, {64095, 17631491}, {64096, 17631747}, - {64097, 17632003}, {64098, 17632259}, {64099, 17632515}, {64100, 17632771}, - {64101, 17633027}, {64102, 17633283}, {64103, 17618691}, {64104, 17633539}, - {64105, 17633795}, {64106, 17634051}, {64107, 17634307}, {64108, 17634563}, - {64109, 17634819}, {64110, 2}, {64112, 17635075}, {64113, 17635331}, - {64114, 17635587}, {64115, 17635843}, {64116, 17636099}, {64117, 17636355}, - {64118, 17636611}, {64119, 17636867}, {64120, 17622275}, {64121, 17637123}, - {64122, 17637379}, {64123, 17637635}, {64124, 17615363}, {64125, 17637891}, - {64126, 17638147}, {64127, 17638403}, {64128, 17638659}, {64129, 17638915}, - {64130, 17639171}, {64131, 17639427}, {64132, 17639683}, {64133, 17639939}, - {64134, 17640195}, {64135, 17640451}, {64136, 17640707}, {64137, 17624323}, - {64138, 17640963}, {64139, 17624579}, {64140, 17641219}, {64141, 17641475}, - {64142, 17641731}, {64143, 17641987}, {64144, 17642243}, {64145, 17615619}, - {64146, 17561091}, {64147, 17642499}, {64148, 17642755}, {64149, 17171971}, - {64150, 17578499}, {64151, 17599491}, {64152, 17643011}, {64153, 17643267}, - {64154, 17626371}, {64155, 17643523}, {64156, 17626627}, {64157, 17643779}, - {64158, 17644035}, {64159, 17644291}, {64160, 17616131}, {64161, 17644547}, - {64162, 17644803}, {64163, 17645059}, {64164, 17645315}, {64165, 17645571}, - {64166, 17616387}, {64167, 17645827}, {64168, 17646083}, {64169, 17646339}, - {64170, 17646595}, {64171, 17646851}, {64172, 17647107}, {64173, 17629699}, - {64174, 17647363}, {64175, 17647619}, {64176, 17587459}, {64177, 17647875}, - {64178, 17630723}, {64179, 17648131}, {64180, 17648387}, {64181, 17648643}, - {64182, 17648899}, {64183, 17649155}, {64184, 17632003}, {64185, 17649411}, - {64186, 17618435}, {64187, 17649667}, {64188, 17632259}, {64189, 17573635}, - {64190, 17649923}, {64191, 17632515}, {64192, 17650179}, {64193, 17633027}, - {64194, 17650435}, {64195, 17650691}, {64196, 17650947}, {64197, 17651203}, - {64198, 17651459}, {64199, 17633539}, {64200, 17617667}, {64201, 17651715}, - {64202, 17633795}, {64203, 17651971}, {64204, 17634051}, {64205, 17652227}, - {64206, 17206531}, {64207, 17652483}, {64208, 17652739}, {64209, 17652995}, - {64210, 17653251}, {64211, 17653507}, {64212, 17653763}, {64213, 17654019}, - {64214, 17654275}, {64215, 17654531}, {64216, 17654787}, {64217, 17655043}, - {64218, 2}, {64256, 34432515}, {64257, 34433027}, {64258, 34433539}, - {64259, 51209987}, {64260, 51211267}, {64261, 33559043}, {64263, 2}, - {64275, 34434819}, {64276, 34435331}, {64277, 34435843}, {64278, 34436355}, - {64279, 34436867}, {64280, 2}, {64285, 34437379}, {64286, 1}, - {64287, 34437891}, {64288, 17661187}, {64289, 17054467}, {64290, 17055235}, - {64291, 17661443}, {64292, 17661699}, {64293, 17661955}, {64294, 17662211}, - {64295, 17662467}, {64296, 17662723}, {64297, 17047043}, {64298, 34440195}, - {64299, 34440707}, {64300, 51218435}, {64301, 51219203}, {64302, 34442755}, - {64303, 34443267}, {64304, 34443779}, {64305, 34444291}, {64306, 34444803}, - {64307, 34445315}, {64308, 34445827}, {64309, 34446339}, {64310, 34446851}, - {64311, 2}, {64312, 34447363}, {64313, 34447875}, {64314, 34448387}, - {64315, 34448899}, {64316, 34449411}, {64317, 2}, {64318, 34449923}, - {64319, 2}, {64320, 34450435}, {64321, 34450947}, {64322, 2}, - {64323, 34451459}, {64324, 34451971}, {64325, 2}, {64326, 34452483}, - {64327, 34452995}, {64328, 34453507}, {64329, 34441219}, {64330, 34454019}, - {64331, 34454531}, {64332, 34455043}, {64333, 34455555}, {64334, 34456067}, - {64335, 34456579}, {64336, 17679875}, {64338, 17680131}, {64342, 17680387}, - {64346, 17680643}, {64350, 17680899}, {64354, 17681155}, {64358, 17681411}, - {64362, 17681667}, {64366, 17681923}, {64370, 17682179}, {64374, 17682435}, - {64378, 17682691}, {64382, 17682947}, {64386, 17683203}, {64388, 17683459}, - {64390, 17683715}, {64392, 17683971}, {64394, 17684227}, {64396, 17684483}, - {64398, 17684739}, {64402, 17684995}, {64406, 17685251}, {64410, 17685507}, - {64414, 17685763}, {64416, 17686019}, {64420, 17686275}, {64422, 17686531}, - {64426, 17686787}, {64430, 17687043}, {64432, 17687299}, {64434, 1}, - {64467, 17687555}, {64471, 16911619}, {64473, 17687811}, {64475, 17688067}, - {64477, 33688835}, {64478, 17688323}, {64480, 17688579}, {64482, 17688835}, - {64484, 17689091}, {64488, 17689347}, {64490, 34466819}, {64492, 34467331}, - {64494, 34467843}, {64496, 34468355}, {64498, 34468867}, {64500, 34469379}, - {64502, 34469891}, {64505, 34470403}, {64508, 17693699}, {64512, 34471171}, - {64513, 34471683}, {64514, 34472195}, {64515, 34470403}, {64516, 34472707}, - {64517, 34473219}, {64518, 34473731}, {64519, 34474243}, {64520, 34474755}, - {64521, 34475267}, {64522, 34475779}, {64523, 34476291}, {64524, 34476803}, - {64525, 34477315}, {64526, 34477827}, {64527, 34478339}, {64528, 34478851}, - {64529, 34479363}, {64530, 34479875}, {64531, 34480387}, {64532, 34480899}, - {64533, 34481411}, {64534, 34481923}, {64535, 34481667}, {64536, 34482435}, - {64537, 34482947}, {64538, 34483459}, {64539, 34483971}, {64540, 34484483}, - {64541, 34484995}, {64542, 34485507}, {64543, 34486019}, {64544, 34486531}, - {64545, 34487043}, {64546, 34487555}, {64547, 34488067}, {64548, 34488579}, - {64549, 34489091}, {64550, 34489603}, {64551, 34490115}, {64552, 34490627}, - {64553, 34491139}, {64554, 34491651}, {64555, 34492163}, {64556, 34492675}, - {64557, 34493187}, {64558, 34493699}, {64559, 34494211}, {64560, 34494723}, - {64561, 34495235}, {64562, 34495747}, {64563, 34496259}, {64564, 34496771}, - {64565, 34497283}, {64566, 34497795}, {64567, 34498307}, {64568, 34498819}, - {64569, 34499331}, {64570, 34499843}, {64571, 34500355}, {64572, 34500867}, - {64573, 34501379}, {64574, 34501891}, {64575, 34502403}, {64576, 34502915}, - {64577, 34503427}, {64578, 34503939}, {64579, 34504451}, {64580, 34504963}, - {64581, 34505475}, {64582, 34482179}, {64583, 34482691}, {64584, 34505987}, - {64585, 34506499}, {64586, 34507011}, {64587, 34507523}, {64588, 34508035}, - {64589, 34508547}, {64590, 34509059}, {64591, 34509571}, {64592, 34510083}, - {64593, 34510595}, {64594, 34511107}, {64595, 34511619}, {64596, 34512131}, - {64597, 34481155}, {64598, 34512643}, {64599, 34513155}, {64600, 34505219}, - {64601, 34513667}, {64602, 34512387}, {64603, 34514179}, {64604, 34514691}, - {64605, 34515203}, {64606, 51292931}, {64607, 51293699}, {64608, 51294467}, - {64609, 51295235}, {64610, 51296003}, {64611, 51296771}, {64612, 34520323}, - {64613, 34520835}, {64614, 34472195}, {64615, 34521347}, {64616, 34470403}, - {64617, 34472707}, {64618, 34521859}, {64619, 34522371}, {64620, 34474755}, - {64621, 34522883}, {64622, 34475267}, {64623, 34475779}, {64624, 34523395}, - {64625, 34523907}, {64626, 34477827}, {64627, 34524419}, {64628, 34478339}, - {64629, 34478851}, {64630, 34524931}, {64631, 34525443}, {64632, 34479875}, - {64633, 34525955}, {64634, 34480387}, {64635, 34480899}, {64636, 34495235}, - {64637, 34495747}, {64638, 34497283}, {64639, 34497795}, {64640, 34498307}, - {64641, 34500355}, {64642, 34500867}, {64643, 34501379}, {64644, 34501891}, - {64645, 34503939}, {64646, 34504451}, {64647, 34504963}, {64648, 34526467}, - {64649, 34505987}, {64650, 34526979}, {64651, 34527491}, {64652, 34509059}, - {64653, 34528003}, {64654, 34509571}, {64655, 34510083}, {64656, 34515203}, - {64657, 34528515}, {64658, 34529027}, {64659, 34505219}, {64660, 34507267}, - {64661, 34513667}, {64662, 34512387}, {64663, 34471171}, {64664, 34471683}, - {64665, 34529539}, {64666, 34472195}, {64667, 34530051}, {64668, 34473219}, - {64669, 34473731}, {64670, 34474243}, {64671, 34474755}, {64672, 34530563}, - {64673, 34476291}, {64674, 34476803}, {64675, 34477315}, {64676, 34477827}, - {64677, 34531075}, {64678, 34479875}, {64679, 34481411}, {64680, 34481923}, - {64681, 34481667}, {64682, 34482435}, {64683, 34482947}, {64684, 34483971}, - {64685, 34484483}, {64686, 34484995}, {64687, 34485507}, {64688, 34486019}, - {64689, 34486531}, {64690, 34531587}, {64691, 34487043}, {64692, 34487555}, - {64693, 34488067}, {64694, 34488579}, {64695, 34489091}, {64696, 34489603}, - {64697, 34490627}, {64698, 34491139}, {64699, 34491651}, {64700, 34492163}, - {64701, 34492675}, {64702, 34493187}, {64703, 34493699}, {64704, 34494211}, - {64705, 34494723}, {64706, 34496259}, {64707, 34496771}, {64708, 34498819}, - {64709, 34499331}, {64710, 34499843}, {64711, 34500355}, {64712, 34500867}, - {64713, 34502403}, {64714, 34502915}, {64715, 34503427}, {64716, 34503939}, - {64717, 34532099}, {64718, 34505475}, {64719, 34482179}, {64720, 34482691}, - {64721, 34505987}, {64722, 34507523}, {64723, 34508035}, {64724, 34508547}, - {64725, 34509059}, {64726, 34532611}, {64727, 34510595}, {64728, 34511107}, - {64729, 34533123}, {64730, 34481155}, {64731, 34512643}, {64732, 34513155}, - {64733, 34505219}, {64734, 34510339}, {64735, 34472195}, {64736, 34530051}, - {64737, 34474755}, {64738, 34530563}, {64739, 34477827}, {64740, 34531075}, - {64741, 34479875}, {64742, 34533635}, {64743, 34486019}, {64744, 34534147}, - {64745, 34534659}, {64746, 34535171}, {64747, 34500355}, {64748, 34500867}, - {64749, 34503939}, {64750, 34509059}, {64751, 34532611}, {64752, 34505219}, - {64753, 34510339}, {64754, 51312899}, {64755, 51313667}, {64756, 51314435}, - {64757, 34537987}, {64758, 34538499}, {64759, 34539011}, {64760, 34539523}, - {64761, 34540035}, {64762, 34540547}, {64763, 34541059}, {64764, 34541571}, - {64765, 34542083}, {64766, 34542595}, {64767, 34543107}, {64768, 34512899}, - {64769, 34543619}, {64770, 34544131}, {64771, 34544643}, {64772, 34513411}, - {64773, 34545155}, {64774, 34545667}, {64775, 34546179}, {64776, 34546691}, - {64777, 34547203}, {64778, 34547715}, {64779, 34548227}, {64780, 34534659}, - {64781, 34548739}, {64782, 34549251}, {64783, 34549763}, {64784, 34550275}, - {64785, 34537987}, {64786, 34538499}, {64787, 34539011}, {64788, 34539523}, - {64789, 34540035}, {64790, 34540547}, {64791, 34541059}, {64792, 34541571}, - {64793, 34542083}, {64794, 34542595}, {64795, 34543107}, {64796, 34512899}, - {64797, 34543619}, {64798, 34544131}, {64799, 34544643}, {64800, 34513411}, - {64801, 34545155}, {64802, 34545667}, {64803, 34546179}, {64804, 34546691}, - {64805, 34547203}, {64806, 34547715}, {64807, 34548227}, {64808, 34534659}, - {64809, 34548739}, {64810, 34549251}, {64811, 34549763}, {64812, 34550275}, - {64813, 34547203}, {64814, 34547715}, {64815, 34548227}, {64816, 34534659}, - {64817, 34534147}, {64818, 34535171}, {64819, 34490115}, {64820, 34484483}, - {64821, 34484995}, {64822, 34485507}, {64823, 34547203}, {64824, 34547715}, - {64825, 34548227}, {64826, 34490115}, {64827, 34490627}, {64828, 34550787}, - {64830, 1}, {64848, 51328515}, {64849, 51329283}, {64851, 51330051}, - {64852, 51330819}, {64853, 51331587}, {64854, 51332355}, {64855, 51333123}, - {64856, 51259139}, {64858, 51333891}, {64859, 51334659}, {64860, 51335427}, - {64861, 51336195}, {64862, 51336963}, {64863, 51337731}, {64865, 51338499}, - {64866, 51339267}, {64868, 51340035}, {64870, 51340803}, {64871, 51341571}, - {64873, 51342339}, {64874, 51343107}, {64876, 51343875}, {64878, 51344643}, - {64879, 51345411}, {64881, 51346179}, {64883, 51346947}, {64884, 51347715}, - {64885, 51348483}, {64886, 51349251}, {64888, 51350019}, {64889, 51350787}, - {64890, 51351555}, {64891, 51352323}, {64892, 51353091}, {64894, 51353859}, - {64895, 51354627}, {64896, 51355395}, {64897, 51356163}, {64898, 51356931}, - {64899, 51357699}, {64901, 51358467}, {64903, 51359235}, {64905, 51360003}, - {64906, 51259395}, {64907, 51360771}, {64908, 51361539}, {64909, 51282691}, - {64910, 51259907}, {64911, 51362307}, {64912, 1}, {64914, 51363075}, - {64915, 51363843}, {64916, 51364611}, {64917, 51365379}, {64918, 51366147}, - {64919, 51366915}, {64921, 51367683}, {64922, 51368451}, {64923, 51369219}, - {64924, 51369987}, {64926, 51370755}, {64927, 51371523}, {64928, 51372291}, - {64929, 51373059}, {64930, 51373827}, {64931, 51374595}, {64932, 51375363}, - {64933, 51376131}, {64934, 51376899}, {64935, 51377667}, {64936, 51378435}, - {64937, 51379203}, {64938, 51379971}, {64939, 51380739}, {64940, 51381507}, - {64941, 51382275}, {64942, 51289859}, {64943, 51383043}, {64944, 51383811}, - {64945, 51384579}, {64946, 51385347}, {64947, 51386115}, {64948, 51353859}, - {64949, 51355395}, {64950, 51386883}, {64951, 51387651}, {64952, 51388419}, - {64953, 51389187}, {64954, 51389955}, {64955, 51390723}, {64956, 51389955}, - {64957, 51388419}, {64958, 51391491}, {64959, 51392259}, {64960, 51393027}, - {64961, 51393795}, {64962, 51394563}, {64963, 51390723}, {64964, 51348483}, - {64965, 51340803}, {64966, 51395331}, {64967, 51396099}, {64968, 1}, - {64976, 2}, {65008, 51396867}, {65009, 51397635}, {65010, 68175619}, - {65011, 68176643}, {65012, 68177667}, {65013, 68178691}, {65014, 68179715}, - {65015, 68180739}, {65016, 68181763}, {65017, 51405571}, {65018, 303064579}, - {65019, 135297027}, {65020, 68190211}, {65021, 1}, {65024, 0}, - {65040, 17859587}, {65041, 17859843}, {65042, 2}, {65043, 17121027}, - {65044, 16848643}, {65045, 17042947}, {65046, 17043971}, {65047, 17860099}, - {65048, 17860355}, {65049, 2}, {65056, 1}, {65072, 2}, - {65073, 17860611}, {65074, 17860867}, {65075, 17861123}, {65077, 17047811}, - {65078, 17048067}, {65079, 17861379}, {65080, 17861635}, {65081, 17861891}, - {65082, 17862147}, {65083, 17862403}, {65084, 17862659}, {65085, 17862915}, - {65086, 17863171}, {65087, 17077763}, {65088, 17078019}, {65089, 17863427}, - {65090, 17863683}, {65091, 17863939}, {65092, 17864195}, {65093, 1}, - {65095, 17864451}, {65096, 17864707}, {65097, 33820675}, {65101, 17861123}, - {65104, 17859587}, {65105, 17859843}, {65106, 2}, {65108, 16848643}, - {65109, 17121027}, {65110, 17043971}, {65111, 17042947}, {65112, 17860611}, - {65113, 17047811}, {65114, 17048067}, {65115, 17861379}, {65116, 17861635}, - {65117, 17861891}, {65118, 17862147}, {65119, 17864963}, {65120, 17865219}, - {65121, 17865475}, {65122, 17047043}, {65123, 17865731}, {65124, 17865987}, - {65125, 17866243}, {65126, 17047555}, {65127, 2}, {65128, 17866499}, - {65129, 17866755}, {65130, 17867011}, {65131, 17867267}, {65132, 2}, - {65136, 34644739}, {65137, 34645251}, {65138, 34515715}, {65139, 1}, - {65140, 34516483}, {65141, 2}, {65142, 34517251}, {65143, 34535683}, - {65144, 34518019}, {65145, 34536451}, {65146, 34518787}, {65147, 34537219}, - {65148, 34519555}, {65149, 34645763}, {65150, 34646275}, {65151, 34646787}, - {65152, 17870083}, {65153, 17870339}, {65155, 17870595}, {65157, 17870851}, - {65159, 17871107}, {65161, 17689603}, {65165, 16910595}, {65167, 17696003}, - {65171, 17871363}, {65173, 17699075}, {65177, 17702147}, {65181, 17694211}, - {65185, 17694723}, {65189, 17697283}, {65193, 17846787}, {65195, 17736963}, - {65197, 17737475}, {65199, 17743875}, {65201, 17707267}, {65205, 17757443}, - {65209, 17709315}, {65213, 17710339}, {65217, 17712387}, {65221, 17713411}, - {65225, 17713923}, {65229, 17714947}, {65233, 17715971}, {65237, 17719043}, - {65241, 17721091}, {65245, 17723395}, {65249, 17695235}, {65253, 17730307}, - {65257, 17733379}, {65261, 16911107}, {65263, 17689347}, {65265, 16912131}, - {65269, 34648835}, {65271, 34649347}, {65273, 34649859}, {65275, 34634755}, - {65277, 2}, {65279, 0}, {65280, 2}, {65281, 17042947}, - {65282, 17873155}, {65283, 17864963}, {65284, 17866755}, {65285, 17867011}, - {65286, 17865219}, {65287, 17873411}, {65288, 17047811}, {65289, 17048067}, - {65290, 17865475}, {65291, 17047043}, {65292, 17859587}, {65293, 17865731}, - {65294, 17207043}, {65295, 17048579}, {65296, 17045507}, {65297, 16786947}, - {65298, 16785155}, {65299, 16785411}, {65300, 16787715}, {65301, 17045763}, - {65302, 17046019}, {65303, 17046275}, {65304, 17046531}, {65305, 17046787}, - {65306, 17121027}, {65307, 16848643}, {65308, 17865987}, {65309, 17047555}, - {65310, 17866243}, {65311, 17043971}, {65312, 17867267}, {65313, 16777219}, - {65314, 16777475}, {65315, 16777731}, {65316, 16777987}, {65317, 16778243}, - {65318, 16778499}, {65319, 16778755}, {65320, 16779011}, {65321, 16779267}, - {65322, 16779523}, {65323, 16779779}, {65324, 16780035}, {65325, 16780291}, - {65326, 16780547}, {65327, 16780803}, {65328, 16781059}, {65329, 16781315}, - {65330, 16781571}, {65331, 16781827}, {65332, 16782083}, {65333, 16782339}, - {65334, 16782595}, {65335, 16782851}, {65336, 16783107}, {65337, 16783363}, - {65338, 16783619}, {65339, 17864451}, {65340, 17866499}, {65341, 17864707}, - {65342, 17873667}, {65343, 17861123}, {65344, 17037059}, {65345, 16777219}, - {65346, 16777475}, {65347, 16777731}, {65348, 16777987}, {65349, 16778243}, - {65350, 16778499}, {65351, 16778755}, {65352, 16779011}, {65353, 16779267}, - {65354, 16779523}, {65355, 16779779}, {65356, 16780035}, {65357, 16780291}, - {65358, 16780547}, {65359, 16780803}, {65360, 16781059}, {65361, 16781315}, - {65362, 16781571}, {65363, 16781827}, {65364, 16782083}, {65365, 16782339}, - {65366, 16782595}, {65367, 16782851}, {65368, 16783107}, {65369, 16783363}, - {65370, 16783619}, {65371, 17861379}, {65372, 17873923}, {65373, 17861635}, - {65374, 17874179}, {65375, 17874435}, {65376, 17874691}, {65377, 17207043}, - {65378, 17863427}, {65379, 17863683}, {65380, 17859843}, {65381, 17874947}, - {65382, 17327363}, {65383, 17329923}, {65384, 17372931}, {65385, 17875203}, - {65386, 17374467}, {65387, 17334019}, {65388, 17875459}, {65389, 17344259}, - {65390, 17390083}, {65391, 17339651}, {65392, 17328643}, {65393, 17316099}, - {65394, 17316355}, {65395, 17316611}, {65396, 17316867}, {65397, 17317123}, - {65398, 17317379}, {65399, 17317635}, {65400, 17317891}, {65401, 17318147}, - {65402, 17209603}, {65403, 17318403}, {65404, 17318659}, {65405, 17318915}, - {65406, 17319171}, {65407, 17319427}, {65408, 17319683}, {65409, 17319939}, - {65410, 17320195}, {65411, 17320451}, {65412, 17209859}, {65413, 17320707}, - {65414, 17320963}, {65415, 17321219}, {65416, 17321475}, {65417, 17321731}, - {65418, 17321987}, {65419, 17322243}, {65420, 17322499}, {65421, 17322755}, - {65422, 17323011}, {65423, 17323267}, {65424, 17323523}, {65425, 17323779}, - {65426, 17324035}, {65427, 17324291}, {65428, 17324547}, {65429, 17324803}, - {65430, 17325059}, {65431, 17325315}, {65432, 17325571}, {65433, 17325827}, - {65434, 17326083}, {65435, 17326339}, {65436, 17326595}, {65437, 17330435}, - {65438, 17208323}, {65439, 17208835}, {65440, 0}, {65441, 17210115}, - {65442, 17210371}, {65443, 17210627}, {65444, 17210883}, {65445, 17211139}, - {65446, 17211395}, {65447, 17211651}, {65448, 17211907}, {65449, 17212163}, - {65450, 17212419}, {65451, 17212675}, {65452, 17212931}, {65453, 17213187}, - {65454, 17213443}, {65455, 17213699}, {65456, 17213955}, {65457, 17214211}, - {65458, 17214467}, {65459, 17214723}, {65460, 17214979}, {65461, 17215235}, - {65462, 17215491}, {65463, 17215747}, {65464, 17216003}, {65465, 17216259}, - {65466, 17216515}, {65467, 17216771}, {65468, 17217027}, {65469, 17217283}, - {65470, 17217539}, {65471, 2}, {65474, 17217795}, {65475, 17218051}, - {65476, 17218307}, {65477, 17218563}, {65478, 17218819}, {65479, 17219075}, - {65480, 2}, {65482, 17219331}, {65483, 17219587}, {65484, 17219843}, - {65485, 17220099}, {65486, 17220355}, {65487, 17220611}, {65488, 2}, - {65490, 17220867}, {65491, 17221123}, {65492, 17221379}, {65493, 17221635}, - {65494, 17221891}, {65495, 17222147}, {65496, 2}, {65498, 17222403}, - {65499, 17222659}, {65500, 17222915}, {65501, 2}, {65504, 17875715}, - {65505, 17875971}, {65506, 17876227}, {65507, 33561859}, {65508, 17876483}, - {65509, 17876739}, {65510, 17876995}, {65511, 2}, {65512, 17877251}, - {65513, 17877507}, {65514, 17877763}, {65515, 17878019}, {65516, 17878275}, - {65517, 17878531}, {65518, 17878787}, {65519, 2}, {65536, 1}, - {65548, 2}, {65549, 1}, {65575, 2}, {65576, 1}, - {65595, 2}, {65596, 1}, {65598, 2}, {65599, 1}, - {65614, 2}, {65616, 1}, {65630, 2}, {65664, 1}, - {65787, 2}, {65792, 1}, {65795, 2}, {65799, 1}, - {65844, 2}, {65847, 1}, {65935, 2}, {65936, 1}, - {65949, 2}, {65952, 1}, {65953, 2}, {66000, 1}, - {66046, 2}, {66176, 1}, {66205, 2}, {66208, 1}, - {66257, 2}, {66272, 1}, {66300, 2}, {66304, 1}, - {66340, 2}, {66349, 1}, {66379, 2}, {66384, 1}, - {66427, 2}, {66432, 1}, {66462, 2}, {66463, 1}, - {66500, 2}, {66504, 1}, {66518, 2}, {66560, 17879043}, - {66561, 17879299}, {66562, 17879555}, {66563, 17879811}, {66564, 17880067}, - {66565, 17880323}, {66566, 17880579}, {66567, 17880835}, {66568, 17881091}, - {66569, 17881347}, {66570, 17881603}, {66571, 17881859}, {66572, 17882115}, - {66573, 17882371}, {66574, 17882627}, {66575, 17882883}, {66576, 17883139}, - {66577, 17883395}, {66578, 17883651}, {66579, 17883907}, {66580, 17884163}, - {66581, 17884419}, {66582, 17884675}, {66583, 17884931}, {66584, 17885187}, - {66585, 17885443}, {66586, 17885699}, {66587, 17885955}, {66588, 17886211}, - {66589, 17886467}, {66590, 17886723}, {66591, 17886979}, {66592, 17887235}, - {66593, 17887491}, {66594, 17887747}, {66595, 17888003}, {66596, 17888259}, - {66597, 17888515}, {66598, 17888771}, {66599, 17889027}, {66600, 1}, - {66718, 2}, {66720, 1}, {66730, 2}, {66736, 17889283}, - {66737, 17889539}, {66738, 17889795}, {66739, 17890051}, {66740, 17890307}, - {66741, 17890563}, {66742, 17890819}, {66743, 17891075}, {66744, 17891331}, - {66745, 17891587}, {66746, 17891843}, {66747, 17892099}, {66748, 17892355}, - {66749, 17892611}, {66750, 17892867}, {66751, 17893123}, {66752, 17893379}, - {66753, 17893635}, {66754, 17893891}, {66755, 17894147}, {66756, 17894403}, - {66757, 17894659}, {66758, 17894915}, {66759, 17895171}, {66760, 17895427}, - {66761, 17895683}, {66762, 17895939}, {66763, 17896195}, {66764, 17896451}, - {66765, 17896707}, {66766, 17896963}, {66767, 17897219}, {66768, 17897475}, - {66769, 17897731}, {66770, 17897987}, {66771, 17898243}, {66772, 2}, - {66776, 1}, {66812, 2}, {66816, 1}, {66856, 2}, - {66864, 1}, {66916, 2}, {66927, 1}, {66928, 17898499}, - {66929, 17898755}, {66930, 17899011}, {66931, 17899267}, {66932, 17899523}, - {66933, 17899779}, {66934, 17900035}, {66935, 17900291}, {66936, 17900547}, - {66937, 17900803}, {66938, 17901059}, {66939, 2}, {66940, 17901315}, - {66941, 17901571}, {66942, 17901827}, {66943, 17902083}, {66944, 17902339}, - {66945, 17902595}, {66946, 17902851}, {66947, 17903107}, {66948, 17903363}, - {66949, 17903619}, {66950, 17903875}, {66951, 17904131}, {66952, 17904387}, - {66953, 17904643}, {66954, 17904899}, {66955, 2}, {66956, 17905155}, - {66957, 17905411}, {66958, 17905667}, {66959, 17905923}, {66960, 17906179}, - {66961, 17906435}, {66962, 17906691}, {66963, 2}, {66964, 17906947}, - {66965, 17907203}, {66966, 2}, {66967, 1}, {66978, 2}, - {66979, 1}, {66994, 2}, {66995, 1}, {67002, 2}, - {67003, 1}, {67005, 2}, {67008, 1}, {67060, 2}, - {67072, 1}, {67383, 2}, {67392, 1}, {67414, 2}, - {67424, 1}, {67432, 2}, {67456, 1}, {67457, 17907459}, - {67458, 17907715}, {67459, 16791043}, {67460, 17907971}, {67461, 16814083}, - {67462, 2}, {67463, 17908227}, {67464, 17908483}, {67465, 17908739}, - {67466, 17908995}, {67467, 16815363}, {67468, 16815619}, {67469, 17909251}, - {67470, 17909507}, {67471, 17909763}, {67472, 17910019}, {67473, 17527555}, - {67474, 17910275}, {67475, 16817155}, {67476, 17910531}, {67477, 16802051}, - {67478, 17910787}, {67479, 17911043}, {67480, 17911299}, {67481, 17911555}, - {67482, 17911811}, {67483, 17523459}, {67484, 17912067}, {67485, 17912323}, - {67486, 17912579}, {67487, 17912835}, {67488, 17913091}, {67489, 17913347}, - {67490, 16795395}, {67491, 17913603}, {67492, 17913859}, {67493, 16781315}, - {67494, 17914115}, {67495, 17914371}, {67496, 17135875}, {67497, 17914627}, - {67498, 16819971}, {67499, 17914883}, {67500, 17915139}, {67501, 17915395}, - {67502, 17915651}, {67503, 16820995}, {67504, 17915907}, {67505, 2}, - {67506, 17916163}, {67507, 17916419}, {67508, 17916675}, {67509, 17916931}, - {67510, 17917187}, {67511, 17917443}, {67512, 17917699}, {67513, 17917955}, - {67514, 17918211}, {67515, 2}, {67584, 1}, {67590, 2}, - {67592, 1}, {67593, 2}, {67594, 1}, {67638, 2}, - {67639, 1}, {67641, 2}, {67644, 1}, {67645, 2}, - {67647, 1}, {67670, 2}, {67671, 1}, {67743, 2}, - {67751, 1}, {67760, 2}, {67808, 1}, {67827, 2}, - {67828, 1}, {67830, 2}, {67835, 1}, {67868, 2}, - {67871, 1}, {67898, 2}, {67903, 1}, {67930, 2}, - {67968, 1}, {68024, 2}, {68028, 1}, {68048, 2}, - {68050, 1}, {68100, 2}, {68101, 1}, {68103, 2}, - {68108, 1}, {68116, 2}, {68117, 1}, {68120, 2}, - {68121, 1}, {68150, 2}, {68152, 1}, {68155, 2}, - {68159, 1}, {68169, 2}, {68176, 1}, {68185, 2}, - {68192, 1}, {68256, 2}, {68288, 1}, {68327, 2}, - {68331, 1}, {68343, 2}, {68352, 1}, {68406, 2}, - {68409, 1}, {68438, 2}, {68440, 1}, {68467, 2}, - {68472, 1}, {68498, 2}, {68505, 1}, {68509, 2}, - {68521, 1}, {68528, 2}, {68608, 1}, {68681, 2}, - {68736, 17918467}, {68737, 17918723}, {68738, 17918979}, {68739, 17919235}, - {68740, 17919491}, {68741, 17919747}, {68742, 17920003}, {68743, 17920259}, - {68744, 17920515}, {68745, 17920771}, {68746, 17921027}, {68747, 17921283}, - {68748, 17921539}, {68749, 17921795}, {68750, 17922051}, {68751, 17922307}, - {68752, 17922563}, {68753, 17922819}, {68754, 17923075}, {68755, 17923331}, - {68756, 17923587}, {68757, 17923843}, {68758, 17924099}, {68759, 17924355}, - {68760, 17924611}, {68761, 17924867}, {68762, 17925123}, {68763, 17925379}, - {68764, 17925635}, {68765, 17925891}, {68766, 17926147}, {68767, 17926403}, - {68768, 17926659}, {68769, 17926915}, {68770, 17927171}, {68771, 17927427}, - {68772, 17927683}, {68773, 17927939}, {68774, 17928195}, {68775, 17928451}, - {68776, 17928707}, {68777, 17928963}, {68778, 17929219}, {68779, 17929475}, - {68780, 17929731}, {68781, 17929987}, {68782, 17930243}, {68783, 17930499}, - {68784, 17930755}, {68785, 17931011}, {68786, 17931267}, {68787, 2}, - {68800, 1}, {68851, 2}, {68858, 1}, {68904, 2}, - {68912, 1}, {68922, 2}, {68928, 1}, {68944, 17931523}, - {68945, 17931779}, {68946, 17932035}, {68947, 17932291}, {68948, 17932547}, - {68949, 17932803}, {68950, 17933059}, {68951, 17933315}, {68952, 17933571}, - {68953, 17933827}, {68954, 17934083}, {68955, 17934339}, {68956, 17934595}, - {68957, 17934851}, {68958, 17935107}, {68959, 17935363}, {68960, 17935619}, - {68961, 17935875}, {68962, 17936131}, {68963, 17936387}, {68964, 17936643}, - {68965, 17936899}, {68966, 2}, {68969, 1}, {68998, 2}, - {69006, 1}, {69008, 2}, {69216, 1}, {69247, 2}, - {69248, 1}, {69290, 2}, {69291, 1}, {69294, 2}, - {69296, 1}, {69298, 2}, {69314, 1}, {69320, 2}, - {69328, 1}, {69337, 2}, {69370, 1}, {69416, 2}, - {69424, 1}, {69466, 2}, {69488, 1}, {69514, 2}, - {69552, 1}, {69580, 2}, {69600, 1}, {69623, 2}, - {69632, 1}, {69710, 2}, {69714, 1}, {69750, 2}, - {69759, 1}, {69821, 2}, {69822, 1}, {69827, 2}, - {69840, 1}, {69865, 2}, {69872, 1}, {69882, 2}, - {69888, 1}, {69941, 2}, {69942, 1}, {69960, 2}, - {69968, 1}, {70007, 2}, {70016, 1}, {70112, 2}, - {70113, 1}, {70133, 2}, {70144, 1}, {70162, 2}, - {70163, 1}, {70210, 2}, {70272, 1}, {70279, 2}, - {70280, 1}, {70281, 2}, {70282, 1}, {70286, 2}, - {70287, 1}, {70302, 2}, {70303, 1}, {70314, 2}, - {70320, 1}, {70379, 2}, {70384, 1}, {70394, 2}, - {70400, 1}, {70404, 2}, {70405, 1}, {70413, 2}, - {70415, 1}, {70417, 2}, {70419, 1}, {70441, 2}, - {70442, 1}, {70449, 2}, {70450, 1}, {70452, 2}, - {70453, 1}, {70458, 2}, {70459, 1}, {70469, 2}, - {70471, 1}, {70473, 2}, {70475, 1}, {70478, 2}, - {70480, 1}, {70481, 2}, {70487, 1}, {70488, 2}, - {70493, 1}, {70500, 2}, {70502, 1}, {70509, 2}, - {70512, 1}, {70517, 2}, {70528, 1}, {70538, 2}, - {70539, 1}, {70540, 2}, {70542, 1}, {70543, 2}, - {70544, 1}, {70582, 2}, {70583, 1}, {70593, 2}, - {70594, 1}, {70595, 2}, {70597, 1}, {70598, 2}, - {70599, 1}, {70603, 2}, {70604, 1}, {70614, 2}, - {70615, 1}, {70617, 2}, {70625, 1}, {70627, 2}, - {70656, 1}, {70748, 2}, {70749, 1}, {70754, 2}, - {70784, 1}, {70856, 2}, {70864, 1}, {70874, 2}, - {71040, 1}, {71094, 2}, {71096, 1}, {71134, 2}, - {71168, 1}, {71237, 2}, {71248, 1}, {71258, 2}, - {71264, 1}, {71277, 2}, {71296, 1}, {71354, 2}, - {71360, 1}, {71370, 2}, {71376, 1}, {71396, 2}, - {71424, 1}, {71451, 2}, {71453, 1}, {71468, 2}, - {71472, 1}, {71495, 2}, {71680, 1}, {71740, 2}, - {71840, 17937155}, {71841, 17937411}, {71842, 17937667}, {71843, 17937923}, - {71844, 17938179}, {71845, 17938435}, {71846, 17938691}, {71847, 17938947}, - {71848, 17939203}, {71849, 17939459}, {71850, 17939715}, {71851, 17939971}, - {71852, 17940227}, {71853, 17940483}, {71854, 17940739}, {71855, 17940995}, - {71856, 17941251}, {71857, 17941507}, {71858, 17941763}, {71859, 17942019}, - {71860, 17942275}, {71861, 17942531}, {71862, 17942787}, {71863, 17943043}, - {71864, 17943299}, {71865, 17943555}, {71866, 17943811}, {71867, 17944067}, - {71868, 17944323}, {71869, 17944579}, {71870, 17944835}, {71871, 17945091}, - {71872, 1}, {71923, 2}, {71935, 1}, {71943, 2}, - {71945, 1}, {71946, 2}, {71948, 1}, {71956, 2}, - {71957, 1}, {71959, 2}, {71960, 1}, {71990, 2}, - {71991, 1}, {71993, 2}, {71995, 1}, {72007, 2}, - {72016, 1}, {72026, 2}, {72096, 1}, {72104, 2}, - {72106, 1}, {72152, 2}, {72154, 1}, {72165, 2}, - {72192, 1}, {72264, 2}, {72272, 1}, {72355, 2}, - {72368, 1}, {72441, 2}, {72448, 1}, {72458, 2}, - {72544, 1}, {72552, 2}, {72640, 1}, {72674, 2}, - {72688, 1}, {72698, 2}, {72704, 1}, {72713, 2}, - {72714, 1}, {72759, 2}, {72760, 1}, {72774, 2}, - {72784, 1}, {72813, 2}, {72816, 1}, {72848, 2}, - {72850, 1}, {72872, 2}, {72873, 1}, {72887, 2}, - {72960, 1}, {72967, 2}, {72968, 1}, {72970, 2}, - {72971, 1}, {73015, 2}, {73018, 1}, {73019, 2}, - {73020, 1}, {73022, 2}, {73023, 1}, {73032, 2}, - {73040, 1}, {73050, 2}, {73056, 1}, {73062, 2}, - {73063, 1}, {73065, 2}, {73066, 1}, {73103, 2}, - {73104, 1}, {73106, 2}, {73107, 1}, {73113, 2}, - {73120, 1}, {73130, 2}, {73136, 1}, {73180, 2}, - {73184, 1}, {73194, 2}, {73440, 1}, {73465, 2}, - {73472, 1}, {73489, 2}, {73490, 1}, {73531, 2}, - {73534, 1}, {73563, 2}, {73648, 1}, {73649, 2}, - {73664, 1}, {73714, 2}, {73727, 1}, {74650, 2}, - {74752, 1}, {74863, 2}, {74864, 1}, {74869, 2}, - {74880, 1}, {75076, 2}, {77712, 1}, {77811, 2}, - {77824, 1}, {78896, 2}, {78912, 1}, {78934, 2}, - {78944, 1}, {82939, 2}, {82944, 1}, {83527, 2}, - {90368, 1}, {90426, 2}, {92160, 1}, {92729, 2}, - {92736, 1}, {92767, 2}, {92768, 1}, {92778, 2}, - {92782, 1}, {92863, 2}, {92864, 1}, {92874, 2}, - {92880, 1}, {92910, 2}, {92912, 1}, {92918, 2}, - {92928, 1}, {92998, 2}, {93008, 1}, {93018, 2}, - {93019, 1}, {93026, 2}, {93027, 1}, {93048, 2}, - {93053, 1}, {93072, 2}, {93504, 1}, {93562, 2}, - {93760, 17945347}, {93761, 17945603}, {93762, 17945859}, {93763, 17946115}, - {93764, 17946371}, {93765, 17946627}, {93766, 17946883}, {93767, 17947139}, - {93768, 17947395}, {93769, 17947651}, {93770, 17947907}, {93771, 17948163}, - {93772, 17948419}, {93773, 17948675}, {93774, 17948931}, {93775, 17949187}, - {93776, 17949443}, {93777, 17949699}, {93778, 17949955}, {93779, 17950211}, - {93780, 17950467}, {93781, 17950723}, {93782, 17950979}, {93783, 17951235}, - {93784, 17951491}, {93785, 17951747}, {93786, 17952003}, {93787, 17952259}, - {93788, 17952515}, {93789, 17952771}, {93790, 17953027}, {93791, 17953283}, - {93792, 1}, {93851, 2}, {93856, 17953539}, {93857, 17953795}, - {93858, 17954051}, {93859, 17954307}, {93860, 17954563}, {93861, 17954819}, - {93862, 17955075}, {93863, 17955331}, {93864, 17955587}, {93865, 17955843}, - {93866, 17956099}, {93867, 17956355}, {93868, 17956611}, {93869, 17956867}, - {93870, 17957123}, {93871, 17957379}, {93872, 17957635}, {93873, 17957891}, - {93874, 17958147}, {93875, 17958403}, {93876, 17958659}, {93877, 17958915}, - {93878, 17959171}, {93879, 17959427}, {93880, 17959683}, {93881, 2}, - {93883, 1}, {93908, 2}, {93952, 1}, {94027, 2}, - {94031, 1}, {94088, 2}, {94095, 1}, {94112, 2}, - {94176, 1}, {94181, 2}, {94192, 1}, {94199, 2}, - {94208, 1}, {101590, 2}, {101631, 1}, {101663, 2}, - {101760, 1}, {101875, 2}, {110576, 1}, {110580, 2}, - {110581, 1}, {110588, 2}, {110589, 1}, {110591, 2}, - {110592, 1}, {110883, 2}, {110898, 1}, {110899, 2}, - {110928, 1}, {110931, 2}, {110933, 1}, {110934, 2}, - {110948, 1}, {110952, 2}, {110960, 1}, {111356, 2}, - {113664, 1}, {113771, 2}, {113776, 1}, {113789, 2}, - {113792, 1}, {113801, 2}, {113808, 1}, {113818, 2}, - {113820, 1}, {113824, 0}, {113828, 2}, {117760, 1}, - {117974, 16777219}, {117975, 16777475}, {117976, 16777731}, {117977, 16777987}, - {117978, 16778243}, {117979, 16778499}, {117980, 16778755}, {117981, 16779011}, - {117982, 16779267}, {117983, 16779523}, {117984, 16779779}, {117985, 16780035}, - {117986, 16780291}, {117987, 16780547}, {117988, 16780803}, {117989, 16781059}, - {117990, 16781315}, {117991, 16781571}, {117992, 16781827}, {117993, 16782083}, - {117994, 16782339}, {117995, 16782595}, {117996, 16782851}, {117997, 16783107}, - {117998, 16783363}, {117999, 16783619}, {118000, 17045507}, {118001, 16786947}, - {118002, 16785155}, {118003, 16785411}, {118004, 16787715}, {118005, 17045763}, - {118006, 17046019}, {118007, 17046275}, {118008, 17046531}, {118009, 17046787}, - {118010, 1}, {118013, 2}, {118016, 1}, {118452, 2}, - {118458, 1}, {118481, 2}, {118496, 1}, {118513, 2}, - {118528, 1}, {118574, 2}, {118576, 1}, {118599, 2}, - {118608, 1}, {118724, 2}, {118784, 1}, {119030, 2}, - {119040, 1}, {119079, 2}, {119081, 1}, {119134, 34737155}, - {119135, 34737667}, {119136, 51515395}, {119137, 51516163}, {119138, 51516931}, - {119139, 51517699}, {119140, 51518467}, {119141, 1}, {119155, 0}, - {119163, 1}, {119227, 34742019}, {119228, 34742531}, {119229, 51520259}, - {119230, 51521027}, {119231, 51521795}, {119232, 51522563}, {119233, 1}, - {119275, 2}, {119296, 1}, {119366, 2}, {119488, 1}, - {119508, 2}, {119520, 1}, {119540, 2}, {119552, 1}, - {119639, 2}, {119648, 1}, {119673, 2}, {119808, 16777219}, - {119809, 16777475}, {119810, 16777731}, {119811, 16777987}, {119812, 16778243}, - {119813, 16778499}, {119814, 16778755}, {119815, 16779011}, {119816, 16779267}, - {119817, 16779523}, {119818, 16779779}, {119819, 16780035}, {119820, 16780291}, - {119821, 16780547}, {119822, 16780803}, {119823, 16781059}, {119824, 16781315}, - {119825, 16781571}, {119826, 16781827}, {119827, 16782083}, {119828, 16782339}, - {119829, 16782595}, {119830, 16782851}, {119831, 16783107}, {119832, 16783363}, - {119833, 16783619}, {119834, 16777219}, {119835, 16777475}, {119836, 16777731}, - {119837, 16777987}, {119838, 16778243}, {119839, 16778499}, {119840, 16778755}, - {119841, 16779011}, {119842, 16779267}, {119843, 16779523}, {119844, 16779779}, - {119845, 16780035}, {119846, 16780291}, {119847, 16780547}, {119848, 16780803}, - {119849, 16781059}, {119850, 16781315}, {119851, 16781571}, {119852, 16781827}, - {119853, 16782083}, {119854, 16782339}, {119855, 16782595}, {119856, 16782851}, - {119857, 16783107}, {119858, 16783363}, {119859, 16783619}, {119860, 16777219}, - {119861, 16777475}, {119862, 16777731}, {119863, 16777987}, {119864, 16778243}, - {119865, 16778499}, {119866, 16778755}, {119867, 16779011}, {119868, 16779267}, - {119869, 16779523}, {119870, 16779779}, {119871, 16780035}, {119872, 16780291}, - {119873, 16780547}, {119874, 16780803}, {119875, 16781059}, {119876, 16781315}, - {119877, 16781571}, {119878, 16781827}, {119879, 16782083}, {119880, 16782339}, - {119881, 16782595}, {119882, 16782851}, {119883, 16783107}, {119884, 16783363}, - {119885, 16783619}, {119886, 16777219}, {119887, 16777475}, {119888, 16777731}, - {119889, 16777987}, {119890, 16778243}, {119891, 16778499}, {119892, 16778755}, - {119893, 2}, {119894, 16779267}, {119895, 16779523}, {119896, 16779779}, - {119897, 16780035}, {119898, 16780291}, {119899, 16780547}, {119900, 16780803}, - {119901, 16781059}, {119902, 16781315}, {119903, 16781571}, {119904, 16781827}, - {119905, 16782083}, {119906, 16782339}, {119907, 16782595}, {119908, 16782851}, - {119909, 16783107}, {119910, 16783363}, {119911, 16783619}, {119912, 16777219}, - {119913, 16777475}, {119914, 16777731}, {119915, 16777987}, {119916, 16778243}, - {119917, 16778499}, {119918, 16778755}, {119919, 16779011}, {119920, 16779267}, - {119921, 16779523}, {119922, 16779779}, {119923, 16780035}, {119924, 16780291}, - {119925, 16780547}, {119926, 16780803}, {119927, 16781059}, {119928, 16781315}, - {119929, 16781571}, {119930, 16781827}, {119931, 16782083}, {119932, 16782339}, - {119933, 16782595}, {119934, 16782851}, {119935, 16783107}, {119936, 16783363}, - {119937, 16783619}, {119938, 16777219}, {119939, 16777475}, {119940, 16777731}, - {119941, 16777987}, {119942, 16778243}, {119943, 16778499}, {119944, 16778755}, - {119945, 16779011}, {119946, 16779267}, {119947, 16779523}, {119948, 16779779}, - {119949, 16780035}, {119950, 16780291}, {119951, 16780547}, {119952, 16780803}, - {119953, 16781059}, {119954, 16781315}, {119955, 16781571}, {119956, 16781827}, - {119957, 16782083}, {119958, 16782339}, {119959, 16782595}, {119960, 16782851}, - {119961, 16783107}, {119962, 16783363}, {119963, 16783619}, {119964, 16777219}, - {119965, 2}, {119966, 16777731}, {119967, 16777987}, {119968, 2}, - {119970, 16778755}, {119971, 2}, {119973, 16779523}, {119974, 16779779}, - {119975, 2}, {119977, 16780547}, {119978, 16780803}, {119979, 16781059}, - {119980, 16781315}, {119981, 2}, {119982, 16781827}, {119983, 16782083}, - {119984, 16782339}, {119985, 16782595}, {119986, 16782851}, {119987, 16783107}, - {119988, 16783363}, {119989, 16783619}, {119990, 16777219}, {119991, 16777475}, - {119992, 16777731}, {119993, 16777987}, {119994, 2}, {119995, 16778499}, - {119996, 2}, {119997, 16779011}, {119998, 16779267}, {119999, 16779523}, - {120000, 16779779}, {120001, 16780035}, {120002, 16780291}, {120003, 16780547}, - {120004, 2}, {120005, 16781059}, {120006, 16781315}, {120007, 16781571}, - {120008, 16781827}, {120009, 16782083}, {120010, 16782339}, {120011, 16782595}, - {120012, 16782851}, {120013, 16783107}, {120014, 16783363}, {120015, 16783619}, - {120016, 16777219}, {120017, 16777475}, {120018, 16777731}, {120019, 16777987}, - {120020, 16778243}, {120021, 16778499}, {120022, 16778755}, {120023, 16779011}, - {120024, 16779267}, {120025, 16779523}, {120026, 16779779}, {120027, 16780035}, - {120028, 16780291}, {120029, 16780547}, {120030, 16780803}, {120031, 16781059}, - {120032, 16781315}, {120033, 16781571}, {120034, 16781827}, {120035, 16782083}, - {120036, 16782339}, {120037, 16782595}, {120038, 16782851}, {120039, 16783107}, - {120040, 16783363}, {120041, 16783619}, {120042, 16777219}, {120043, 16777475}, - {120044, 16777731}, {120045, 16777987}, {120046, 16778243}, {120047, 16778499}, - {120048, 16778755}, {120049, 16779011}, {120050, 16779267}, {120051, 16779523}, - {120052, 16779779}, {120053, 16780035}, {120054, 16780291}, {120055, 16780547}, - {120056, 16780803}, {120057, 16781059}, {120058, 16781315}, {120059, 16781571}, - {120060, 16781827}, {120061, 16782083}, {120062, 16782339}, {120063, 16782595}, - {120064, 16782851}, {120065, 16783107}, {120066, 16783363}, {120067, 16783619}, - {120068, 16777219}, {120069, 16777475}, {120070, 2}, {120071, 16777987}, - {120072, 16778243}, {120073, 16778499}, {120074, 16778755}, {120075, 2}, - {120077, 16779523}, {120078, 16779779}, {120079, 16780035}, {120080, 16780291}, - {120081, 16780547}, {120082, 16780803}, {120083, 16781059}, {120084, 16781315}, - {120085, 2}, {120086, 16781827}, {120087, 16782083}, {120088, 16782339}, - {120089, 16782595}, {120090, 16782851}, {120091, 16783107}, {120092, 16783363}, - {120093, 2}, {120094, 16777219}, {120095, 16777475}, {120096, 16777731}, - {120097, 16777987}, {120098, 16778243}, {120099, 16778499}, {120100, 16778755}, - {120101, 16779011}, {120102, 16779267}, {120103, 16779523}, {120104, 16779779}, - {120105, 16780035}, {120106, 16780291}, {120107, 16780547}, {120108, 16780803}, - {120109, 16781059}, {120110, 16781315}, {120111, 16781571}, {120112, 16781827}, - {120113, 16782083}, {120114, 16782339}, {120115, 16782595}, {120116, 16782851}, - {120117, 16783107}, {120118, 16783363}, {120119, 16783619}, {120120, 16777219}, - {120121, 16777475}, {120122, 2}, {120123, 16777987}, {120124, 16778243}, - {120125, 16778499}, {120126, 16778755}, {120127, 2}, {120128, 16779267}, - {120129, 16779523}, {120130, 16779779}, {120131, 16780035}, {120132, 16780291}, - {120133, 2}, {120134, 16780803}, {120135, 2}, {120138, 16781827}, - {120139, 16782083}, {120140, 16782339}, {120141, 16782595}, {120142, 16782851}, - {120143, 16783107}, {120144, 16783363}, {120145, 2}, {120146, 16777219}, - {120147, 16777475}, {120148, 16777731}, {120149, 16777987}, {120150, 16778243}, - {120151, 16778499}, {120152, 16778755}, {120153, 16779011}, {120154, 16779267}, - {120155, 16779523}, {120156, 16779779}, {120157, 16780035}, {120158, 16780291}, - {120159, 16780547}, {120160, 16780803}, {120161, 16781059}, {120162, 16781315}, - {120163, 16781571}, {120164, 16781827}, {120165, 16782083}, {120166, 16782339}, - {120167, 16782595}, {120168, 16782851}, {120169, 16783107}, {120170, 16783363}, - {120171, 16783619}, {120172, 16777219}, {120173, 16777475}, {120174, 16777731}, - {120175, 16777987}, {120176, 16778243}, {120177, 16778499}, {120178, 16778755}, - {120179, 16779011}, {120180, 16779267}, {120181, 16779523}, {120182, 16779779}, - {120183, 16780035}, {120184, 16780291}, {120185, 16780547}, {120186, 16780803}, - {120187, 16781059}, {120188, 16781315}, {120189, 16781571}, {120190, 16781827}, - {120191, 16782083}, {120192, 16782339}, {120193, 16782595}, {120194, 16782851}, - {120195, 16783107}, {120196, 16783363}, {120197, 16783619}, {120198, 16777219}, - {120199, 16777475}, {120200, 16777731}, {120201, 16777987}, {120202, 16778243}, - {120203, 16778499}, {120204, 16778755}, {120205, 16779011}, {120206, 16779267}, - {120207, 16779523}, {120208, 16779779}, {120209, 16780035}, {120210, 16780291}, - {120211, 16780547}, {120212, 16780803}, {120213, 16781059}, {120214, 16781315}, - {120215, 16781571}, {120216, 16781827}, {120217, 16782083}, {120218, 16782339}, - {120219, 16782595}, {120220, 16782851}, {120221, 16783107}, {120222, 16783363}, - {120223, 16783619}, {120224, 16777219}, {120225, 16777475}, {120226, 16777731}, - {120227, 16777987}, {120228, 16778243}, {120229, 16778499}, {120230, 16778755}, - {120231, 16779011}, {120232, 16779267}, {120233, 16779523}, {120234, 16779779}, - {120235, 16780035}, {120236, 16780291}, {120237, 16780547}, {120238, 16780803}, - {120239, 16781059}, {120240, 16781315}, {120241, 16781571}, {120242, 16781827}, - {120243, 16782083}, {120244, 16782339}, {120245, 16782595}, {120246, 16782851}, - {120247, 16783107}, {120248, 16783363}, {120249, 16783619}, {120250, 16777219}, - {120251, 16777475}, {120252, 16777731}, {120253, 16777987}, {120254, 16778243}, - {120255, 16778499}, {120256, 16778755}, {120257, 16779011}, {120258, 16779267}, - {120259, 16779523}, {120260, 16779779}, {120261, 16780035}, {120262, 16780291}, - {120263, 16780547}, {120264, 16780803}, {120265, 16781059}, {120266, 16781315}, - {120267, 16781571}, {120268, 16781827}, {120269, 16782083}, {120270, 16782339}, - {120271, 16782595}, {120272, 16782851}, {120273, 16783107}, {120274, 16783363}, - {120275, 16783619}, {120276, 16777219}, {120277, 16777475}, {120278, 16777731}, - {120279, 16777987}, {120280, 16778243}, {120281, 16778499}, {120282, 16778755}, - {120283, 16779011}, {120284, 16779267}, {120285, 16779523}, {120286, 16779779}, - {120287, 16780035}, {120288, 16780291}, {120289, 16780547}, {120290, 16780803}, - {120291, 16781059}, {120292, 16781315}, {120293, 16781571}, {120294, 16781827}, - {120295, 16782083}, {120296, 16782339}, {120297, 16782595}, {120298, 16782851}, - {120299, 16783107}, {120300, 16783363}, {120301, 16783619}, {120302, 16777219}, - {120303, 16777475}, {120304, 16777731}, {120305, 16777987}, {120306, 16778243}, - {120307, 16778499}, {120308, 16778755}, {120309, 16779011}, {120310, 16779267}, - {120311, 16779523}, {120312, 16779779}, {120313, 16780035}, {120314, 16780291}, - {120315, 16780547}, {120316, 16780803}, {120317, 16781059}, {120318, 16781315}, - {120319, 16781571}, {120320, 16781827}, {120321, 16782083}, {120322, 16782339}, - {120323, 16782595}, {120324, 16782851}, {120325, 16783107}, {120326, 16783363}, - {120327, 16783619}, {120328, 16777219}, {120329, 16777475}, {120330, 16777731}, - {120331, 16777987}, {120332, 16778243}, {120333, 16778499}, {120334, 16778755}, - {120335, 16779011}, {120336, 16779267}, {120337, 16779523}, {120338, 16779779}, - {120339, 16780035}, {120340, 16780291}, {120341, 16780547}, {120342, 16780803}, - {120343, 16781059}, {120344, 16781315}, {120345, 16781571}, {120346, 16781827}, - {120347, 16782083}, {120348, 16782339}, {120349, 16782595}, {120350, 16782851}, - {120351, 16783107}, {120352, 16783363}, {120353, 16783619}, {120354, 16777219}, - {120355, 16777475}, {120356, 16777731}, {120357, 16777987}, {120358, 16778243}, - {120359, 16778499}, {120360, 16778755}, {120361, 16779011}, {120362, 16779267}, - {120363, 16779523}, {120364, 16779779}, {120365, 16780035}, {120366, 16780291}, - {120367, 16780547}, {120368, 16780803}, {120369, 16781059}, {120370, 16781315}, - {120371, 16781571}, {120372, 16781827}, {120373, 16782083}, {120374, 16782339}, - {120375, 16782595}, {120376, 16782851}, {120377, 16783107}, {120378, 16783363}, - {120379, 16783619}, {120380, 16777219}, {120381, 16777475}, {120382, 16777731}, - {120383, 16777987}, {120384, 16778243}, {120385, 16778499}, {120386, 16778755}, - {120387, 16779011}, {120388, 16779267}, {120389, 16779523}, {120390, 16779779}, - {120391, 16780035}, {120392, 16780291}, {120393, 16780547}, {120394, 16780803}, - {120395, 16781059}, {120396, 16781315}, {120397, 16781571}, {120398, 16781827}, - {120399, 16782083}, {120400, 16782339}, {120401, 16782595}, {120402, 16782851}, - {120403, 16783107}, {120404, 16783363}, {120405, 16783619}, {120406, 16777219}, - {120407, 16777475}, {120408, 16777731}, {120409, 16777987}, {120410, 16778243}, - {120411, 16778499}, {120412, 16778755}, {120413, 16779011}, {120414, 16779267}, - {120415, 16779523}, {120416, 16779779}, {120417, 16780035}, {120418, 16780291}, - {120419, 16780547}, {120420, 16780803}, {120421, 16781059}, {120422, 16781315}, - {120423, 16781571}, {120424, 16781827}, {120425, 16782083}, {120426, 16782339}, - {120427, 16782595}, {120428, 16782851}, {120429, 16783107}, {120430, 16783363}, - {120431, 16783619}, {120432, 16777219}, {120433, 16777475}, {120434, 16777731}, - {120435, 16777987}, {120436, 16778243}, {120437, 16778499}, {120438, 16778755}, - {120439, 16779011}, {120440, 16779267}, {120441, 16779523}, {120442, 16779779}, - {120443, 16780035}, {120444, 16780291}, {120445, 16780547}, {120446, 16780803}, - {120447, 16781059}, {120448, 16781315}, {120449, 16781571}, {120450, 16781827}, - {120451, 16782083}, {120452, 16782339}, {120453, 16782595}, {120454, 16782851}, - {120455, 16783107}, {120456, 16783363}, {120457, 16783619}, {120458, 16777219}, - {120459, 16777475}, {120460, 16777731}, {120461, 16777987}, {120462, 16778243}, - {120463, 16778499}, {120464, 16778755}, {120465, 16779011}, {120466, 16779267}, - {120467, 16779523}, {120468, 16779779}, {120469, 16780035}, {120470, 16780291}, - {120471, 16780547}, {120472, 16780803}, {120473, 16781059}, {120474, 16781315}, - {120475, 16781571}, {120476, 16781827}, {120477, 16782083}, {120478, 16782339}, - {120479, 16782595}, {120480, 16782851}, {120481, 16783107}, {120482, 16783363}, - {120483, 16783619}, {120484, 17968899}, {120485, 17969155}, {120486, 2}, - {120488, 16851715}, {120489, 16851971}, {120490, 16852227}, {120491, 16852483}, - {120492, 16852739}, {120493, 16852995}, {120494, 16853251}, {120495, 16853507}, - {120496, 16846851}, {120497, 16853763}, {120498, 16854019}, {120499, 16786179}, - {120500, 16854275}, {120501, 16854531}, {120502, 16854787}, {120503, 16855043}, - {120504, 16855299}, {120505, 16853507}, {120506, 16855555}, {120507, 16855811}, - {120508, 16856067}, {120509, 16856323}, {120510, 16856579}, {120511, 16856835}, - {120512, 16857091}, {120513, 17969411}, {120514, 16851715}, {120515, 16851971}, - {120516, 16852227}, {120517, 16852483}, {120518, 16852739}, {120519, 16852995}, - {120520, 16853251}, {120521, 16853507}, {120522, 16846851}, {120523, 16853763}, - {120524, 16854019}, {120525, 16786179}, {120526, 16854275}, {120527, 16854531}, - {120528, 16854787}, {120529, 16855043}, {120530, 16855299}, {120531, 16855555}, - {120533, 16855811}, {120534, 16856067}, {120535, 16856323}, {120536, 16856579}, - {120537, 16856835}, {120538, 16857091}, {120539, 17969667}, {120540, 16852739}, - {120541, 16853507}, {120542, 16853763}, {120543, 16856323}, {120544, 16855299}, - {120545, 16855043}, {120546, 16851715}, {120547, 16851971}, {120548, 16852227}, - {120549, 16852483}, {120550, 16852739}, {120551, 16852995}, {120552, 16853251}, - {120553, 16853507}, {120554, 16846851}, {120555, 16853763}, {120556, 16854019}, - {120557, 16786179}, {120558, 16854275}, {120559, 16854531}, {120560, 16854787}, - {120561, 16855043}, {120562, 16855299}, {120563, 16853507}, {120564, 16855555}, - {120565, 16855811}, {120566, 16856067}, {120567, 16856323}, {120568, 16856579}, - {120569, 16856835}, {120570, 16857091}, {120571, 17969411}, {120572, 16851715}, - {120573, 16851971}, {120574, 16852227}, {120575, 16852483}, {120576, 16852739}, - {120577, 16852995}, {120578, 16853251}, {120579, 16853507}, {120580, 16846851}, - {120581, 16853763}, {120582, 16854019}, {120583, 16786179}, {120584, 16854275}, - {120585, 16854531}, {120586, 16854787}, {120587, 16855043}, {120588, 16855299}, - {120589, 16855555}, {120591, 16855811}, {120592, 16856067}, {120593, 16856323}, - {120594, 16856579}, {120595, 16856835}, {120596, 16857091}, {120597, 17969667}, - {120598, 16852739}, {120599, 16853507}, {120600, 16853763}, {120601, 16856323}, - {120602, 16855299}, {120603, 16855043}, {120604, 16851715}, {120605, 16851971}, - {120606, 16852227}, {120607, 16852483}, {120608, 16852739}, {120609, 16852995}, - {120610, 16853251}, {120611, 16853507}, {120612, 16846851}, {120613, 16853763}, - {120614, 16854019}, {120615, 16786179}, {120616, 16854275}, {120617, 16854531}, - {120618, 16854787}, {120619, 16855043}, {120620, 16855299}, {120621, 16853507}, - {120622, 16855555}, {120623, 16855811}, {120624, 16856067}, {120625, 16856323}, - {120626, 16856579}, {120627, 16856835}, {120628, 16857091}, {120629, 17969411}, - {120630, 16851715}, {120631, 16851971}, {120632, 16852227}, {120633, 16852483}, - {120634, 16852739}, {120635, 16852995}, {120636, 16853251}, {120637, 16853507}, - {120638, 16846851}, {120639, 16853763}, {120640, 16854019}, {120641, 16786179}, - {120642, 16854275}, {120643, 16854531}, {120644, 16854787}, {120645, 16855043}, - {120646, 16855299}, {120647, 16855555}, {120649, 16855811}, {120650, 16856067}, - {120651, 16856323}, {120652, 16856579}, {120653, 16856835}, {120654, 16857091}, - {120655, 17969667}, {120656, 16852739}, {120657, 16853507}, {120658, 16853763}, - {120659, 16856323}, {120660, 16855299}, {120661, 16855043}, {120662, 16851715}, - {120663, 16851971}, {120664, 16852227}, {120665, 16852483}, {120666, 16852739}, - {120667, 16852995}, {120668, 16853251}, {120669, 16853507}, {120670, 16846851}, - {120671, 16853763}, {120672, 16854019}, {120673, 16786179}, {120674, 16854275}, - {120675, 16854531}, {120676, 16854787}, {120677, 16855043}, {120678, 16855299}, - {120679, 16853507}, {120680, 16855555}, {120681, 16855811}, {120682, 16856067}, - {120683, 16856323}, {120684, 16856579}, {120685, 16856835}, {120686, 16857091}, - {120687, 17969411}, {120688, 16851715}, {120689, 16851971}, {120690, 16852227}, - {120691, 16852483}, {120692, 16852739}, {120693, 16852995}, {120694, 16853251}, - {120695, 16853507}, {120696, 16846851}, {120697, 16853763}, {120698, 16854019}, - {120699, 16786179}, {120700, 16854275}, {120701, 16854531}, {120702, 16854787}, - {120703, 16855043}, {120704, 16855299}, {120705, 16855555}, {120707, 16855811}, - {120708, 16856067}, {120709, 16856323}, {120710, 16856579}, {120711, 16856835}, - {120712, 16857091}, {120713, 17969667}, {120714, 16852739}, {120715, 16853507}, - {120716, 16853763}, {120717, 16856323}, {120718, 16855299}, {120719, 16855043}, - {120720, 16851715}, {120721, 16851971}, {120722, 16852227}, {120723, 16852483}, - {120724, 16852739}, {120725, 16852995}, {120726, 16853251}, {120727, 16853507}, - {120728, 16846851}, {120729, 16853763}, {120730, 16854019}, {120731, 16786179}, - {120732, 16854275}, {120733, 16854531}, {120734, 16854787}, {120735, 16855043}, - {120736, 16855299}, {120737, 16853507}, {120738, 16855555}, {120739, 16855811}, - {120740, 16856067}, {120741, 16856323}, {120742, 16856579}, {120743, 16856835}, - {120744, 16857091}, {120745, 17969411}, {120746, 16851715}, {120747, 16851971}, - {120748, 16852227}, {120749, 16852483}, {120750, 16852739}, {120751, 16852995}, - {120752, 16853251}, {120753, 16853507}, {120754, 16846851}, {120755, 16853763}, - {120756, 16854019}, {120757, 16786179}, {120758, 16854275}, {120759, 16854531}, - {120760, 16854787}, {120761, 16855043}, {120762, 16855299}, {120763, 16855555}, - {120765, 16855811}, {120766, 16856067}, {120767, 16856323}, {120768, 16856579}, - {120769, 16856835}, {120770, 16857091}, {120771, 17969667}, {120772, 16852739}, - {120773, 16853507}, {120774, 16853763}, {120775, 16856323}, {120776, 16855299}, - {120777, 16855043}, {120778, 16858627}, {120780, 2}, {120782, 17045507}, - {120783, 16786947}, {120784, 16785155}, {120785, 16785411}, {120786, 16787715}, - {120787, 17045763}, {120788, 17046019}, {120789, 17046275}, {120790, 17046531}, - {120791, 17046787}, {120792, 17045507}, {120793, 16786947}, {120794, 16785155}, - {120795, 16785411}, {120796, 16787715}, {120797, 17045763}, {120798, 17046019}, - {120799, 17046275}, {120800, 17046531}, {120801, 17046787}, {120802, 17045507}, - {120803, 16786947}, {120804, 16785155}, {120805, 16785411}, {120806, 16787715}, - {120807, 17045763}, {120808, 17046019}, {120809, 17046275}, {120810, 17046531}, - {120811, 17046787}, {120812, 17045507}, {120813, 16786947}, {120814, 16785155}, - {120815, 16785411}, {120816, 16787715}, {120817, 17045763}, {120818, 17046019}, - {120819, 17046275}, {120820, 17046531}, {120821, 17046787}, {120822, 17045507}, - {120823, 16786947}, {120824, 16785155}, {120825, 16785411}, {120826, 16787715}, - {120827, 17045763}, {120828, 17046019}, {120829, 17046275}, {120830, 17046531}, - {120831, 17046787}, {120832, 1}, {121484, 2}, {121499, 1}, - {121504, 2}, {121505, 1}, {121520, 2}, {122624, 1}, - {122655, 2}, {122661, 1}, {122667, 2}, {122880, 1}, - {122887, 2}, {122888, 1}, {122905, 2}, {122907, 1}, - {122914, 2}, {122915, 1}, {122917, 2}, {122918, 1}, - {122923, 2}, {122928, 16866563}, {122929, 16866819}, {122930, 16867075}, - {122931, 16867331}, {122932, 16867587}, {122933, 16867843}, {122934, 16868099}, - {122935, 16868355}, {122936, 16868611}, {122937, 16869123}, {122938, 16869379}, - {122939, 16869635}, {122940, 16870147}, {122941, 16870403}, {122942, 16870659}, - {122943, 16870915}, {122944, 16871171}, {122945, 16871427}, {122946, 16871683}, - {122947, 16871939}, {122948, 16872195}, {122949, 16872451}, {122950, 16872707}, - {122951, 16873475}, {122952, 16873987}, {122953, 16874243}, {122954, 17505795}, - {122955, 16889091}, {122956, 16864003}, {122957, 16864515}, {122958, 16891139}, - {122959, 16883715}, {122960, 16886019}, {122961, 16866563}, {122962, 16866819}, - {122963, 16867075}, {122964, 16867331}, {122965, 16867587}, {122966, 16867843}, - {122967, 16868099}, {122968, 16868355}, {122969, 16868611}, {122970, 16869123}, - {122971, 16869379}, {122972, 16870147}, {122973, 16870403}, {122974, 16870915}, - {122975, 16871427}, {122976, 16871683}, {122977, 16871939}, {122978, 16872195}, - {122979, 16872451}, {122980, 16872707}, {122981, 16873219}, {122982, 16873475}, - {122983, 16879875}, {122984, 16864003}, {122985, 16863747}, {122986, 16866307}, - {122987, 16883203}, {122988, 17500931}, {122989, 16883971}, {122990, 2}, - {123023, 1}, {123024, 2}, {123136, 1}, {123181, 2}, - {123184, 1}, {123198, 2}, {123200, 1}, {123210, 2}, - {123214, 1}, {123216, 2}, {123536, 1}, {123567, 2}, - {123584, 1}, {123642, 2}, {123647, 1}, {123648, 2}, - {124112, 1}, {124154, 2}, {124368, 1}, {124411, 2}, - {124415, 1}, {124416, 2}, {124608, 1}, {124639, 2}, - {124640, 1}, {124662, 2}, {124670, 1}, {124672, 2}, - {124896, 1}, {124903, 2}, {124904, 1}, {124908, 2}, - {124909, 1}, {124911, 2}, {124912, 1}, {124927, 2}, - {124928, 1}, {125125, 2}, {125127, 1}, {125143, 2}, - {125184, 17969923}, {125185, 17970179}, {125186, 17970435}, {125187, 17970691}, - {125188, 17970947}, {125189, 17971203}, {125190, 17971459}, {125191, 17971715}, - {125192, 17971971}, {125193, 17972227}, {125194, 17972483}, {125195, 17972739}, - {125196, 17972995}, {125197, 17973251}, {125198, 17973507}, {125199, 17973763}, - {125200, 17974019}, {125201, 17974275}, {125202, 17974531}, {125203, 17974787}, - {125204, 17975043}, {125205, 17975299}, {125206, 17975555}, {125207, 17975811}, - {125208, 17976067}, {125209, 17976323}, {125210, 17976579}, {125211, 17976835}, - {125212, 17977091}, {125213, 17977347}, {125214, 17977603}, {125215, 17977859}, - {125216, 17978115}, {125217, 17978371}, {125218, 1}, {125260, 2}, - {125264, 1}, {125274, 2}, {125278, 1}, {125280, 2}, - {126065, 1}, {126133, 2}, {126209, 1}, {126270, 2}, - {126464, 16910595}, {126465, 17696003}, {126466, 17694211}, {126467, 17846787}, - {126468, 2}, {126469, 16911107}, {126470, 17743875}, {126471, 17694723}, - {126472, 17712387}, {126473, 16912131}, {126474, 17721091}, {126475, 17723395}, - {126476, 17695235}, {126477, 17730307}, {126478, 17707267}, {126479, 17713923}, - {126480, 17715971}, {126481, 17709315}, {126482, 17719043}, {126483, 17737475}, - {126484, 17757443}, {126485, 17699075}, {126486, 17702147}, {126487, 17697283}, - {126488, 17736963}, {126489, 17710339}, {126490, 17713411}, {126491, 17714947}, - {126492, 17978627}, {126493, 17685763}, {126494, 17978883}, {126495, 17979139}, - {126496, 2}, {126497, 17696003}, {126498, 17694211}, {126499, 2}, - {126500, 17733379}, {126501, 2}, {126503, 17694723}, {126504, 2}, - {126505, 16912131}, {126506, 17721091}, {126507, 17723395}, {126508, 17695235}, - {126509, 17730307}, {126510, 17707267}, {126511, 17713923}, {126512, 17715971}, - {126513, 17709315}, {126514, 17719043}, {126515, 2}, {126516, 17757443}, - {126517, 17699075}, {126518, 17702147}, {126519, 17697283}, {126520, 2}, - {126521, 17710339}, {126522, 2}, {126523, 17714947}, {126524, 2}, - {126530, 17694211}, {126531, 2}, {126535, 17694723}, {126536, 2}, - {126537, 16912131}, {126538, 2}, {126539, 17723395}, {126540, 2}, - {126541, 17730307}, {126542, 17707267}, {126543, 17713923}, {126544, 2}, - {126545, 17709315}, {126546, 17719043}, {126547, 2}, {126548, 17757443}, - {126549, 2}, {126551, 17697283}, {126552, 2}, {126553, 17710339}, - {126554, 2}, {126555, 17714947}, {126556, 2}, {126557, 17685763}, - {126558, 2}, {126559, 17979139}, {126560, 2}, {126561, 17696003}, - {126562, 17694211}, {126563, 2}, {126564, 17733379}, {126565, 2}, - {126567, 17694723}, {126568, 17712387}, {126569, 16912131}, {126570, 17721091}, - {126571, 2}, {126572, 17695235}, {126573, 17730307}, {126574, 17707267}, - {126575, 17713923}, {126576, 17715971}, {126577, 17709315}, {126578, 17719043}, - {126579, 2}, {126580, 17757443}, {126581, 17699075}, {126582, 17702147}, - {126583, 17697283}, {126584, 2}, {126585, 17710339}, {126586, 17713411}, - {126587, 17714947}, {126588, 17978627}, {126589, 2}, {126590, 17978883}, - {126591, 2}, {126592, 16910595}, {126593, 17696003}, {126594, 17694211}, - {126595, 17846787}, {126596, 17733379}, {126597, 16911107}, {126598, 17743875}, - {126599, 17694723}, {126600, 17712387}, {126601, 16912131}, {126602, 2}, - {126603, 17723395}, {126604, 17695235}, {126605, 17730307}, {126606, 17707267}, - {126607, 17713923}, {126608, 17715971}, {126609, 17709315}, {126610, 17719043}, - {126611, 17737475}, {126612, 17757443}, {126613, 17699075}, {126614, 17702147}, - {126615, 17697283}, {126616, 17736963}, {126617, 17710339}, {126618, 17713411}, - {126619, 17714947}, {126620, 2}, {126625, 17696003}, {126626, 17694211}, - {126627, 17846787}, {126628, 2}, {126629, 16911107}, {126630, 17743875}, - {126631, 17694723}, {126632, 17712387}, {126633, 16912131}, {126634, 2}, - {126635, 17723395}, {126636, 17695235}, {126637, 17730307}, {126638, 17707267}, - {126639, 17713923}, {126640, 17715971}, {126641, 17709315}, {126642, 17719043}, - {126643, 17737475}, {126644, 17757443}, {126645, 17699075}, {126646, 17702147}, - {126647, 17697283}, {126648, 17736963}, {126649, 17710339}, {126650, 17713411}, - {126651, 17714947}, {126652, 2}, {126704, 1}, {126706, 2}, - {126976, 1}, {127020, 2}, {127024, 1}, {127124, 2}, - {127136, 1}, {127151, 2}, {127153, 1}, {127168, 2}, - {127169, 1}, {127184, 2}, {127185, 1}, {127222, 2}, - {127233, 34756611}, {127234, 34757123}, {127235, 34757635}, {127236, 34758147}, - {127237, 34758659}, {127238, 34759171}, {127239, 34759683}, {127240, 34760195}, - {127241, 34760707}, {127242, 34761219}, {127243, 1}, {127248, 50655491}, - {127249, 50656259}, {127250, 50657027}, {127251, 50657795}, {127252, 50658563}, - {127253, 50659331}, {127254, 50660099}, {127255, 50660867}, {127256, 50661635}, - {127257, 50662403}, {127258, 50663171}, {127259, 50663939}, {127260, 50664707}, - {127261, 50665475}, {127262, 50666243}, {127263, 50667011}, {127264, 50667779}, - {127265, 50668547}, {127266, 50669315}, {127267, 50670083}, {127268, 50670851}, - {127269, 50671619}, {127270, 50672387}, {127271, 50673155}, {127272, 50673923}, - {127273, 50674691}, {127274, 51538947}, {127275, 16777731}, {127276, 16781571}, - {127277, 33554947}, {127278, 34762499}, {127279, 1}, {127280, 16777219}, - {127281, 16777475}, {127282, 16777731}, {127283, 16777987}, {127284, 16778243}, - {127285, 16778499}, {127286, 16778755}, {127287, 16779011}, {127288, 16779267}, - {127289, 16779523}, {127290, 16779779}, {127291, 16780035}, {127292, 16780291}, - {127293, 16780547}, {127294, 16780803}, {127295, 16781059}, {127296, 16781315}, - {127297, 16781571}, {127298, 16781827}, {127299, 16782083}, {127300, 16782339}, - {127301, 16782595}, {127302, 16782851}, {127303, 16783107}, {127304, 16783363}, - {127305, 16783619}, {127306, 34763011}, {127307, 34237187}, {127308, 34763523}, - {127309, 34764035}, {127310, 51541763}, {127311, 34765315}, {127312, 1}, - {127338, 34220035}, {127339, 34200067}, {127340, 34765827}, {127341, 1}, - {127376, 34766339}, {127377, 1}, {127406, 2}, {127462, 1}, - {127488, 34766851}, {127489, 34767363}, {127490, 17318403}, {127491, 2}, - {127504, 17168387}, {127505, 17990659}, {127506, 17990915}, {127507, 17362179}, - {127508, 17153795}, {127509, 17991171}, {127510, 17991427}, {127511, 17235971}, - {127512, 17991683}, {127513, 17991939}, {127514, 17992195}, {127515, 17596931}, - {127516, 17992451}, {127517, 17992707}, {127518, 17992963}, {127519, 17993219}, - {127520, 17993475}, {127521, 17993731}, {127522, 17177603}, {127523, 17993987}, - {127524, 17994243}, {127525, 17994499}, {127526, 17994755}, {127527, 17995011}, - {127528, 17995267}, {127529, 17152259}, {127530, 17233923}, {127531, 17995523}, - {127532, 17299203}, {127533, 17234691}, {127534, 17299459}, {127535, 17995779}, - {127536, 17191939}, {127537, 17996035}, {127538, 17996291}, {127539, 17996547}, - {127540, 17996803}, {127541, 17997059}, {127542, 17274883}, {127543, 17170947}, - {127544, 17997315}, {127545, 17997571}, {127546, 17997827}, {127547, 17998083}, - {127548, 2}, {127552, 51552771}, {127553, 51553539}, {127554, 51554307}, - {127555, 51555075}, {127556, 51555843}, {127557, 51556611}, {127558, 51557379}, - {127559, 51558147}, {127560, 51558915}, {127561, 2}, {127568, 18005251}, - {127569, 18005507}, {127570, 2}, {127584, 1}, {127590, 2}, - {127744, 1}, {128729, 2}, {128732, 1}, {128749, 2}, - {128752, 1}, {128765, 2}, {128768, 1}, {128986, 2}, - {128992, 1}, {129004, 2}, {129008, 1}, {129009, 2}, - {129024, 1}, {129036, 2}, {129040, 1}, {129096, 2}, - {129104, 1}, {129114, 2}, {129120, 1}, {129160, 2}, - {129168, 1}, {129198, 2}, {129200, 1}, {129212, 2}, - {129216, 1}, {129218, 2}, {129232, 1}, {129241, 2}, - {129280, 1}, {129624, 2}, {129632, 1}, {129646, 2}, - {129648, 1}, {129661, 2}, {129664, 1}, {129675, 2}, - {129678, 1}, {129735, 2}, {129736, 1}, {129737, 2}, - {129741, 1}, {129757, 2}, {129759, 1}, {129771, 2}, - {129775, 1}, {129785, 2}, {129792, 1}, {129939, 2}, - {129940, 1}, {130032, 17045507}, {130033, 16786947}, {130034, 16785155}, - {130035, 16785411}, {130036, 16787715}, {130037, 17045763}, {130038, 17046019}, - {130039, 17046275}, {130040, 17046531}, {130041, 17046787}, {130042, 1}, - {130043, 2}, {131072, 1}, {173792, 2}, {173824, 1}, - {178206, 2}, {178208, 1}, {183982, 2}, {183984, 1}, - {191457, 2}, {191472, 1}, {192094, 2}, {194560, 18005763}, - {194561, 18006019}, {194562, 18006275}, {194563, 18006531}, {194564, 18006787}, - {194565, 17620739}, {194566, 18007043}, {194567, 18007299}, {194568, 18007555}, - {194569, 18007811}, {194570, 17620995}, {194571, 18008067}, {194572, 18008323}, - {194573, 18008579}, {194574, 17621251}, {194575, 18008835}, {194576, 18009091}, - {194577, 18009347}, {194578, 18009603}, {194579, 18009859}, {194580, 18010115}, - {194581, 17992963}, {194582, 18010371}, {194583, 18010627}, {194584, 18010883}, - {194585, 18011139}, {194586, 18011395}, {194587, 17635331}, {194588, 18011651}, - {194589, 17156355}, {194590, 18011907}, {194591, 18012163}, {194592, 18012419}, - {194593, 18012675}, {194594, 17997571}, {194595, 18012931}, {194596, 18013187}, - {194597, 17636611}, {194598, 17621507}, {194599, 17621763}, {194600, 17636867}, - {194601, 18013443}, {194602, 18013699}, {194603, 17575171}, {194604, 18013955}, - {194605, 17622019}, {194606, 18014211}, {194607, 18014467}, {194608, 18014723}, - {194609, 18014979}, {194612, 18015235}, {194613, 18015491}, {194614, 18015747}, - {194615, 18016003}, {194616, 18016259}, {194617, 18016515}, {194618, 18016771}, - {194619, 18017027}, {194620, 18017283}, {194621, 18017539}, {194622, 18017795}, - {194623, 18018051}, {194624, 18018307}, {194625, 18018563}, {194626, 18018819}, - {194627, 18019075}, {194628, 18019331}, {194629, 18019587}, {194631, 17637379}, - {194632, 18019843}, {194633, 18020099}, {194634, 18020355}, {194635, 18020611}, - {194636, 17622531}, {194637, 18020867}, {194638, 18021123}, {194639, 18021379}, - {194640, 17612291}, {194641, 18021635}, {194642, 18021891}, {194643, 18022147}, - {194644, 18022403}, {194645, 18022659}, {194646, 18022915}, {194647, 18023171}, - {194648, 18023427}, {194649, 18023683}, {194650, 18023939}, {194651, 18024195}, - {194652, 18024451}, {194653, 17991171}, {194654, 18024707}, {194655, 18024963}, - {194656, 18025219}, {194657, 18025475}, {194658, 18025731}, {194659, 18025987}, - {194660, 18026243}, {194661, 18026499}, {194662, 18026755}, {194663, 18027011}, - {194664, 18027267}, {194665, 18027523}, {194666, 18027779}, {194668, 18028035}, - {194669, 18028291}, {194670, 18028547}, {194671, 17574147}, {194672, 18028803}, - {194673, 18029059}, {194674, 18029315}, {194675, 18029571}, {194676, 18029827}, - {194677, 17163011}, {194678, 18030083}, {194679, 18030339}, {194680, 17163523}, - {194681, 18030595}, {194682, 18030851}, {194683, 18031107}, {194684, 18031363}, - {194685, 18031619}, {194686, 18031875}, {194687, 18032131}, {194688, 18032387}, - {194689, 18032643}, {194690, 18032899}, {194691, 18033155}, {194692, 18033411}, - {194693, 18033667}, {194694, 18033923}, {194695, 18034179}, {194696, 18034435}, - {194697, 18034691}, {194698, 18034947}, {194699, 18035203}, {194700, 18035459}, - {194701, 18035715}, {194702, 17560835}, {194703, 18035971}, {194704, 17166083}, - {194705, 18036227}, {194707, 18036483}, {194708, 18036739}, {194710, 18036995}, - {194711, 18037251}, {194712, 18037507}, {194713, 18037763}, {194714, 18038019}, - {194715, 18038275}, {194716, 18038531}, {194717, 18038787}, {194718, 18039043}, - {194719, 18039299}, {194720, 18039555}, {194721, 18039811}, {194722, 18040067}, - {194723, 17623811}, {194724, 18040323}, {194725, 18040579}, {194726, 18040835}, - {194727, 18041091}, {194728, 17640451}, {194729, 18041091}, {194730, 18041347}, - {194731, 17624323}, {194732, 18041603}, {194733, 18041859}, {194734, 18042115}, - {194735, 18042371}, {194736, 17624579}, {194737, 17553923}, {194738, 17425411}, - {194739, 18042627}, {194740, 18042883}, {194741, 18043139}, {194742, 18043395}, - {194743, 18043651}, {194744, 18043907}, {194745, 18044163}, {194746, 18044419}, - {194747, 18044675}, {194748, 18044931}, {194749, 18045187}, {194750, 18045443}, - {194751, 18045699}, {194752, 18045955}, {194753, 18046211}, {194754, 18046467}, - {194755, 18046723}, {194756, 18046979}, {194757, 18047235}, {194758, 18047491}, - {194759, 18047747}, {194760, 17624835}, {194761, 18048003}, {194762, 18048259}, - {194763, 18048515}, {194764, 18048771}, {194765, 18049027}, {194766, 18049283}, - {194767, 17625347}, {194768, 18049539}, {194769, 18049795}, {194770, 18050051}, - {194771, 18050307}, {194772, 18050563}, {194773, 18050819}, {194774, 18051075}, - {194775, 18051331}, {194776, 17561091}, {194777, 17642499}, {194778, 18051587}, - {194779, 18051843}, {194780, 18052099}, {194781, 18052355}, {194782, 18052611}, - {194783, 18052867}, {194784, 18053123}, {194785, 18053379}, {194786, 17625603}, - {194787, 18053635}, {194788, 18053891}, {194789, 18054147}, {194790, 18054403}, - {194791, 17653251}, {194792, 18054659}, {194793, 18054915}, {194794, 18055171}, - {194795, 18055427}, {194796, 18055683}, {194797, 18055939}, {194798, 18056195}, - {194799, 18056451}, {194800, 18056707}, {194801, 18056963}, {194802, 18057219}, - {194803, 18057475}, {194804, 18057731}, {194805, 17578499}, {194806, 18057987}, - {194807, 18058243}, {194808, 18058499}, {194809, 18058755}, {194810, 18059011}, - {194811, 18059267}, {194812, 18059523}, {194813, 18059779}, {194814, 18060035}, - {194815, 18060291}, {194816, 18060547}, {194817, 17625859}, {194818, 17599491}, - {194819, 18060803}, {194820, 18061059}, {194821, 18061315}, {194822, 18061571}, - {194823, 18061827}, {194824, 18062083}, {194825, 18062339}, {194826, 18062595}, - {194827, 17643267}, {194828, 18062851}, {194829, 18063107}, {194830, 18063363}, - {194831, 18063619}, {194832, 18063875}, {194833, 18064131}, {194834, 18064387}, - {194835, 18064643}, {194836, 17643523}, {194837, 18064899}, {194838, 18065155}, - {194839, 18065411}, {194840, 18065667}, {194841, 18065923}, {194842, 18066179}, - {194843, 18066435}, {194844, 18066691}, {194845, 18066947}, {194846, 18067203}, - {194847, 18067459}, {194848, 18067715}, {194849, 17644035}, {194850, 18067971}, - {194851, 18068227}, {194852, 18068483}, {194853, 18068739}, {194854, 18068995}, - {194855, 18069251}, {194856, 18069507}, {194857, 18069763}, {194858, 18070019}, - {194859, 18070275}, {194860, 18070531}, {194862, 18070787}, {194863, 18071043}, - {194864, 17644547}, {194865, 18071299}, {194866, 18071555}, {194867, 18071811}, - {194868, 18072067}, {194869, 18072323}, {194870, 18072579}, {194871, 18072835}, - {194872, 17574915}, {194873, 18073091}, {194874, 18073347}, {194875, 18073603}, - {194876, 18073859}, {194877, 18074115}, {194878, 18074371}, {194879, 18074627}, - {194880, 17646083}, {194881, 18074883}, {194882, 18075139}, {194883, 18075395}, - {194884, 18075651}, {194885, 18075907}, {194886, 18076163}, {194888, 17646339}, - {194889, 17653763}, {194890, 18076419}, {194891, 18076675}, {194892, 18076931}, - {194893, 18077187}, {194894, 18077443}, {194895, 17565443}, {194896, 17646851}, - {194897, 18077699}, {194898, 18077955}, {194899, 17628419}, {194900, 18078211}, - {194901, 18078467}, {194902, 17617411}, {194903, 18078723}, {194904, 18078979}, - {194905, 17629187}, {194906, 18079235}, {194907, 18079491}, {194908, 18079747}, - {194909, 18080003}, {194911, 18080259}, {194912, 18080515}, {194913, 18080771}, - {194914, 18081027}, {194915, 18081283}, {194916, 18081539}, {194917, 18081795}, - {194918, 18082051}, {194919, 18082307}, {194920, 18082563}, {194921, 18082819}, - {194922, 18083075}, {194923, 18083331}, {194924, 18083587}, {194925, 18083843}, - {194926, 18084099}, {194927, 18084355}, {194928, 18084611}, {194929, 18084867}, - {194930, 18085123}, {194931, 18085379}, {194932, 18085635}, {194933, 18085891}, - {194934, 18086147}, {194935, 18086403}, {194936, 18086659}, {194937, 18086915}, - {194938, 17630723}, {194939, 18087171}, {194940, 18087427}, {194941, 18087683}, - {194942, 18087939}, {194943, 18088195}, {194944, 18088451}, {194945, 18088707}, - {194946, 18088963}, {194947, 18089219}, {194948, 18089475}, {194949, 18089731}, - {194950, 18089987}, {194951, 18090243}, {194952, 18090499}, {194953, 18090755}, - {194954, 18091011}, {194955, 18036483}, {194956, 18091267}, {194957, 18091523}, - {194958, 18091779}, {194959, 18092035}, {194960, 18092291}, {194961, 18092547}, - {194962, 18092803}, {194963, 18093059}, {194964, 18093315}, {194965, 18093571}, - {194966, 18093827}, {194967, 18094083}, {194968, 17579267}, {194969, 18094339}, - {194970, 18094595}, {194971, 18094851}, {194972, 18095107}, {194973, 18095363}, - {194974, 18095619}, {194975, 17631491}, {194976, 18095875}, {194977, 18096131}, - {194978, 18096387}, {194979, 18096643}, {194980, 18096899}, {194981, 18097155}, - {194982, 18097411}, {194983, 18097667}, {194984, 18097923}, {194985, 18098179}, - {194986, 18098435}, {194987, 18098691}, {194988, 18098947}, {194989, 18099203}, - {194990, 18099459}, {194991, 18099715}, {194992, 18099971}, {194993, 18100227}, - {194994, 18100483}, {194995, 18100739}, {194996, 17564163}, {194997, 18100995}, - {194998, 18101251}, {194999, 18101507}, {195000, 18101763}, {195001, 18102019}, - {195002, 18102275}, {195003, 17648643}, {195004, 18102531}, {195005, 18102787}, - {195006, 18103043}, {195007, 18103299}, {195008, 18103555}, {195009, 18103811}, - {195010, 18104067}, {195011, 18104323}, {195012, 17189123}, {195013, 18104579}, - {195014, 18104835}, {195015, 18105091}, {195016, 18105347}, {195017, 18105603}, - {195018, 18105859}, {195019, 18106115}, {195020, 18106371}, {195021, 18106627}, - {195022, 18106883}, {195023, 18107139}, {195024, 17649923}, {195025, 17650179}, - {195026, 17190915}, {195027, 18107395}, {195028, 18107651}, {195029, 18107907}, - {195030, 18108163}, {195031, 18108419}, {195032, 18108675}, {195033, 18108931}, - {195034, 18109187}, {195035, 18109443}, {195036, 18109699}, {195037, 18109955}, - {195038, 18110211}, {195039, 17650435}, {195040, 18110467}, {195041, 18110723}, - {195042, 18110979}, {195043, 18111235}, {195044, 18111491}, {195045, 18111747}, - {195046, 18112003}, {195047, 18112259}, {195048, 18112515}, {195049, 18112771}, - {195050, 18113027}, {195051, 18113283}, {195052, 18113539}, {195053, 18113795}, - {195054, 18114051}, {195055, 18114307}, {195056, 18114563}, {195057, 18114819}, - {195058, 18115075}, {195059, 18115331}, {195060, 18115587}, {195061, 18115843}, - {195062, 18116099}, {195063, 18116355}, {195064, 18116611}, {195065, 18116867}, - {195066, 18117123}, {195067, 18117379}, {195068, 18117635}, {195069, 18117891}, - {195070, 17651971}, {195072, 18118147}, {195073, 18118403}, {195074, 18118659}, - {195075, 18118915}, {195076, 18119171}, {195077, 18119427}, {195078, 18119683}, - {195079, 18119939}, {195080, 18120195}, {195081, 18120451}, {195082, 17652227}, - {195083, 18120707}, {195084, 18120963}, {195085, 18121219}, {195086, 18121475}, - {195087, 18121731}, {195088, 18121987}, {195089, 18122243}, {195090, 18122499}, - {195091, 18122755}, {195092, 18123011}, {195093, 17203203}, {195094, 18123267}, - {195095, 17204227}, {195096, 18123523}, {195097, 18123779}, {195098, 18124035}, - {195099, 18124291}, {195100, 17205507}, {195101, 18124547}, {195102, 2}, - {196608, 1}, {201547, 2}, {201552, 1}, {210042, 2}, - {917760, 0}, {918000, 2} -}; +// Sentinel values stored in stage2 / returned by lookup. +constexpr uint16_t IDNA_VALID = 0xFFFF; // code point is valid as-is +constexpr uint16_t IDNA_DISALLOWED = 0xFFFE; // code point is disallowed +constexpr uint16_t IDNA_IGNORED = 0x0000; // ignored (index into empty UTF-8 entry) + +// Bit 15 of a stage1 entry: set = boolean block, clear = mixed block. +constexpr uint16_t IDNA_BOOL_FLAG = 0x8000; + +// Two-level table covers code points [0, IDNA_LOW_RANGE_END). +// Derived from the highest non-disallowed code point below the high-ignored range, +// rounded up to the next 64-code-point block boundary. +constexpr uint32_t IDNA_LOW_RANGE_END = 0x00033480; + +// Variation selectors supplement: U+E0100..U+E01EF are all ignored. +// These are handled with a simple range check; everything else above +// IDNA_LOW_RANGE_END is disallowed. +constexpr uint32_t IDNA_HIGH_IGNORED_START = 0x000E0100; +constexpr uint32_t IDNA_HIGH_IGNORED_END = 0x000E01F0; // exclusive +// idna_stage1[cp >> 6]: one entry per 64-code-point block. +// Bit 15 set -> lower 15 bits = index into idna_bool_blocks[]. +// Bit 15 clear -> value = base offset into idna_stage2[] for this block. -} // namespace ada::idna -#endif // ADA_IDNA_TABLES_H +} // namespace ada::idna +#endif // ADA_IDNA_MAPPING_TABLE_H /* end file src/mapping_tables.cpp */ namespace ada::idna { -// This can be greatly accelerated. For now we just use a simply -// binary search. In practice, you should *not* do that. -uint32_t find_range_index(uint32_t key) { - //////////////// - // This could be implemented with std::lower_bound, but we roll our own - // because we want to allow further optimizations in the future. - //////////////// - uint32_t len = std::size(table); - uint32_t low = 0; - uint32_t high = len - 1; - while (low <= high) { - uint32_t middle_index = (low + high) >> 1; // cannot overflow - uint32_t middle_value = table[middle_index][0]; - if (middle_value < key) { - low = middle_index + 1; - } else if (middle_value > key) { - high = middle_index - 1; +// --- O(1) two-level table lookup --------------------------------------------- +// +// Returns one of: +// IDNA_VALID - keep code point in output unchanged +// IDNA_DISALLOWED - code point is not allowed (map() returns error) +// IDNA_IGNORED - code point is ignored (index 0 = empty UTF-8 entry) +// other - byte offset into idna_utf8_mappings[] (null-terminated) +// +// Assumes ensure_tables() has already been called by the public entry point. +static uint16_t idna_lookup(uint32_t cp) noexcept { + if (cp < IDNA_LOW_RANGE_END) { + uint16_t ref = idna_stage1[cp >> IDNA_BLOCK_BITS]; + if (ref & IDNA_BOOL_FLAG) { + uint32_t bit_idx = + static_cast(ref & ~IDNA_BOOL_FLAG) * IDNA_BLOCK_SIZE + + (cp & IDNA_BLOCK_MASK); + bool is_valid = (idna_bool_blocks[bit_idx >> 6] >> (bit_idx & 63u)) & 1u; + return is_valid ? IDNA_VALID : IDNA_DISALLOWED; + } + return idna_stage2[ref + (cp & IDNA_BLOCK_MASK)]; + } + + if (cp >= IDNA_HIGH_IGNORED_START && cp < IDNA_HIGH_IGNORED_END) { + return IDNA_IGNORED; + } + + return IDNA_DISALLOWED; +} + +// Advances *ptr past one well-formed UTF-8 code point from the mapping table. +static char32_t utf8_next(const uint8_t*& ptr) noexcept { + uint8_t b0 = *ptr++; + if (b0 < 0x80u) return static_cast(b0); + if (b0 < 0xE0u) { + uint32_t cp = (b0 & 0x1Fu) << 6; + cp |= (*ptr++ & 0x3Fu); + return static_cast(cp); + } + if (b0 < 0xF0u) { + uint32_t cp = (b0 & 0x0Fu) << 12; + cp |= ((*ptr++ & 0x3Fu) << 6); + cp |= (*ptr++ & 0x3Fu); + return static_cast(cp); + } + uint32_t cp = (b0 & 0x07u) << 18; + cp |= ((*ptr++ & 0x3Fu) << 12); + cp |= ((*ptr++ & 0x3Fu) << 6); + cp |= (*ptr++ & 0x3Fu); + return static_cast(cp); +} + +// Count UTF-8 code points in a null-terminated mapping string (trusted table). +static size_t utf8_count_codepoints(const uint8_t* ptr) noexcept { + size_t n = 0; + while (*ptr != 0) { + ++n; + if (*ptr < 0x80u) { + ++ptr; + } else if (*ptr < 0xE0u) { + ptr += 2; + } else if (*ptr < 0xF0u) { + ptr += 3; } else { - return middle_index; // perfect match + ptr += 4; } } - return low == 0 ? 0 : low - 1; + return n; } +// --- ASCII fast path --------------------------------------------------------- void ascii_map(char* input, size_t length) { auto broadcast = [](uint8_t v) -> uint64_t { return 0x101010101010101ull * v; @@ -2824,4966 +5141,115 @@ void ascii_map(char* input, size_t length) { for (; i + 7 < length; i += 8) { uint64_t word{}; - memcpy(&word, input + i, sizeof(word)); + std::memcpy(&word, input + i, sizeof(word)); word ^= (((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80) >> 2; - memcpy(input + i, &word, sizeof(word)); + std::memcpy(input + i, &word, sizeof(word)); } if (i < length) { uint64_t word{}; - memcpy(&word, input + i, length - i); + std::memcpy(&word, input + i, length - i); word ^= (((word + broadcast_Ap) ^ (word + broadcast_Zp)) & broadcast_80) >> 2; - memcpy(input + i, &word, length - i); + std::memcpy(input + i, &word, length - i); } } -// Map the characters according to IDNA, returning the empty string on error. -std::u32string map(std::u32string_view input) { +// Two-pass map: first validate + exact size, then write once (no growth +// realloc). +bool map(std::u32string_view input, std::u32string& out) { // [Map](https://www.unicode.org/reports/tr46/#ProcessingStepMap). - // For each code point in the domain_name string, look up the status - // value in Section 5, [IDNA Mapping - // Table](https://www.unicode.org/reports/tr46/#IDNA_Mapping_Table), - // and take the following actions: - // * disallowed: Leave the code point unchanged in the string, and - // record that there was an error. - // * ignored: Remove the code point from the string. This is - // equivalent to mapping the code point to an empty string. - // * mapped: Replace the code point in the string by the value for - // the mapping in Section 5, [IDNA Mapping - // Table](https://www.unicode.org/reports/tr46/#IDNA_Mapping_Table). - // * valid: Leave the code point unchanged in the string. - static std::u32string error = U""; - std::u32string answer; - answer.reserve(input.size()); + out.clear(); + if (!ensure_tables()) { + return false; + } + + // Pass 1: validate and compute exact output length. + size_t out_size = 0; for (char32_t x : input) { - size_t index = find_range_index(x); - uint32_t descriptor = table[index][1]; - uint8_t code = uint8_t(descriptor); - switch (code) { - case 0: - break; // nothing to do, ignored - case 1: - answer.push_back(x); // valid, we just copy it to output - break; - case 2: - return error; // disallowed - // case 3 : - default: - // We have a mapping - { - size_t char_count = (descriptor >> 24); - uint16_t char_index = uint16_t(descriptor >> 8); - for (size_t idx = char_index; idx < char_index + char_count; idx++) { - answer.push_back(mappings[idx]); - } - } + uint16_t status = idna_lookup(static_cast(x)); + if (status == IDNA_DISALLOWED) { + return false; + } + if (status == IDNA_VALID) { + ++out_size; + continue; } + if (static_cast(status) >= idna_utf8_mappings_size) { + return false; + } + out_size += utf8_count_codepoints(idna_utf8_mappings + status); + } + + // Pass 2: write into a single allocation. + out.resize(out_size); + size_t w = 0; + for (char32_t x : input) { + uint16_t status = idna_lookup(static_cast(x)); + if (status == IDNA_VALID) { + out[w++] = x; + continue; + } + // IGNORED or mapped (status already validated in pass 1). + const uint8_t* ptr = idna_utf8_mappings + status; + while (*ptr != 0) { + out[w++] = utf8_next(ptr); + } + } + return true; +} + +std::u32string map(std::u32string_view input) { + std::u32string answer; + if (!map(input, answer)) { + return {}; } return answer; } + } // namespace ada::idna /* end file src/mapping.cpp */ /* begin file src/normalization.cpp */ -/* begin file src/normalization_tables.cpp */ -// IDNA 17.0.0 +/* begin file include/ada/idna/normalization.h */ +#ifndef ADA_IDNA_NORMALIZATION_H +#define ADA_IDNA_NORMALIZATION_H +#include +#include + +namespace ada::idna { + +// Returns true if `input` is already in Unicode Normalization Form C. +// Requires that internal tables have been loaded (call ensure via normalize +// or map first, or this returns false if tables are unavailable). +[[nodiscard]] bool is_already_nfc(std::u32string_view input) noexcept; + +// Normalize the characters according to IDNA (Unicode Normalization Form C). +// Returns false if the internal Unicode tables could not be loaded; in that +// case `input` is left unchanged. Skips work when the string is already NFC. +[[nodiscard]] bool normalize(std::u32string& input); + +} // namespace ada::idna +#endif +/* end file include/ada/idna/normalization.h */ +/* begin file src/normalization_tables.cpp */ +// Normalization table helpers. +// Array payloads live in the DEFLATE blob (table_store.hpp). // clang-format off #ifndef ADA_IDNA_NORMALIZATION_TABLES_H #define ADA_IDNA_NORMALIZATION_TABLES_H -#include - -/** - * Unicode Standard Annex #15 - * - * UNICODE NORMALIZATION FORMS - * https://www.unicode.org/reports/tr15/ - * - * See https://github.com/uni-algo/uni-algo/blob/c612968c5ed3ace39bde4c894c24286c5f2c7fe2/include/uni_algo/impl/data/data_norm.h for reference. - */ namespace ada::idna { -const uint8_t decomposition_index[4352] = { - 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 16, 7, 17, 18, 19, 20, 21, 22, 23, 24, 7, - 7, 7, 7, 7, 25, 7, 26, 27, 28, 29, 30, 31, 32, 33, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 34, 35, 7, 7, 7, - 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 37, 38, 39, 40, 41, 42, 43, 7, 7, 7, 7, 7, 7, 7, 44, 7, 7, - 7, 7, 7, 7, 7, 7, 45, 46, 7, 47, 48, 49, 7, 7, 7, 50, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 51, 7, 52, 53, 54, 55, 56, 7, 7, 7, - 7, 7, 7, 7, 7, 57, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 58, - 59, 7, 60, 61, 62, 7, 7, 7, 7, 7, 7, 7, 7, 63, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 64, 65, 66, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7}; - -const uint16_t decomposition_block[67][257] = { - {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 8, 8, 8, 8, - 8, 8, 8, 9, 16, 17, 20, 20, 20, 20, 21, 28, 28, 29, 33, - 37, 45, 48, 48, 49, 57, 61, 64, 65, 77, 89, 100, 100, 108, 116, - 124, 132, 140, 148, 148, 156, 164, 172, 180, 188, 196, 204, 212, 220, 220, - 228, 236, 244, 252, 260, 268, 268, 268, 276, 284, 292, 300, 308, 308, 308, - 316, 324, 332, 340, 348, 356, 356, 364, 372, 380, 388, 396, 404, 412, 420, - 428, 428, 436, 444, 452, 460, 468, 476, 476, 476, 484, 492, 500, 508, 516, - 516, 524}, - {524, 532, 540, 548, 556, 564, 572, 580, 588, 596, 604, 612, - 620, 628, 636, 644, 652, 652, 652, 660, 668, 676, 684, 692, - 700, 708, 716, 724, 732, 740, 748, 756, 764, 772, 780, 788, - 796, 804, 812, 812, 812, 820, 828, 836, 844, 852, 860, 868, - 876, 884, 885, 893, 900, 908, 916, 924, 932, 932, 940, 948, - 956, 964, 972, 981, 989, 996, 996, 996, 1004, 1012, 1020, 1028, - 1036, 1045, 1052, 1052, 1052, 1060, 1068, 1076, 1084, 1092, 1100, 1100, - 1100, 1108, 1116, 1124, 1132, 1140, 1148, 1156, 1164, 1172, 1180, 1188, - 1196, 1204, 1212, 1220, 1228, 1236, 1244, 1244, 1244, 1252, 1260, 1268, - 1276, 1284, 1292, 1300, 1308, 1316, 1324, 1332, 1340, 1348, 1356, 1364, - 1372, 1380, 1388, 1396, 1404, 1412, 1420, 1429, 1432, 1432, 1432, 1432, - 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, - 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, 1432, - 1432, 1432, 1432, 1432, 1432, 1440, 1448, 1448, 1448, 1448, 1448, 1448, - 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1448, 1456, 1464, 1464, 1464, - 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, 1464, - 1464, 1464, 1464, 1464, 1465, 1477, 1489, 1501, 1509, 1517, 1525, 1533, - 1541, 1548, 1556, 1564, 1572, 1580, 1588, 1596, 1604, 1612, 1624, 1636, - 1648, 1660, 1672, 1684, 1696, 1708, 1708, 1720, 1732, 1744, 1756, 1764, - 1772, 1772, 1772, 1780, 1788, 1796, 1804, 1812, 1820, 1832, 1844, 1852, - 1860, 1869, 1877, 1885, 1892, 1900, 1908, 1908, 1908, 1916, 1924, 1936, - 1948, 1956, 1964, 1972, 1980}, - {1980, 1988, 1996, 2004, 2012, 2020, 2028, 2036, 2044, 2052, 2060, 2068, - 2076, 2084, 2092, 2100, 2108, 2116, 2124, 2132, 2140, 2148, 2156, 2164, - 2172, 2180, 2188, 2196, 2204, 2204, 2204, 2212, 2220, 2220, 2220, 2220, - 2220, 2220, 2220, 2228, 2236, 2244, 2252, 2264, 2276, 2288, 2300, 2308, - 2316, 2328, 2340, 2348, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, - 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2356, 2357, 2361, 2365, 2369, - 2373, 2377, 2381, 2385, 2389, 2392, 2392, 2392, 2392, 2392, 2392, 2392, - 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, - 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, 2392, - 2393, 2401, 2409, 2417, 2425, 2433, 2440, 2440, 2441, 2445, 2449, 2453, - 2457, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460}, - {2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, 2460, - 2460, 2460, 2460, 2460, 2460, 2464, 2468, 2468, 2472, 2480, 2480, 2480, - 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, - 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, - 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, - 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2480, 2484, 2484, 2484, - 2484, 2484, 2485, 2492, 2492, 2492, 2492, 2496, 2496, 2496, 2496, 2496, - 2497, 2506, 2512, 2520, 2524, 2532, 2540, 2548, 2548, 2556, 2556, 2564, - 2572, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, - 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 2584, - 2584, 2584, 2584, 2592, 2600, 2608, 2616, 2624, 2632, 2644, 2644, 2644, - 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, - 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2644, 2652, - 2660, 2668, 2676, 2684, 2685, 2689, 2693, 2698, 2706, 2713, 2717, 2720, - 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, - 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, 2720, - 2721, 2725, 2729, 2732, 2733, 2737, 2740, 2740, 2740, 2741, 2744, 2744, - 2744, 2744, 2744, 2744, 2744}, - {2744, 2752, 2760, 2760, 2768, 2768, 2768, 2768, 2776, 2776, 2776, 2776, - 2776, 2784, 2792, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, 2800, - 2800, 2800, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, - 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, - 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2808, 2816, 2816, - 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, - 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2816, 2824, 2832, 2832, - 2840, 2840, 2840, 2840, 2848, 2848, 2848, 2848, 2848, 2856, 2864, 2872, - 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, - 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2872, 2880, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, 2888, - 2888, 2888, 2896, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, 2904, - 2904, 2904, 2904, 2904, 2904, 2912, 2920, 2928, 2936, 2936, 2936, 2944, - 2952, 2952, 2952, 2960, 2968, 2976, 2984, 2992, 3000, 3000, 3000, 3008, - 3016, 3024, 3032, 3040, 3048, 3048, 3048, 3056, 3064, 3072, 3080, 3088, - 3096, 3104, 3112, 3120, 3128, 3136, 3144, 3144, 3144, 3152, 3160, 3160, - 3160, 3160, 3160, 3160, 3160}, - {3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, 3160, - 3160, 3160, 3160, 3161, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168}, - {3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, - 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3168, 3176, - 3184, 3192, 3200, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, - 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3208, 3209, 3217, 3225, - 3233, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, 3240, - 3240, 3248, 3248, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, - 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3256, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, 3264, - 3264, 3264, 3264, 3264, 3264, 3264, 3272, 3272, 3272, 3272, 3272, 3272, - 3272, 3272, 3280, 3280, 3280, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, 3288, - 3288, 3288, 3288, 3288, 3288, 3296, 3304, 3312, 3320, 3328, 3336, 3344, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, - 3360, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, - 3368, 3368, 3368, 3368, 3368, 3376, 3384, 3384, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392}, - {3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3400, 3400, 3400, 3408, 3408, 3408, 3408, 3408, - 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, - 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, 3408, - 3408, 3408, 3408, 3408, 3408, 3408, 3416, 3424, 3432, 3432, 3432, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440}, - {3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3440, - 3440, 3448, 3448, 3448, 3456, 3464, 3464, 3464, 3464, 3464, 3464, 3464, - 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3464, 3472, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, 3480, - 3480, 3480, 3480, 3480, 3480, 3488, 3488, 3488, 3488, 3488, 3488, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, - 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3488, 3496, - 3504, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512}, - {3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, 3512, - 3512, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, 3520, - 3520, 3528, 3528, 3528, 3528, 3528, 3528, 3528, 3536, 3544, 3544, 3552, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564}, - {3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, 3564, - 3564, 3564, 3564, 3572, 3580, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, 3588, - 3588, 3588, 3588, 3596, 3596, 3604, 3616, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624}, - {3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, 3624, - 3624, 3624, 3624, 3625, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, - 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3632, 3633, - 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, - 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, - 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, 3640, - 3640, 3640, 3640, 3640, 3641, 3649, 3656, 3656, 3656, 3656, 3656, 3656, - 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, - 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, - 3656, 3656, 3656, 3656, 3656}, - {3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, 3656, - 3657, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, - 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3660, 3668, 3668, 3668, 3668, - 3668, 3668, 3668, 3668, 3668, 3668, 3676, 3676, 3676, 3676, 3676, 3684, - 3684, 3684, 3684, 3684, 3692, 3692, 3692, 3692, 3692, 3700, 3700, 3700, - 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3700, 3708, 3708, - 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3708, 3716, 3716, 3724, 3733, - 3744, 3753, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3764, 3772, 3772, - 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, 3772, - 3772, 3772, 3772, 3772, 3780, 3780, 3780, 3780, 3780, 3780, 3780, 3780, - 3780, 3780, 3788, 3788, 3788, 3788, 3788, 3796, 3796, 3796, 3796, 3796, - 3804, 3804, 3804, 3804, 3804, 3812, 3812, 3812, 3812, 3812, 3812, 3812, - 3812, 3812, 3812, 3812, 3812, 3812, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820}, - {3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, 3820, - 3820, 3820, 3820, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, 3828, - 3829, 3832, 3832, 3832, 3832}, - {3832, 3832, 3832, 3832, 3832, 3832, 3832, 3840, 3840, 3848, 3848, 3856, - 3856, 3864, 3864, 3872, 3872, 3872, 3872, 3880, 3880, 3880, 3880, 3880, - 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, - 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, - 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, 3880, - 3888, 3888, 3896, 3896, 3896, 3904, 3912, 3912, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920}, - {3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, - 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3921, 3925, 3929, 3932, - 3933, 3937, 3941, 3945, 3949, 3953, 3957, 3961, 3965, 3969, 3973, 3976, - 3977, 3981, 3985, 3989, 3993, 3997, 4001, 4005, 4009, 4013, 4017, 4021, - 4025, 4029, 4033, 4037, 4041, 4045, 4048, 4049, 4053, 4057, 4061, 4065, - 4069, 4073, 4077, 4081, 4085, 4089, 4093, 4097, 4101, 4105, 4109, 4113, - 4117, 4121, 4125, 4129, 4133, 4137, 4141, 4145, 4149, 4153, 4157, 4160, - 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, 4160, - 4161, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, - 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, - 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4164, 4165, - 4169, 4173, 4177, 4181, 4185, 4189, 4193, 4197, 4201, 4205, 4209, 4213, - 4217, 4221, 4225, 4229, 4233, 4237, 4241, 4245, 4249, 4253, 4257, 4261, - 4265, 4269, 4273, 4277, 4281, 4285, 4289, 4293, 4297, 4301, 4305, 4309, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, 4312, - 4312, 4312, 4312, 4312, 4312}, - {4312, 4320, 4328, 4336, 4344, 4352, 4360, 4368, 4376, 4388, 4400, 4408, - 4416, 4424, 4432, 4440, 4448, 4456, 4464, 4472, 4480, 4492, 4504, 4516, - 4528, 4536, 4544, 4552, 4560, 4572, 4584, 4592, 4600, 4608, 4616, 4624, - 4632, 4640, 4648, 4656, 4664, 4672, 4680, 4688, 4696, 4704, 4712, 4724, - 4736, 4744, 4752, 4760, 4768, 4776, 4784, 4792, 4800, 4812, 4824, 4832, - 4840, 4848, 4856, 4864, 4872, 4880, 4888, 4896, 4904, 4912, 4920, 4928, - 4936, 4944, 4952, 4960, 4968, 4980, 4992, 5004, 5016, 5028, 5040, 5052, - 5064, 5072, 5080, 5088, 5096, 5104, 5112, 5120, 5128, 5140, 5152, 5160, - 5168, 5176, 5184, 5192, 5200, 5212, 5224, 5236, 5248, 5260, 5272, 5280, - 5288, 5296, 5304, 5312, 5320, 5328, 5336, 5344, 5352, 5360, 5368, 5376, - 5384, 5396, 5408, 5420, 5432, 5440, 5448, 5456, 5464, 5472, 5480, 5488, - 5496, 5504, 5512, 5520, 5528, 5536, 5544, 5552, 5560, 5568, 5576, 5584, - 5592, 5600, 5608, 5616, 5624, 5632, 5640, 5648, 5656, 5664, 5673, 5682, - 5688, 5688, 5688, 5688, 5688, 5696, 5704, 5712, 5720, 5732, 5744, 5756, - 5768, 5780, 5792, 5804, 5816, 5828, 5840, 5852, 5864, 5876, 5888, 5900, - 5912, 5924, 5936, 5948, 5960, 5968, 5976, 5984, 5992, 6000, 6008, 6020, - 6032, 6044, 6056, 6068, 6080, 6092, 6104, 6116, 6128, 6136, 6144, 6152, - 6160, 6168, 6176, 6184, 6192, 6204, 6216, 6228, 6240, 6252, 6264, 6276, - 6288, 6300, 6312, 6324, 6336, 6348, 6360, 6372, 6384, 6396, 6408, 6420, - 6432, 6440, 6448, 6456, 6464, 6476, 6488, 6500, 6512, 6524, 6536, 6548, - 6560, 6572, 6584, 6592, 6600, 6608, 6616, 6624, 6632, 6640, 6648, 6648, - 6648, 6648, 6648, 6648, 6648}, - {6648, 6656, 6664, 6676, 6688, 6700, 6712, 6724, 6736, 6744, 6752, 6764, - 6776, 6788, 6800, 6812, 6824, 6832, 6840, 6852, 6864, 6876, 6888, 6888, - 6888, 6896, 6904, 6916, 6928, 6940, 6952, 6952, 6952, 6960, 6968, 6980, - 6992, 7004, 7016, 7028, 7040, 7048, 7056, 7068, 7080, 7092, 7104, 7116, - 7128, 7136, 7144, 7156, 7168, 7180, 7192, 7204, 7216, 7224, 7232, 7244, - 7256, 7268, 7280, 7292, 7304, 7312, 7320, 7332, 7344, 7356, 7368, 7368, - 7368, 7376, 7384, 7396, 7408, 7420, 7432, 7432, 7432, 7440, 7448, 7460, - 7472, 7484, 7496, 7508, 7520, 7520, 7528, 7528, 7540, 7540, 7552, 7552, - 7564, 7572, 7580, 7592, 7604, 7616, 7628, 7640, 7652, 7660, 7668, 7680, - 7692, 7704, 7716, 7728, 7740, 7748, 7756, 7764, 7772, 7780, 7788, 7796, - 7804, 7812, 7820, 7828, 7836, 7844, 7852, 7852, 7852, 7864, 7876, 7892, - 7908, 7924, 7940, 7956, 7972, 7984, 7996, 8012, 8028, 8044, 8060, 8076, - 8092, 8104, 8116, 8132, 8148, 8164, 8180, 8196, 8212, 8224, 8236, 8252, - 8268, 8284, 8300, 8316, 8332, 8344, 8356, 8372, 8388, 8404, 8420, 8436, - 8452, 8464, 8476, 8492, 8508, 8524, 8540, 8556, 8572, 8580, 8588, 8600, - 8608, 8620, 8620, 8628, 8640, 8648, 8656, 8664, 8672, 8681, 8688, 8693, - 8701, 8710, 8716, 8728, 8736, 8748, 8748, 8756, 8768, 8776, 8784, 8792, - 8800, 8810, 8818, 8826, 8832, 8840, 8848, 8860, 8872, 8872, 8872, 8880, - 8892, 8900, 8908, 8916, 8924, 8926, 8934, 8942, 8948, 8956, 8964, 8976, - 8988, 8996, 9004, 9012, 9024, 9032, 9040, 9048, 9056, 9066, 9074, 9080, - 9084, 9084, 9084, 9096, 9104, 9116, 9116, 9124, 9136, 9144, 9152, 9160, - 9168, 9178, 9181, 9188, 9190}, - {9190, 9194, 9197, 9201, 9205, 9209, 9213, 9217, 9221, 9225, 9229, 9232, - 9232, 9232, 9232, 9232, 9232, 9233, 9236, 9236, 9236, 9236, 9236, 9237, - 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, 9244, - 9245, 9249, 9257, 9268, 9268, 9268, 9268, 9268, 9268, 9268, 9268, 9269, - 9272, 9272, 9272, 9273, 9281, 9292, 9293, 9301, 9312, 9312, 9312, 9312, - 9313, 9320, 9321, 9328, 9328, 9328, 9328, 9328, 9328, 9328, 9328, 9329, - 9337, 9345, 9352, 9352, 9352, 9352, 9352, 9352, 9352, 9352, 9352, 9352, - 9352, 9352, 9352, 9353, 9368, 9368, 9368, 9368, 9368, 9368, 9368, 9369, - 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, 9372, - 9372, 9372, 9372, 9372, 9373, 9377, 9380, 9380, 9381, 9385, 9389, 9393, - 9397, 9401, 9405, 9409, 9413, 9417, 9421, 9425, 9429, 9433, 9437, 9441, - 9445, 9449, 9453, 9457, 9461, 9465, 9469, 9473, 9477, 9481, 9485, 9488, - 9489, 9493, 9497, 9501, 9505, 9509, 9513, 9517, 9521, 9525, 9529, 9533, - 9537, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, 9540, - 9541, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, 9548, - 9548, 9548, 9548, 9548, 9549}, - {9549, 9561, 9573, 9577, 9584, 9585, 9597, 9609, 9612, 9613, - 9621, 9625, 9629, 9633, 9637, 9641, 9645, 9649, 9653, 9657, - 9660, 9661, 9665, 9672, 9672, 9673, 9677, 9681, 9685, 9689, - 9692, 9692, 9693, 9701, 9713, 9720, 9721, 9724, 9724, 9728, - 9729, 9732, 9732, 9736, 9745, 9749, 9752, 9753, 9757, 9761, - 9764, 9765, 9769, 9773, 9777, 9781, 9785, 9789, 9792, 9793, - 9805, 9809, 9813, 9817, 9821, 9824, 9824, 9824, 9824, 9825, - 9829, 9833, 9837, 9841, 9844, 9844, 9844, 9844, 9844, 9844, - 9845, 9857, 9869, 9885, 9897, 9909, 9921, 9933, 9945, 9957, - 9969, 9981, 9993, 10005, 10017, 10029, 10037, 10041, 10049, 10061, - 10069, 10073, 10081, 10093, 10109, 10117, 10121, 10129, 10141, 10145, - 10149, 10153, 10157, 10161, 10169, 10181, 10189, 10193, 10201, 10213, - 10229, 10237, 10241, 10249, 10261, 10265, 10269, 10273, 10276, 10276, - 10276, 10276, 10276, 10276, 10276, 10276, 10276, 10277, 10288, 10288, - 10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288, 10288, - 10288, 10288, 10288, 10288, 10288, 10296, 10304, 10304, 10304, 10304, - 10304, 10304, 10304, 10304, 10304, 10304, 10304, 10304, 10304, 10304, - 10304, 10304, 10304, 10304, 10304, 10312, 10312, 10312, 10312, 10312, - 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, - 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, 10312, - 10312, 10312, 10312, 10312, 10312, 10312, 10320, 10328, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, 10336, - 10336, 10336, 10336, 10336, 10336, 10336, 10336}, - {10336, 10336, 10336, 10336, 10336, 10344, 10344, 10344, 10344, 10344, - 10352, 10352, 10352, 10360, 10360, 10360, 10360, 10360, 10360, 10360, - 10360, 10360, 10360, 10360, 10360, 10360, 10360, 10360, 10360, 10360, - 10360, 10360, 10360, 10360, 10360, 10360, 10360, 10368, 10368, 10376, - 10376, 10376, 10376, 10376, 10377, 10385, 10396, 10397, 10405, 10416, - 10416, 10416, 10416, 10416, 10416, 10416, 10416, 10416, 10416, 10416, - 10416, 10416, 10416, 10416, 10416, 10416, 10424, 10424, 10424, 10432, - 10432, 10432, 10440, 10440, 10448, 10448, 10448, 10448, 10448, 10448, - 10448, 10448, 10448, 10448, 10448, 10448, 10448, 10448, 10448, 10448, - 10448, 10448, 10448, 10448, 10448, 10448, 10448, 10456, 10456, 10464, - 10464, 10464, 10464, 10464, 10464, 10464, 10464, 10464, 10464, 10464, - 10472, 10480, 10488, 10496, 10504, 10504, 10504, 10512, 10520, 10520, - 10520, 10528, 10536, 10536, 10536, 10536, 10536, 10536, 10536, 10544, - 10552, 10552, 10552, 10560, 10568, 10568, 10568, 10576, 10584, 10584, - 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, - 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, - 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, 10584, - 10584, 10584, 10584, 10592, 10600, 10608, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, 10616, - 10616, 10616, 10616, 10616, 10616, 10624, 10632, 10640, 10648, 10648, - 10648, 10648, 10648, 10648, 10648, 10656, 10664, 10672, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680}, - {10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, 10680, - 10680, 10680, 10684, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688}, - {10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, 10688, - 10688, 10688, 10688, 10688, 10688, 10688, 10689, 10693, 10697, 10701, - 10705, 10709, 10713, 10717, 10721, 10725, 10733, 10741, 10749, 10757, - 10765, 10773, 10781, 10789, 10797, 10805, 10813, 10825, 10837, 10849, - 10861, 10873, 10885, 10897, 10909, 10921, 10937, 10953, 10969, 10985, - 11001, 11017, 11033, 11049, 11065, 11081, 11097, 11105, 11113, 11121, - 11129, 11137, 11145, 11153, 11161, 11169, 11181, 11193, 11205, 11217, - 11229, 11241, 11253, 11265, 11277, 11289, 11301, 11313, 11325, 11337, - 11349, 11361, 11373, 11385, 11397, 11409, 11421, 11433, 11445, 11457, - 11469, 11481, 11493, 11505, 11517, 11529, 11541, 11553, 11565, 11577, - 11589, 11601, 11613, 11617, 11621, 11625, 11629, 11633, 11637, 11641, - 11645, 11649, 11653, 11657, 11661, 11665, 11669, 11673, 11677, 11681, - 11685, 11689, 11693, 11697, 11701, 11705, 11709, 11713, 11717, 11721, - 11725, 11729, 11733, 11737, 11741, 11745, 11749, 11753, 11757, 11761, - 11765, 11769, 11773, 11777, 11781, 11785, 11789, 11793, 11797, 11801, - 11805, 11809, 11813, 11817, 11821, 11824, 11824, 11824, 11824, 11824, - 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, - 11824, 11824, 11824, 11824, 11824, 11824, 11824}, - {11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, 11824, - 11824, 11824, 11825, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, 11840, - 11840, 11840, 11840, 11840, 11840, 11840, 11841, 11853, 11861, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, 11872, - 11872, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880}, - {11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, 11880, - 11880, 11880, 11880, 11880, 11881, 11885, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888}, - {11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, 11888, - 11888, 11889, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892}, - {11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, - 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11892, 11893, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, 11896, - 11896, 11896, 11896, 11897, 11900, 11900, 11900, 11900, 11900, 11900, - 11900, 11900, 11900, 11900, 11900, 11900, 11901}, - {11901, 11905, 11909, 11913, 11917, 11921, 11925, 11929, 11933, 11937, - 11941, 11945, 11949, 11953, 11957, 11961, 11965, 11969, 11973, 11977, - 11981, 11985, 11989, 11993, 11997, 12001, 12005, 12009, 12013, 12017, - 12021, 12025, 12029, 12033, 12037, 12041, 12045, 12049, 12053, 12057, - 12061, 12065, 12069, 12073, 12077, 12081, 12085, 12089, 12093, 12097, - 12101, 12105, 12109, 12113, 12117, 12121, 12125, 12129, 12133, 12137, - 12141, 12145, 12149, 12153, 12157, 12161, 12165, 12169, 12173, 12177, - 12181, 12185, 12189, 12193, 12197, 12201, 12205, 12209, 12213, 12217, - 12221, 12225, 12229, 12233, 12237, 12241, 12245, 12249, 12253, 12257, - 12261, 12265, 12269, 12273, 12277, 12281, 12285, 12289, 12293, 12297, - 12301, 12305, 12309, 12313, 12317, 12321, 12325, 12329, 12333, 12337, - 12341, 12345, 12349, 12353, 12357, 12361, 12365, 12369, 12373, 12377, - 12381, 12385, 12389, 12393, 12397, 12401, 12405, 12409, 12413, 12417, - 12421, 12425, 12429, 12433, 12437, 12441, 12445, 12449, 12453, 12457, - 12461, 12465, 12469, 12473, 12477, 12481, 12485, 12489, 12493, 12497, - 12501, 12505, 12509, 12513, 12517, 12521, 12525, 12529, 12533, 12537, - 12541, 12545, 12549, 12553, 12557, 12561, 12565, 12569, 12573, 12577, - 12581, 12585, 12589, 12593, 12597, 12601, 12605, 12609, 12613, 12617, - 12621, 12625, 12629, 12633, 12637, 12641, 12645, 12649, 12653, 12657, - 12661, 12665, 12669, 12673, 12677, 12681, 12685, 12689, 12693, 12697, - 12701, 12705, 12709, 12713, 12717, 12721, 12725, 12729, 12733, 12737, - 12741, 12745, 12749, 12753, 12756, 12756, 12756, 12756, 12756, 12756, - 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, - 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, - 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, 12756, - 12756, 12756, 12756, 12756, 12756, 12756, 12757}, - {12757, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, 12760, - 12760, 12760, 12760, 12760, 12761, 12764, 12765, 12769, 12773, 12776, - 12776, 12776, 12776, 12776, 12776, 12776, 12776, 12776, 12776, 12776, - 12776, 12776, 12776, 12776, 12776, 12776, 12776, 12784, 12784, 12792, - 12792, 12800, 12800, 12808, 12808, 12816, 12816, 12824, 12824, 12832, - 12832, 12840, 12840, 12848, 12848, 12856, 12856, 12864, 12864, 12872, - 12872, 12872, 12880, 12880, 12888, 12888, 12896, 12896, 12896, 12896, - 12896, 12896, 12896, 12904, 12912, 12912, 12920, 12928, 12928, 12936, - 12944, 12944, 12952, 12960, 12960, 12968, 12976, 12976, 12976, 12976, - 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, - 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12976, 12984, - 12984, 12984, 12984, 12984, 12984, 12985, 12993, 13000, 13000, 13009, - 13016, 13016, 13016, 13016, 13016, 13016, 13016, 13016, 13016, 13016, - 13016, 13016, 13016, 13024, 13024, 13032, 13032, 13040, 13040, 13048, - 13048, 13056, 13056, 13064, 13064, 13072, 13072, 13080, 13080, 13088, - 13088, 13096, 13096, 13104, 13104, 13112, 13112, 13112, 13120, 13120, - 13128, 13128, 13136, 13136, 13136, 13136, 13136, 13136, 13136, 13144, - 13152, 13152, 13160, 13168, 13168, 13176, 13184, 13184, 13192, 13200, - 13200, 13208, 13216, 13216, 13216, 13216, 13216, 13216, 13216, 13216, - 13216, 13216, 13216, 13216, 13216, 13216, 13216, 13216, 13216, 13216, - 13216, 13216, 13216, 13216, 13216, 13224, 13224, 13224, 13232, 13240, - 13248, 13256, 13256, 13256, 13256, 13265, 13272}, - {13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, - 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, - 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, - 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, - 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13272, 13273, - 13277, 13281, 13285, 13289, 13293, 13297, 13301, 13305, 13309, 13313, - 13317, 13321, 13325, 13329, 13333, 13337, 13341, 13345, 13349, 13353, - 13357, 13361, 13365, 13369, 13373, 13377, 13381, 13385, 13389, 13393, - 13397, 13401, 13405, 13409, 13413, 13417, 13421, 13425, 13429, 13433, - 13437, 13441, 13445, 13449, 13453, 13457, 13461, 13465, 13469, 13473, - 13477, 13481, 13485, 13489, 13493, 13497, 13501, 13505, 13509, 13513, - 13517, 13521, 13525, 13529, 13533, 13537, 13541, 13545, 13549, 13553, - 13557, 13561, 13565, 13569, 13573, 13577, 13581, 13585, 13589, 13593, - 13597, 13601, 13605, 13609, 13613, 13617, 13621, 13625, 13629, 13633, - 13637, 13641, 13645, 13648, 13648, 13648, 13649, 13653, 13657, 13661, - 13665, 13669, 13673, 13677, 13681, 13685, 13689, 13693, 13697, 13701, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, 13704, - 13704, 13704, 13704, 13704, 13704, 13704, 13705}, - {13705, 13717, 13729, 13741, 13753, 13765, 13777, 13789, 13801, 13813, - 13825, 13837, 13849, 13861, 13873, 13889, 13905, 13921, 13937, 13953, - 13969, 13985, 14001, 14017, 14033, 14049, 14065, 14081, 14097, 14113, - 14141, 14164, 14165, 14177, 14189, 14201, 14213, 14225, 14237, 14249, - 14261, 14273, 14285, 14297, 14309, 14321, 14333, 14345, 14357, 14369, - 14381, 14393, 14405, 14417, 14429, 14441, 14453, 14465, 14477, 14489, - 14501, 14513, 14525, 14537, 14549, 14561, 14573, 14585, 14597, 14601, - 14605, 14609, 14612, 14612, 14612, 14612, 14612, 14612, 14612, 14612, - 14613, 14625, 14633, 14641, 14649, 14657, 14665, 14673, 14681, 14689, - 14697, 14705, 14713, 14721, 14729, 14737, 14745, 14749, 14753, 14757, - 14761, 14765, 14769, 14773, 14777, 14781, 14785, 14789, 14793, 14797, - 14801, 14809, 14817, 14825, 14833, 14841, 14849, 14857, 14865, 14873, - 14881, 14889, 14897, 14905, 14913, 14933, 14949, 14956, 14957, 14961, - 14965, 14969, 14973, 14977, 14981, 14985, 14989, 14993, 14997, 15001, - 15005, 15009, 15013, 15017, 15021, 15025, 15029, 15033, 15037, 15041, - 15045, 15049, 15053, 15057, 15061, 15065, 15069, 15073, 15077, 15081, - 15085, 15089, 15093, 15097, 15101, 15105, 15109, 15113, 15117, 15121, - 15125, 15129, 15133, 15137, 15141, 15145, 15149, 15153, 15161, 15169, - 15177, 15185, 15193, 15201, 15209, 15217, 15225, 15233, 15241, 15249, - 15257, 15265, 15273, 15281, 15289, 15297, 15305, 15313, 15321, 15329, - 15337, 15345, 15357, 15369, 15381, 15389, 15401, 15409, 15421, 15425, - 15429, 15433, 15437, 15441, 15445, 15449, 15453, 15457, 15461, 15465, - 15469, 15473, 15477, 15481, 15485, 15489, 15493, 15497, 15501, 15505, - 15509, 15513, 15517, 15521, 15525, 15529, 15533, 15537, 15541, 15545, - 15549, 15553, 15557, 15561, 15565, 15569, 15573, 15577, 15581, 15585, - 15589, 15593, 15597, 15601, 15605, 15609, 15617}, - {15617, 15637, 15653, 15673, 15685, 15705, 15717, 15729, 15753, 15769, - 15781, 15793, 15805, 15821, 15837, 15853, 15869, 15885, 15901, 15917, - 15941, 15949, 15973, 15997, 16017, 16033, 16057, 16081, 16097, 16109, - 16121, 16137, 16153, 16173, 16193, 16205, 16217, 16233, 16245, 16257, - 16265, 16273, 16285, 16297, 16321, 16337, 16357, 16381, 16397, 16409, - 16421, 16445, 16461, 16485, 16497, 16517, 16529, 16545, 16557, 16573, - 16593, 16609, 16629, 16645, 16653, 16673, 16685, 16697, 16713, 16725, - 16737, 16749, 16769, 16785, 16793, 16817, 16829, 16849, 16865, 16881, - 16893, 16905, 16921, 16929, 16945, 16965, 16973, 16997, 17009, 17017, - 17025, 17033, 17041, 17049, 17057, 17065, 17073, 17081, 17089, 17101, - 17113, 17125, 17137, 17149, 17161, 17173, 17185, 17197, 17209, 17221, - 17233, 17245, 17257, 17269, 17281, 17289, 17297, 17309, 17317, 17325, - 17333, 17345, 17357, 17365, 17373, 17381, 17389, 17397, 17413, 17421, - 17429, 17437, 17445, 17453, 17461, 17469, 17477, 17489, 17505, 17513, - 17521, 17529, 17537, 17545, 17553, 17561, 17573, 17585, 17597, 17609, - 17617, 17625, 17633, 17641, 17649, 17657, 17665, 17673, 17681, 17689, - 17701, 17713, 17721, 17733, 17745, 17757, 17765, 17777, 17789, 17805, - 17813, 17825, 17837, 17849, 17861, 17881, 17905, 17913, 17921, 17929, - 17937, 17945, 17953, 17961, 17969, 17977, 17985, 17993, 18001, 18009, - 18017, 18025, 18033, 18041, 18049, 18065, 18073, 18081, 18089, 18105, - 18117, 18125, 18133, 18141, 18149, 18157, 18165, 18173, 18181, 18189, - 18197, 18209, 18217, 18225, 18237, 18249, 18257, 18273, 18285, 18293, - 18301, 18309, 18317, 18329, 18341, 18349, 18357, 18365, 18373, 18381, - 18389, 18397, 18405, 18413, 18425, 18437, 18449, 18461, 18473, 18485, - 18497, 18509, 18521, 18533, 18545, 18557, 18569, 18581, 18593, 18605, - 18617, 18629, 18641, 18653, 18665, 18677, 18688}, - {18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, 18688, - 18688, 18688, 18688, 18688, 18688, 18688, 18689, 18693, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696}, - {18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, 18696, - 18696, 18696, 18697, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, 18700, - 18700, 18700, 18701, 18705, 18709, 18712, 18712, 18712, 18713, 18717, - 18720, 18720, 18720, 18720, 18720, 18720, 18720}, - {18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, 18720, - 18720, 18720, 18721, 18725, 18729, 18733, 18736, 18736, 18736, 18736, - 18736, 18736, 18736, 18736, 18736, 18737, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, 18740, - 18740, 18740, 18740, 18740, 18740, 18740, 18740}, - {18740, 18744, 18748, 18752, 18756, 18760, 18764, 18768, 18772, 18776, - 18780, 18784, 18788, 18792, 18796, 18800, 18804, 18808, 18812, 18816, - 18820, 18824, 18828, 18832, 18836, 18840, 18844, 18848, 18852, 18856, - 18860, 18864, 18868, 18872, 18876, 18880, 18884, 18888, 18892, 18896, - 18900, 18904, 18908, 18912, 18916, 18920, 18924, 18928, 18932, 18936, - 18940, 18944, 18948, 18952, 18956, 18960, 18964, 18968, 18972, 18976, - 18980, 18984, 18988, 18992, 18996, 19000, 19004, 19008, 19012, 19016, - 19020, 19024, 19028, 19032, 19036, 19040, 19044, 19048, 19052, 19056, - 19060, 19064, 19068, 19072, 19076, 19080, 19084, 19088, 19092, 19096, - 19100, 19104, 19108, 19112, 19116, 19120, 19124, 19128, 19132, 19136, - 19140, 19144, 19148, 19152, 19156, 19160, 19164, 19168, 19172, 19176, - 19180, 19184, 19188, 19192, 19196, 19200, 19204, 19208, 19212, 19216, - 19220, 19224, 19228, 19232, 19236, 19240, 19244, 19248, 19252, 19256, - 19260, 19264, 19268, 19272, 19276, 19280, 19284, 19288, 19292, 19296, - 19300, 19304, 19308, 19312, 19316, 19320, 19324, 19328, 19332, 19336, - 19340, 19344, 19348, 19352, 19356, 19360, 19364, 19368, 19372, 19376, - 19380, 19384, 19388, 19392, 19396, 19400, 19404, 19408, 19412, 19416, - 19420, 19424, 19428, 19432, 19436, 19440, 19444, 19448, 19452, 19456, - 19460, 19464, 19468, 19472, 19476, 19480, 19484, 19488, 19492, 19496, - 19500, 19504, 19508, 19512, 19516, 19520, 19524, 19528, 19532, 19536, - 19540, 19544, 19548, 19552, 19556, 19560, 19564, 19568, 19572, 19576, - 19580, 19584, 19588, 19592, 19596, 19600, 19604, 19608, 19612, 19616, - 19620, 19624, 19628, 19632, 19636, 19640, 19644, 19648, 19652, 19656, - 19660, 19664, 19668, 19672, 19676, 19680, 19684, 19688, 19692, 19696, - 19700, 19704, 19708, 19712, 19716, 19720, 19724, 19728, 19732, 19736, - 19740, 19744, 19748, 19752, 19756, 19760, 19764}, - {19764, 19768, 19772, 19776, 19780, 19784, 19788, 19792, 19796, 19800, - 19804, 19808, 19812, 19816, 19820, 19820, 19820, 19824, 19824, 19828, - 19828, 19828, 19832, 19836, 19840, 19844, 19848, 19852, 19856, 19860, - 19864, 19868, 19868, 19872, 19872, 19876, 19876, 19876, 19880, 19884, - 19884, 19884, 19884, 19888, 19892, 19896, 19900, 19904, 19908, 19912, - 19916, 19920, 19924, 19928, 19932, 19936, 19940, 19944, 19948, 19952, - 19956, 19960, 19964, 19968, 19972, 19976, 19980, 19984, 19988, 19992, - 19996, 20000, 20004, 20008, 20012, 20016, 20020, 20024, 20028, 20032, - 20036, 20040, 20044, 20048, 20052, 20056, 20060, 20064, 20068, 20072, - 20076, 20080, 20084, 20088, 20092, 20096, 20100, 20104, 20108, 20112, - 20116, 20120, 20124, 20128, 20132, 20136, 20140, 20144, 20148, 20152, - 20156, 20156, 20156, 20160, 20164, 20168, 20172, 20176, 20180, 20184, - 20188, 20192, 20196, 20200, 20204, 20208, 20212, 20216, 20220, 20224, - 20228, 20232, 20236, 20240, 20244, 20248, 20252, 20256, 20260, 20264, - 20268, 20272, 20276, 20280, 20284, 20288, 20292, 20296, 20300, 20304, - 20308, 20312, 20316, 20320, 20324, 20328, 20332, 20336, 20340, 20344, - 20348, 20352, 20356, 20360, 20364, 20368, 20372, 20376, 20380, 20384, - 20388, 20392, 20396, 20400, 20404, 20408, 20412, 20416, 20420, 20424, - 20428, 20432, 20436, 20440, 20444, 20448, 20452, 20456, 20460, 20464, - 20468, 20472, 20476, 20480, 20484, 20488, 20492, 20496, 20500, 20504, - 20508, 20512, 20516, 20520, 20524, 20528, 20532, 20536, 20540, 20544, - 20548, 20552, 20556, 20560, 20564, 20568, 20572, 20576, 20580, 20580, - 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, - 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, - 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, 20580, - 20580, 20580, 20580, 20580, 20580, 20580, 20581}, - {20581, 20589, 20597, 20605, 20617, 20629, 20637, 20644, 20644, 20644, - 20644, 20644, 20644, 20644, 20644, 20644, 20644, 20644, 20644, 20645, - 20653, 20661, 20669, 20677, 20684, 20684, 20684, 20684, 20684, 20684, - 20692, 20692, 20701, 20705, 20709, 20713, 20717, 20721, 20725, 20729, - 20733, 20737, 20740, 20748, 20756, 20768, 20780, 20788, 20796, 20804, - 20812, 20820, 20828, 20836, 20844, 20852, 20852, 20860, 20868, 20876, - 20884, 20892, 20892, 20900, 20900, 20908, 20916, 20916, 20924, 20932, - 20932, 20940, 20948, 20956, 20964, 20972, 20980, 20988, 20996, 21005, - 21013, 21017, 21021, 21025, 21029, 21033, 21037, 21041, 21045, 21049, - 21053, 21057, 21061, 21065, 21069, 21073, 21077, 21081, 21085, 21089, - 21093, 21097, 21101, 21105, 21109, 21113, 21117, 21121, 21125, 21129, - 21133, 21137, 21141, 21145, 21149, 21153, 21157, 21161, 21165, 21169, - 21173, 21177, 21181, 21185, 21189, 21193, 21197, 21201, 21205, 21209, - 21213, 21217, 21221, 21225, 21229, 21233, 21237, 21241, 21245, 21249, - 21253, 21257, 21261, 21265, 21269, 21273, 21277, 21281, 21285, 21289, - 21293, 21297, 21301, 21305, 21309, 21313, 21317, 21321, 21325, 21329, - 21333, 21337, 21341, 21345, 21349, 21357, 21365, 21369, 21373, 21377, - 21381, 21385, 21389, 21393, 21397, 21401, 21405, 21413, 21420, 21420, - 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, - 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, - 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, 21420, - 21420, 21421, 21425, 21429, 21433, 21437, 21441, 21445, 21449, 21453, - 21457, 21461, 21469, 21473, 21477, 21481, 21485, 21489, 21493, 21497, - 21501, 21505, 21509, 21513, 21517, 21529, 21541, 21553, 21565, 21577, - 21589, 21601, 21613, 21625, 21637, 21649, 21661, 21673, 21685, 21697, - 21709, 21721, 21733, 21737, 21741, 21745, 21749}, - {21749, 21761, 21773, 21785, 21797, 21809, 21817, 21825, 21833, 21841, - 21849, 21857, 21865, 21873, 21881, 21889, 21897, 21905, 21913, 21921, - 21929, 21937, 21945, 21953, 21961, 21969, 21977, 21985, 21993, 22001, - 22009, 22017, 22025, 22033, 22041, 22049, 22057, 22065, 22073, 22081, - 22089, 22097, 22105, 22113, 22121, 22129, 22137, 22145, 22153, 22161, - 22169, 22177, 22185, 22193, 22201, 22209, 22217, 22225, 22233, 22241, - 22249, 22257, 22265, 22273, 22281, 22289, 22297, 22305, 22313, 22321, - 22329, 22337, 22345, 22353, 22361, 22369, 22377, 22385, 22393, 22401, - 22409, 22417, 22425, 22433, 22441, 22449, 22457, 22465, 22473, 22481, - 22489, 22497, 22505, 22513, 22521, 22533, 22545, 22557, 22569, 22581, - 22593, 22605, 22617, 22629, 22641, 22653, 22665, 22673, 22681, 22689, - 22697, 22705, 22713, 22721, 22729, 22737, 22745, 22753, 22761, 22769, - 22777, 22785, 22793, 22801, 22809, 22817, 22825, 22833, 22841, 22849, - 22857, 22865, 22873, 22881, 22889, 22897, 22905, 22913, 22921, 22929, - 22937, 22945, 22953, 22961, 22969, 22977, 22985, 22993, 23001, 23009, - 23017, 23025, 23037, 23049, 23061, 23073, 23085, 23093, 23101, 23109, - 23117, 23125, 23133, 23141, 23149, 23157, 23165, 23173, 23181, 23189, - 23197, 23205, 23213, 23221, 23229, 23237, 23245, 23253, 23261, 23269, - 23277, 23285, 23293, 23301, 23309, 23317, 23325, 23333, 23341, 23349, - 23357, 23365, 23373, 23381, 23389, 23397, 23405, 23413, 23421, 23429, - 23437, 23445, 23453, 23461, 23469, 23477, 23485, 23493, 23501, 23509, - 23517, 23525, 23533, 23541, 23549, 23557, 23565, 23573, 23581, 23589, - 23597, 23605, 23613, 23621, 23633, 23645, 23653, 23661, 23669, 23677, - 23685, 23693, 23701, 23709, 23717, 23725, 23733, 23741, 23749, 23757, - 23765, 23773, 23781, 23793, 23805, 23817, 23825, 23833, 23841, 23849, - 23857, 23865, 23873, 23881, 23889, 23897, 23905}, - {23905, 23913, 23921, 23929, 23937, 23945, 23953, 23961, 23969, 23977, - 23985, 23993, 24001, 24009, 24017, 24025, 24033, 24041, 24049, 24057, - 24065, 24073, 24081, 24089, 24097, 24105, 24113, 24121, 24129, 24137, - 24145, 24153, 24161, 24169, 24177, 24185, 24193, 24201, 24209, 24217, - 24225, 24233, 24241, 24249, 24257, 24265, 24273, 24281, 24289, 24297, - 24305, 24313, 24321, 24329, 24337, 24345, 24353, 24361, 24369, 24377, - 24385, 24393, 24400, 24400, 24400, 24400, 24400, 24400, 24400, 24400, - 24400, 24400, 24400, 24400, 24400, 24400, 24400, 24400, 24400, 24400, - 24401, 24413, 24425, 24437, 24449, 24461, 24473, 24485, 24497, 24509, - 24521, 24533, 24545, 24557, 24569, 24581, 24593, 24605, 24617, 24629, - 24641, 24653, 24665, 24677, 24689, 24701, 24713, 24725, 24737, 24749, - 24761, 24773, 24785, 24797, 24809, 24821, 24833, 24845, 24857, 24869, - 24881, 24893, 24905, 24917, 24929, 24941, 24953, 24965, 24977, 24989, - 25001, 25013, 25025, 25037, 25049, 25061, 25073, 25085, 25097, 25109, - 25121, 25133, 25145, 25157, 25168, 25168, 25169, 25181, 25193, 25205, - 25217, 25229, 25241, 25253, 25265, 25277, 25289, 25301, 25313, 25325, - 25337, 25349, 25361, 25373, 25385, 25397, 25409, 25421, 25433, 25445, - 25457, 25469, 25481, 25493, 25505, 25517, 25529, 25541, 25553, 25565, - 25577, 25589, 25601, 25613, 25625, 25637, 25649, 25661, 25673, 25685, - 25697, 25709, 25721, 25733, 25745, 25757, 25769, 25781, 25793, 25805, - 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, - 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, - 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, - 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, 25816, - 25817, 25829, 25841, 25857, 25873, 25889, 25905, 25921, 25937, 25953, - 25965, 26037, 26069, 26084, 26084, 26084, 26084}, - {26084, 26084, 26084, 26084, 26084, 26084, 26084, 26084, 26084, 26084, - 26084, 26084, 26084, 26084, 26084, 26084, 26085, 26089, 26093, 26097, - 26101, 26105, 26109, 26113, 26117, 26121, 26132, 26132, 26132, 26132, - 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26132, - 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26132, 26133, 26141, - 26145, 26149, 26153, 26157, 26161, 26165, 26169, 26173, 26177, 26181, - 26185, 26189, 26193, 26197, 26201, 26205, 26209, 26213, 26217, 26220, - 26220, 26221, 26225, 26229, 26237, 26245, 26253, 26261, 26265, 26269, - 26273, 26277, 26281, 26284, 26285, 26289, 26293, 26297, 26301, 26305, - 26309, 26313, 26317, 26321, 26325, 26329, 26333, 26337, 26341, 26345, - 26349, 26353, 26357, 26360, 26361, 26365, 26369, 26373, 26376, 26376, - 26376, 26376, 26377, 26385, 26393, 26400, 26401, 26408, 26409, 26417, - 26425, 26433, 26441, 26449, 26457, 26465, 26473, 26481, 26489, 26493, - 26501, 26509, 26517, 26525, 26533, 26541, 26549, 26557, 26565, 26573, - 26581, 26589, 26593, 26597, 26601, 26605, 26609, 26613, 26617, 26621, - 26625, 26629, 26633, 26637, 26641, 26645, 26649, 26653, 26657, 26661, - 26665, 26669, 26673, 26677, 26681, 26685, 26689, 26693, 26697, 26701, - 26705, 26709, 26713, 26717, 26721, 26725, 26729, 26733, 26737, 26741, - 26745, 26749, 26753, 26757, 26761, 26765, 26769, 26773, 26777, 26781, - 26785, 26789, 26793, 26797, 26801, 26805, 26809, 26813, 26817, 26821, - 26825, 26829, 26833, 26837, 26841, 26845, 26849, 26853, 26857, 26861, - 26865, 26869, 26873, 26877, 26881, 26885, 26889, 26893, 26897, 26901, - 26905, 26909, 26913, 26917, 26921, 26925, 26929, 26933, 26937, 26941, - 26945, 26949, 26953, 26957, 26961, 26965, 26969, 26973, 26977, 26981, - 26985, 26989, 26993, 26997, 27001, 27005, 27017, 27029, 27041, 27053, - 27065, 27077, 27085, 27092, 27092, 27092, 27092}, - {27092, 27093, 27097, 27101, 27105, 27109, 27113, 27117, 27121, 27125, - 27129, 27133, 27137, 27141, 27145, 27149, 27153, 27157, 27161, 27165, - 27169, 27173, 27177, 27181, 27185, 27189, 27193, 27197, 27201, 27205, - 27209, 27213, 27217, 27221, 27225, 27229, 27233, 27237, 27241, 27245, - 27249, 27253, 27257, 27261, 27265, 27269, 27273, 27277, 27281, 27285, - 27289, 27293, 27297, 27301, 27305, 27309, 27313, 27317, 27321, 27325, - 27329, 27333, 27337, 27341, 27345, 27349, 27353, 27357, 27361, 27365, - 27369, 27373, 27377, 27381, 27385, 27389, 27393, 27397, 27401, 27405, - 27409, 27413, 27417, 27421, 27425, 27429, 27433, 27437, 27441, 27445, - 27449, 27453, 27457, 27461, 27465, 27469, 27473, 27477, 27481, 27485, - 27489, 27493, 27497, 27501, 27505, 27509, 27513, 27517, 27521, 27525, - 27529, 27533, 27537, 27541, 27545, 27549, 27553, 27557, 27561, 27565, - 27569, 27573, 27577, 27581, 27585, 27589, 27593, 27597, 27601, 27605, - 27609, 27613, 27617, 27621, 27625, 27629, 27633, 27637, 27641, 27645, - 27649, 27653, 27657, 27661, 27665, 27669, 27673, 27677, 27681, 27685, - 27689, 27693, 27697, 27701, 27705, 27709, 27713, 27717, 27721, 27725, - 27729, 27733, 27737, 27741, 27745, 27749, 27753, 27757, 27761, 27765, - 27769, 27773, 27777, 27781, 27785, 27789, 27793, 27797, 27801, 27805, - 27809, 27813, 27817, 27821, 27825, 27829, 27833, 27837, 27841, 27845, - 27849, 27852, 27852, 27852, 27853, 27857, 27861, 27865, 27869, 27873, - 27876, 27876, 27877, 27881, 27885, 27889, 27893, 27897, 27900, 27900, - 27901, 27905, 27909, 27913, 27917, 27921, 27924, 27924, 27925, 27929, - 27933, 27936, 27936, 27936, 27937, 27941, 27945, 27949, 27957, 27961, - 27965, 27968, 27969, 27973, 27977, 27981, 27985, 27989, 27993, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996}, - {27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, - 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27996, 27997, - 28001, 28005, 28009, 28013, 28016, 28017, 28021, 28025, 28029, 28033, - 28037, 28041, 28045, 28049, 28053, 28057, 28061, 28065, 28069, 28073, - 28077, 28081, 28085, 28089, 28093, 28097, 28101, 28105, 28109, 28113, - 28117, 28121, 28125, 28129, 28133, 28137, 28141, 28145, 28149, 28153, - 28157, 28161, 28165, 28169, 28173, 28177, 28181, 28184, 28185, 28189, - 28193, 28197, 28201, 28205, 28209, 28213, 28217, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220}, - {28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, 28220, - 28220, 28220, 28220, 28220, 28220, 28228, 28228, 28236, 28236, 28236, - 28236, 28236, 28236, 28236, 28236, 28236, 28236, 28236, 28236, 28236, - 28236, 28236, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244}, - {28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28244, - 28244, 28244, 28244, 28244, 28244, 28244, 28244, 28252, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260}, - {28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, 28260, - 28260, 28260, 28260, 28260, 28260, 28260, 28268, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276}, - {28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, - 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28276, 28284, 28292, - 28292, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300}, - {28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28300, - 28300, 28300, 28300, 28300, 28300, 28300, 28300, 28308, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316}, - {28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28316, - 28316, 28316, 28316, 28316, 28316, 28316, 28316, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324}, - {28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, 28324, - 28324, 28324, 28324, 28324, 28324, 28332, 28340, 28352, 28364, 28376, - 28388, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, - 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28400, 28408, 28416, - 28428, 28440, 28452, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464}, - {28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, 28464, - 28464, 28464, 28464, 28464, 28464, 28464, 28465}, - {28465, 28469, 28473, 28477, 28481, 28485, 28489, 28493, 28497, 28501, - 28505, 28509, 28513, 28517, 28521, 28525, 28529, 28533, 28537, 28541, - 28545, 28549, 28553, 28557, 28561, 28565, 28569, 28573, 28577, 28581, - 28585, 28589, 28593, 28597, 28601, 28605, 28609, 28613, 28617, 28621, - 28625, 28629, 28633, 28637, 28641, 28645, 28649, 28653, 28657, 28661, - 28665, 28669, 28673, 28677, 28681, 28685, 28689, 28693, 28697, 28701, - 28705, 28709, 28713, 28717, 28721, 28725, 28729, 28733, 28737, 28741, - 28745, 28749, 28753, 28757, 28761, 28765, 28769, 28773, 28777, 28781, - 28785, 28789, 28793, 28797, 28801, 28804, 28805, 28809, 28813, 28817, - 28821, 28825, 28829, 28833, 28837, 28841, 28845, 28849, 28853, 28857, - 28861, 28865, 28869, 28873, 28877, 28881, 28885, 28889, 28893, 28897, - 28901, 28905, 28909, 28913, 28917, 28921, 28925, 28929, 28933, 28937, - 28941, 28945, 28949, 28953, 28957, 28961, 28965, 28969, 28973, 28977, - 28981, 28985, 28989, 28993, 28997, 29001, 29005, 29009, 29013, 29017, - 29021, 29025, 29029, 29033, 29037, 29041, 29045, 29049, 29053, 29057, - 29061, 29065, 29069, 29073, 29077, 29081, 29085, 29088, 29089, 29093, - 29096, 29096, 29097, 29100, 29100, 29101, 29105, 29108, 29108, 29109, - 29113, 29117, 29121, 29124, 29125, 29129, 29133, 29137, 29141, 29145, - 29149, 29153, 29157, 29161, 29165, 29169, 29172, 29173, 29176, 29177, - 29181, 29185, 29189, 29193, 29197, 29201, 29204, 29205, 29209, 29213, - 29217, 29221, 29225, 29229, 29233, 29237, 29241, 29245, 29249, 29253, - 29257, 29261, 29265, 29269, 29273, 29277, 29281, 29285, 29289, 29293, - 29297, 29301, 29305, 29309, 29313, 29317, 29321, 29325, 29329, 29333, - 29337, 29341, 29345, 29349, 29353, 29357, 29361, 29365, 29369, 29373, - 29377, 29381, 29385, 29389, 29393, 29397, 29401, 29405, 29409, 29413, - 29417, 29421, 29425, 29429, 29433, 29437, 29441}, - {29441, 29445, 29449, 29453, 29457, 29461, 29464, 29465, 29469, 29473, - 29477, 29480, 29480, 29481, 29485, 29489, 29493, 29497, 29501, 29505, - 29509, 29512, 29513, 29517, 29521, 29525, 29529, 29533, 29537, 29540, - 29541, 29545, 29549, 29553, 29557, 29561, 29565, 29569, 29573, 29577, - 29581, 29585, 29589, 29593, 29597, 29601, 29605, 29609, 29613, 29617, - 29621, 29625, 29629, 29633, 29637, 29641, 29645, 29649, 29652, 29653, - 29657, 29661, 29665, 29668, 29669, 29673, 29677, 29681, 29685, 29688, - 29689, 29692, 29692, 29692, 29693, 29697, 29701, 29705, 29709, 29713, - 29717, 29720, 29721, 29725, 29729, 29733, 29737, 29741, 29745, 29749, - 29753, 29757, 29761, 29765, 29769, 29773, 29777, 29781, 29785, 29789, - 29793, 29797, 29801, 29805, 29809, 29813, 29817, 29821, 29825, 29829, - 29833, 29837, 29841, 29845, 29849, 29853, 29857, 29861, 29865, 29869, - 29873, 29877, 29881, 29885, 29889, 29893, 29897, 29901, 29905, 29909, - 29913, 29917, 29921, 29925, 29929, 29933, 29937, 29941, 29945, 29949, - 29953, 29957, 29961, 29965, 29969, 29973, 29977, 29981, 29985, 29989, - 29993, 29997, 30001, 30005, 30009, 30013, 30017, 30021, 30025, 30029, - 30033, 30037, 30041, 30045, 30049, 30053, 30057, 30061, 30065, 30069, - 30073, 30077, 30081, 30085, 30089, 30093, 30097, 30101, 30105, 30109, - 30113, 30117, 30121, 30125, 30129, 30133, 30137, 30141, 30145, 30149, - 30153, 30157, 30161, 30165, 30169, 30173, 30177, 30181, 30185, 30189, - 30193, 30197, 30201, 30205, 30209, 30213, 30217, 30221, 30225, 30229, - 30233, 30237, 30241, 30245, 30249, 30253, 30257, 30261, 30265, 30269, - 30273, 30277, 30281, 30285, 30289, 30293, 30297, 30301, 30305, 30309, - 30313, 30317, 30321, 30325, 30329, 30333, 30337, 30341, 30345, 30349, - 30353, 30357, 30361, 30365, 30369, 30373, 30377, 30381, 30385, 30389, - 30393, 30397, 30401, 30405, 30409, 30413, 30417}, - {30417, 30421, 30425, 30429, 30433, 30437, 30441, 30445, 30449, 30453, - 30457, 30461, 30465, 30469, 30473, 30477, 30481, 30485, 30489, 30493, - 30497, 30501, 30505, 30509, 30513, 30517, 30521, 30525, 30529, 30533, - 30537, 30541, 30545, 30549, 30553, 30557, 30561, 30565, 30569, 30573, - 30577, 30581, 30585, 30589, 30593, 30597, 30601, 30605, 30609, 30613, - 30617, 30621, 30625, 30629, 30633, 30637, 30641, 30645, 30649, 30653, - 30657, 30661, 30665, 30669, 30673, 30677, 30681, 30685, 30689, 30693, - 30697, 30701, 30705, 30709, 30713, 30717, 30721, 30725, 30729, 30733, - 30737, 30741, 30745, 30749, 30753, 30757, 30761, 30765, 30769, 30773, - 30777, 30781, 30785, 30789, 30793, 30797, 30801, 30805, 30809, 30813, - 30817, 30821, 30825, 30829, 30833, 30837, 30841, 30845, 30849, 30853, - 30857, 30861, 30865, 30869, 30873, 30877, 30881, 30885, 30889, 30893, - 30897, 30901, 30905, 30909, 30913, 30917, 30921, 30925, 30929, 30933, - 30937, 30941, 30945, 30949, 30953, 30957, 30961, 30965, 30969, 30973, - 30977, 30981, 30985, 30989, 30993, 30997, 31001, 31005, 31009, 31013, - 31017, 31021, 31025, 31029, 31033, 31037, 31041, 31045, 31049, 31053, - 31057, 31061, 31065, 31069, 31073, 31077, 31080, 31080, 31081, 31085, - 31089, 31093, 31097, 31101, 31105, 31109, 31113, 31117, 31121, 31125, - 31129, 31133, 31137, 31141, 31145, 31149, 31153, 31157, 31161, 31165, - 31169, 31173, 31177, 31181, 31185, 31189, 31193, 31197, 31201, 31205, - 31209, 31213, 31217, 31221, 31225, 31229, 31233, 31237, 31241, 31245, - 31249, 31253, 31257, 31261, 31265, 31269, 31273, 31277, 31281, 31285, - 31289, 31293, 31297, 31301, 31305, 31309, 31313, 31317, 31321, 31325, - 31329, 31333, 31337, 31341, 31345, 31349, 31353, 31357, 31361, 31365, - 31369, 31373, 31377, 31381, 31385, 31389, 31393, 31397, 31401, 31405, - 31409, 31413, 31417, 31421, 31425, 31429, 31433}, - {31433, 31437, 31441, 31445, 31449, 31453, 31457, 31461, 31465, 31469, - 31473, 31477, 31481, 31485, 31489, 31493, 31497, 31501, 31505, 31509, - 31513, 31517, 31521, 31525, 31529, 31533, 31537, 31541, 31545, 31549, - 31553, 31557, 31561, 31565, 31569, 31573, 31577, 31581, 31585, 31589, - 31593, 31597, 31601, 31605, 31609, 31613, 31617, 31621, 31625, 31629, - 31633, 31637, 31641, 31645, 31649, 31653, 31657, 31661, 31665, 31669, - 31673, 31677, 31681, 31685, 31689, 31693, 31697, 31701, 31705, 31709, - 31713, 31717, 31721, 31725, 31729, 31733, 31737, 31741, 31745, 31749, - 31753, 31757, 31761, 31765, 31769, 31773, 31777, 31781, 31785, 31789, - 31793, 31797, 31801, 31805, 31809, 31813, 31817, 31821, 31825, 31829, - 31833, 31837, 31841, 31845, 31849, 31853, 31857, 31861, 31865, 31869, - 31873, 31877, 31881, 31885, 31889, 31893, 31897, 31901, 31905, 31909, - 31913, 31917, 31921, 31925, 31929, 31933, 31937, 31941, 31945, 31949, - 31953, 31957, 31961, 31965, 31969, 31973, 31977, 31981, 31985, 31989, - 31993, 31997, 32001, 32005, 32009, 32013, 32017, 32021, 32025, 32029, - 32033, 32037, 32041, 32045, 32049, 32053, 32057, 32061, 32065, 32069, - 32073, 32077, 32081, 32085, 32089, 32093, 32097, 32101, 32105, 32109, - 32113, 32117, 32121, 32125, 32129, 32133, 32137, 32141, 32145, 32149, - 32153, 32157, 32161, 32165, 32169, 32173, 32177, 32181, 32185, 32189, - 32193, 32197, 32201, 32205, 32209, 32213, 32217, 32221, 32225, 32229, - 32233, 32237, 32241, 32245, 32248, 32248, 32249, 32253, 32257, 32261, - 32265, 32269, 32273, 32277, 32281, 32285, 32289, 32293, 32297, 32301, - 32305, 32309, 32313, 32317, 32321, 32325, 32329, 32333, 32337, 32341, - 32345, 32349, 32353, 32357, 32361, 32365, 32369, 32373, 32377, 32381, - 32385, 32389, 32393, 32397, 32401, 32405, 32409, 32413, 32417, 32421, - 32425, 32429, 32433, 32437, 32441, 32445, 32448}, - {32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, - 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, - 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, - 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, - 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32448, 32449, 32453, - 32457, 32461, 32465, 32469, 32473, 32477, 32481, 32485, 32489, 32493, - 32497, 32501, 32505, 32509, 32513, 32517, 32521, 32525, 32529, 32533, - 32537, 32541, 32545, 32549, 32553, 32557, 32561, 32565, 32569, 32573, - 32577, 32581, 32585, 32589, 32593, 32597, 32601, 32605, 32609, 32613, - 32617, 32621, 32625, 32629, 32633, 32637, 32641, 32645, 32649, 32653, - 32657, 32661, 32665, 32669, 32673, 32677, 32681, 32685, 32689, 32693, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696}, - {32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, 32696, - 32696, 32696, 32696, 32696, 32696, 32696, 32697}, - {32697, 32701, 32705, 32709, 32712, 32713, 32717, 32721, 32725, 32729, - 32733, 32737, 32741, 32745, 32749, 32753, 32757, 32761, 32765, 32769, - 32773, 32777, 32781, 32785, 32789, 32793, 32797, 32801, 32805, 32809, - 32813, 32817, 32820, 32821, 32825, 32828, 32829, 32832, 32832, 32833, - 32836, 32837, 32841, 32845, 32849, 32853, 32857, 32861, 32865, 32869, - 32873, 32876, 32877, 32881, 32885, 32889, 32892, 32893, 32896, 32897, - 32900, 32900, 32900, 32900, 32900, 32900, 32901, 32904, 32904, 32904, - 32904, 32905, 32908, 32909, 32912, 32913, 32916, 32917, 32921, 32925, - 32928, 32929, 32933, 32936, 32937, 32940, 32940, 32941, 32944, 32945, - 32948, 32949, 32952, 32953, 32956, 32957, 32960, 32961, 32965, 32968, - 32969, 32972, 32972, 32973, 32977, 32981, 32985, 32988, 32989, 32993, - 32997, 33001, 33005, 33009, 33013, 33016, 33017, 33021, 33025, 33029, - 33032, 33033, 33037, 33041, 33045, 33048, 33049, 33052, 33053, 33057, - 33061, 33065, 33069, 33073, 33077, 33081, 33085, 33089, 33092, 33093, - 33097, 33101, 33105, 33109, 33113, 33117, 33121, 33125, 33129, 33133, - 33137, 33141, 33145, 33149, 33153, 33157, 33160, 33160, 33160, 33160, - 33160, 33161, 33165, 33169, 33172, 33173, 33177, 33181, 33185, 33189, - 33192, 33193, 33197, 33201, 33205, 33209, 33213, 33217, 33221, 33225, - 33229, 33233, 33237, 33241, 33245, 33249, 33253, 33257, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260}, - {33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, 33260, - 33260, 33260, 33260, 33260, 33260, 33260, 33261}, - {33261, 33269, 33277, 33285, 33293, 33301, 33309, 33317, 33325, 33333, - 33341, 33348, 33348, 33348, 33348, 33348, 33349, 33361, 33373, 33385, - 33397, 33409, 33421, 33433, 33445, 33457, 33469, 33481, 33493, 33505, - 33517, 33529, 33541, 33553, 33565, 33577, 33589, 33601, 33613, 33625, - 33637, 33649, 33661, 33673, 33677, 33681, 33689, 33696, 33697, 33701, - 33705, 33709, 33713, 33717, 33721, 33725, 33729, 33733, 33737, 33741, - 33745, 33749, 33753, 33757, 33761, 33765, 33769, 33773, 33777, 33781, - 33785, 33789, 33793, 33797, 33801, 33809, 33817, 33825, 33833, 33845, - 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, - 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, 33852, - 33852, 33852, 33852, 33852, 33852, 33852, 33853, 33861, 33869, 33876, - 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, - 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, - 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, 33876, - 33876, 33876, 33876, 33876, 33877, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, 33884, - 33884, 33884, 33884, 33884, 33884, 33884, 33885}, - {33885, 33893, 33901, 33904, 33904, 33904, 33904, 33904, 33904, 33904, - 33904, 33904, 33904, 33904, 33904, 33904, 33905, 33909, 33913, 33917, - 33925, 33929, 33933, 33937, 33941, 33945, 33949, 33953, 33957, 33961, - 33965, 33969, 33973, 33977, 33981, 33985, 33989, 33993, 33997, 34001, - 34005, 34009, 34013, 34017, 34021, 34025, 34029, 34033, 34037, 34041, - 34045, 34049, 34053, 34057, 34061, 34065, 34069, 34073, 34077, 34081, - 34084, 34084, 34084, 34084, 34085, 34097, 34109, 34121, 34133, 34145, - 34157, 34169, 34181, 34192, 34192, 34192, 34192, 34192, 34192, 34192, - 34193, 34197, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200}, - {34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, 34200, - 34201, 34205, 34209, 34213, 34217, 34221, 34225, 34229, 34233, 34237, - 34240, 34240, 34240, 34240, 34240, 34240, 34240}, - {34240, 34244, 34248, 34252, 34256, 34260, 34264, 34268, 34272, 34276, - 34280, 34284, 34288, 34292, 34296, 34300, 34304, 34308, 34312, 34316, - 34320, 34324, 34328, 34332, 34336, 34340, 34344, 34348, 34352, 34356, - 34360, 34364, 34368, 34372, 34376, 34380, 34384, 34388, 34392, 34396, - 34400, 34404, 34408, 34412, 34416, 34420, 34424, 34428, 34432, 34436, - 34440, 34444, 34448, 34452, 34456, 34460, 34464, 34468, 34472, 34476, - 34480, 34484, 34488, 34492, 34496, 34500, 34504, 34508, 34512, 34516, - 34520, 34524, 34528, 34532, 34536, 34540, 34544, 34548, 34552, 34556, - 34560, 34564, 34568, 34572, 34576, 34580, 34584, 34588, 34592, 34596, - 34600, 34604, 34608, 34612, 34616, 34620, 34624, 34628, 34632, 34636, - 34640, 34644, 34648, 34652, 34656, 34660, 34664, 34668, 34672, 34676, - 34680, 34684, 34688, 34692, 34696, 34700, 34704, 34708, 34712, 34716, - 34720, 34724, 34728, 34732, 34736, 34740, 34744, 34748, 34752, 34756, - 34760, 34764, 34768, 34772, 34776, 34780, 34784, 34788, 34792, 34796, - 34800, 34804, 34808, 34812, 34816, 34820, 34824, 34828, 34832, 34836, - 34840, 34844, 34848, 34852, 34856, 34860, 34864, 34868, 34872, 34876, - 34880, 34884, 34888, 34892, 34896, 34900, 34904, 34908, 34912, 34916, - 34920, 34924, 34928, 34932, 34936, 34940, 34944, 34948, 34952, 34956, - 34960, 34964, 34968, 34972, 34976, 34980, 34984, 34988, 34992, 34996, - 35000, 35004, 35008, 35012, 35016, 35020, 35024, 35028, 35032, 35036, - 35040, 35044, 35048, 35052, 35056, 35060, 35064, 35068, 35072, 35076, - 35080, 35084, 35088, 35092, 35096, 35100, 35104, 35108, 35112, 35116, - 35120, 35124, 35128, 35132, 35136, 35140, 35144, 35148, 35152, 35156, - 35160, 35164, 35168, 35172, 35176, 35180, 35184, 35188, 35192, 35196, - 35200, 35204, 35208, 35212, 35216, 35220, 35224, 35228, 35232, 35236, - 35240, 35244, 35248, 35252, 35256, 35260, 35264}, - {35264, 35268, 35272, 35276, 35280, 35284, 35288, 35292, 35296, 35300, - 35304, 35308, 35312, 35316, 35320, 35324, 35328, 35332, 35336, 35340, - 35344, 35348, 35352, 35356, 35360, 35364, 35368, 35372, 35376, 35380, - 35384, 35388, 35392, 35396, 35400, 35404, 35408, 35412, 35416, 35420, - 35424, 35428, 35432, 35436, 35440, 35444, 35448, 35452, 35456, 35460, - 35464, 35468, 35472, 35476, 35480, 35484, 35488, 35492, 35496, 35500, - 35504, 35508, 35512, 35516, 35520, 35524, 35528, 35532, 35536, 35540, - 35544, 35548, 35552, 35556, 35560, 35564, 35568, 35572, 35576, 35580, - 35584, 35588, 35592, 35596, 35600, 35604, 35608, 35612, 35616, 35620, - 35624, 35628, 35632, 35636, 35640, 35644, 35648, 35652, 35656, 35660, - 35664, 35668, 35672, 35676, 35680, 35684, 35688, 35692, 35696, 35700, - 35704, 35708, 35712, 35716, 35720, 35724, 35728, 35732, 35736, 35740, - 35744, 35748, 35752, 35756, 35760, 35764, 35768, 35772, 35776, 35780, - 35784, 35788, 35792, 35796, 35800, 35804, 35808, 35812, 35816, 35820, - 35824, 35828, 35832, 35836, 35840, 35844, 35848, 35852, 35856, 35860, - 35864, 35868, 35872, 35876, 35880, 35884, 35888, 35892, 35896, 35900, - 35904, 35908, 35912, 35916, 35920, 35924, 35928, 35932, 35936, 35940, - 35944, 35948, 35952, 35956, 35960, 35964, 35968, 35972, 35976, 35980, - 35984, 35988, 35992, 35996, 36000, 36004, 36008, 36012, 36016, 36020, - 36024, 36028, 36032, 36036, 36040, 36044, 36048, 36052, 36056, 36060, - 36064, 36068, 36072, 36076, 36080, 36084, 36088, 36092, 36096, 36100, - 36104, 36108, 36112, 36116, 36120, 36124, 36128, 36132, 36136, 36140, - 36144, 36148, 36152, 36156, 36160, 36164, 36168, 36172, 36176, 36180, - 36184, 36188, 36192, 36196, 36200, 36204, 36208, 36212, 36216, 36220, - 36224, 36228, 36232, 36236, 36240, 36244, 36248, 36252, 36256, 36260, - 36264, 36268, 36272, 36276, 36280, 36284, 36288}, - {36288, 36292, 36296, 36300, 36304, 36308, 36312, 36316, 36320, 36324, - 36328, 36332, 36336, 36340, 36344, 36348, 36352, 36356, 36360, 36364, - 36368, 36372, 36376, 36380, 36384, 36388, 36392, 36396, 36400, 36404, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, 36408, - 36408, 36408, 36408, 36408, 36408, 36408, 36408}}; -const char32_t decomposition_data[9102] = { - 0, 32, 32, 776, 97, 32, 772, 50, 51, - 32, 769, 956, 32, 807, 49, 111, 49, 8260, - 52, 49, 8260, 50, 51, 8260, 52, 65, 768, - 65, 769, 65, 770, 65, 771, 65, 776, 65, - 778, 67, 807, 69, 768, 69, 769, 69, 770, - 69, 776, 73, 768, 73, 769, 73, 770, 73, - 776, 78, 771, 79, 768, 79, 769, 79, 770, - 79, 771, 79, 776, 85, 768, 85, 769, 85, - 770, 85, 776, 89, 769, 97, 768, 97, 769, - 97, 770, 97, 771, 97, 776, 97, 778, 99, - 807, 101, 768, 101, 769, 101, 770, 101, 776, - 105, 768, 105, 769, 105, 770, 105, 776, 110, - 771, 111, 768, 111, 769, 111, 770, 111, 771, - 111, 776, 117, 768, 117, 769, 117, 770, 117, - 776, 121, 769, 121, 776, 65, 772, 97, 772, - 65, 774, 97, 774, 65, 808, 97, 808, 67, - 769, 99, 769, 67, 770, 99, 770, 67, 775, - 99, 775, 67, 780, 99, 780, 68, 780, 100, - 780, 69, 772, 101, 772, 69, 774, 101, 774, - 69, 775, 101, 775, 69, 808, 101, 808, 69, - 780, 101, 780, 71, 770, 103, 770, 71, 774, - 103, 774, 71, 775, 103, 775, 71, 807, 103, - 807, 72, 770, 104, 770, 73, 771, 105, 771, - 73, 772, 105, 772, 73, 774, 105, 774, 73, - 808, 105, 808, 73, 775, 73, 74, 105, 106, - 74, 770, 106, 770, 75, 807, 107, 807, 76, - 769, 108, 769, 76, 807, 108, 807, 76, 780, - 108, 780, 76, 183, 108, 183, 78, 769, 110, - 769, 78, 807, 110, 807, 78, 780, 110, 780, - 700, 110, 79, 772, 111, 772, 79, 774, 111, - 774, 79, 779, 111, 779, 82, 769, 114, 769, - 82, 807, 114, 807, 82, 780, 114, 780, 83, - 769, 115, 769, 83, 770, 115, 770, 83, 807, - 115, 807, 83, 780, 115, 780, 84, 807, 116, - 807, 84, 780, 116, 780, 85, 771, 117, 771, - 85, 772, 117, 772, 85, 774, 117, 774, 85, - 778, 117, 778, 85, 779, 117, 779, 85, 808, - 117, 808, 87, 770, 119, 770, 89, 770, 121, - 770, 89, 776, 90, 769, 122, 769, 90, 775, - 122, 775, 90, 780, 122, 780, 115, 79, 795, - 111, 795, 85, 795, 117, 795, 68, 90, 780, - 68, 122, 780, 100, 122, 780, 76, 74, 76, - 106, 108, 106, 78, 74, 78, 106, 110, 106, - 65, 780, 97, 780, 73, 780, 105, 780, 79, - 780, 111, 780, 85, 780, 117, 780, 85, 776, - 772, 117, 776, 772, 85, 776, 769, 117, 776, - 769, 85, 776, 780, 117, 776, 780, 85, 776, - 768, 117, 776, 768, 65, 776, 772, 97, 776, - 772, 65, 775, 772, 97, 775, 772, 198, 772, - 230, 772, 71, 780, 103, 780, 75, 780, 107, - 780, 79, 808, 111, 808, 79, 808, 772, 111, - 808, 772, 439, 780, 658, 780, 106, 780, 68, - 90, 68, 122, 100, 122, 71, 769, 103, 769, - 78, 768, 110, 768, 65, 778, 769, 97, 778, - 769, 198, 769, 230, 769, 216, 769, 248, 769, - 65, 783, 97, 783, 65, 785, 97, 785, 69, - 783, 101, 783, 69, 785, 101, 785, 73, 783, - 105, 783, 73, 785, 105, 785, 79, 783, 111, - 783, 79, 785, 111, 785, 82, 783, 114, 783, - 82, 785, 114, 785, 85, 783, 117, 783, 85, - 785, 117, 785, 83, 806, 115, 806, 84, 806, - 116, 806, 72, 780, 104, 780, 65, 775, 97, - 775, 69, 807, 101, 807, 79, 776, 772, 111, - 776, 772, 79, 771, 772, 111, 771, 772, 79, - 775, 111, 775, 79, 775, 772, 111, 775, 772, - 89, 772, 121, 772, 104, 614, 106, 114, 633, - 635, 641, 119, 121, 32, 774, 32, 775, 32, - 778, 32, 808, 32, 771, 32, 779, 611, 108, - 115, 120, 661, 768, 769, 787, 776, 769, 697, - 32, 837, 59, 32, 769, 168, 769, 913, 769, - 183, 917, 769, 919, 769, 921, 769, 927, 769, - 933, 769, 937, 769, 953, 776, 769, 921, 776, - 933, 776, 945, 769, 949, 769, 951, 769, 953, - 769, 965, 776, 769, 953, 776, 965, 776, 959, - 769, 965, 769, 969, 769, 946, 952, 933, 978, - 769, 978, 776, 966, 960, 954, 961, 962, 920, - 949, 931, 1045, 768, 1045, 776, 1043, 769, 1030, - 776, 1050, 769, 1048, 768, 1059, 774, 1048, 774, - 1080, 774, 1077, 768, 1077, 776, 1075, 769, 1110, - 776, 1082, 769, 1080, 768, 1091, 774, 1140, 783, - 1141, 783, 1046, 774, 1078, 774, 1040, 774, 1072, - 774, 1040, 776, 1072, 776, 1045, 774, 1077, 774, - 1240, 776, 1241, 776, 1046, 776, 1078, 776, 1047, - 776, 1079, 776, 1048, 772, 1080, 772, 1048, 776, - 1080, 776, 1054, 776, 1086, 776, 1256, 776, 1257, - 776, 1069, 776, 1101, 776, 1059, 772, 1091, 772, - 1059, 776, 1091, 776, 1059, 779, 1091, 779, 1063, - 776, 1095, 776, 1067, 776, 1099, 776, 1381, 1410, - 1575, 1619, 1575, 1620, 1608, 1620, 1575, 1621, 1610, - 1620, 1575, 1652, 1608, 1652, 1735, 1652, 1610, 1652, - 1749, 1620, 1729, 1620, 1746, 1620, 2344, 2364, 2352, - 2364, 2355, 2364, 2325, 2364, 2326, 2364, 2327, 2364, - 2332, 2364, 2337, 2364, 2338, 2364, 2347, 2364, 2351, - 2364, 2503, 2494, 2503, 2519, 2465, 2492, 2466, 2492, - 2479, 2492, 2610, 2620, 2616, 2620, 2582, 2620, 2583, - 2620, 2588, 2620, 2603, 2620, 2887, 2902, 2887, 2878, - 2887, 2903, 2849, 2876, 2850, 2876, 2962, 3031, 3014, - 3006, 3015, 3006, 3014, 3031, 3142, 3158, 3263, 3285, - 3270, 3285, 3270, 3286, 3270, 3266, 3270, 3266, 3285, - 3398, 3390, 3399, 3390, 3398, 3415, 3545, 3530, 3545, - 3535, 3545, 3535, 3530, 3545, 3551, 3661, 3634, 3789, - 3762, 3755, 3737, 3755, 3745, 3851, 3906, 4023, 3916, - 4023, 3921, 4023, 3926, 4023, 3931, 4023, 3904, 4021, - 3953, 3954, 3953, 3956, 4018, 3968, 4018, 3953, 3968, - 4019, 3968, 4019, 3953, 3968, 3953, 3968, 3986, 4023, - 3996, 4023, 4001, 4023, 4006, 4023, 4011, 4023, 3984, - 4021, 4133, 4142, 4316, 6917, 6965, 6919, 6965, 6921, - 6965, 6923, 6965, 6925, 6965, 6929, 6965, 6970, 6965, - 6972, 6965, 6974, 6965, 6975, 6965, 6978, 6965, 65, - 198, 66, 68, 69, 398, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 546, 80, 82, 84, - 85, 87, 97, 592, 593, 7426, 98, 100, 101, - 601, 603, 604, 103, 107, 109, 331, 111, 596, - 7446, 7447, 112, 116, 117, 7453, 623, 118, 7461, - 946, 947, 948, 966, 967, 105, 114, 117, 118, - 946, 947, 961, 966, 967, 1085, 594, 99, 597, - 240, 604, 102, 607, 609, 613, 616, 617, 618, - 7547, 669, 621, 7557, 671, 625, 624, 626, 627, - 628, 629, 632, 642, 643, 427, 649, 650, 7452, - 651, 652, 122, 656, 657, 658, 952, 65, 805, - 97, 805, 66, 775, 98, 775, 66, 803, 98, - 803, 66, 817, 98, 817, 67, 807, 769, 99, - 807, 769, 68, 775, 100, 775, 68, 803, 100, - 803, 68, 817, 100, 817, 68, 807, 100, 807, - 68, 813, 100, 813, 69, 772, 768, 101, 772, - 768, 69, 772, 769, 101, 772, 769, 69, 813, - 101, 813, 69, 816, 101, 816, 69, 807, 774, - 101, 807, 774, 70, 775, 102, 775, 71, 772, - 103, 772, 72, 775, 104, 775, 72, 803, 104, - 803, 72, 776, 104, 776, 72, 807, 104, 807, - 72, 814, 104, 814, 73, 816, 105, 816, 73, - 776, 769, 105, 776, 769, 75, 769, 107, 769, - 75, 803, 107, 803, 75, 817, 107, 817, 76, - 803, 108, 803, 76, 803, 772, 108, 803, 772, - 76, 817, 108, 817, 76, 813, 108, 813, 77, - 769, 109, 769, 77, 775, 109, 775, 77, 803, - 109, 803, 78, 775, 110, 775, 78, 803, 110, - 803, 78, 817, 110, 817, 78, 813, 110, 813, - 79, 771, 769, 111, 771, 769, 79, 771, 776, - 111, 771, 776, 79, 772, 768, 111, 772, 768, - 79, 772, 769, 111, 772, 769, 80, 769, 112, - 769, 80, 775, 112, 775, 82, 775, 114, 775, - 82, 803, 114, 803, 82, 803, 772, 114, 803, - 772, 82, 817, 114, 817, 83, 775, 115, 775, - 83, 803, 115, 803, 83, 769, 775, 115, 769, - 775, 83, 780, 775, 115, 780, 775, 83, 803, - 775, 115, 803, 775, 84, 775, 116, 775, 84, - 803, 116, 803, 84, 817, 116, 817, 84, 813, - 116, 813, 85, 804, 117, 804, 85, 816, 117, - 816, 85, 813, 117, 813, 85, 771, 769, 117, - 771, 769, 85, 772, 776, 117, 772, 776, 86, - 771, 118, 771, 86, 803, 118, 803, 87, 768, - 119, 768, 87, 769, 119, 769, 87, 776, 119, - 776, 87, 775, 119, 775, 87, 803, 119, 803, - 88, 775, 120, 775, 88, 776, 120, 776, 89, - 775, 121, 775, 90, 770, 122, 770, 90, 803, - 122, 803, 90, 817, 122, 817, 104, 817, 116, - 776, 119, 778, 121, 778, 97, 702, 383, 775, - 65, 803, 97, 803, 65, 777, 97, 777, 65, - 770, 769, 97, 770, 769, 65, 770, 768, 97, - 770, 768, 65, 770, 777, 97, 770, 777, 65, - 770, 771, 97, 770, 771, 65, 803, 770, 97, - 803, 770, 65, 774, 769, 97, 774, 769, 65, - 774, 768, 97, 774, 768, 65, 774, 777, 97, - 774, 777, 65, 774, 771, 97, 774, 771, 65, - 803, 774, 97, 803, 774, 69, 803, 101, 803, - 69, 777, 101, 777, 69, 771, 101, 771, 69, - 770, 769, 101, 770, 769, 69, 770, 768, 101, - 770, 768, 69, 770, 777, 101, 770, 777, 69, - 770, 771, 101, 770, 771, 69, 803, 770, 101, - 803, 770, 73, 777, 105, 777, 73, 803, 105, - 803, 79, 803, 111, 803, 79, 777, 111, 777, - 79, 770, 769, 111, 770, 769, 79, 770, 768, - 111, 770, 768, 79, 770, 777, 111, 770, 777, - 79, 770, 771, 111, 770, 771, 79, 803, 770, - 111, 803, 770, 79, 795, 769, 111, 795, 769, - 79, 795, 768, 111, 795, 768, 79, 795, 777, - 111, 795, 777, 79, 795, 771, 111, 795, 771, - 79, 795, 803, 111, 795, 803, 85, 803, 117, - 803, 85, 777, 117, 777, 85, 795, 769, 117, - 795, 769, 85, 795, 768, 117, 795, 768, 85, - 795, 777, 117, 795, 777, 85, 795, 771, 117, - 795, 771, 85, 795, 803, 117, 795, 803, 89, - 768, 121, 768, 89, 803, 121, 803, 89, 777, - 121, 777, 89, 771, 121, 771, 945, 787, 945, - 788, 945, 787, 768, 945, 788, 768, 945, 787, - 769, 945, 788, 769, 945, 787, 834, 945, 788, - 834, 913, 787, 913, 788, 913, 787, 768, 913, - 788, 768, 913, 787, 769, 913, 788, 769, 913, - 787, 834, 913, 788, 834, 949, 787, 949, 788, - 949, 787, 768, 949, 788, 768, 949, 787, 769, - 949, 788, 769, 917, 787, 917, 788, 917, 787, - 768, 917, 788, 768, 917, 787, 769, 917, 788, - 769, 951, 787, 951, 788, 951, 787, 768, 951, - 788, 768, 951, 787, 769, 951, 788, 769, 951, - 787, 834, 951, 788, 834, 919, 787, 919, 788, - 919, 787, 768, 919, 788, 768, 919, 787, 769, - 919, 788, 769, 919, 787, 834, 919, 788, 834, - 953, 787, 953, 788, 953, 787, 768, 953, 788, - 768, 953, 787, 769, 953, 788, 769, 953, 787, - 834, 953, 788, 834, 921, 787, 921, 788, 921, - 787, 768, 921, 788, 768, 921, 787, 769, 921, - 788, 769, 921, 787, 834, 921, 788, 834, 959, - 787, 959, 788, 959, 787, 768, 959, 788, 768, - 959, 787, 769, 959, 788, 769, 927, 787, 927, - 788, 927, 787, 768, 927, 788, 768, 927, 787, - 769, 927, 788, 769, 965, 787, 965, 788, 965, - 787, 768, 965, 788, 768, 965, 787, 769, 965, - 788, 769, 965, 787, 834, 965, 788, 834, 933, - 788, 933, 788, 768, 933, 788, 769, 933, 788, - 834, 969, 787, 969, 788, 969, 787, 768, 969, - 788, 768, 969, 787, 769, 969, 788, 769, 969, - 787, 834, 969, 788, 834, 937, 787, 937, 788, - 937, 787, 768, 937, 788, 768, 937, 787, 769, - 937, 788, 769, 937, 787, 834, 937, 788, 834, - 945, 768, 945, 769, 949, 768, 949, 769, 951, - 768, 951, 769, 953, 768, 953, 769, 959, 768, - 959, 769, 965, 768, 965, 769, 969, 768, 969, - 769, 945, 787, 837, 945, 788, 837, 945, 787, - 768, 837, 945, 788, 768, 837, 945, 787, 769, - 837, 945, 788, 769, 837, 945, 787, 834, 837, - 945, 788, 834, 837, 913, 787, 837, 913, 788, - 837, 913, 787, 768, 837, 913, 788, 768, 837, - 913, 787, 769, 837, 913, 788, 769, 837, 913, - 787, 834, 837, 913, 788, 834, 837, 951, 787, - 837, 951, 788, 837, 951, 787, 768, 837, 951, - 788, 768, 837, 951, 787, 769, 837, 951, 788, - 769, 837, 951, 787, 834, 837, 951, 788, 834, - 837, 919, 787, 837, 919, 788, 837, 919, 787, - 768, 837, 919, 788, 768, 837, 919, 787, 769, - 837, 919, 788, 769, 837, 919, 787, 834, 837, - 919, 788, 834, 837, 969, 787, 837, 969, 788, - 837, 969, 787, 768, 837, 969, 788, 768, 837, - 969, 787, 769, 837, 969, 788, 769, 837, 969, - 787, 834, 837, 969, 788, 834, 837, 937, 787, - 837, 937, 788, 837, 937, 787, 768, 837, 937, - 788, 768, 837, 937, 787, 769, 837, 937, 788, - 769, 837, 937, 787, 834, 837, 937, 788, 834, - 837, 945, 774, 945, 772, 945, 768, 837, 945, - 837, 945, 769, 837, 945, 834, 945, 834, 837, - 913, 774, 913, 772, 913, 768, 913, 769, 913, - 837, 32, 787, 953, 32, 787, 32, 834, 168, - 834, 951, 768, 837, 951, 837, 951, 769, 837, - 951, 834, 951, 834, 837, 917, 768, 917, 769, - 919, 768, 919, 769, 919, 837, 8127, 768, 8127, - 769, 8127, 834, 953, 774, 953, 772, 953, 776, - 768, 953, 776, 769, 953, 834, 953, 776, 834, - 921, 774, 921, 772, 921, 768, 921, 769, 8190, - 768, 8190, 769, 8190, 834, 965, 774, 965, 772, - 965, 776, 768, 965, 776, 769, 961, 787, 961, - 788, 965, 834, 965, 776, 834, 933, 774, 933, - 772, 933, 768, 933, 769, 929, 788, 168, 768, - 168, 769, 96, 969, 768, 837, 969, 837, 969, - 769, 837, 969, 834, 969, 834, 837, 927, 768, - 927, 769, 937, 768, 937, 769, 937, 837, 180, - 32, 788, 8194, 8195, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 8208, 32, 819, 46, 46, - 46, 46, 46, 46, 32, 8242, 8242, 8242, 8242, - 8242, 8245, 8245, 8245, 8245, 8245, 33, 33, 32, - 773, 63, 63, 63, 33, 33, 63, 8242, 8242, - 8242, 8242, 32, 48, 105, 52, 53, 54, 55, - 56, 57, 43, 8722, 61, 40, 41, 110, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, - 43, 8722, 61, 40, 41, 97, 101, 111, 120, - 601, 104, 107, 108, 109, 110, 112, 115, 116, - 82, 115, 97, 47, 99, 97, 47, 115, 67, - 176, 67, 99, 47, 111, 99, 47, 117, 400, - 176, 70, 103, 72, 72, 72, 104, 295, 73, - 73, 76, 108, 78, 78, 111, 80, 81, 82, - 82, 82, 83, 77, 84, 69, 76, 84, 77, - 90, 937, 90, 75, 65, 778, 66, 67, 101, - 69, 70, 77, 111, 1488, 1489, 1490, 1491, 105, - 70, 65, 88, 960, 947, 915, 928, 8721, 68, - 100, 101, 105, 106, 49, 8260, 55, 49, 8260, - 57, 49, 8260, 49, 48, 49, 8260, 51, 50, - 8260, 51, 49, 8260, 53, 50, 8260, 53, 51, - 8260, 53, 52, 8260, 53, 49, 8260, 54, 53, - 8260, 54, 49, 8260, 56, 51, 8260, 56, 53, - 8260, 56, 55, 8260, 56, 49, 8260, 73, 73, - 73, 73, 73, 73, 73, 86, 86, 86, 73, - 86, 73, 73, 86, 73, 73, 73, 73, 88, - 88, 88, 73, 88, 73, 73, 76, 67, 68, - 77, 105, 105, 105, 105, 105, 105, 105, 118, - 118, 118, 105, 118, 105, 105, 118, 105, 105, - 105, 105, 120, 120, 120, 105, 120, 105, 105, - 108, 99, 100, 109, 48, 8260, 51, 8592, 824, - 8594, 824, 8596, 824, 8656, 824, 8660, 824, 8658, - 824, 8707, 824, 8712, 824, 8715, 824, 8739, 824, - 8741, 824, 8747, 8747, 8747, 8747, 8747, 8750, 8750, - 8750, 8750, 8750, 8764, 824, 8771, 824, 8773, 824, - 8776, 824, 61, 824, 8801, 824, 8781, 824, 60, - 824, 62, 824, 8804, 824, 8805, 824, 8818, 824, - 8819, 824, 8822, 824, 8823, 824, 8826, 824, 8827, - 824, 8834, 824, 8835, 824, 8838, 824, 8839, 824, - 8866, 824, 8872, 824, 8873, 824, 8875, 824, 8828, - 824, 8829, 824, 8849, 824, 8850, 824, 8882, 824, - 8883, 824, 8884, 824, 8885, 824, 12296, 12297, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 49, - 48, 49, 49, 49, 50, 49, 51, 49, 52, - 49, 53, 49, 54, 49, 55, 49, 56, 49, - 57, 50, 48, 40, 49, 41, 40, 50, 41, - 40, 51, 41, 40, 52, 41, 40, 53, 41, - 40, 54, 41, 40, 55, 41, 40, 56, 41, - 40, 57, 41, 40, 49, 48, 41, 40, 49, - 49, 41, 40, 49, 50, 41, 40, 49, 51, - 41, 40, 49, 52, 41, 40, 49, 53, 41, - 40, 49, 54, 41, 40, 49, 55, 41, 40, - 49, 56, 41, 40, 49, 57, 41, 40, 50, - 48, 41, 49, 46, 50, 46, 51, 46, 52, - 46, 53, 46, 54, 46, 55, 46, 56, 46, - 57, 46, 49, 48, 46, 49, 49, 46, 49, - 50, 46, 49, 51, 46, 49, 52, 46, 49, - 53, 46, 49, 54, 46, 49, 55, 46, 49, - 56, 46, 49, 57, 46, 50, 48, 46, 40, - 97, 41, 40, 98, 41, 40, 99, 41, 40, - 100, 41, 40, 101, 41, 40, 102, 41, 40, - 103, 41, 40, 104, 41, 40, 105, 41, 40, - 106, 41, 40, 107, 41, 40, 108, 41, 40, - 109, 41, 40, 110, 41, 40, 111, 41, 40, - 112, 41, 40, 113, 41, 40, 114, 41, 40, - 115, 41, 40, 116, 41, 40, 117, 41, 40, - 118, 41, 40, 119, 41, 40, 120, 41, 40, - 121, 41, 40, 122, 41, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 48, 8747, 8747, 8747, 8747, 58, - 58, 61, 61, 61, 61, 61, 61, 10973, 824, - 106, 86, 11617, 27597, 40863, 19968, 20008, 20022, 20031, - 20057, 20101, 20108, 20128, 20154, 20799, 20837, 20843, 20866, - 20886, 20907, 20960, 20981, 20992, 21147, 21241, 21269, 21274, - 21304, 21313, 21340, 21353, 21378, 21430, 21448, 21475, 22231, - 22303, 22763, 22786, 22794, 22805, 22823, 22899, 23376, 23424, - 23544, 23567, 23586, 23608, 23662, 23665, 24027, 24037, 24049, - 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, 24400, - 24417, 24435, 24515, 25096, 25142, 25163, 25903, 25908, 25991, - 26007, 26020, 26041, 26080, 26085, 26352, 26376, 26408, 27424, - 27490, 27513, 27571, 27595, 27604, 27611, 27663, 27668, 27700, - 28779, 29226, 29238, 29243, 29247, 29255, 29273, 29275, 29356, - 29572, 29577, 29916, 29926, 29976, 29983, 29992, 30000, 30091, - 30098, 30326, 30333, 30382, 30399, 30446, 30683, 30690, 30707, - 31034, 31160, 31166, 31348, 31435, 31481, 31859, 31992, 32566, - 32593, 32650, 32701, 32769, 32780, 32786, 32819, 32895, 32905, - 33251, 33258, 33267, 33276, 33292, 33307, 33311, 33390, 33394, - 33400, 34381, 34411, 34880, 34892, 34915, 35198, 35211, 35282, - 35328, 35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, - 36523, 36554, 36763, 36784, 36789, 37009, 37193, 37318, 37324, - 37329, 38263, 38272, 38428, 38582, 38585, 38632, 38737, 38750, - 38754, 38761, 38859, 38893, 38899, 38913, 39080, 39131, 39135, - 39318, 39321, 39340, 39592, 39640, 39647, 39717, 39727, 39730, - 39740, 39770, 40165, 40565, 40575, 40613, 40635, 40643, 40653, - 40657, 40697, 40701, 40718, 40723, 40736, 40763, 40778, 40786, - 40845, 40860, 40864, 32, 12306, 21313, 21316, 21317, 12363, - 12441, 12365, 12441, 12367, 12441, 12369, 12441, 12371, 12441, - 12373, 12441, 12375, 12441, 12377, 12441, 12379, 12441, 12381, - 12441, 12383, 12441, 12385, 12441, 12388, 12441, 12390, 12441, - 12392, 12441, 12399, 12441, 12399, 12442, 12402, 12441, 12402, - 12442, 12405, 12441, 12405, 12442, 12408, 12441, 12408, 12442, - 12411, 12441, 12411, 12442, 12358, 12441, 32, 12441, 32, - 12442, 12445, 12441, 12424, 12426, 12459, 12441, 12461, 12441, - 12463, 12441, 12465, 12441, 12467, 12441, 12469, 12441, 12471, - 12441, 12473, 12441, 12475, 12441, 12477, 12441, 12479, 12441, - 12481, 12441, 12484, 12441, 12486, 12441, 12488, 12441, 12495, - 12441, 12495, 12442, 12498, 12441, 12498, 12442, 12501, 12441, - 12501, 12442, 12504, 12441, 12504, 12442, 12507, 12441, 12507, - 12442, 12454, 12441, 12527, 12441, 12528, 12441, 12529, 12441, - 12530, 12441, 12541, 12441, 12467, 12488, 4352, 4353, 4522, - 4354, 4524, 4525, 4355, 4356, 4357, 4528, 4529, 4530, - 4531, 4532, 4533, 4378, 4358, 4359, 4360, 4385, 4361, - 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, - 4449, 4450, 4451, 4452, 4453, 4454, 4455, 4456, 4457, - 4458, 4459, 4460, 4461, 4462, 4463, 4464, 4465, 4466, - 4467, 4468, 4469, 4448, 4372, 4373, 4551, 4552, 4556, - 4558, 4563, 4567, 4569, 4380, 4573, 4575, 4381, 4382, - 4384, 4386, 4387, 4391, 4393, 4395, 4396, 4397, 4398, - 4399, 4402, 4406, 4416, 4423, 4428, 4593, 4594, 4439, - 4440, 4441, 4484, 4485, 4488, 4497, 4498, 4500, 4510, - 4513, 19968, 20108, 19977, 22235, 19978, 20013, 19979, 30002, - 20057, 19993, 19969, 22825, 22320, 20154, 40, 4352, 41, - 40, 4354, 41, 40, 4355, 41, 40, 4357, 41, - 40, 4358, 41, 40, 4359, 41, 40, 4361, 41, - 40, 4363, 41, 40, 4364, 41, 40, 4366, 41, - 40, 4367, 41, 40, 4368, 41, 40, 4369, 41, - 40, 4370, 41, 40, 4352, 4449, 41, 40, 4354, - 4449, 41, 40, 4355, 4449, 41, 40, 4357, 4449, - 41, 40, 4358, 4449, 41, 40, 4359, 4449, 41, - 40, 4361, 4449, 41, 40, 4363, 4449, 41, 40, - 4364, 4449, 41, 40, 4366, 4449, 41, 40, 4367, - 4449, 41, 40, 4368, 4449, 41, 40, 4369, 4449, - 41, 40, 4370, 4449, 41, 40, 4364, 4462, 41, - 40, 4363, 4457, 4364, 4453, 4523, 41, 40, 4363, - 4457, 4370, 4462, 41, 40, 19968, 41, 40, 20108, - 41, 40, 19977, 41, 40, 22235, 41, 40, 20116, - 41, 40, 20845, 41, 40, 19971, 41, 40, 20843, - 41, 40, 20061, 41, 40, 21313, 41, 40, 26376, - 41, 40, 28779, 41, 40, 27700, 41, 40, 26408, - 41, 40, 37329, 41, 40, 22303, 41, 40, 26085, - 41, 40, 26666, 41, 40, 26377, 41, 40, 31038, - 41, 40, 21517, 41, 40, 29305, 41, 40, 36001, - 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, - 41, 40, 21628, 41, 40, 23398, 41, 40, 30435, - 41, 40, 20225, 41, 40, 36039, 41, 40, 21332, - 41, 40, 31085, 41, 40, 20241, 41, 40, 33258, - 41, 40, 33267, 41, 21839, 24188, 25991, 31631, 80, - 84, 69, 50, 49, 50, 50, 50, 51, 50, - 52, 50, 53, 50, 54, 50, 55, 50, 56, - 50, 57, 51, 48, 51, 49, 51, 50, 51, - 51, 51, 52, 51, 53, 4352, 4354, 4355, 4357, - 4358, 4359, 4361, 4363, 4364, 4366, 4367, 4368, 4369, - 4370, 4352, 4449, 4354, 4449, 4355, 4449, 4357, 4449, - 4358, 4449, 4359, 4449, 4361, 4449, 4363, 4449, 4364, - 4449, 4366, 4449, 4367, 4449, 4368, 4449, 4369, 4449, - 4370, 4449, 4366, 4449, 4535, 4352, 4457, 4364, 4462, - 4363, 4468, 4363, 4462, 19968, 20108, 19977, 22235, 20116, - 20845, 19971, 20843, 20061, 21313, 26376, 28779, 27700, 26408, - 37329, 22303, 26085, 26666, 26377, 31038, 21517, 29305, 36001, - 31069, 21172, 31192, 30007, 22899, 36969, 20778, 21360, 27880, - 38917, 20241, 20889, 27491, 19978, 20013, 19979, 24038, 21491, - 21307, 23447, 23398, 30435, 20225, 36039, 21332, 22812, 51, - 54, 51, 55, 51, 56, 51, 57, 52, 48, - 52, 49, 52, 50, 52, 51, 52, 52, 52, - 53, 52, 54, 52, 55, 52, 56, 52, 57, - 53, 48, 49, 26376, 50, 26376, 51, 26376, 52, - 26376, 53, 26376, 54, 26376, 55, 26376, 56, 26376, - 57, 26376, 49, 48, 26376, 49, 49, 26376, 49, - 50, 26376, 72, 103, 101, 114, 103, 101, 86, - 76, 84, 68, 12450, 12452, 12454, 12456, 12458, 12459, - 12461, 12463, 12465, 12467, 12469, 12471, 12473, 12475, 12477, - 12479, 12481, 12484, 12486, 12488, 12490, 12491, 12492, 12493, - 12494, 12495, 12498, 12501, 12504, 12507, 12510, 12511, 12512, - 12513, 12514, 12516, 12518, 12520, 12521, 12522, 12523, 12524, - 12525, 12527, 12528, 12529, 12530, 20196, 21644, 12450, 12495, - 12442, 12540, 12488, 12450, 12523, 12501, 12449, 12450, 12531, - 12504, 12442, 12450, 12450, 12540, 12523, 12452, 12491, 12531, - 12463, 12441, 12452, 12531, 12481, 12454, 12457, 12531, 12456, - 12473, 12463, 12540, 12488, 12441, 12456, 12540, 12459, 12540, - 12458, 12531, 12473, 12458, 12540, 12512, 12459, 12452, 12522, - 12459, 12521, 12483, 12488, 12459, 12525, 12522, 12540, 12459, - 12441, 12525, 12531, 12459, 12441, 12531, 12510, 12461, 12441, - 12459, 12441, 12461, 12441, 12491, 12540, 12461, 12517, 12522, - 12540, 12461, 12441, 12523, 12479, 12441, 12540, 12461, 12525, - 12461, 12525, 12463, 12441, 12521, 12512, 12461, 12525, 12513, - 12540, 12488, 12523, 12461, 12525, 12527, 12483, 12488, 12463, - 12441, 12521, 12512, 12463, 12441, 12521, 12512, 12488, 12531, - 12463, 12523, 12475, 12441, 12452, 12525, 12463, 12525, 12540, - 12493, 12465, 12540, 12473, 12467, 12523, 12490, 12467, 12540, - 12507, 12442, 12469, 12452, 12463, 12523, 12469, 12531, 12481, - 12540, 12512, 12471, 12522, 12531, 12463, 12441, 12475, 12531, - 12481, 12475, 12531, 12488, 12479, 12441, 12540, 12473, 12486, - 12441, 12471, 12488, 12441, 12523, 12488, 12531, 12490, 12494, - 12494, 12483, 12488, 12495, 12452, 12484, 12495, 12442, 12540, - 12475, 12531, 12488, 12495, 12442, 12540, 12484, 12495, 12441, - 12540, 12524, 12523, 12498, 12442, 12450, 12473, 12488, 12523, - 12498, 12442, 12463, 12523, 12498, 12442, 12467, 12498, 12441, - 12523, 12501, 12449, 12521, 12483, 12488, 12441, 12501, 12451, - 12540, 12488, 12501, 12441, 12483, 12471, 12455, 12523, 12501, - 12521, 12531, 12504, 12463, 12479, 12540, 12523, 12504, 12442, - 12477, 12504, 12442, 12491, 12498, 12504, 12523, 12484, 12504, - 12442, 12531, 12473, 12504, 12442, 12540, 12471, 12441, 12504, - 12441, 12540, 12479, 12507, 12442, 12452, 12531, 12488, 12507, - 12441, 12523, 12488, 12507, 12531, 12507, 12442, 12531, 12488, - 12441, 12507, 12540, 12523, 12507, 12540, 12531, 12510, 12452, - 12463, 12525, 12510, 12452, 12523, 12510, 12483, 12495, 12510, - 12523, 12463, 12510, 12531, 12471, 12519, 12531, 12511, 12463, - 12525, 12531, 12511, 12522, 12511, 12522, 12495, 12441, 12540, - 12523, 12513, 12459, 12441, 12513, 12459, 12441, 12488, 12531, - 12513, 12540, 12488, 12523, 12516, 12540, 12488, 12441, 12516, - 12540, 12523, 12518, 12450, 12531, 12522, 12483, 12488, 12523, - 12522, 12521, 12523, 12498, 12442, 12540, 12523, 12540, 12501, - 12441, 12523, 12524, 12512, 12524, 12531, 12488, 12465, 12441, - 12531, 12527, 12483, 12488, 48, 28857, 49, 28857, 50, - 28857, 51, 28857, 52, 28857, 53, 28857, 54, 28857, - 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, - 49, 49, 28857, 49, 50, 28857, 49, 51, 28857, - 49, 52, 28857, 49, 53, 28857, 49, 54, 28857, - 49, 55, 28857, 49, 56, 28857, 49, 57, 28857, - 50, 48, 28857, 50, 49, 28857, 50, 50, 28857, - 50, 51, 28857, 50, 52, 28857, 104, 80, 97, - 100, 97, 65, 85, 98, 97, 114, 111, 86, - 112, 99, 100, 109, 100, 109, 50, 100, 109, - 51, 73, 85, 24179, 25104, 26157, 21644, 22823, 27491, - 26126, 27835, 26666, 24335, 20250, 31038, 112, 65, 110, - 65, 956, 65, 109, 65, 107, 65, 75, 66, - 77, 66, 71, 66, 99, 97, 108, 107, 99, - 97, 108, 112, 70, 110, 70, 956, 70, 956, - 103, 109, 103, 107, 103, 72, 122, 107, 72, - 122, 77, 72, 122, 71, 72, 122, 84, 72, - 122, 956, 108, 109, 108, 100, 108, 107, 108, - 102, 109, 110, 109, 956, 109, 109, 109, 99, - 109, 107, 109, 109, 109, 50, 99, 109, 50, - 109, 50, 107, 109, 50, 109, 109, 51, 99, - 109, 51, 109, 51, 107, 109, 51, 109, 8725, - 115, 109, 8725, 115, 50, 80, 97, 107, 80, - 97, 77, 80, 97, 71, 80, 97, 114, 97, - 100, 114, 97, 100, 8725, 115, 114, 97, 100, - 8725, 115, 50, 112, 115, 110, 115, 956, 115, - 109, 115, 112, 86, 110, 86, 956, 86, 109, - 86, 107, 86, 77, 86, 112, 87, 110, 87, - 956, 87, 109, 87, 107, 87, 77, 87, 107, - 937, 77, 937, 97, 46, 109, 46, 66, 113, - 99, 99, 99, 100, 67, 8725, 107, 103, 67, - 111, 46, 100, 66, 71, 121, 104, 97, 72, - 80, 105, 110, 75, 75, 75, 77, 107, 116, - 108, 109, 108, 110, 108, 111, 103, 108, 120, - 109, 98, 109, 105, 108, 109, 111, 108, 80, - 72, 112, 46, 109, 46, 80, 80, 77, 80, - 82, 115, 114, 83, 118, 87, 98, 86, 8725, - 109, 65, 8725, 109, 49, 26085, 50, 26085, 51, - 26085, 52, 26085, 53, 26085, 54, 26085, 55, 26085, - 56, 26085, 57, 26085, 49, 48, 26085, 49, 49, - 26085, 49, 50, 26085, 49, 51, 26085, 49, 52, - 26085, 49, 53, 26085, 49, 54, 26085, 49, 55, - 26085, 49, 56, 26085, 49, 57, 26085, 50, 48, - 26085, 50, 49, 26085, 50, 50, 26085, 50, 51, - 26085, 50, 52, 26085, 50, 53, 26085, 50, 54, - 26085, 50, 55, 26085, 50, 56, 26085, 50, 57, - 26085, 51, 48, 26085, 51, 49, 26085, 103, 97, - 108, 1098, 1100, 42863, 67, 70, 81, 294, 339, - 42791, 43831, 619, 43858, 653, 35912, 26356, 36554, 36040, - 28369, 20018, 21477, 40860, 40860, 22865, 37329, 21895, 22856, - 25078, 30313, 32645, 34367, 34746, 35064, 37007, 27138, 27931, - 28889, 29662, 33853, 37226, 39409, 20098, 21365, 27396, 29211, - 34349, 40478, 23888, 28651, 34253, 35172, 25289, 33240, 34847, - 24266, 26391, 28010, 29436, 37070, 20358, 20919, 21214, 25796, - 27347, 29200, 30439, 32769, 34310, 34396, 36335, 38706, 39791, - 40442, 30860, 31103, 32160, 33737, 37636, 40575, 35542, 22751, - 24324, 31840, 32894, 29282, 30922, 36034, 38647, 22744, 23650, - 27155, 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956, - 20940, 31260, 32190, 33777, 38517, 35712, 25295, 27138, 35582, - 20025, 23527, 24594, 29575, 30064, 21271, 30971, 20415, 24489, - 19981, 27852, 25976, 32034, 21443, 22622, 30465, 33865, 35498, - 27578, 36784, 27784, 25342, 33509, 25504, 30053, 20142, 20841, - 20937, 26753, 31975, 33391, 35538, 37327, 21237, 21570, 22899, - 24300, 26053, 28670, 31018, 38317, 39530, 40599, 40654, 21147, - 26310, 27511, 36706, 24180, 24976, 25088, 25754, 28451, 29001, - 29833, 31178, 32244, 32879, 36646, 34030, 36899, 37706, 21015, - 21155, 21693, 28872, 35010, 35498, 24265, 24565, 25467, 27566, - 31806, 29557, 20196, 22265, 23527, 23994, 24604, 29618, 29801, - 32666, 32838, 37428, 38646, 38728, 38936, 20363, 31150, 37300, - 38584, 24801, 20102, 20698, 23534, 23615, 26009, 27138, 29134, - 30274, 34044, 36988, 40845, 26248, 38446, 21129, 26491, 26611, - 27969, 28316, 29705, 30041, 30827, 32016, 39006, 20845, 25134, - 38520, 20523, 23833, 28138, 36650, 24459, 24900, 26647, 29575, - 38534, 21033, 21519, 23653, 26131, 26446, 26792, 27877, 29702, - 30178, 32633, 35023, 35041, 37324, 38626, 21311, 28346, 21533, - 29136, 29848, 34298, 38563, 40023, 40607, 26519, 28107, 33256, - 31435, 31520, 31890, 29376, 28825, 35672, 20160, 33590, 21050, - 20999, 24230, 25299, 31958, 23429, 27934, 26292, 36667, 34892, - 38477, 35211, 24275, 20800, 21952, 22618, 26228, 20958, 29482, - 30410, 31036, 31070, 31077, 31119, 38742, 31934, 32701, 34322, - 35576, 36920, 37117, 39151, 39164, 39208, 40372, 37086, 38583, - 20398, 20711, 20813, 21193, 21220, 21329, 21917, 22022, 22120, - 22592, 22696, 23652, 23662, 24724, 24936, 24974, 25074, 25935, - 26082, 26257, 26757, 28023, 28186, 28450, 29038, 29227, 29730, - 30865, 31038, 31049, 31048, 31056, 31062, 31069, 31117, 31118, - 31296, 31361, 31680, 32244, 32265, 32321, 32626, 32773, 33261, - 33401, 33401, 33879, 35088, 35222, 35585, 35641, 36051, 36104, - 36790, 36920, 38627, 38911, 38971, 24693, 148206, 33304, 20006, - 20917, 20840, 20352, 20805, 20864, 21191, 21242, 21917, 21845, - 21913, 21986, 22618, 22707, 22852, 22868, 23138, 23336, 24274, - 24281, 24425, 24493, 24792, 24910, 24840, 24974, 24928, 25074, - 25140, 25540, 25628, 25682, 25942, 26228, 26391, 26395, 26454, - 27513, 27578, 27969, 28379, 28363, 28450, 28702, 29038, 30631, - 29237, 29359, 29482, 29809, 29958, 30011, 30237, 30239, 30410, - 30427, 30452, 30538, 30528, 30924, 31409, 31680, 31867, 32091, - 32244, 32574, 32773, 33618, 33775, 34681, 35137, 35206, 35222, - 35519, 35576, 35531, 35585, 35582, 35565, 35641, 35722, 36104, - 36664, 36978, 37273, 37494, 38524, 38627, 38742, 38875, 38911, - 38923, 38971, 39698, 40860, 141386, 141380, 144341, 15261, 16408, - 16441, 152137, 154832, 163539, 40771, 40846, 102, 102, 102, - 105, 102, 108, 102, 102, 105, 102, 102, 108, - 115, 116, 115, 116, 1396, 1398, 1396, 1381, 1396, - 1387, 1406, 1398, 1396, 1389, 1497, 1460, 1522, 1463, - 1506, 1488, 1491, 1492, 1499, 1500, 1501, 1512, 1514, - 43, 1513, 1473, 1513, 1474, 1513, 1468, 1473, 1513, - 1468, 1474, 1488, 1463, 1488, 1464, 1488, 1468, 1489, - 1468, 1490, 1468, 1491, 1468, 1492, 1468, 1493, 1468, - 1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499, - 1468, 1500, 1468, 1502, 1468, 1504, 1468, 1505, 1468, - 1507, 1468, 1508, 1468, 1510, 1468, 1511, 1468, 1512, - 1468, 1513, 1468, 1514, 1468, 1493, 1465, 1489, 1471, - 1499, 1471, 1508, 1471, 1488, 1500, 1649, 1649, 1659, - 1659, 1659, 1659, 1662, 1662, 1662, 1662, 1664, 1664, - 1664, 1664, 1658, 1658, 1658, 1658, 1663, 1663, 1663, - 1663, 1657, 1657, 1657, 1657, 1700, 1700, 1700, 1700, - 1702, 1702, 1702, 1702, 1668, 1668, 1668, 1668, 1667, - 1667, 1667, 1667, 1670, 1670, 1670, 1670, 1671, 1671, - 1671, 1671, 1677, 1677, 1676, 1676, 1678, 1678, 1672, - 1672, 1688, 1688, 1681, 1681, 1705, 1705, 1705, 1705, - 1711, 1711, 1711, 1711, 1715, 1715, 1715, 1715, 1713, - 1713, 1713, 1713, 1722, 1722, 1723, 1723, 1723, 1723, - 1749, 1620, 1749, 1620, 1729, 1729, 1729, 1729, 1726, - 1726, 1726, 1726, 1746, 1746, 1746, 1620, 1746, 1620, - 1709, 1709, 1709, 1709, 1735, 1735, 1734, 1734, 1736, - 1736, 1735, 1652, 1739, 1739, 1733, 1733, 1737, 1737, - 1744, 1744, 1744, 1744, 1609, 1609, 1610, 1620, 1575, - 1610, 1620, 1575, 1610, 1620, 1749, 1610, 1620, 1749, - 1610, 1620, 1608, 1610, 1620, 1608, 1610, 1620, 1735, - 1610, 1620, 1735, 1610, 1620, 1734, 1610, 1620, 1734, - 1610, 1620, 1736, 1610, 1620, 1736, 1610, 1620, 1744, - 1610, 1620, 1744, 1610, 1620, 1744, 1610, 1620, 1609, - 1610, 1620, 1609, 1610, 1620, 1609, 1740, 1740, 1740, - 1740, 1610, 1620, 1580, 1610, 1620, 1581, 1610, 1620, - 1605, 1610, 1620, 1609, 1610, 1620, 1610, 1576, 1580, - 1576, 1581, 1576, 1582, 1576, 1605, 1576, 1609, 1576, - 1610, 1578, 1580, 1578, 1581, 1578, 1582, 1578, 1605, - 1578, 1609, 1578, 1610, 1579, 1580, 1579, 1605, 1579, - 1609, 1579, 1610, 1580, 1581, 1580, 1605, 1581, 1580, - 1581, 1605, 1582, 1580, 1582, 1581, 1582, 1605, 1587, - 1580, 1587, 1581, 1587, 1582, 1587, 1605, 1589, 1581, - 1589, 1605, 1590, 1580, 1590, 1581, 1590, 1582, 1590, - 1605, 1591, 1581, 1591, 1605, 1592, 1605, 1593, 1580, - 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, 1601, - 1581, 1601, 1582, 1601, 1605, 1601, 1609, 1601, 1610, - 1602, 1581, 1602, 1605, 1602, 1609, 1602, 1610, 1603, - 1575, 1603, 1580, 1603, 1581, 1603, 1582, 1603, 1604, - 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, 1604, - 1581, 1604, 1582, 1604, 1605, 1604, 1609, 1604, 1610, - 1605, 1580, 1605, 1581, 1605, 1582, 1605, 1605, 1605, - 1609, 1605, 1610, 1606, 1580, 1606, 1581, 1606, 1582, - 1606, 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607, - 1605, 1607, 1609, 1607, 1610, 1610, 1580, 1610, 1581, - 1610, 1582, 1610, 1605, 1610, 1609, 1610, 1610, 1584, - 1648, 1585, 1648, 1609, 1648, 32, 1612, 1617, 32, - 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, 32, - 1616, 1617, 32, 1617, 1648, 1610, 1620, 1585, 1610, - 1620, 1586, 1610, 1620, 1605, 1610, 1620, 1606, 1610, - 1620, 1609, 1610, 1620, 1610, 1576, 1585, 1576, 1586, - 1576, 1605, 1576, 1606, 1576, 1609, 1576, 1610, 1578, - 1585, 1578, 1586, 1578, 1605, 1578, 1606, 1578, 1609, - 1578, 1610, 1579, 1585, 1579, 1586, 1579, 1605, 1579, - 1606, 1579, 1609, 1579, 1610, 1601, 1609, 1601, 1610, - 1602, 1609, 1602, 1610, 1603, 1575, 1603, 1604, 1603, - 1605, 1603, 1609, 1603, 1610, 1604, 1605, 1604, 1609, - 1604, 1610, 1605, 1575, 1605, 1605, 1606, 1585, 1606, - 1586, 1606, 1605, 1606, 1606, 1606, 1609, 1606, 1610, - 1609, 1648, 1610, 1585, 1610, 1586, 1610, 1605, 1610, - 1606, 1610, 1609, 1610, 1610, 1610, 1620, 1580, 1610, - 1620, 1581, 1610, 1620, 1582, 1610, 1620, 1605, 1610, - 1620, 1607, 1576, 1580, 1576, 1581, 1576, 1582, 1576, - 1605, 1576, 1607, 1578, 1580, 1578, 1581, 1578, 1582, - 1578, 1605, 1578, 1607, 1579, 1605, 1580, 1581, 1580, - 1605, 1581, 1580, 1581, 1605, 1582, 1580, 1582, 1605, - 1587, 1580, 1587, 1581, 1587, 1582, 1587, 1605, 1589, - 1581, 1589, 1582, 1589, 1605, 1590, 1580, 1590, 1581, - 1590, 1582, 1590, 1605, 1591, 1581, 1592, 1605, 1593, - 1580, 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, - 1601, 1581, 1601, 1582, 1601, 1605, 1602, 1581, 1602, - 1605, 1603, 1580, 1603, 1581, 1603, 1582, 1603, 1604, - 1603, 1605, 1604, 1580, 1604, 1581, 1604, 1582, 1604, - 1605, 1604, 1607, 1605, 1580, 1605, 1581, 1605, 1582, - 1605, 1605, 1606, 1580, 1606, 1581, 1606, 1582, 1606, - 1605, 1606, 1607, 1607, 1580, 1607, 1605, 1607, 1648, - 1610, 1580, 1610, 1581, 1610, 1582, 1610, 1605, 1610, - 1607, 1610, 1620, 1605, 1610, 1620, 1607, 1576, 1605, - 1576, 1607, 1578, 1605, 1578, 1607, 1579, 1605, 1579, - 1607, 1587, 1605, 1587, 1607, 1588, 1605, 1588, 1607, - 1603, 1604, 1603, 1605, 1604, 1605, 1606, 1605, 1606, - 1607, 1610, 1605, 1610, 1607, 1600, 1614, 1617, 1600, - 1615, 1617, 1600, 1616, 1617, 1591, 1609, 1591, 1610, - 1593, 1609, 1593, 1610, 1594, 1609, 1594, 1610, 1587, - 1609, 1587, 1610, 1588, 1609, 1588, 1610, 1581, 1609, - 1581, 1610, 1580, 1609, 1580, 1610, 1582, 1609, 1582, - 1610, 1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610, - 1588, 1580, 1588, 1581, 1588, 1582, 1588, 1605, 1588, - 1585, 1587, 1585, 1589, 1585, 1590, 1585, 1591, 1609, - 1591, 1610, 1593, 1609, 1593, 1610, 1594, 1609, 1594, - 1610, 1587, 1609, 1587, 1610, 1588, 1609, 1588, 1610, - 1581, 1609, 1581, 1610, 1580, 1609, 1580, 1610, 1582, - 1609, 1582, 1610, 1589, 1609, 1589, 1610, 1590, 1609, - 1590, 1610, 1588, 1580, 1588, 1581, 1588, 1582, 1588, - 1605, 1588, 1585, 1587, 1585, 1589, 1585, 1590, 1585, - 1588, 1580, 1588, 1581, 1588, 1582, 1588, 1605, 1587, - 1607, 1588, 1607, 1591, 1605, 1587, 1580, 1587, 1581, - 1587, 1582, 1588, 1580, 1588, 1581, 1588, 1582, 1591, - 1605, 1592, 1605, 1575, 1611, 1575, 1611, 1578, 1580, - 1605, 1578, 1581, 1580, 1578, 1581, 1580, 1578, 1581, - 1605, 1578, 1582, 1605, 1578, 1605, 1580, 1578, 1605, - 1581, 1578, 1605, 1582, 1580, 1605, 1581, 1580, 1605, - 1581, 1581, 1605, 1610, 1581, 1605, 1609, 1587, 1581, - 1580, 1587, 1580, 1581, 1587, 1580, 1609, 1587, 1605, - 1581, 1587, 1605, 1581, 1587, 1605, 1580, 1587, 1605, - 1605, 1587, 1605, 1605, 1589, 1581, 1581, 1589, 1581, - 1581, 1589, 1605, 1605, 1588, 1581, 1605, 1588, 1581, - 1605, 1588, 1580, 1610, 1588, 1605, 1582, 1588, 1605, - 1582, 1588, 1605, 1605, 1588, 1605, 1605, 1590, 1581, - 1609, 1590, 1582, 1605, 1590, 1582, 1605, 1591, 1605, - 1581, 1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605, - 1610, 1593, 1580, 1605, 1593, 1605, 1605, 1593, 1605, - 1605, 1593, 1605, 1609, 1594, 1605, 1605, 1594, 1605, - 1610, 1594, 1605, 1609, 1601, 1582, 1605, 1601, 1582, - 1605, 1602, 1605, 1581, 1602, 1605, 1605, 1604, 1581, - 1605, 1604, 1581, 1610, 1604, 1581, 1609, 1604, 1580, - 1580, 1604, 1580, 1580, 1604, 1582, 1605, 1604, 1582, - 1605, 1604, 1605, 1581, 1604, 1605, 1581, 1605, 1581, - 1580, 1605, 1581, 1605, 1605, 1581, 1610, 1605, 1580, - 1581, 1605, 1580, 1605, 1605, 1582, 1580, 1605, 1582, - 1605, 1605, 1580, 1582, 1607, 1605, 1580, 1607, 1605, - 1605, 1606, 1581, 1605, 1606, 1581, 1609, 1606, 1580, - 1605, 1606, 1580, 1605, 1606, 1580, 1609, 1606, 1605, - 1610, 1606, 1605, 1609, 1610, 1605, 1605, 1610, 1605, - 1605, 1576, 1582, 1610, 1578, 1580, 1610, 1578, 1580, - 1609, 1578, 1582, 1610, 1578, 1582, 1609, 1578, 1605, - 1610, 1578, 1605, 1609, 1580, 1605, 1610, 1580, 1581, - 1609, 1580, 1605, 1609, 1587, 1582, 1609, 1589, 1581, - 1610, 1588, 1581, 1610, 1590, 1581, 1610, 1604, 1580, - 1610, 1604, 1605, 1610, 1610, 1581, 1610, 1610, 1580, - 1610, 1610, 1605, 1610, 1605, 1605, 1610, 1602, 1605, - 1610, 1606, 1581, 1610, 1602, 1605, 1581, 1604, 1581, - 1605, 1593, 1605, 1610, 1603, 1605, 1610, 1606, 1580, - 1581, 1605, 1582, 1610, 1604, 1580, 1605, 1603, 1605, - 1605, 1604, 1580, 1605, 1606, 1580, 1581, 1580, 1581, - 1610, 1581, 1580, 1610, 1605, 1580, 1610, 1601, 1605, - 1610, 1576, 1581, 1610, 1603, 1605, 1605, 1593, 1580, - 1605, 1589, 1605, 1605, 1587, 1582, 1610, 1606, 1580, - 1610, 1589, 1604, 1746, 1602, 1604, 1746, 1575, 1604, - 1604, 1607, 1575, 1603, 1576, 1585, 1605, 1581, 1605, - 1583, 1589, 1604, 1593, 1605, 1585, 1587, 1608, 1604, - 1593, 1604, 1610, 1607, 1608, 1587, 1604, 1605, 1589, - 1604, 1609, 1589, 1604, 1609, 32, 1575, 1604, 1604, - 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, - 1604, 1605, 1580, 1604, 32, 1580, 1604, 1575, 1604, - 1607, 1585, 1740, 1575, 1604, 44, 12289, 12290, 58, - 59, 33, 63, 12310, 12311, 46, 46, 46, 46, - 46, 8212, 8211, 95, 95, 40, 41, 123, 125, - 12308, 12309, 12304, 12305, 12298, 12299, 12296, 12297, 12300, - 12301, 12302, 12303, 91, 93, 32, 773, 32, 773, - 32, 773, 32, 773, 95, 95, 95, 44, 12289, - 46, 59, 58, 63, 33, 8212, 40, 41, 123, - 125, 12308, 12309, 35, 38, 42, 43, 45, 60, - 62, 61, 92, 36, 37, 64, 32, 1611, 1600, - 1611, 32, 1612, 32, 1613, 32, 1614, 1600, 1614, - 32, 1615, 1600, 1615, 32, 1616, 1600, 1616, 32, - 1617, 1600, 1617, 32, 1618, 1600, 1618, 1569, 1575, - 1619, 1575, 1619, 1575, 1620, 1575, 1620, 1608, 1620, - 1608, 1620, 1575, 1621, 1575, 1621, 1610, 1620, 1610, - 1620, 1610, 1620, 1610, 1620, 1575, 1575, 1576, 1576, - 1576, 1576, 1577, 1577, 1578, 1578, 1578, 1578, 1579, - 1579, 1579, 1579, 1580, 1580, 1580, 1580, 1581, 1581, - 1581, 1581, 1582, 1582, 1582, 1582, 1583, 1583, 1584, - 1584, 1585, 1585, 1586, 1586, 1587, 1587, 1587, 1587, - 1588, 1588, 1588, 1588, 1589, 1589, 1589, 1589, 1590, - 1590, 1590, 1590, 1591, 1591, 1591, 1591, 1592, 1592, - 1592, 1592, 1593, 1593, 1593, 1593, 1594, 1594, 1594, - 1594, 1601, 1601, 1601, 1601, 1602, 1602, 1602, 1602, - 1603, 1603, 1603, 1603, 1604, 1604, 1604, 1604, 1605, - 1605, 1605, 1605, 1606, 1606, 1606, 1606, 1607, 1607, - 1607, 1607, 1608, 1608, 1609, 1609, 1610, 1610, 1610, - 1610, 1604, 1575, 1619, 1604, 1575, 1619, 1604, 1575, - 1620, 1604, 1575, 1620, 1604, 1575, 1621, 1604, 1575, - 1621, 1604, 1575, 1604, 1575, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, - 10629, 10630, 12290, 12300, 12301, 12289, 12539, 12530, 12449, - 12451, 12453, 12455, 12457, 12515, 12517, 12519, 12483, 12540, - 12450, 12452, 12454, 12456, 12458, 12459, 12461, 12463, 12465, - 12467, 12469, 12471, 12473, 12475, 12477, 12479, 12481, 12484, - 12486, 12488, 12490, 12491, 12492, 12493, 12494, 12495, 12498, - 12501, 12504, 12507, 12510, 12511, 12512, 12513, 12514, 12516, - 12518, 12520, 12521, 12522, 12523, 12524, 12525, 12527, 12531, - 12441, 12442, 4448, 4352, 4353, 4522, 4354, 4524, 4525, - 4355, 4356, 4357, 4528, 4529, 4530, 4531, 4532, 4533, - 4378, 4358, 4359, 4360, 4385, 4361, 4362, 4363, 4364, - 4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, 4451, - 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, - 4461, 4462, 4463, 4464, 4465, 4466, 4467, 4468, 4469, - 162, 163, 172, 32, 772, 166, 165, 8361, 9474, - 8592, 8593, 8594, 8595, 9632, 9675, 720, 721, 230, - 665, 595, 675, 43878, 677, 676, 598, 599, 7569, - 600, 606, 681, 612, 610, 608, 667, 295, 668, - 615, 644, 682, 683, 620, 122628, 42894, 622, 122629, - 654, 122630, 248, 630, 631, 113, 634, 122632, 637, - 638, 640, 680, 678, 43879, 679, 648, 11377, 655, - 673, 674, 664, 448, 449, 450, 122634, 122654, 69785, - 69818, 69787, 69818, 69797, 69818, 69937, 69927, 69938, 69927, - 70471, 70462, 70471, 70487, 70841, 70842, 70841, 70832, 70841, - 70845, 71096, 71087, 71097, 71087, 71989, 71984, 119127, 119141, - 119128, 119141, 119128, 119141, 119150, 119128, 119141, 119151, 119128, - 119141, 119152, 119128, 119141, 119153, 119128, 119141, 119154, 119225, - 119141, 119226, 119141, 119225, 119141, 119150, 119226, 119141, 119150, - 119225, 119141, 119151, 119226, 119141, 119151, 65, 66, 67, - 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, - 86, 87, 88, 89, 90, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 97, 98, 99, 100, 101, 102, - 103, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 83, 84, 85, 86, 87, 88, 89, 90, - 97, 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 65, - 67, 68, 71, 74, 75, 78, 79, 80, 81, - 83, 84, 85, 86, 87, 88, 89, 90, 97, - 98, 99, 100, 102, 104, 105, 106, 107, 108, - 109, 110, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 65, 66, 68, 69, 70, 71, 74, - 75, 76, 77, 78, 79, 80, 81, 83, 84, - 85, 86, 87, 88, 89, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 65, 66, 68, 69, 70, - 71, 73, 74, 75, 76, 77, 79, 83, 84, - 85, 86, 87, 88, 89, 97, 98, 99, 100, - 101, 102, 103, 104, 105, 106, 107, 108, 109, - 110, 111, 112, 113, 114, 115, 116, 117, 118, - 119, 120, 121, 122, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, - 79, 80, 81, 82, 83, 84, 85, 86, 87, - 88, 89, 90, 97, 98, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 109, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 65, 66, 67, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, - 90, 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, - 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 97, - 98, 99, 100, 101, 102, 103, 104, 105, 106, - 107, 108, 109, 110, 111, 112, 113, 114, 115, - 116, 117, 118, 119, 120, 121, 122, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, - 85, 86, 87, 88, 89, 90, 97, 98, 99, - 100, 101, 102, 103, 104, 105, 106, 107, 108, - 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 65, 66, 67, 68, - 69, 70, 71, 72, 73, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 97, 98, 99, 100, 101, - 102, 103, 104, 105, 106, 107, 108, 109, 110, - 111, 112, 113, 114, 115, 116, 117, 118, 119, - 120, 121, 122, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 305, 567, 913, 914, 915, 916, 917, 918, - 919, 920, 921, 922, 923, 924, 925, 926, 927, - 928, 929, 920, 931, 932, 933, 934, 935, 936, - 937, 8711, 945, 946, 947, 948, 949, 950, 951, - 952, 953, 954, 955, 956, 957, 958, 959, 960, - 961, 962, 963, 964, 965, 966, 967, 968, 969, - 8706, 949, 952, 954, 966, 961, 960, 913, 914, - 915, 916, 917, 918, 919, 920, 921, 922, 923, - 924, 925, 926, 927, 928, 929, 920, 931, 932, - 933, 934, 935, 936, 937, 8711, 945, 946, 947, - 948, 949, 950, 951, 952, 953, 954, 955, 956, - 957, 958, 959, 960, 961, 962, 963, 964, 965, - 966, 967, 968, 969, 8706, 949, 952, 954, 966, - 961, 960, 913, 914, 915, 916, 917, 918, 919, - 920, 921, 922, 923, 924, 925, 926, 927, 928, - 929, 920, 931, 932, 933, 934, 935, 936, 937, - 8711, 945, 946, 947, 948, 949, 950, 951, 952, - 953, 954, 955, 956, 957, 958, 959, 960, 961, - 962, 963, 964, 965, 966, 967, 968, 969, 8706, - 949, 952, 954, 966, 961, 960, 913, 914, 915, - 916, 917, 918, 919, 920, 921, 922, 923, 924, - 925, 926, 927, 928, 929, 920, 931, 932, 933, - 934, 935, 936, 937, 8711, 945, 946, 947, 948, - 949, 950, 951, 952, 953, 954, 955, 956, 957, - 958, 959, 960, 961, 962, 963, 964, 965, 966, - 967, 968, 969, 8706, 949, 952, 954, 966, 961, - 960, 913, 914, 915, 916, 917, 918, 919, 920, - 921, 922, 923, 924, 925, 926, 927, 928, 929, - 920, 931, 932, 933, 934, 935, 936, 937, 8711, - 945, 946, 947, 948, 949, 950, 951, 952, 953, - 954, 955, 956, 957, 958, 959, 960, 961, 962, - 963, 964, 965, 966, 967, 968, 969, 8706, 949, - 952, 954, 966, 961, 960, 988, 989, 48, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, - 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 48, 49, 50, 51, 52, 53, 54, 55, - 56, 57, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 1072, 1073, 1074, 1075, 1076, 1077, - 1078, 1079, 1080, 1082, 1083, 1084, 1086, 1087, 1088, - 1089, 1090, 1091, 1092, 1093, 1094, 1095, 1096, 1099, - 1101, 1102, 42633, 1241, 1110, 1112, 1257, 1199, 1231, - 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, - 1082, 1083, 1086, 1087, 1089, 1091, 1092, 1093, 1094, - 1095, 1096, 1098, 1099, 1169, 1110, 1109, 1119, 1195, - 42577, 1201, 1575, 1576, 1580, 1583, 1608, 1586, 1581, - 1591, 1610, 1603, 1604, 1605, 1606, 1587, 1593, 1601, - 1589, 1602, 1585, 1588, 1578, 1579, 1582, 1584, 1590, - 1592, 1594, 1646, 1722, 1697, 1647, 1576, 1580, 1607, - 1581, 1610, 1603, 1604, 1605, 1606, 1587, 1593, 1601, - 1589, 1602, 1588, 1578, 1579, 1582, 1590, 1594, 1580, - 1581, 1610, 1604, 1606, 1587, 1593, 1589, 1602, 1588, - 1582, 1590, 1594, 1722, 1647, 1576, 1580, 1607, 1581, - 1591, 1610, 1603, 1605, 1606, 1587, 1593, 1601, 1589, - 1602, 1588, 1578, 1579, 1582, 1590, 1592, 1594, 1646, - 1697, 1575, 1576, 1580, 1583, 1607, 1608, 1586, 1581, - 1591, 1610, 1604, 1605, 1606, 1587, 1593, 1601, 1589, - 1602, 1585, 1588, 1578, 1579, 1582, 1584, 1590, 1592, - 1594, 1576, 1580, 1583, 1608, 1586, 1581, 1591, 1610, - 1604, 1605, 1606, 1587, 1593, 1601, 1589, 1602, 1585, - 1588, 1578, 1579, 1582, 1584, 1590, 1592, 1594, 48, - 46, 48, 44, 49, 44, 50, 44, 51, 44, - 52, 44, 53, 44, 54, 44, 55, 44, 56, - 44, 57, 44, 40, 65, 41, 40, 66, 41, - 40, 67, 41, 40, 68, 41, 40, 69, 41, - 40, 70, 41, 40, 71, 41, 40, 72, 41, - 40, 73, 41, 40, 74, 41, 40, 75, 41, - 40, 76, 41, 40, 77, 41, 40, 78, 41, - 40, 79, 41, 40, 80, 41, 40, 81, 41, - 40, 82, 41, 40, 83, 41, 40, 84, 41, - 40, 85, 41, 40, 86, 41, 40, 87, 41, - 40, 88, 41, 40, 89, 41, 40, 90, 41, - 12308, 83, 12309, 67, 82, 67, 68, 87, 90, - 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 72, - 86, 77, 86, 83, 68, 83, 83, 80, 80, - 86, 87, 67, 77, 67, 77, 68, 77, 82, - 68, 74, 12411, 12363, 12467, 12467, 12469, 25163, 23383, - 21452, 12486, 12441, 20108, 22810, 35299, 22825, 20132, 26144, - 28961, 26009, 21069, 24460, 20877, 26032, 21021, 32066, 29983, - 36009, 22768, 21561, 28436, 25237, 25429, 19968, 19977, 36938, - 24038, 20013, 21491, 25351, 36208, 25171, 31105, 31354, 21512, - 28288, 26377, 26376, 30003, 21106, 21942, 37197, 12308, 26412, - 12309, 12308, 19977, 12309, 12308, 20108, 12309, 12308, 23433, - 12309, 12308, 28857, 12309, 12308, 25171, 12309, 12308, 30423, - 12309, 12308, 21213, 12309, 12308, 25943, 12309, 24471, 21487, - 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 20029, 20024, 20033, 131362, 20320, 20398, 20411, 20482, - 20602, 20633, 20711, 20687, 13470, 132666, 20813, 20820, 20836, - 20855, 132380, 13497, 20839, 20877, 132427, 20887, 20900, 20172, - 20908, 20917, 168415, 20981, 20995, 13535, 21051, 21062, 21106, - 21111, 13589, 21191, 21193, 21220, 21242, 21253, 21254, 21271, - 21321, 21329, 21338, 21363, 21373, 21375, 21375, 21375, 133676, - 28784, 21450, 21471, 133987, 21483, 21489, 21510, 21662, 21560, - 21576, 21608, 21666, 21750, 21776, 21843, 21859, 21892, 21892, - 21913, 21931, 21939, 21954, 22294, 22022, 22295, 22097, 22132, - 20999, 22766, 22478, 22516, 22541, 22411, 22578, 22577, 22700, - 136420, 22770, 22775, 22790, 22810, 22818, 22882, 136872, 136938, - 23020, 23067, 23079, 23000, 23142, 14062, 14076, 23304, 23358, - 23358, 137672, 23491, 23512, 23527, 23539, 138008, 23551, 23558, - 24403, 23586, 14209, 23648, 23662, 23744, 23693, 138724, 23875, - 138726, 23918, 23915, 23932, 24033, 24034, 14383, 24061, 24104, - 24125, 24169, 14434, 139651, 14460, 24240, 24243, 24246, 24266, - 172946, 24318, 140081, 140081, 33281, 24354, 24354, 14535, 144056, - 156122, 24418, 24427, 14563, 24474, 24525, 24535, 24569, 24705, - 14650, 14620, 24724, 141012, 24775, 24904, 24908, 24910, 24908, - 24954, 24974, 25010, 24996, 25007, 25054, 25074, 25078, 25104, - 25115, 25181, 25265, 25300, 25424, 142092, 25405, 25340, 25448, - 25475, 25572, 142321, 25634, 25541, 25513, 14894, 25705, 25726, - 25757, 25719, 14956, 25935, 25964, 143370, 26083, 26360, 26185, - 15129, 26257, 15112, 15076, 20882, 20885, 26368, 26268, 32941, - 17369, 26391, 26395, 26401, 26462, 26451, 144323, 15177, 26618, - 26501, 26706, 26757, 144493, 26766, 26655, 26900, 15261, 26946, - 27043, 27114, 27304, 145059, 27355, 15384, 27425, 145575, 27476, - 15438, 27506, 27551, 27578, 27579, 146061, 138507, 146170, 27726, - 146620, 27839, 27853, 27751, 27926, 27966, 28023, 27969, 28009, - 28024, 28037, 146718, 27956, 28207, 28270, 15667, 28363, 28359, - 147153, 28153, 28526, 147294, 147342, 28614, 28729, 28702, 28699, - 15766, 28746, 28797, 28791, 28845, 132389, 28997, 148067, 29084, - 148395, 29224, 29237, 29264, 149000, 29312, 29333, 149301, 149524, - 29562, 29579, 16044, 29605, 16056, 16056, 29767, 29788, 29809, - 29829, 29898, 16155, 29988, 150582, 30014, 150674, 30064, 139679, - 30224, 151457, 151480, 151620, 16380, 16392, 30452, 151795, 151794, - 151833, 151859, 30494, 30495, 30495, 30538, 16441, 30603, 16454, - 16534, 152605, 30798, 30860, 30924, 16611, 153126, 31062, 153242, - 153285, 31119, 31211, 16687, 31296, 31306, 31311, 153980, 154279, - 154279, 31470, 16898, 154539, 31686, 31689, 16935, 154752, 31954, - 17056, 31976, 31971, 32000, 155526, 32099, 17153, 32199, 32258, - 32325, 17204, 156200, 156231, 17241, 156377, 32634, 156478, 32661, - 32762, 32773, 156890, 156963, 32864, 157096, 32880, 144223, 17365, - 32946, 33027, 17419, 33086, 23221, 157607, 157621, 144275, 144284, - 33281, 33284, 36766, 17515, 33425, 33419, 33437, 21171, 33457, - 33459, 33469, 33510, 158524, 33509, 33565, 33635, 33709, 33571, - 33725, 33767, 33879, 33619, 33738, 33740, 33756, 158774, 159083, - 158933, 17707, 34033, 34035, 34070, 160714, 34148, 159532, 17757, - 17761, 159665, 159954, 17771, 34384, 34396, 34407, 34409, 34473, - 34440, 34574, 34530, 34681, 34600, 34667, 34694, 17879, 34785, - 34817, 17913, 34912, 34915, 161383, 35031, 35038, 17973, 35066, - 13499, 161966, 162150, 18110, 18119, 35488, 35565, 35722, 35925, - 162984, 36011, 36033, 36123, 36215, 163631, 133124, 36299, 36284, - 36336, 133342, 36564, 36664, 165330, 165357, 37012, 37105, 37137, - 165678, 37147, 37432, 37591, 37592, 37500, 37881, 37909, 166906, - 38283, 18837, 38327, 167287, 18918, 38595, 23986, 38691, 168261, - 168474, 19054, 19062, 38880, 168970, 19122, 169110, 38923, 38923, - 38953, 169398, 39138, 19251, 39209, 39335, 39362, 39422, 19406, - 170800, 39698, 40000, 40189, 19662, 19693, 40295, 172238, 19704, - 172293, 172558, 172689, 40635, 19798, 40697, 40702, 40709, 40719, - 40726, 40763, 173568}; - -const uint8_t canonical_combining_class_index[4352] = { - 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, - 15, 0, 0, 0, 16, 17, 18, 19, 20, 21, 22, 0, 0, 23, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 24, 25, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 28, 29, 30, - 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 32, 0, 0, 33, 0, 0, 34, 35, 36, 0, 0, 0, 0, 0, 0, - 37, 0, 0, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 52, - 53, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 55, 56, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 61, 56, 62, 0, 63, 0, 0, 0, 64, 65, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}; -const uint8_t canonical_combining_class_block[67][256] = { - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, - 220, 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 220, 220, - 220, 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, 220, 220, 230, - 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, 230, 232, 220, - 220, 230, 233, 234, 234, 233, 234, 234, 233, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 230, 230, 230, 230, - 220, 230, 230, 230, 222, 220, 230, 230, 230, 230, 230, 230, 220, 220, 220, - 220, 220, 220, 230, 230, 220, 230, 230, 222, 228, 230, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, - 0, 230, 220, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 230, 230, 230, 230, 230, 230, 230, 230, 30, 31, 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, - 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220, 220, 230, 230, 230, - 230, 230, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, - 230, 230, 220, 230, 0, 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 230, 220, 230, 230, 220, 230, 230, 220, 220, 220, 230, 220, - 220, 230, 220, 230, 230, 230, 220, 230, 220, 230, 220, 230, 220, 230, 230, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, - 230, 230, 220, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 0, 230, 230, 230, 230, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, - 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 230, 220, 220, 220, 230, 230, 230, 230, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 220, 220, 220, - 220, 220, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 0, 220, 230, 230, 220, 230, 230, 220, 230, 230, 230, 220, 220, 220, - 27, 28, 29, 230, 230, 230, 220, 230, 230, 220, 220, 230, 230, 230, 230, - 230}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 118, 118, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 122, 122, 122, 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 220, 0, 216, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 132, 0, 0, 0, - 0, 0, 130, 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, - 230, 230, 230, 230, 230, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, - 230, 220, 220, 220, 220, 220, 220, 230, 230, 220, 0, 220, 220, 230, 230, - 220, 220, 230, 230, 230, 230, 230, 220, 230, 230, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 230, 230, 230, - 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, - 230, 0, 1, 220, 220, 220, 220, 220, 230, 230, 220, 220, 220, 220, 230, - 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 220, 0, 0, - 0, 0, 0, 0, 230, 0, 0, 0, 230, 230, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 220, - 230, 230, 230, 230, 230, 230, 230, 220, 230, 230, 234, 214, 220, 202, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 232, 228, 228, 220, 218, 230, 233, 220, 230, - 220}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 230, 1, 1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, - 0, 230, 0, 0, 0, 1, 1, 230, 220, 230, 1, 1, 220, 220, 220, 220, - 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 218, 228, 232, 222, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, - 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 230, 0, 230, 230, 220, 0, 0, 230, 230, 0, 0, 0, 0, 0, - 230, 230, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 230, 230, 230, 230, 230, 230, 230, 220, 220, 220, 220, 220, 220, - 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 230, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 1, 220, 0, - 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, - 230, 230, 230, 220, 230, 220, 220, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 230, 220, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, - 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 7, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 7, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 9, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 216, 216, 1, 1, 1, 0, 0, 0, 226, 216, 216, - 216, 216, 216, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, - 220, 220, 220, 0, 0, 230, 230, 230, 230, 230, 220, 220, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {230, 230, 230, 230, 230, 230, 230, 0, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, - 230, 230, 230, 230, 0, 230, 230, 0, 230, 230, 230, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 232, 232, 220, 230, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 220, 220, 220, 220, 220, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230, 7, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; - -const uint8_t composition_index[4352] = { - 0, 1, 2, 3, 4, 5, 6, 5, 5, 7, 5, 8, 9, 10, 5, 5, 11, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 12, 5, 5, 13, 14, 5, 15, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 17, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 18, 19, 5, 20, 21, 22, 5, 5, 5, 23, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5}; -const uint16_t composition_block[67][257] = { - {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 3, 5, 7, 7, 7, 39, 45, 55, 67, 101, 103, 117, 131, 161, - 163, 173, 185, 191, 209, 241, 245, 245, 261, 275, 289, 327, 331, 343, 347, - 365, 377, 377, 377, 377, 377, 377, 377, 409, 415, 425, 437, 471, 473, 487, - 503, 531, 535, 545, 557, 563, 581, 613, 617, 617, 633, 647, 663, 701, 705, - 719, 723, 743, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, - 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, - 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, - 755, 755, 755, 755, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 769, 769, 771, 773, 777, 779, 779, 779, 787, 787, 787, 787, 787, 789, 789, - 789, 789, 789, 797, 803, 805, 805, 807, 807, 807, 807, 815, 815, 815, 815, - 815, 815, 823, 823, 825, 827, 831, 833, 833, 833, 841, 841, 841, 841, 841, - 843, 843, 843, 843, 843, 851, 857, 859, 859, 861, 861, 861, 861, 869, 869, - 869, 869}, - {869, 869, 869, 877, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, 885, - 885, 885, 885, 885, 889, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, 893, - 893, 893, 897, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, 901, - 901, 903, 905, 905, 905, 905, 905, 907, 909, 909, 909, 909, 909, 909, 909, - 911, 913, 915, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, 917, - 917, 917, 917, 917, 917, 917, 917, 917, 919, 919, 919, 919, 919, 919, 919, - 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, - 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 919, 929, 939, 939, 939, - 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 939, 949, 959, 959, 959, - 959, 959, 959, 959, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, - 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, - 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, - 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 963, 965, 965, 965, 965, - 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, - 965, 965}, - {965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, - 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, 965, - 965, 965, 965, 965, 965, 965, 965, 965, 965, 967, 969, 971, 973, 973, 973, - 973, 973, 975, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, - 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979}, - {979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, - 979, 979, 993, 993, 993, 993, 1001, 1001, 1011, 1011, 1025, 1025, - 1025, 1025, 1025, 1025, 1033, 1033, 1035, 1035, 1035, 1035, 1047, 1047, - 1047, 1047, 1057, 1057, 1057, 1059, 1059, 1061, 1061, 1061, 1077, 1077, - 1077, 1077, 1085, 1085, 1097, 1097, 1113, 1113, 1113, 1113, 1113, 1113, - 1121, 1121, 1125, 1125, 1125, 1125, 1141, 1141, 1141, 1141, 1153, 1159, - 1165, 1165, 1165, 1167, 1167, 1167, 1167, 1171, 1171, 1171, 1171, 1171, - 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, - 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, - 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171, - 1171, 1171, 1171, 1171, 1171}, - {1171, 1171, 1171, 1171, 1171, 1171, 1171, 1173, 1173, 1173, 1173, 1173, - 1173, 1173, 1173, 1173, 1173, 1177, 1177, 1177, 1179, 1179, 1185, 1189, - 1191, 1199, 1199, 1201, 1201, 1201, 1201, 1203, 1203, 1203, 1203, 1203, - 1211, 1211, 1211, 1211, 1213, 1213, 1213, 1213, 1215, 1215, 1217, 1217, - 1217, 1221, 1221, 1221, 1223, 1223, 1229, 1233, 1235, 1243, 1243, 1245, - 1245, 1245, 1245, 1247, 1247, 1247, 1247, 1247, 1255, 1255, 1255, 1255, - 1257, 1257, 1257, 1257, 1259, 1259, 1261, 1261, 1261, 1261, 1261, 1261, - 1261, 1261, 1261, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, - 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, - 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1263, 1265, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, 1267, - 1267, 1269, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, 1271, - 1271, 1271, 1271, 1271, 1271, 1273, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1275}, - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, - {1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, 1275, - 1275, 1275, 1275, 1275, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, - 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, - 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, 1281, - 1281, 1283, 1283, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, 1285, - 1285, 1285, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1287, - 1287, 1287, 1287, 1287, 1287, 1287, 1287, 1289, 1289, 1289, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291}, - {1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, 1291, - 1291, 1291, 1291, 1291, 1291, 1293, 1293, 1293, 1293, 1293, 1293, 1293, - 1293, 1295, 1295, 1295, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, - 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1297, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301}, - {1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, 1301, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, 1307, - 1307, 1307, 1307, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, - 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, - 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, - 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1309, - 1309, 1309, 1309, 1309, 1309, 1309, 1309, 1313, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315}, - {1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, - 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1315, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, 1317, - 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1325, 1325, 1325, 1325, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327}, - {1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, - 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1327, 1331, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, 1333, - 1333, 1333, 1339, 1339, 1339, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341}, - {1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, 1341, - 1341, 1341, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, - 1343, 1343, 1343, 1343, 1343}, - {1343, 1343, 1343, 1343, 1343, 1343, 1345, 1345, 1347, 1347, 1349, 1349, - 1351, 1351, 1353, 1353, 1353, 1353, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, - 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1355, 1357, - 1357, 1359, 1359, 1361, 1363, 1363, 1363, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365}, - {1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1365, - 1365, 1365, 1365, 1365, 1365, 1365, 1365, 1367, 1369, 1369, 1369, 1369, - 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, - 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1369, - 1369, 1369, 1369, 1369, 1369, 1369, 1369, 1371, 1373, 1373, 1373, 1373, - 1373, 1373, 1373, 1375, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, 1377, - 1377, 1377, 1377, 1377, 1377, 1381, 1385, 1385, 1385, 1385, 1385, 1385, - 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, 1385, - 1385, 1385, 1385, 1385, 1385, 1387, 1389, 1389, 1389, 1389, 1389, 1389, - 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, 1389, - 1389, 1391, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, 1393, - 1393, 1393, 1393, 1393, 1393}, - {1393, 1401, 1409, 1411, 1413, 1415, 1417, 1419, 1421, 1429, 1437, 1439, - 1441, 1443, 1445, 1447, 1449, 1453, 1457, 1457, 1457, 1457, 1457, 1457, - 1457, 1461, 1465, 1465, 1465, 1465, 1465, 1465, 1465, 1473, 1481, 1483, - 1485, 1487, 1489, 1491, 1493, 1501, 1509, 1511, 1513, 1515, 1517, 1519, - 1521, 1527, 1533, 1533, 1533, 1533, 1533, 1533, 1533, 1539, 1545, 1545, - 1545, 1545, 1545, 1545, 1545, 1549, 1553, 1553, 1553, 1553, 1553, 1553, - 1553, 1557, 1561, 1561, 1561, 1561, 1561, 1561, 1561, 1567, 1573, 1573, - 1573, 1573, 1573, 1573, 1573, 1573, 1579, 1579, 1579, 1579, 1579, 1579, - 1579, 1587, 1595, 1597, 1599, 1601, 1603, 1605, 1607, 1615, 1623, 1625, - 1627, 1629, 1631, 1633, 1635, 1637, 1637, 1637, 1637, 1639, 1639, 1639, - 1639, 1639, 1639, 1639, 1639, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, 1641, - 1641, 1641, 1641, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, 1643, - 1649, 1649, 1649, 1649, 1649, 1649, 1649, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1651, - 1651, 1651, 1651, 1651, 1651, 1651, 1651, 1653, 1653, 1653, 1653, 1653, - 1653, 1653, 1653, 1659, 1659}, - {1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, 1659, - 1659, 1661, 1661, 1663, 1663, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, 1665, - 1665, 1665, 1665, 1665, 1665, 1667, 1667, 1669, 1669, 1671, 1671, 1671, - 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, - 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, - 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, 1671, - 1671, 1671, 1671, 1671, 1671}, - {1671, 1671, 1671, 1671, 1673, 1673, 1673, 1673, 1673, 1675, 1675, 1675, - 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, - 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, 1677, - 1679, 1679, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, - 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, 1681, - 1681, 1683, 1683, 1683, 1683, 1683, 1683, 1683, 1685, 1685, 1687, 1687, - 1687, 1689, 1689, 1689, 1689, 1689, 1691, 1691, 1691, 1691, 1691, 1691, - 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, 1691, - 1691, 1691, 1693, 1693, 1693, 1695, 1697, 1697, 1697, 1697, 1697, 1697, - 1697, 1697, 1697, 1697, 1697, 1697, 1697, 1699, 1701, 1701, 1701, 1703, - 1705, 1705, 1705, 1707, 1709, 1711, 1713, 1713, 1713, 1713, 1713, 1715, - 1717, 1717, 1717, 1719, 1721, 1721, 1721, 1721, 1721, 1721, 1721, 1721, - 1721, 1721, 1723, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1725, - 1725, 1725, 1725, 1725, 1725, 1725, 1725, 1727, 1727, 1727, 1727, 1727, - 1727, 1729, 1731, 1731, 1733, 1733, 1733, 1733, 1733, 1733, 1733, 1735, - 1737, 1739, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741}, - {1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, - 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1741, 1743, - 1743, 1743, 1743, 1743, 1745, 1745, 1747, 1747, 1749, 1749, 1751, 1751, - 1753, 1753, 1755, 1755, 1757, 1757, 1759, 1759, 1761, 1761, 1763, 1763, - 1765, 1765, 1767, 1767, 1767, 1769, 1769, 1771, 1771, 1773, 1773, 1773, - 1773, 1773, 1773, 1773, 1777, 1777, 1777, 1781, 1781, 1781, 1785, 1785, - 1785, 1789, 1789, 1789, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, - 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, - 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, 1793, - 1793, 1793, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1795, 1797, - 1797, 1797, 1797, 1797, 1799, 1799, 1801, 1801, 1803, 1803, 1805, 1805, - 1807, 1807, 1809, 1809, 1811, 1811, 1813, 1813, 1815, 1815, 1817, 1817, - 1819, 1819, 1821, 1821, 1821, 1823, 1823, 1825, 1825, 1827, 1827, 1827, - 1827, 1827, 1827, 1827, 1831, 1831, 1831, 1835, 1835, 1835, 1839, 1839, - 1839, 1843, 1843, 1843, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, - 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, 1847, - 1849, 1851, 1853, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, 1855, - 1855, 1855, 1857, 1857, 1857}, - {1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, - 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1857, 1859, 1859, - 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1861, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863}, - {1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, 1863, - 1863, 1863, 1865, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867}, - {1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, 1867, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871}, - {1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, 1871, - 1871, 1871, 1871, 1871, 1871, 1871, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877}, - {1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, 1877, - 1877, 1877, 1877, 1877, 1877, 1879, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881}, - {1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, 1881, - 1881, 1881, 1881, 1881, 1881, 1881, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, 1883, - 1883, 1883, 1883, 1883, 1883}}; -const char32_t composition_data[1883] = { - 0, 824, 8814, 824, 8800, 824, 8815, 768, 192, 769, 193, - 770, 194, 771, 195, 772, 256, 774, 258, 775, 550, 776, - 196, 777, 7842, 778, 197, 780, 461, 783, 512, 785, 514, - 803, 7840, 805, 7680, 808, 260, 775, 7682, 803, 7684, 817, - 7686, 769, 262, 770, 264, 775, 266, 780, 268, 807, 199, - 775, 7690, 780, 270, 803, 7692, 807, 7696, 813, 7698, 817, - 7694, 768, 200, 769, 201, 770, 202, 771, 7868, 772, 274, - 774, 276, 775, 278, 776, 203, 777, 7866, 780, 282, 783, - 516, 785, 518, 803, 7864, 807, 552, 808, 280, 813, 7704, - 816, 7706, 775, 7710, 769, 500, 770, 284, 772, 7712, 774, - 286, 775, 288, 780, 486, 807, 290, 770, 292, 775, 7714, - 776, 7718, 780, 542, 803, 7716, 807, 7720, 814, 7722, 768, - 204, 769, 205, 770, 206, 771, 296, 772, 298, 774, 300, - 775, 304, 776, 207, 777, 7880, 780, 463, 783, 520, 785, - 522, 803, 7882, 808, 302, 816, 7724, 770, 308, 769, 7728, - 780, 488, 803, 7730, 807, 310, 817, 7732, 769, 313, 780, - 317, 803, 7734, 807, 315, 813, 7740, 817, 7738, 769, 7742, - 775, 7744, 803, 7746, 768, 504, 769, 323, 771, 209, 775, - 7748, 780, 327, 803, 7750, 807, 325, 813, 7754, 817, 7752, - 768, 210, 769, 211, 770, 212, 771, 213, 772, 332, 774, - 334, 775, 558, 776, 214, 777, 7886, 779, 336, 780, 465, - 783, 524, 785, 526, 795, 416, 803, 7884, 808, 490, 769, - 7764, 775, 7766, 769, 340, 775, 7768, 780, 344, 783, 528, - 785, 530, 803, 7770, 807, 342, 817, 7774, 769, 346, 770, - 348, 775, 7776, 780, 352, 803, 7778, 806, 536, 807, 350, - 775, 7786, 780, 356, 803, 7788, 806, 538, 807, 354, 813, - 7792, 817, 7790, 768, 217, 769, 218, 770, 219, 771, 360, - 772, 362, 774, 364, 776, 220, 777, 7910, 778, 366, 779, - 368, 780, 467, 783, 532, 785, 534, 795, 431, 803, 7908, - 804, 7794, 808, 370, 813, 7798, 816, 7796, 771, 7804, 803, - 7806, 768, 7808, 769, 7810, 770, 372, 775, 7814, 776, 7812, - 803, 7816, 775, 7818, 776, 7820, 768, 7922, 769, 221, 770, - 374, 771, 7928, 772, 562, 775, 7822, 776, 376, 777, 7926, - 803, 7924, 769, 377, 770, 7824, 775, 379, 780, 381, 803, - 7826, 817, 7828, 768, 224, 769, 225, 770, 226, 771, 227, - 772, 257, 774, 259, 775, 551, 776, 228, 777, 7843, 778, - 229, 780, 462, 783, 513, 785, 515, 803, 7841, 805, 7681, - 808, 261, 775, 7683, 803, 7685, 817, 7687, 769, 263, 770, - 265, 775, 267, 780, 269, 807, 231, 775, 7691, 780, 271, - 803, 7693, 807, 7697, 813, 7699, 817, 7695, 768, 232, 769, - 233, 770, 234, 771, 7869, 772, 275, 774, 277, 775, 279, - 776, 235, 777, 7867, 780, 283, 783, 517, 785, 519, 803, - 7865, 807, 553, 808, 281, 813, 7705, 816, 7707, 775, 7711, - 769, 501, 770, 285, 772, 7713, 774, 287, 775, 289, 780, - 487, 807, 291, 770, 293, 775, 7715, 776, 7719, 780, 543, - 803, 7717, 807, 7721, 814, 7723, 817, 7830, 768, 236, 769, - 237, 770, 238, 771, 297, 772, 299, 774, 301, 776, 239, - 777, 7881, 780, 464, 783, 521, 785, 523, 803, 7883, 808, - 303, 816, 7725, 770, 309, 780, 496, 769, 7729, 780, 489, - 803, 7731, 807, 311, 817, 7733, 769, 314, 780, 318, 803, - 7735, 807, 316, 813, 7741, 817, 7739, 769, 7743, 775, 7745, - 803, 7747, 768, 505, 769, 324, 771, 241, 775, 7749, 780, - 328, 803, 7751, 807, 326, 813, 7755, 817, 7753, 768, 242, - 769, 243, 770, 244, 771, 245, 772, 333, 774, 335, 775, - 559, 776, 246, 777, 7887, 779, 337, 780, 466, 783, 525, - 785, 527, 795, 417, 803, 7885, 808, 491, 769, 7765, 775, - 7767, 769, 341, 775, 7769, 780, 345, 783, 529, 785, 531, - 803, 7771, 807, 343, 817, 7775, 769, 347, 770, 349, 775, - 7777, 780, 353, 803, 7779, 806, 537, 807, 351, 775, 7787, - 776, 7831, 780, 357, 803, 7789, 806, 539, 807, 355, 813, - 7793, 817, 7791, 768, 249, 769, 250, 770, 251, 771, 361, - 772, 363, 774, 365, 776, 252, 777, 7911, 778, 367, 779, - 369, 780, 468, 783, 533, 785, 535, 795, 432, 803, 7909, - 804, 7795, 808, 371, 813, 7799, 816, 7797, 771, 7805, 803, - 7807, 768, 7809, 769, 7811, 770, 373, 775, 7815, 776, 7813, - 778, 7832, 803, 7817, 775, 7819, 776, 7821, 768, 7923, 769, - 253, 770, 375, 771, 7929, 772, 563, 775, 7823, 776, 255, - 777, 7927, 778, 7833, 803, 7925, 769, 378, 770, 7825, 775, - 380, 780, 382, 803, 7827, 817, 7829, 768, 8173, 769, 901, - 834, 8129, 768, 7846, 769, 7844, 771, 7850, 777, 7848, 772, - 478, 769, 506, 769, 508, 772, 482, 769, 7688, 768, 7872, - 769, 7870, 771, 7876, 777, 7874, 769, 7726, 768, 7890, 769, - 7888, 771, 7894, 777, 7892, 769, 7756, 772, 556, 776, 7758, - 772, 554, 769, 510, 768, 475, 769, 471, 772, 469, 780, - 473, 768, 7847, 769, 7845, 771, 7851, 777, 7849, 772, 479, - 769, 507, 769, 509, 772, 483, 769, 7689, 768, 7873, 769, - 7871, 771, 7877, 777, 7875, 769, 7727, 768, 7891, 769, 7889, - 771, 7895, 777, 7893, 769, 7757, 772, 557, 776, 7759, 772, - 555, 769, 511, 768, 476, 769, 472, 772, 470, 780, 474, - 768, 7856, 769, 7854, 771, 7860, 777, 7858, 768, 7857, 769, - 7855, 771, 7861, 777, 7859, 768, 7700, 769, 7702, 768, 7701, - 769, 7703, 768, 7760, 769, 7762, 768, 7761, 769, 7763, 775, - 7780, 775, 7781, 775, 7782, 775, 7783, 769, 7800, 769, 7801, - 776, 7802, 776, 7803, 775, 7835, 768, 7900, 769, 7898, 771, - 7904, 777, 7902, 803, 7906, 768, 7901, 769, 7899, 771, 7905, - 777, 7903, 803, 7907, 768, 7914, 769, 7912, 771, 7918, 777, - 7916, 803, 7920, 768, 7915, 769, 7913, 771, 7919, 777, 7917, - 803, 7921, 780, 494, 772, 492, 772, 493, 772, 480, 772, - 481, 774, 7708, 774, 7709, 772, 560, 772, 561, 780, 495, - 768, 8122, 769, 902, 772, 8121, 774, 8120, 787, 7944, 788, - 7945, 837, 8124, 768, 8136, 769, 904, 787, 7960, 788, 7961, - 768, 8138, 769, 905, 787, 7976, 788, 7977, 837, 8140, 768, - 8154, 769, 906, 772, 8153, 774, 8152, 776, 938, 787, 7992, - 788, 7993, 768, 8184, 769, 908, 787, 8008, 788, 8009, 788, - 8172, 768, 8170, 769, 910, 772, 8169, 774, 8168, 776, 939, - 788, 8025, 768, 8186, 769, 911, 787, 8040, 788, 8041, 837, - 8188, 837, 8116, 837, 8132, 768, 8048, 769, 940, 772, 8113, - 774, 8112, 787, 7936, 788, 7937, 834, 8118, 837, 8115, 768, - 8050, 769, 941, 787, 7952, 788, 7953, 768, 8052, 769, 942, - 787, 7968, 788, 7969, 834, 8134, 837, 8131, 768, 8054, 769, - 943, 772, 8145, 774, 8144, 776, 970, 787, 7984, 788, 7985, - 834, 8150, 768, 8056, 769, 972, 787, 8000, 788, 8001, 787, - 8164, 788, 8165, 768, 8058, 769, 973, 772, 8161, 774, 8160, - 776, 971, 787, 8016, 788, 8017, 834, 8166, 768, 8060, 769, - 974, 787, 8032, 788, 8033, 834, 8182, 837, 8179, 768, 8146, - 769, 912, 834, 8151, 768, 8162, 769, 944, 834, 8167, 837, - 8180, 769, 979, 776, 980, 776, 1031, 774, 1232, 776, 1234, - 769, 1027, 768, 1024, 774, 1238, 776, 1025, 774, 1217, 776, - 1244, 776, 1246, 768, 1037, 772, 1250, 774, 1049, 776, 1252, - 769, 1036, 776, 1254, 772, 1262, 774, 1038, 776, 1264, 779, - 1266, 776, 1268, 776, 1272, 776, 1260, 774, 1233, 776, 1235, - 769, 1107, 768, 1104, 774, 1239, 776, 1105, 774, 1218, 776, - 1245, 776, 1247, 768, 1117, 772, 1251, 774, 1081, 776, 1253, - 769, 1116, 776, 1255, 772, 1263, 774, 1118, 776, 1265, 779, - 1267, 776, 1269, 776, 1273, 776, 1261, 776, 1111, 783, 1142, - 783, 1143, 776, 1242, 776, 1243, 776, 1258, 776, 1259, 1619, - 1570, 1620, 1571, 1621, 1573, 1620, 1572, 1620, 1574, 1620, 1730, - 1620, 1747, 1620, 1728, 2364, 2345, 2364, 2353, 2364, 2356, 2494, - 2507, 2519, 2508, 2878, 2891, 2902, 2888, 2903, 2892, 3031, 2964, - 3006, 3018, 3031, 3020, 3006, 3019, 3158, 3144, 3285, 3264, 3266, - 3274, 3285, 3271, 3286, 3272, 3285, 3275, 3390, 3402, 3415, 3404, - 3390, 3403, 3530, 3546, 3535, 3548, 3551, 3550, 3530, 3549, 4142, - 4134, 6965, 6918, 6965, 6920, 6965, 6922, 6965, 6924, 6965, 6926, - 6965, 6930, 6965, 6971, 6965, 6973, 6965, 6976, 6965, 6977, 6965, - 6979, 772, 7736, 772, 7737, 772, 7772, 772, 7773, 775, 7784, - 775, 7785, 770, 7852, 774, 7862, 770, 7853, 774, 7863, 770, - 7878, 770, 7879, 770, 7896, 770, 7897, 768, 7938, 769, 7940, - 834, 7942, 837, 8064, 768, 7939, 769, 7941, 834, 7943, 837, - 8065, 837, 8066, 837, 8067, 837, 8068, 837, 8069, 837, 8070, - 837, 8071, 768, 7946, 769, 7948, 834, 7950, 837, 8072, 768, - 7947, 769, 7949, 834, 7951, 837, 8073, 837, 8074, 837, 8075, - 837, 8076, 837, 8077, 837, 8078, 837, 8079, 768, 7954, 769, - 7956, 768, 7955, 769, 7957, 768, 7962, 769, 7964, 768, 7963, - 769, 7965, 768, 7970, 769, 7972, 834, 7974, 837, 8080, 768, - 7971, 769, 7973, 834, 7975, 837, 8081, 837, 8082, 837, 8083, - 837, 8084, 837, 8085, 837, 8086, 837, 8087, 768, 7978, 769, - 7980, 834, 7982, 837, 8088, 768, 7979, 769, 7981, 834, 7983, - 837, 8089, 837, 8090, 837, 8091, 837, 8092, 837, 8093, 837, - 8094, 837, 8095, 768, 7986, 769, 7988, 834, 7990, 768, 7987, - 769, 7989, 834, 7991, 768, 7994, 769, 7996, 834, 7998, 768, - 7995, 769, 7997, 834, 7999, 768, 8002, 769, 8004, 768, 8003, - 769, 8005, 768, 8010, 769, 8012, 768, 8011, 769, 8013, 768, - 8018, 769, 8020, 834, 8022, 768, 8019, 769, 8021, 834, 8023, - 768, 8027, 769, 8029, 834, 8031, 768, 8034, 769, 8036, 834, - 8038, 837, 8096, 768, 8035, 769, 8037, 834, 8039, 837, 8097, - 837, 8098, 837, 8099, 837, 8100, 837, 8101, 837, 8102, 837, - 8103, 768, 8042, 769, 8044, 834, 8046, 837, 8104, 768, 8043, - 769, 8045, 834, 8047, 837, 8105, 837, 8106, 837, 8107, 837, - 8108, 837, 8109, 837, 8110, 837, 8111, 837, 8114, 837, 8130, - 837, 8178, 837, 8119, 768, 8141, 769, 8142, 834, 8143, 837, - 8135, 837, 8183, 768, 8157, 769, 8158, 834, 8159, 824, 8602, - 824, 8603, 824, 8622, 824, 8653, 824, 8655, 824, 8654, 824, - 8708, 824, 8713, 824, 8716, 824, 8740, 824, 8742, 824, 8769, - 824, 8772, 824, 8775, 824, 8777, 824, 8813, 824, 8802, 824, - 8816, 824, 8817, 824, 8820, 824, 8821, 824, 8824, 824, 8825, - 824, 8832, 824, 8833, 824, 8928, 824, 8929, 824, 8836, 824, - 8837, 824, 8840, 824, 8841, 824, 8930, 824, 8931, 824, 8876, - 824, 8877, 824, 8878, 824, 8879, 824, 8938, 824, 8939, 824, - 8940, 824, 8941, 12441, 12436, 12441, 12364, 12441, 12366, 12441, 12368, - 12441, 12370, 12441, 12372, 12441, 12374, 12441, 12376, 12441, 12378, 12441, - 12380, 12441, 12382, 12441, 12384, 12441, 12386, 12441, 12389, 12441, 12391, - 12441, 12393, 12441, 12400, 12442, 12401, 12441, 12403, 12442, 12404, 12441, - 12406, 12442, 12407, 12441, 12409, 12442, 12410, 12441, 12412, 12442, 12413, - 12441, 12446, 12441, 12532, 12441, 12460, 12441, 12462, 12441, 12464, 12441, - 12466, 12441, 12468, 12441, 12470, 12441, 12472, 12441, 12474, 12441, 12476, - 12441, 12478, 12441, 12480, 12441, 12482, 12441, 12485, 12441, 12487, 12441, - 12489, 12441, 12496, 12442, 12497, 12441, 12499, 12442, 12500, 12441, 12502, - 12442, 12503, 12441, 12505, 12442, 12506, 12441, 12508, 12442, 12509, 12441, - 12535, 12441, 12536, 12441, 12537, 12441, 12538, 12441, 12542, 69818, 69786, - 69818, 69788, 69818, 69803, 69927, 69934, 69927, 69935, 70462, 70475, 70487, - 70476, 70832, 70844, 70842, 70843, 70845, 70846, 71087, 71098, 71087, 71099, - 71984, 71992}; +// Accessors and multi-stage tables are provided by table_store.hpp after +// ensure_tables(). Lookup code matches the classic O(1) uni-algo layout. } // namespace ada::idna #endif // ADA_IDNA_NORMALIZATION_TABLES_H /* end file src/normalization_tables.cpp */ +#include + namespace ada::idna { // See @@ -7799,6 +5265,30 @@ constexpr char32_t hangul_ncount = hangul_vcount * hangul_tcount; constexpr char32_t hangul_scount = hangul_lcount * hangul_vcount * hangul_tcount; +// Canonical decomposition length (0 if none / compatibility-only / Hangul +// syllable). Length 1 means a singleton mapping (character is not NFC form). +// Length >= 2 means a primary composite that is already the NFC form of its +// decomposition (e.g. U+00E9 LATIN SMALL LETTER E WITH ACUTE). +static size_t canonical_decomp_length(char32_t current_character) noexcept { + if (current_character >= hangul_sbase && + current_character < hangul_sbase + hangul_scount) { + // Hangul precomposed syllables are NFC. + return 0; + } + if (current_character >= 0x110000) { + return 0; + } + const uint8_t di = decomposition_index[current_character >> 8]; + const uint16_t* const decomposition = + decomposition_block_row(di) + (current_character % 256); + size_t decomposition_length = + (decomposition[1] >> 2) - (decomposition[0] >> 2); + if ((decomposition_length > 0) && (decomposition[0] & 1)) { + decomposition_length = 0; // compatibility-only: ignored for NFC + } + return decomposition_length; +} + std::pair compute_decomposition_length( const std::u32string_view input) noexcept { bool decomposition_needed{false}; @@ -7808,6 +5298,7 @@ std::pair compute_decomposition_length( if (current_character >= hangul_sbase && current_character < hangul_sbase + hangul_scount) { + // Full NFD-style Hangul decomp for the decompose() step. decomposition_length = 2; if ((current_character - hangul_sbase) % hangul_tcount) { decomposition_length = 3; @@ -7815,7 +5306,7 @@ std::pair compute_decomposition_length( } else if (current_character < 0x110000) { const uint8_t di = decomposition_index[current_character >> 8]; const uint16_t* const decomposition = - decomposition_block[di] + (current_character % 256); + decomposition_block_row(di) + (current_character % 256); decomposition_length = (decomposition[1] >> 2) - (decomposition[0] >> 2); if ((decomposition_length > 0) && (decomposition[0] & 1)) { decomposition_length = 0; @@ -7845,9 +5336,9 @@ void decompose(std::u32string& input, size_t additional_elements) { hangul_vbase + (s_index % hangul_ncount) / hangul_tcount; input[--descending_idx] = hangul_lbase + s_index / hangul_ncount; } else if (input[input_count] < 0x110000) { - // Check decomposition_data. const uint16_t* decomposition = - decomposition_block[decomposition_index[input[input_count] >> 8]] + + decomposition_block_row( + decomposition_index[input[input_count] >> 8]) + (input[input_count] % 256); uint16_t decomposition_length = (decomposition[1] >> 2) - (decomposition[0] >> 2); @@ -7855,26 +5346,29 @@ void decompose(std::u32string& input, size_t additional_elements) { decomposition_length = 0; } if (decomposition_length > 0) { - // Non-recursive decomposition. - while (decomposition_length-- > 0) { - input[--descending_idx] = decomposition_data[(decomposition[0] >> 2) + - decomposition_length]; + const size_t base = static_cast(decomposition[0] >> 2); + if (base + decomposition_length > decomposition_data_size) { + input[--descending_idx] = input[input_count]; + } else { + while (decomposition_length-- > 0) { + input[--descending_idx] = + decomposition_data[base + decomposition_length]; + } } } else { - // No decomposition. input[--descending_idx] = input[input_count]; } } else { - // Non-Unicode character. input[--descending_idx] = input[input_count]; } } } uint8_t get_ccc(char32_t c) noexcept { - return c < 0x110000 ? canonical_combining_class_block - [canonical_combining_class_index[c >> 8]][c % 256] - : 0; + if (c >= 0x110000) { + return 0; + } + return ccc_block_row(ccc_index[c >> 8])[c % 256]; } void sort_marks(std::u32string& input) { @@ -7882,7 +5376,7 @@ void sort_marks(std::u32string& input) { uint8_t ccc = get_ccc(input[idx]); if (ccc == 0) { continue; - } // Skip non-combining characters. + } auto current_character = input[idx]; size_t back_idx = idx; while (back_idx != 0 && get_ccc(input[back_idx - 1]) > ccc) { @@ -7906,6 +5400,98 @@ void decompose_nfc(std::u32string& input) { sort_marks(input); } +// Returns true if a composition step would change the string. +static bool would_compose(std::u32string_view input) noexcept { + for (size_t input_count = 0; input_count < input.size();) { + const char32_t current = input[input_count]; + if (current >= hangul_lbase && current < hangul_lbase + hangul_lcount) { + if (input_count + 1 < input.size() && + input[input_count + 1] >= hangul_vbase && + input[input_count + 1] < hangul_vbase + hangul_vcount) { + return true; + } + ++input_count; + continue; + } + if (current >= hangul_sbase && current < hangul_sbase + hangul_scount) { + if ((current - hangul_sbase) % hangul_tcount && + input_count + 1 < input.size() && + input[input_count + 1] > hangul_tbase && + input[input_count + 1] < hangul_tbase + hangul_tcount) { + return true; + } + ++input_count; + continue; + } + if (current < 0x110000) { + const uint16_t* composition = + composition_block_row(composition_index[current >> 8]) + + (current % 256); + int32_t previous_ccc = -1; + size_t j = input_count; + for (; j + 1 < input.size(); ++j) { + uint8_t ccc = get_ccc(input[j + 1]); + if (composition[1] != composition[0] && previous_ccc < ccc) { + int left = composition[0]; + int right = composition[1]; + if (left < 0 || right < left || + static_cast(right) > composition_data_size) { + break; + } + while (left + 2 < right) { + int middle = left + (((right - left) >> 1) & ~1); + if (composition_data[static_cast(middle)] <= input[j + 1]) { + left = middle; + } + if (composition_data[static_cast(middle)] >= input[j + 1]) { + right = middle; + } + } + if (static_cast(left + 1) < composition_data_size && + composition_data[static_cast(left)] == input[j + 1]) { + return true; + } + } + if (ccc == 0) { + break; + } + previous_ccc = ccc; + } + input_count = j + 1; + continue; + } + ++input_count; + } + return false; +} + +bool is_already_nfc(std::u32string_view input) noexcept { + if (input.empty()) { + return true; + } + if (!tables_are_ready() && !ensure_tables()) { + return false; + } + // 1) Singleton decompositions are never NFC (e.g. U+212B ANGSTROM SIGN). + // Multi-code-point decomps are primary composites that are NFC as-is. + for (char32_t c : input) { + if (canonical_decomp_length(c) == 1) { + return false; + } + } + // 2) Combining marks already in canonical order. + uint8_t prev_ccc = 0; + for (char32_t c : input) { + uint8_t ccc = get_ccc(c); + if (ccc != 0 && prev_ccc > ccc) { + return false; + } + prev_ccc = ccc; + } + // 3) No pairwise composition would apply (including Hangul L+V / LV+T). + return !would_compose(input); +} + void compose(std::u32string& input) { /** * Compose the domain_name string to Unicode Normalization Form C. @@ -7942,40 +5528,46 @@ void compose(std::u32string& input) { } } else if (input[input_count] < 0x110000) { const uint16_t* composition = - &composition_block[composition_index[input[input_count] >> 8]] - [input[input_count] % 256]; + composition_block_row(composition_index[input[input_count] >> 8]) + + (input[input_count] % 256); size_t initial_composition_count = composition_count; for (int32_t previous_ccc = -1; input_count + 1 < input.size(); input_count++) { uint8_t ccc = get_ccc(input[input_count + 1]); if (composition[1] != composition[0] && previous_ccc < ccc) { - // Try finding a composition. int left = composition[0]; int right = composition[1]; + if (left < 0 || right < left || + static_cast(right) > composition_data_size) { + break; + } while (left + 2 < right) { - // mean without overflow int middle = left + (((right - left) >> 1) & ~1); - if (composition_data[middle] <= input[input_count + 1]) { + if (composition_data[static_cast(middle)] <= + input[input_count + 1]) { left = middle; } - if (composition_data[middle] >= input[input_count + 1]) { + if (composition_data[static_cast(middle)] >= + input[input_count + 1]) { right = middle; } } - if (composition_data[left] == input[input_count + 1]) { - input[initial_composition_count] = composition_data[left + 1]; + if (static_cast(left + 1) < composition_data_size && + composition_data[static_cast(left)] == + input[input_count + 1]) { + char32_t composed = composition_data[static_cast(left + 1)]; + input[initial_composition_count] = composed; composition = - &composition_block - [composition_index[composition_data[left + 1] >> 8]] - [composition_data[left + 1] % 256]; + composition_block_row(composition_index[composed >> 8]) + + (composed % 256); continue; } } if (ccc == 0) { break; - } // Not a combining character. + } previous_ccc = ccc; input[++composition_count] = input[input_count + 1]; } @@ -7987,18 +5579,43 @@ void compose(std::u32string& input) { } } -void normalize(std::u32string& input) { +bool normalize(std::u32string& input) { /** - * Normalize the domain_name string to Unicode Normalization Form C. + * Normalize the characters according to IDNA (Unicode Normalization Form C). * @see https://www.unicode.org/reports/tr46/#ProcessingStepNormalize */ + if (!ensure_tables() || decomposition_index == nullptr || + composition_index == nullptr) { + return false; + } + if (is_already_nfc(input)) { + return true; + } decompose_nfc(input); compose(input); + return true; } } // namespace ada::idna /* end file src/normalization.cpp */ /* begin file src/punycode.cpp */ +/* begin file include/ada/idna/punycode.h */ +#ifndef ADA_IDNA_PUNYCODE_H +#define ADA_IDNA_PUNYCODE_H + +#include +#include + +namespace ada::idna { + +bool punycode_to_utf32(std::string_view input, std::u32string& out); +bool verify_punycode(std::string_view input); +bool utf32_to_punycode(std::u32string_view input, std::string& out); + +} // namespace ada::idna + +#endif // ADA_IDNA_PUNYCODE_H +/* end file include/ada/idna/punycode.h */ #include @@ -8038,10 +5655,6 @@ static constexpr int32_t adapt(int32_t d, int32_t n, bool firsttime) { } bool punycode_to_utf32(std::string_view input, std::u32string &out) { - // See https://github.com/whatwg/url/issues/803 - if (input.starts_with("xn--")) { - return false; - } int32_t written_out{0}; out.reserve(out.size() + input.size()); uint32_t n = initial_n; @@ -8098,13 +5711,20 @@ bool punycode_to_utf32(std::string_view input, std::u32string &out) { written_out++; ++i; } + // See https://github.com/whatwg/url/issues/803 + // Reject labels whose decoded form begins with "xn--" (double-encoded ACE). + if (out.size() >= 4 && out[0] == U'x' && out[1] == U'n' && out[2] == U'-' && + out[3] == U'-') { + return false; + } return true; } bool verify_punycode(std::string_view input) { - if (input.starts_with("xn--")) { - return false; - } + // Track only the first 4 decoded code points to check for the "xn--" prefix. + // This avoids heap allocation while still detecting double-encoded ACE + // labels. + uint32_t first4[4]{}; size_t written_out{0}; uint32_t n = initial_n; int32_t i = 0; @@ -8116,6 +5736,9 @@ bool verify_punycode(std::string_view input) { if (c >= 0x80) { return false; } + if (written_out < 4) { + first4[written_out] = c; + } written_out++; } input.remove_prefix(end_of_ascii + 1); @@ -8155,10 +5778,23 @@ bool verify_punycode(std::string_view input) { if (n < 0x80) { return false; } + // Simulate insert at position i, maintaining only the first 4 slots. + size_t insert_pos = size_t(i); + if (insert_pos < 4) { + for (size_t j = 3; j > insert_pos; j--) { + first4[j] = first4[j - 1]; + } + first4[insert_pos] = n; + } written_out++; ++i; } - + // See https://github.com/whatwg/url/issues/803 + // Reject labels whose decoded form begins with "xn--" (double-encoded ACE). + if (written_out >= 4 && first4[0] == U'x' && first4[1] == U'n' && + first4[2] == U'-' && first4[3] == U'-') { + return false; + } return true; } @@ -8226,7 +5862,9 @@ bool utf32_to_punycode(std::u32string_view input, std::string &out) { } // namespace ada::idna /* end file src/punycode.cpp */ /* begin file src/validity.cpp */ + #include +#include #include namespace ada::idna { @@ -8258,755 +5896,28 @@ enum direction : uint8_t { LRE }; -struct directions { - uint32_t start_code; - uint32_t final_code; - direction direct; -}; - -static directions dir_table[] = { - {0x0, 0x8, direction::BN}, {0x9, 0x9, direction::S}, - {0xa, 0xa, direction::B}, {0xb, 0xb, direction::S}, - {0xc, 0xc, direction::WS}, {0xd, 0xd, direction::B}, - {0xe, 0x1b, direction::BN}, {0x1c, 0x1e, direction::B}, - {0x1f, 0x1f, direction::S}, {0x20, 0x20, direction::WS}, - {0x21, 0x22, direction::ON}, {0x23, 0x25, direction::ET}, - {0x26, 0x2a, direction::ON}, {0x2b, 0x2b, direction::ES}, - {0x2c, 0x2c, direction::CS}, {0x2d, 0x2d, direction::ES}, - {0x2e, 0x2f, direction::CS}, {0x30, 0x39, direction::EN}, - {0x3a, 0x3a, direction::CS}, {0x3b, 0x40, direction::ON}, - {0x41, 0x5a, direction::L}, {0x5b, 0x60, direction::ON}, - {0x61, 0x7a, direction::L}, {0x7b, 0x7e, direction::ON}, - {0x7f, 0x84, direction::BN}, {0x85, 0x85, direction::B}, - {0x86, 0x9f, direction::BN}, {0xa0, 0xa0, direction::CS}, - {0xa1, 0xa1, direction::ON}, {0xa2, 0xa5, direction::ET}, - {0xa6, 0xa9, direction::ON}, {0xaa, 0xaa, direction::L}, - {0xab, 0xac, direction::ON}, {0xad, 0xad, direction::BN}, - {0xae, 0xaf, direction::ON}, {0xb0, 0xb1, direction::ET}, - {0xb2, 0xb3, direction::EN}, {0xb4, 0xb4, direction::ON}, - {0xb5, 0xb5, direction::L}, {0xb6, 0xb8, direction::ON}, - {0xb9, 0xb9, direction::EN}, {0xba, 0xba, direction::L}, - {0xbb, 0xbf, direction::ON}, {0xc0, 0xd6, direction::L}, - {0xd7, 0xd7, direction::ON}, {0xd8, 0xf6, direction::L}, - {0xf7, 0xf7, direction::ON}, {0xf8, 0x2b8, direction::L}, - {0x2b9, 0x2ba, direction::ON}, {0x2bb, 0x2c1, direction::L}, - {0x2c2, 0x2cf, direction::ON}, {0x2d0, 0x2d1, direction::L}, - {0x2d2, 0x2df, direction::ON}, {0x2e0, 0x2e4, direction::L}, - {0x2e5, 0x2ed, direction::ON}, {0x2ee, 0x2ee, direction::L}, - {0x2ef, 0x2ff, direction::ON}, {0x300, 0x36f, direction::NSM}, - {0x370, 0x373, direction::L}, {0x374, 0x375, direction::ON}, - {0x376, 0x377, direction::L}, {0x37a, 0x37d, direction::L}, - {0x37e, 0x37e, direction::ON}, {0x37f, 0x37f, direction::L}, - {0x384, 0x385, direction::ON}, {0x386, 0x386, direction::L}, - {0x387, 0x387, direction::ON}, {0x388, 0x38a, direction::L}, - {0x38c, 0x38c, direction::L}, {0x38e, 0x3a1, direction::L}, - {0x3a3, 0x3f5, direction::L}, {0x3f6, 0x3f6, direction::ON}, - {0x3f7, 0x482, direction::L}, {0x483, 0x489, direction::NSM}, - {0x48a, 0x52f, direction::L}, {0x531, 0x556, direction::L}, - {0x559, 0x589, direction::L}, {0x58a, 0x58a, direction::ON}, - {0x58d, 0x58e, direction::ON}, {0x58f, 0x58f, direction::ET}, - {0x591, 0x5bd, direction::NSM}, {0x5be, 0x5be, direction::R}, - {0x5bf, 0x5bf, direction::NSM}, {0x5c0, 0x5c0, direction::R}, - {0x5c1, 0x5c2, direction::NSM}, {0x5c3, 0x5c3, direction::R}, - {0x5c4, 0x5c5, direction::NSM}, {0x5c6, 0x5c6, direction::R}, - {0x5c7, 0x5c7, direction::NSM}, {0x5d0, 0x5ea, direction::R}, - {0x5ef, 0x5f4, direction::R}, {0x600, 0x605, direction::AN}, - {0x606, 0x607, direction::ON}, {0x608, 0x608, direction::AL}, - {0x609, 0x60a, direction::ET}, {0x60b, 0x60b, direction::AL}, - {0x60c, 0x60c, direction::CS}, {0x60d, 0x60d, direction::AL}, - {0x60e, 0x60f, direction::ON}, {0x610, 0x61a, direction::NSM}, - {0x61b, 0x61c, direction::AL}, {0x61e, 0x64a, direction::AL}, - {0x64b, 0x65f, direction::NSM}, {0x660, 0x669, direction::AN}, - {0x66a, 0x66a, direction::ET}, {0x66b, 0x66c, direction::AN}, - {0x66d, 0x66f, direction::AL}, {0x670, 0x670, direction::NSM}, - {0x671, 0x6d5, direction::AL}, {0x6d6, 0x6dc, direction::NSM}, - {0x6dd, 0x6dd, direction::AN}, {0x6de, 0x6de, direction::ON}, - {0x6df, 0x6e4, direction::NSM}, {0x6e5, 0x6e6, direction::AL}, - {0x6e7, 0x6e8, direction::NSM}, {0x6e9, 0x6e9, direction::ON}, - {0x6ea, 0x6ed, direction::NSM}, {0x6ee, 0x6ef, direction::AL}, - {0x6f0, 0x6f9, direction::EN}, {0x6fa, 0x70d, direction::AL}, - {0x70f, 0x710, direction::AL}, {0x711, 0x711, direction::NSM}, - {0x712, 0x72f, direction::AL}, {0x730, 0x74a, direction::NSM}, - {0x74d, 0x7a5, direction::AL}, {0x7a6, 0x7b0, direction::NSM}, - {0x7b1, 0x7b1, direction::AL}, {0x7c0, 0x7ea, direction::R}, - {0x7eb, 0x7f3, direction::NSM}, {0x7f4, 0x7f5, direction::R}, - {0x7f6, 0x7f9, direction::ON}, {0x7fa, 0x7fa, direction::R}, - {0x7fd, 0x7fd, direction::NSM}, {0x7fe, 0x815, direction::R}, - {0x816, 0x819, direction::NSM}, {0x81a, 0x81a, direction::R}, - {0x81b, 0x823, direction::NSM}, {0x824, 0x824, direction::R}, - {0x825, 0x827, direction::NSM}, {0x828, 0x828, direction::R}, - {0x829, 0x82d, direction::NSM}, {0x830, 0x83e, direction::R}, - {0x840, 0x858, direction::R}, {0x859, 0x85b, direction::NSM}, - {0x85e, 0x85e, direction::R}, {0x860, 0x86a, direction::AL}, - {0x8a0, 0x8b4, direction::AL}, {0x8b6, 0x8c7, direction::AL}, - {0x8d3, 0x8e1, direction::NSM}, {0x8e2, 0x8e2, direction::AN}, - {0x8e3, 0x902, direction::NSM}, {0x903, 0x939, direction::L}, - {0x93a, 0x93a, direction::NSM}, {0x93b, 0x93b, direction::L}, - {0x93c, 0x93c, direction::NSM}, {0x93d, 0x940, direction::L}, - {0x941, 0x948, direction::NSM}, {0x949, 0x94c, direction::L}, - {0x94d, 0x94d, direction::NSM}, {0x94e, 0x950, direction::L}, - {0x951, 0x957, direction::NSM}, {0x958, 0x961, direction::L}, - {0x962, 0x963, direction::NSM}, {0x964, 0x980, direction::L}, - {0x981, 0x981, direction::NSM}, {0x982, 0x983, direction::L}, - {0x985, 0x98c, direction::L}, {0x98f, 0x990, direction::L}, - {0x993, 0x9a8, direction::L}, {0x9aa, 0x9b0, direction::L}, - {0x9b2, 0x9b2, direction::L}, {0x9b6, 0x9b9, direction::L}, - {0x9bc, 0x9bc, direction::NSM}, {0x9bd, 0x9c0, direction::L}, - {0x9c1, 0x9c4, direction::NSM}, {0x9c7, 0x9c8, direction::L}, - {0x9cb, 0x9cc, direction::L}, {0x9cd, 0x9cd, direction::NSM}, - {0x9ce, 0x9ce, direction::L}, {0x9d7, 0x9d7, direction::L}, - {0x9dc, 0x9dd, direction::L}, {0x9df, 0x9e1, direction::L}, - {0x9e2, 0x9e3, direction::NSM}, {0x9e6, 0x9f1, direction::L}, - {0x9f2, 0x9f3, direction::ET}, {0x9f4, 0x9fa, direction::L}, - {0x9fb, 0x9fb, direction::ET}, {0x9fc, 0x9fd, direction::L}, - {0x9fe, 0x9fe, direction::NSM}, {0xa01, 0xa02, direction::NSM}, - {0xa03, 0xa03, direction::L}, {0xa05, 0xa0a, direction::L}, - {0xa0f, 0xa10, direction::L}, {0xa13, 0xa28, direction::L}, - {0xa2a, 0xa30, direction::L}, {0xa32, 0xa33, direction::L}, - {0xa35, 0xa36, direction::L}, {0xa38, 0xa39, direction::L}, - {0xa3c, 0xa3c, direction::NSM}, {0xa3e, 0xa40, direction::L}, - {0xa41, 0xa42, direction::NSM}, {0xa47, 0xa48, direction::NSM}, - {0xa4b, 0xa4d, direction::NSM}, {0xa51, 0xa51, direction::NSM}, - {0xa59, 0xa5c, direction::L}, {0xa5e, 0xa5e, direction::L}, - {0xa66, 0xa6f, direction::L}, {0xa70, 0xa71, direction::NSM}, - {0xa72, 0xa74, direction::L}, {0xa75, 0xa75, direction::NSM}, - {0xa76, 0xa76, direction::L}, {0xa81, 0xa82, direction::NSM}, - {0xa83, 0xa83, direction::L}, {0xa85, 0xa8d, direction::L}, - {0xa8f, 0xa91, direction::L}, {0xa93, 0xaa8, direction::L}, - {0xaaa, 0xab0, direction::L}, {0xab2, 0xab3, direction::L}, - {0xab5, 0xab9, direction::L}, {0xabc, 0xabc, direction::NSM}, - {0xabd, 0xac0, direction::L}, {0xac1, 0xac5, direction::NSM}, - {0xac7, 0xac8, direction::NSM}, {0xac9, 0xac9, direction::L}, - {0xacb, 0xacc, direction::L}, {0xacd, 0xacd, direction::NSM}, - {0xad0, 0xad0, direction::L}, {0xae0, 0xae1, direction::L}, - {0xae2, 0xae3, direction::NSM}, {0xae6, 0xaf0, direction::L}, - {0xaf1, 0xaf1, direction::ET}, {0xaf9, 0xaf9, direction::L}, - {0xafa, 0xaff, direction::NSM}, {0xb01, 0xb01, direction::NSM}, - {0xb02, 0xb03, direction::L}, {0xb05, 0xb0c, direction::L}, - {0xb0f, 0xb10, direction::L}, {0xb13, 0xb28, direction::L}, - {0xb2a, 0xb30, direction::L}, {0xb32, 0xb33, direction::L}, - {0xb35, 0xb39, direction::L}, {0xb3c, 0xb3c, direction::NSM}, - {0xb3d, 0xb3e, direction::L}, {0xb3f, 0xb3f, direction::NSM}, - {0xb40, 0xb40, direction::L}, {0xb41, 0xb44, direction::NSM}, - {0xb47, 0xb48, direction::L}, {0xb4b, 0xb4c, direction::L}, - {0xb4d, 0xb4d, direction::NSM}, {0xb55, 0xb56, direction::NSM}, - {0xb57, 0xb57, direction::L}, {0xb5c, 0xb5d, direction::L}, - {0xb5f, 0xb61, direction::L}, {0xb62, 0xb63, direction::NSM}, - {0xb66, 0xb77, direction::L}, {0xb82, 0xb82, direction::NSM}, - {0xb83, 0xb83, direction::L}, {0xb85, 0xb8a, direction::L}, - {0xb8e, 0xb90, direction::L}, {0xb92, 0xb95, direction::L}, - {0xb99, 0xb9a, direction::L}, {0xb9c, 0xb9c, direction::L}, - {0xb9e, 0xb9f, direction::L}, {0xba3, 0xba4, direction::L}, - {0xba8, 0xbaa, direction::L}, {0xbae, 0xbb9, direction::L}, - {0xbbe, 0xbbf, direction::L}, {0xbc0, 0xbc0, direction::NSM}, - {0xbc1, 0xbc2, direction::L}, {0xbc6, 0xbc8, direction::L}, - {0xbca, 0xbcc, direction::L}, {0xbcd, 0xbcd, direction::NSM}, - {0xbd0, 0xbd0, direction::L}, {0xbd7, 0xbd7, direction::L}, - {0xbe6, 0xbf2, direction::L}, {0xbf3, 0xbf8, direction::ON}, - {0xbf9, 0xbf9, direction::ET}, {0xbfa, 0xbfa, direction::ON}, - {0xc00, 0xc00, direction::NSM}, {0xc01, 0xc03, direction::L}, - {0xc04, 0xc04, direction::NSM}, {0xc05, 0xc0c, direction::L}, - {0xc0e, 0xc10, direction::L}, {0xc12, 0xc28, direction::L}, - {0xc2a, 0xc39, direction::L}, {0xc3d, 0xc3d, direction::L}, - {0xc3e, 0xc40, direction::NSM}, {0xc41, 0xc44, direction::L}, - {0xc46, 0xc48, direction::NSM}, {0xc4a, 0xc4d, direction::NSM}, - {0xc55, 0xc56, direction::NSM}, {0xc58, 0xc5a, direction::L}, - {0xc60, 0xc61, direction::L}, {0xc62, 0xc63, direction::NSM}, - {0xc66, 0xc6f, direction::L}, {0xc77, 0xc77, direction::L}, - {0xc78, 0xc7e, direction::ON}, {0xc7f, 0xc80, direction::L}, - {0xc81, 0xc81, direction::NSM}, {0xc82, 0xc8c, direction::L}, - {0xc8e, 0xc90, direction::L}, {0xc92, 0xca8, direction::L}, - {0xcaa, 0xcb3, direction::L}, {0xcb5, 0xcb9, direction::L}, - {0xcbc, 0xcbc, direction::NSM}, {0xcbd, 0xcc4, direction::L}, - {0xcc6, 0xcc8, direction::L}, {0xcca, 0xccb, direction::L}, - {0xccc, 0xccd, direction::NSM}, {0xcd5, 0xcd6, direction::L}, - {0xcde, 0xcde, direction::L}, {0xce0, 0xce1, direction::L}, - {0xce2, 0xce3, direction::NSM}, {0xce6, 0xcef, direction::L}, - {0xcf1, 0xcf2, direction::L}, {0xd00, 0xd01, direction::NSM}, - {0xd02, 0xd0c, direction::L}, {0xd0e, 0xd10, direction::L}, - {0xd12, 0xd3a, direction::L}, {0xd3b, 0xd3c, direction::NSM}, - {0xd3d, 0xd40, direction::L}, {0xd41, 0xd44, direction::NSM}, - {0xd46, 0xd48, direction::L}, {0xd4a, 0xd4c, direction::L}, - {0xd4d, 0xd4d, direction::NSM}, {0xd4e, 0xd4f, direction::L}, - {0xd54, 0xd61, direction::L}, {0xd62, 0xd63, direction::NSM}, - {0xd66, 0xd7f, direction::L}, {0xd81, 0xd81, direction::NSM}, - {0xd82, 0xd83, direction::L}, {0xd85, 0xd96, direction::L}, - {0xd9a, 0xdb1, direction::L}, {0xdb3, 0xdbb, direction::L}, - {0xdbd, 0xdbd, direction::L}, {0xdc0, 0xdc6, direction::L}, - {0xdca, 0xdca, direction::NSM}, {0xdcf, 0xdd1, direction::L}, - {0xdd2, 0xdd4, direction::NSM}, {0xdd6, 0xdd6, direction::NSM}, - {0xdd8, 0xddf, direction::L}, {0xde6, 0xdef, direction::L}, - {0xdf2, 0xdf4, direction::L}, {0xe01, 0xe30, direction::L}, - {0xe31, 0xe31, direction::NSM}, {0xe32, 0xe33, direction::L}, - {0xe34, 0xe3a, direction::NSM}, {0xe3f, 0xe3f, direction::ET}, - {0xe40, 0xe46, direction::L}, {0xe47, 0xe4e, direction::NSM}, - {0xe4f, 0xe5b, direction::L}, {0xe81, 0xe82, direction::L}, - {0xe84, 0xe84, direction::L}, {0xe86, 0xe8a, direction::L}, - {0xe8c, 0xea3, direction::L}, {0xea5, 0xea5, direction::L}, - {0xea7, 0xeb0, direction::L}, {0xeb1, 0xeb1, direction::NSM}, - {0xeb2, 0xeb3, direction::L}, {0xeb4, 0xebc, direction::NSM}, - {0xebd, 0xebd, direction::L}, {0xec0, 0xec4, direction::L}, - {0xec6, 0xec6, direction::L}, {0xec8, 0xecd, direction::NSM}, - {0xed0, 0xed9, direction::L}, {0xedc, 0xedf, direction::L}, - {0xf00, 0xf17, direction::L}, {0xf18, 0xf19, direction::NSM}, - {0xf1a, 0xf34, direction::L}, {0xf35, 0xf35, direction::NSM}, - {0xf36, 0xf36, direction::L}, {0xf37, 0xf37, direction::NSM}, - {0xf38, 0xf38, direction::L}, {0xf39, 0xf39, direction::NSM}, - {0xf3a, 0xf3d, direction::ON}, {0xf3e, 0xf47, direction::L}, - {0xf49, 0xf6c, direction::L}, {0xf71, 0xf7e, direction::NSM}, - {0xf7f, 0xf7f, direction::L}, {0xf80, 0xf84, direction::NSM}, - {0xf85, 0xf85, direction::L}, {0xf86, 0xf87, direction::NSM}, - {0xf88, 0xf8c, direction::L}, {0xf8d, 0xf97, direction::NSM}, - {0xf99, 0xfbc, direction::NSM}, {0xfbe, 0xfc5, direction::L}, - {0xfc6, 0xfc6, direction::NSM}, {0xfc7, 0xfcc, direction::L}, - {0xfce, 0xfda, direction::L}, {0x1000, 0x102c, direction::L}, - {0x102d, 0x1030, direction::NSM}, {0x1031, 0x1031, direction::L}, - {0x1032, 0x1037, direction::NSM}, {0x1038, 0x1038, direction::L}, - {0x1039, 0x103a, direction::NSM}, {0x103b, 0x103c, direction::L}, - {0x103d, 0x103e, direction::NSM}, {0x103f, 0x1057, direction::L}, - {0x1058, 0x1059, direction::NSM}, {0x105a, 0x105d, direction::L}, - {0x105e, 0x1060, direction::NSM}, {0x1061, 0x1070, direction::L}, - {0x1071, 0x1074, direction::NSM}, {0x1075, 0x1081, direction::L}, - {0x1082, 0x1082, direction::NSM}, {0x1083, 0x1084, direction::L}, - {0x1085, 0x1086, direction::NSM}, {0x1087, 0x108c, direction::L}, - {0x108d, 0x108d, direction::NSM}, {0x108e, 0x109c, direction::L}, - {0x109d, 0x109d, direction::NSM}, {0x109e, 0x10c5, direction::L}, - {0x10c7, 0x10c7, direction::L}, {0x10cd, 0x10cd, direction::L}, - {0x10d0, 0x1248, direction::L}, {0x124a, 0x124d, direction::L}, - {0x1250, 0x1256, direction::L}, {0x1258, 0x1258, direction::L}, - {0x125a, 0x125d, direction::L}, {0x1260, 0x1288, direction::L}, - {0x128a, 0x128d, direction::L}, {0x1290, 0x12b0, direction::L}, - {0x12b2, 0x12b5, direction::L}, {0x12b8, 0x12be, direction::L}, - {0x12c0, 0x12c0, direction::L}, {0x12c2, 0x12c5, direction::L}, - {0x12c8, 0x12d6, direction::L}, {0x12d8, 0x1310, direction::L}, - {0x1312, 0x1315, direction::L}, {0x1318, 0x135a, direction::L}, - {0x135d, 0x135f, direction::NSM}, {0x1360, 0x137c, direction::L}, - {0x1380, 0x138f, direction::L}, {0x1390, 0x1399, direction::ON}, - {0x13a0, 0x13f5, direction::L}, {0x13f8, 0x13fd, direction::L}, - {0x1400, 0x1400, direction::ON}, {0x1401, 0x167f, direction::L}, - {0x1680, 0x1680, direction::WS}, {0x1681, 0x169a, direction::L}, - {0x169b, 0x169c, direction::ON}, {0x16a0, 0x16f8, direction::L}, - {0x1700, 0x170c, direction::L}, {0x170e, 0x1711, direction::L}, - {0x1712, 0x1714, direction::NSM}, {0x1720, 0x1731, direction::L}, - {0x1732, 0x1734, direction::NSM}, {0x1735, 0x1736, direction::L}, - {0x1740, 0x1751, direction::L}, {0x1752, 0x1753, direction::NSM}, - {0x1760, 0x176c, direction::L}, {0x176e, 0x1770, direction::L}, - {0x1772, 0x1773, direction::NSM}, {0x1780, 0x17b3, direction::L}, - {0x17b4, 0x17b5, direction::NSM}, {0x17b6, 0x17b6, direction::L}, - {0x17b7, 0x17bd, direction::NSM}, {0x17be, 0x17c5, direction::L}, - {0x17c6, 0x17c6, direction::NSM}, {0x17c7, 0x17c8, direction::L}, - {0x17c9, 0x17d3, direction::NSM}, {0x17d4, 0x17da, direction::L}, - {0x17db, 0x17db, direction::ET}, {0x17dc, 0x17dc, direction::L}, - {0x17dd, 0x17dd, direction::NSM}, {0x17e0, 0x17e9, direction::L}, - {0x17f0, 0x17f9, direction::ON}, {0x1800, 0x180a, direction::ON}, - {0x180b, 0x180d, direction::NSM}, {0x180e, 0x180e, direction::BN}, - {0x1810, 0x1819, direction::L}, {0x1820, 0x1878, direction::L}, - {0x1880, 0x1884, direction::L}, {0x1885, 0x1886, direction::NSM}, - {0x1887, 0x18a8, direction::L}, {0x18a9, 0x18a9, direction::NSM}, - {0x18aa, 0x18aa, direction::L}, {0x18b0, 0x18f5, direction::L}, - {0x1900, 0x191e, direction::L}, {0x1920, 0x1922, direction::NSM}, - {0x1923, 0x1926, direction::L}, {0x1927, 0x1928, direction::NSM}, - {0x1929, 0x192b, direction::L}, {0x1930, 0x1931, direction::L}, - {0x1932, 0x1932, direction::NSM}, {0x1933, 0x1938, direction::L}, - {0x1939, 0x193b, direction::NSM}, {0x1940, 0x1940, direction::ON}, - {0x1944, 0x1945, direction::ON}, {0x1946, 0x196d, direction::L}, - {0x1970, 0x1974, direction::L}, {0x1980, 0x19ab, direction::L}, - {0x19b0, 0x19c9, direction::L}, {0x19d0, 0x19da, direction::L}, - {0x19de, 0x19ff, direction::ON}, {0x1a00, 0x1a16, direction::L}, - {0x1a17, 0x1a18, direction::NSM}, {0x1a19, 0x1a1a, direction::L}, - {0x1a1b, 0x1a1b, direction::NSM}, {0x1a1e, 0x1a55, direction::L}, - {0x1a56, 0x1a56, direction::NSM}, {0x1a57, 0x1a57, direction::L}, - {0x1a58, 0x1a5e, direction::NSM}, {0x1a60, 0x1a60, direction::NSM}, - {0x1a61, 0x1a61, direction::L}, {0x1a62, 0x1a62, direction::NSM}, - {0x1a63, 0x1a64, direction::L}, {0x1a65, 0x1a6c, direction::NSM}, - {0x1a6d, 0x1a72, direction::L}, {0x1a73, 0x1a7c, direction::NSM}, - {0x1a7f, 0x1a7f, direction::NSM}, {0x1a80, 0x1a89, direction::L}, - {0x1a90, 0x1a99, direction::L}, {0x1aa0, 0x1aad, direction::L}, - {0x1ab0, 0x1ac0, direction::NSM}, {0x1b00, 0x1b03, direction::NSM}, - {0x1b04, 0x1b33, direction::L}, {0x1b34, 0x1b34, direction::NSM}, - {0x1b35, 0x1b35, direction::L}, {0x1b36, 0x1b3a, direction::NSM}, - {0x1b3b, 0x1b3b, direction::L}, {0x1b3c, 0x1b3c, direction::NSM}, - {0x1b3d, 0x1b41, direction::L}, {0x1b42, 0x1b42, direction::NSM}, - {0x1b43, 0x1b4b, direction::L}, {0x1b50, 0x1b6a, direction::L}, - {0x1b6b, 0x1b73, direction::NSM}, {0x1b74, 0x1b7c, direction::L}, - {0x1b80, 0x1b81, direction::NSM}, {0x1b82, 0x1ba1, direction::L}, - {0x1ba2, 0x1ba5, direction::NSM}, {0x1ba6, 0x1ba7, direction::L}, - {0x1ba8, 0x1ba9, direction::NSM}, {0x1baa, 0x1baa, direction::L}, - {0x1bab, 0x1bad, direction::NSM}, {0x1bae, 0x1be5, direction::L}, - {0x1be6, 0x1be6, direction::NSM}, {0x1be7, 0x1be7, direction::L}, - {0x1be8, 0x1be9, direction::NSM}, {0x1bea, 0x1bec, direction::L}, - {0x1bed, 0x1bed, direction::NSM}, {0x1bee, 0x1bee, direction::L}, - {0x1bef, 0x1bf1, direction::NSM}, {0x1bf2, 0x1bf3, direction::L}, - {0x1bfc, 0x1c2b, direction::L}, {0x1c2c, 0x1c33, direction::NSM}, - {0x1c34, 0x1c35, direction::L}, {0x1c36, 0x1c37, direction::NSM}, - {0x1c3b, 0x1c49, direction::L}, {0x1c4d, 0x1c88, direction::L}, - {0x1c90, 0x1cba, direction::L}, {0x1cbd, 0x1cc7, direction::L}, - {0x1cd0, 0x1cd2, direction::NSM}, {0x1cd3, 0x1cd3, direction::L}, - {0x1cd4, 0x1ce0, direction::NSM}, {0x1ce1, 0x1ce1, direction::L}, - {0x1ce2, 0x1ce8, direction::NSM}, {0x1ce9, 0x1cec, direction::L}, - {0x1ced, 0x1ced, direction::NSM}, {0x1cee, 0x1cf3, direction::L}, - {0x1cf4, 0x1cf4, direction::NSM}, {0x1cf5, 0x1cf7, direction::L}, - {0x1cf8, 0x1cf9, direction::NSM}, {0x1cfa, 0x1cfa, direction::L}, - {0x1d00, 0x1dbf, direction::L}, {0x1dc0, 0x1df9, direction::NSM}, - {0x1dfb, 0x1dff, direction::NSM}, {0x1e00, 0x1f15, direction::L}, - {0x1f18, 0x1f1d, direction::L}, {0x1f20, 0x1f45, direction::L}, - {0x1f48, 0x1f4d, direction::L}, {0x1f50, 0x1f57, direction::L}, - {0x1f59, 0x1f59, direction::L}, {0x1f5b, 0x1f5b, direction::L}, - {0x1f5d, 0x1f5d, direction::L}, {0x1f5f, 0x1f7d, direction::L}, - {0x1f80, 0x1fb4, direction::L}, {0x1fb6, 0x1fbc, direction::L}, - {0x1fbd, 0x1fbd, direction::ON}, {0x1fbe, 0x1fbe, direction::L}, - {0x1fbf, 0x1fc1, direction::ON}, {0x1fc2, 0x1fc4, direction::L}, - {0x1fc6, 0x1fcc, direction::L}, {0x1fcd, 0x1fcf, direction::ON}, - {0x1fd0, 0x1fd3, direction::L}, {0x1fd6, 0x1fdb, direction::L}, - {0x1fdd, 0x1fdf, direction::ON}, {0x1fe0, 0x1fec, direction::L}, - {0x1fed, 0x1fef, direction::ON}, {0x1ff2, 0x1ff4, direction::L}, - {0x1ff6, 0x1ffc, direction::L}, {0x1ffd, 0x1ffe, direction::ON}, - {0x2000, 0x200a, direction::WS}, {0x200b, 0x200d, direction::BN}, - {0x200e, 0x200e, direction::L}, {0x200f, 0x200f, direction::R}, - {0x2010, 0x2027, direction::ON}, {0x2028, 0x2028, direction::WS}, - {0x2029, 0x2029, direction::B}, {0x202a, 0x202a, direction::LRE}, - {0x202b, 0x202b, direction::RLE}, {0x202c, 0x202c, direction::PDF}, - {0x202d, 0x202d, direction::LRO}, {0x202e, 0x202e, direction::RLO}, - {0x202f, 0x202f, direction::CS}, {0x2030, 0x2034, direction::ET}, - {0x2035, 0x2043, direction::ON}, {0x2044, 0x2044, direction::CS}, - {0x2045, 0x205e, direction::ON}, {0x205f, 0x205f, direction::WS}, - {0x2060, 0x2064, direction::BN}, {0x2066, 0x2066, direction::LRI}, - {0x2067, 0x2067, direction::RLI}, {0x2068, 0x2068, direction::FSI}, - {0x2069, 0x2069, direction::PDI}, {0x206a, 0x206f, direction::BN}, - {0x2070, 0x2070, direction::EN}, {0x2071, 0x2071, direction::L}, - {0x2074, 0x2079, direction::EN}, {0x207a, 0x207b, direction::ES}, - {0x207c, 0x207e, direction::ON}, {0x207f, 0x207f, direction::L}, - {0x2080, 0x2089, direction::EN}, {0x208a, 0x208b, direction::ES}, - {0x208c, 0x208e, direction::ON}, {0x2090, 0x209c, direction::L}, - {0x20a0, 0x20bf, direction::ET}, {0x20d0, 0x20f0, direction::NSM}, - {0x2100, 0x2101, direction::ON}, {0x2102, 0x2102, direction::L}, - {0x2103, 0x2106, direction::ON}, {0x2107, 0x2107, direction::L}, - {0x2108, 0x2109, direction::ON}, {0x210a, 0x2113, direction::L}, - {0x2114, 0x2114, direction::ON}, {0x2115, 0x2115, direction::L}, - {0x2116, 0x2118, direction::ON}, {0x2119, 0x211d, direction::L}, - {0x211e, 0x2123, direction::ON}, {0x2124, 0x2124, direction::L}, - {0x2125, 0x2125, direction::ON}, {0x2126, 0x2126, direction::L}, - {0x2127, 0x2127, direction::ON}, {0x2128, 0x2128, direction::L}, - {0x2129, 0x2129, direction::ON}, {0x212a, 0x212d, direction::L}, - {0x212e, 0x212e, direction::ET}, {0x212f, 0x2139, direction::L}, - {0x213a, 0x213b, direction::ON}, {0x213c, 0x213f, direction::L}, - {0x2140, 0x2144, direction::ON}, {0x2145, 0x2149, direction::L}, - {0x214a, 0x214d, direction::ON}, {0x214e, 0x214f, direction::L}, - {0x2150, 0x215f, direction::ON}, {0x2160, 0x2188, direction::L}, - {0x2189, 0x218b, direction::ON}, {0x2190, 0x2211, direction::ON}, - {0x2212, 0x2212, direction::ES}, {0x2213, 0x2213, direction::ET}, - {0x2214, 0x2335, direction::ON}, {0x2336, 0x237a, direction::L}, - {0x237b, 0x2394, direction::ON}, {0x2395, 0x2395, direction::L}, - {0x2396, 0x2426, direction::ON}, {0x2440, 0x244a, direction::ON}, - {0x2460, 0x2487, direction::ON}, {0x2488, 0x249b, direction::EN}, - {0x249c, 0x24e9, direction::L}, {0x24ea, 0x26ab, direction::ON}, - {0x26ac, 0x26ac, direction::L}, {0x26ad, 0x27ff, direction::ON}, - {0x2800, 0x28ff, direction::L}, {0x2900, 0x2b73, direction::ON}, - {0x2b76, 0x2b95, direction::ON}, {0x2b97, 0x2bff, direction::ON}, - {0x2c00, 0x2c2e, direction::L}, {0x2c30, 0x2c5e, direction::L}, - {0x2c60, 0x2ce4, direction::L}, {0x2ce5, 0x2cea, direction::ON}, - {0x2ceb, 0x2cee, direction::L}, {0x2cef, 0x2cf1, direction::NSM}, - {0x2cf2, 0x2cf3, direction::L}, {0x2cf9, 0x2cff, direction::ON}, - {0x2d00, 0x2d25, direction::L}, {0x2d27, 0x2d27, direction::L}, - {0x2d2d, 0x2d2d, direction::L}, {0x2d30, 0x2d67, direction::L}, - {0x2d6f, 0x2d70, direction::L}, {0x2d7f, 0x2d7f, direction::NSM}, - {0x2d80, 0x2d96, direction::L}, {0x2da0, 0x2da6, direction::L}, - {0x2da8, 0x2dae, direction::L}, {0x2db0, 0x2db6, direction::L}, - {0x2db8, 0x2dbe, direction::L}, {0x2dc0, 0x2dc6, direction::L}, - {0x2dc8, 0x2dce, direction::L}, {0x2dd0, 0x2dd6, direction::L}, - {0x2dd8, 0x2dde, direction::L}, {0x2de0, 0x2dff, direction::NSM}, - {0x2e00, 0x2e52, direction::ON}, {0x2e80, 0x2e99, direction::ON}, - {0x2e9b, 0x2ef3, direction::ON}, {0x2f00, 0x2fd5, direction::ON}, - {0x2ff0, 0x2ffb, direction::ON}, {0x3000, 0x3000, direction::WS}, - {0x3001, 0x3004, direction::ON}, {0x3005, 0x3007, direction::L}, - {0x3008, 0x3020, direction::ON}, {0x3021, 0x3029, direction::L}, - {0x302a, 0x302d, direction::NSM}, {0x302e, 0x302f, direction::L}, - {0x3030, 0x3030, direction::ON}, {0x3031, 0x3035, direction::L}, - {0x3036, 0x3037, direction::ON}, {0x3038, 0x303c, direction::L}, - {0x303d, 0x303f, direction::ON}, {0x3041, 0x3096, direction::L}, - {0x3099, 0x309a, direction::NSM}, {0x309b, 0x309c, direction::ON}, - {0x309d, 0x309f, direction::L}, {0x30a0, 0x30a0, direction::ON}, - {0x30a1, 0x30fa, direction::L}, {0x30fb, 0x30fb, direction::ON}, - {0x30fc, 0x30ff, direction::L}, {0x3105, 0x312f, direction::L}, - {0x3131, 0x318e, direction::L}, {0x3190, 0x31bf, direction::L}, - {0x31c0, 0x31e3, direction::ON}, {0x31f0, 0x321c, direction::L}, - {0x321d, 0x321e, direction::ON}, {0x3220, 0x324f, direction::L}, - {0x3250, 0x325f, direction::ON}, {0x3260, 0x327b, direction::L}, - {0x327c, 0x327e, direction::ON}, {0x327f, 0x32b0, direction::L}, - {0x32b1, 0x32bf, direction::ON}, {0x32c0, 0x32cb, direction::L}, - {0x32cc, 0x32cf, direction::ON}, {0x32d0, 0x3376, direction::L}, - {0x3377, 0x337a, direction::ON}, {0x337b, 0x33dd, direction::L}, - {0x33de, 0x33df, direction::ON}, {0x33e0, 0x33fe, direction::L}, - {0x33ff, 0x33ff, direction::ON}, {0x3400, 0x4dbf, direction::L}, - {0x4dc0, 0x4dff, direction::ON}, {0x4e00, 0x9ffc, direction::L}, - {0xa000, 0xa48c, direction::L}, {0xa490, 0xa4c6, direction::ON}, - {0xa4d0, 0xa60c, direction::L}, {0xa60d, 0xa60f, direction::ON}, - {0xa610, 0xa62b, direction::L}, {0xa640, 0xa66e, direction::L}, - {0xa66f, 0xa672, direction::NSM}, {0xa673, 0xa673, direction::ON}, - {0xa674, 0xa67d, direction::NSM}, {0xa67e, 0xa67f, direction::ON}, - {0xa680, 0xa69d, direction::L}, {0xa69e, 0xa69f, direction::NSM}, - {0xa6a0, 0xa6ef, direction::L}, {0xa6f0, 0xa6f1, direction::NSM}, - {0xa6f2, 0xa6f7, direction::L}, {0xa700, 0xa721, direction::ON}, - {0xa722, 0xa787, direction::L}, {0xa788, 0xa788, direction::ON}, - {0xa789, 0xa7bf, direction::L}, {0xa7c2, 0xa7ca, direction::L}, - {0xa7f5, 0xa801, direction::L}, {0xa802, 0xa802, direction::NSM}, - {0xa803, 0xa805, direction::L}, {0xa806, 0xa806, direction::NSM}, - {0xa807, 0xa80a, direction::L}, {0xa80b, 0xa80b, direction::NSM}, - {0xa80c, 0xa824, direction::L}, {0xa825, 0xa826, direction::NSM}, - {0xa827, 0xa827, direction::L}, {0xa828, 0xa82b, direction::ON}, - {0xa82c, 0xa82c, direction::NSM}, {0xa830, 0xa837, direction::L}, - {0xa838, 0xa839, direction::ET}, {0xa840, 0xa873, direction::L}, - {0xa874, 0xa877, direction::ON}, {0xa880, 0xa8c3, direction::L}, - {0xa8c4, 0xa8c5, direction::NSM}, {0xa8ce, 0xa8d9, direction::L}, - {0xa8e0, 0xa8f1, direction::NSM}, {0xa8f2, 0xa8fe, direction::L}, - {0xa8ff, 0xa8ff, direction::NSM}, {0xa900, 0xa925, direction::L}, - {0xa926, 0xa92d, direction::NSM}, {0xa92e, 0xa946, direction::L}, - {0xa947, 0xa951, direction::NSM}, {0xa952, 0xa953, direction::L}, - {0xa95f, 0xa97c, direction::L}, {0xa980, 0xa982, direction::NSM}, - {0xa983, 0xa9b2, direction::L}, {0xa9b3, 0xa9b3, direction::NSM}, - {0xa9b4, 0xa9b5, direction::L}, {0xa9b6, 0xa9b9, direction::NSM}, - {0xa9ba, 0xa9bb, direction::L}, {0xa9bc, 0xa9bd, direction::NSM}, - {0xa9be, 0xa9cd, direction::L}, {0xa9cf, 0xa9d9, direction::L}, - {0xa9de, 0xa9e4, direction::L}, {0xa9e5, 0xa9e5, direction::NSM}, - {0xa9e6, 0xa9fe, direction::L}, {0xaa00, 0xaa28, direction::L}, - {0xaa29, 0xaa2e, direction::NSM}, {0xaa2f, 0xaa30, direction::L}, - {0xaa31, 0xaa32, direction::NSM}, {0xaa33, 0xaa34, direction::L}, - {0xaa35, 0xaa36, direction::NSM}, {0xaa40, 0xaa42, direction::L}, - {0xaa43, 0xaa43, direction::NSM}, {0xaa44, 0xaa4b, direction::L}, - {0xaa4c, 0xaa4c, direction::NSM}, {0xaa4d, 0xaa4d, direction::L}, - {0xaa50, 0xaa59, direction::L}, {0xaa5c, 0xaa7b, direction::L}, - {0xaa7c, 0xaa7c, direction::NSM}, {0xaa7d, 0xaaaf, direction::L}, - {0xaab0, 0xaab0, direction::NSM}, {0xaab1, 0xaab1, direction::L}, - {0xaab2, 0xaab4, direction::NSM}, {0xaab5, 0xaab6, direction::L}, - {0xaab7, 0xaab8, direction::NSM}, {0xaab9, 0xaabd, direction::L}, - {0xaabe, 0xaabf, direction::NSM}, {0xaac0, 0xaac0, direction::L}, - {0xaac1, 0xaac1, direction::NSM}, {0xaac2, 0xaac2, direction::L}, - {0xaadb, 0xaaeb, direction::L}, {0xaaec, 0xaaed, direction::NSM}, - {0xaaee, 0xaaf5, direction::L}, {0xaaf6, 0xaaf6, direction::NSM}, - {0xab01, 0xab06, direction::L}, {0xab09, 0xab0e, direction::L}, - {0xab11, 0xab16, direction::L}, {0xab20, 0xab26, direction::L}, - {0xab28, 0xab2e, direction::L}, {0xab30, 0xab69, direction::L}, - {0xab6a, 0xab6b, direction::ON}, {0xab70, 0xabe4, direction::L}, - {0xabe5, 0xabe5, direction::NSM}, {0xabe6, 0xabe7, direction::L}, - {0xabe8, 0xabe8, direction::NSM}, {0xabe9, 0xabec, direction::L}, - {0xabed, 0xabed, direction::NSM}, {0xabf0, 0xabf9, direction::L}, - {0xac00, 0xd7a3, direction::L}, {0xd7b0, 0xd7c6, direction::L}, - {0xd7cb, 0xd7fb, direction::L}, {0xd800, 0xfa6d, direction::L}, - {0xfa70, 0xfad9, direction::L}, {0xfb00, 0xfb06, direction::L}, - {0xfb13, 0xfb17, direction::L}, {0xfb1d, 0xfb1d, direction::R}, - {0xfb1e, 0xfb1e, direction::NSM}, {0xfb1f, 0xfb28, direction::R}, - {0xfb29, 0xfb29, direction::ES}, {0xfb2a, 0xfb36, direction::R}, - {0xfb38, 0xfb3c, direction::R}, {0xfb3e, 0xfb3e, direction::R}, - {0xfb40, 0xfb41, direction::R}, {0xfb43, 0xfb44, direction::R}, - {0xfb46, 0xfb4f, direction::R}, {0xfb50, 0xfbc1, direction::AL}, - {0xfbd3, 0xfd3d, direction::AL}, {0xfd3e, 0xfd3f, direction::ON}, - {0xfd50, 0xfd8f, direction::AL}, {0xfd92, 0xfdc7, direction::AL}, - {0xfdf0, 0xfdfc, direction::AL}, {0xfdfd, 0xfdfd, direction::ON}, - {0xfe00, 0xfe0f, direction::NSM}, {0xfe10, 0xfe19, direction::ON}, - {0xfe20, 0xfe2f, direction::NSM}, {0xfe30, 0xfe4f, direction::ON}, - {0xfe50, 0xfe50, direction::CS}, {0xfe51, 0xfe51, direction::ON}, - {0xfe52, 0xfe52, direction::CS}, {0xfe54, 0xfe54, direction::ON}, - {0xfe55, 0xfe55, direction::CS}, {0xfe56, 0xfe5e, direction::ON}, - {0xfe5f, 0xfe5f, direction::ET}, {0xfe60, 0xfe61, direction::ON}, - {0xfe62, 0xfe63, direction::ES}, {0xfe64, 0xfe66, direction::ON}, - {0xfe68, 0xfe68, direction::ON}, {0xfe69, 0xfe6a, direction::ET}, - {0xfe6b, 0xfe6b, direction::ON}, {0xfe70, 0xfe74, direction::AL}, - {0xfe76, 0xfefc, direction::AL}, {0xfeff, 0xfeff, direction::BN}, - {0xff01, 0xff02, direction::ON}, {0xff03, 0xff05, direction::ET}, - {0xff06, 0xff0a, direction::ON}, {0xff0b, 0xff0b, direction::ES}, - {0xff0c, 0xff0c, direction::CS}, {0xff0d, 0xff0d, direction::ES}, - {0xff0e, 0xff0f, direction::CS}, {0xff10, 0xff19, direction::EN}, - {0xff1a, 0xff1a, direction::CS}, {0xff1b, 0xff20, direction::ON}, - {0xff21, 0xff3a, direction::L}, {0xff3b, 0xff40, direction::ON}, - {0xff41, 0xff5a, direction::L}, {0xff5b, 0xff65, direction::ON}, - {0xff66, 0xffbe, direction::L}, {0xffc2, 0xffc7, direction::L}, - {0xffca, 0xffcf, direction::L}, {0xffd2, 0xffd7, direction::L}, - {0xffda, 0xffdc, direction::L}, {0xffe0, 0xffe1, direction::ET}, - {0xffe2, 0xffe4, direction::ON}, {0xffe5, 0xffe6, direction::ET}, - {0xffe8, 0xffee, direction::ON}, {0xfff9, 0xfffd, direction::ON}, - {0x10000, 0x1000b, direction::L}, {0x1000d, 0x10026, direction::L}, - {0x10028, 0x1003a, direction::L}, {0x1003c, 0x1003d, direction::L}, - {0x1003f, 0x1004d, direction::L}, {0x10050, 0x1005d, direction::L}, - {0x10080, 0x100fa, direction::L}, {0x10100, 0x10100, direction::L}, - {0x10101, 0x10101, direction::ON}, {0x10102, 0x10102, direction::L}, - {0x10107, 0x10133, direction::L}, {0x10137, 0x1013f, direction::L}, - {0x10140, 0x1018c, direction::ON}, {0x1018d, 0x1018e, direction::L}, - {0x10190, 0x1019c, direction::ON}, {0x101a0, 0x101a0, direction::ON}, - {0x101d0, 0x101fc, direction::L}, {0x101fd, 0x101fd, direction::NSM}, - {0x10280, 0x1029c, direction::L}, {0x102a0, 0x102d0, direction::L}, - {0x102e0, 0x102e0, direction::NSM}, {0x102e1, 0x102fb, direction::EN}, - {0x10300, 0x10323, direction::L}, {0x1032d, 0x1034a, direction::L}, - {0x10350, 0x10375, direction::L}, {0x10376, 0x1037a, direction::NSM}, - {0x10380, 0x1039d, direction::L}, {0x1039f, 0x103c3, direction::L}, - {0x103c8, 0x103d5, direction::L}, {0x10400, 0x1049d, direction::L}, - {0x104a0, 0x104a9, direction::L}, {0x104b0, 0x104d3, direction::L}, - {0x104d8, 0x104fb, direction::L}, {0x10500, 0x10527, direction::L}, - {0x10530, 0x10563, direction::L}, {0x1056f, 0x1056f, direction::L}, - {0x10600, 0x10736, direction::L}, {0x10740, 0x10755, direction::L}, - {0x10760, 0x10767, direction::L}, {0x10800, 0x10805, direction::R}, - {0x10808, 0x10808, direction::R}, {0x1080a, 0x10835, direction::R}, - {0x10837, 0x10838, direction::R}, {0x1083c, 0x1083c, direction::R}, - {0x1083f, 0x10855, direction::R}, {0x10857, 0x1089e, direction::R}, - {0x108a7, 0x108af, direction::R}, {0x108e0, 0x108f2, direction::R}, - {0x108f4, 0x108f5, direction::R}, {0x108fb, 0x1091b, direction::R}, - {0x1091f, 0x1091f, direction::ON}, {0x10920, 0x10939, direction::R}, - {0x1093f, 0x1093f, direction::R}, {0x10980, 0x109b7, direction::R}, - {0x109bc, 0x109cf, direction::R}, {0x109d2, 0x10a00, direction::R}, - {0x10a01, 0x10a03, direction::NSM}, {0x10a05, 0x10a06, direction::NSM}, - {0x10a0c, 0x10a0f, direction::NSM}, {0x10a10, 0x10a13, direction::R}, - {0x10a15, 0x10a17, direction::R}, {0x10a19, 0x10a35, direction::R}, - {0x10a38, 0x10a3a, direction::NSM}, {0x10a3f, 0x10a3f, direction::NSM}, - {0x10a40, 0x10a48, direction::R}, {0x10a50, 0x10a58, direction::R}, - {0x10a60, 0x10a9f, direction::R}, {0x10ac0, 0x10ae4, direction::R}, - {0x10ae5, 0x10ae6, direction::NSM}, {0x10aeb, 0x10af6, direction::R}, - {0x10b00, 0x10b35, direction::R}, {0x10b39, 0x10b3f, direction::ON}, - {0x10b40, 0x10b55, direction::R}, {0x10b58, 0x10b72, direction::R}, - {0x10b78, 0x10b91, direction::R}, {0x10b99, 0x10b9c, direction::R}, - {0x10ba9, 0x10baf, direction::R}, {0x10c00, 0x10c48, direction::R}, - {0x10c80, 0x10cb2, direction::R}, {0x10cc0, 0x10cf2, direction::R}, - {0x10cfa, 0x10cff, direction::R}, {0x10d00, 0x10d23, direction::AL}, - {0x10d24, 0x10d27, direction::NSM}, {0x10d30, 0x10d39, direction::AN}, - {0x10e60, 0x10e7e, direction::AN}, {0x10e80, 0x10ea9, direction::R}, - {0x10eab, 0x10eac, direction::NSM}, {0x10ead, 0x10ead, direction::R}, - {0x10eb0, 0x10eb1, direction::R}, {0x10f00, 0x10f27, direction::R}, - {0x10f30, 0x10f45, direction::AL}, {0x10f46, 0x10f50, direction::NSM}, - {0x10f51, 0x10f59, direction::AL}, {0x10fb0, 0x10fcb, direction::R}, - {0x10fe0, 0x10ff6, direction::R}, {0x11000, 0x11000, direction::L}, - {0x11001, 0x11001, direction::NSM}, {0x11002, 0x11037, direction::L}, - {0x11038, 0x11046, direction::NSM}, {0x11047, 0x1104d, direction::L}, - {0x11052, 0x11065, direction::ON}, {0x11066, 0x1106f, direction::L}, - {0x1107f, 0x11081, direction::NSM}, {0x11082, 0x110b2, direction::L}, - {0x110b3, 0x110b6, direction::NSM}, {0x110b7, 0x110b8, direction::L}, - {0x110b9, 0x110ba, direction::NSM}, {0x110bb, 0x110c1, direction::L}, - {0x110cd, 0x110cd, direction::L}, {0x110d0, 0x110e8, direction::L}, - {0x110f0, 0x110f9, direction::L}, {0x11100, 0x11102, direction::NSM}, - {0x11103, 0x11126, direction::L}, {0x11127, 0x1112b, direction::NSM}, - {0x1112c, 0x1112c, direction::L}, {0x1112d, 0x11134, direction::NSM}, - {0x11136, 0x11147, direction::L}, {0x11150, 0x11172, direction::L}, - {0x11173, 0x11173, direction::NSM}, {0x11174, 0x11176, direction::L}, - {0x11180, 0x11181, direction::NSM}, {0x11182, 0x111b5, direction::L}, - {0x111b6, 0x111be, direction::NSM}, {0x111bf, 0x111c8, direction::L}, - {0x111c9, 0x111cc, direction::NSM}, {0x111cd, 0x111ce, direction::L}, - {0x111cf, 0x111cf, direction::NSM}, {0x111d0, 0x111df, direction::L}, - {0x111e1, 0x111f4, direction::L}, {0x11200, 0x11211, direction::L}, - {0x11213, 0x1122e, direction::L}, {0x1122f, 0x11231, direction::NSM}, - {0x11232, 0x11233, direction::L}, {0x11234, 0x11234, direction::NSM}, - {0x11235, 0x11235, direction::L}, {0x11236, 0x11237, direction::NSM}, - {0x11238, 0x1123d, direction::L}, {0x1123e, 0x1123e, direction::NSM}, - {0x11280, 0x11286, direction::L}, {0x11288, 0x11288, direction::L}, - {0x1128a, 0x1128d, direction::L}, {0x1128f, 0x1129d, direction::L}, - {0x1129f, 0x112a9, direction::L}, {0x112b0, 0x112de, direction::L}, - {0x112df, 0x112df, direction::NSM}, {0x112e0, 0x112e2, direction::L}, - {0x112e3, 0x112ea, direction::NSM}, {0x112f0, 0x112f9, direction::L}, - {0x11300, 0x11301, direction::NSM}, {0x11302, 0x11303, direction::L}, - {0x11305, 0x1130c, direction::L}, {0x1130f, 0x11310, direction::L}, - {0x11313, 0x11328, direction::L}, {0x1132a, 0x11330, direction::L}, - {0x11332, 0x11333, direction::L}, {0x11335, 0x11339, direction::L}, - {0x1133b, 0x1133c, direction::NSM}, {0x1133d, 0x1133f, direction::L}, - {0x11340, 0x11340, direction::NSM}, {0x11341, 0x11344, direction::L}, - {0x11347, 0x11348, direction::L}, {0x1134b, 0x1134d, direction::L}, - {0x11350, 0x11350, direction::L}, {0x11357, 0x11357, direction::L}, - {0x1135d, 0x11363, direction::L}, {0x11366, 0x1136c, direction::NSM}, - {0x11370, 0x11374, direction::NSM}, {0x11400, 0x11437, direction::L}, - {0x11438, 0x1143f, direction::NSM}, {0x11440, 0x11441, direction::L}, - {0x11442, 0x11444, direction::NSM}, {0x11445, 0x11445, direction::L}, - {0x11446, 0x11446, direction::NSM}, {0x11447, 0x1145b, direction::L}, - {0x1145d, 0x1145d, direction::L}, {0x1145e, 0x1145e, direction::NSM}, - {0x1145f, 0x11461, direction::L}, {0x11480, 0x114b2, direction::L}, - {0x114b3, 0x114b8, direction::NSM}, {0x114b9, 0x114b9, direction::L}, - {0x114ba, 0x114ba, direction::NSM}, {0x114bb, 0x114be, direction::L}, - {0x114bf, 0x114c0, direction::NSM}, {0x114c1, 0x114c1, direction::L}, - {0x114c2, 0x114c3, direction::NSM}, {0x114c4, 0x114c7, direction::L}, - {0x114d0, 0x114d9, direction::L}, {0x11580, 0x115b1, direction::L}, - {0x115b2, 0x115b5, direction::NSM}, {0x115b8, 0x115bb, direction::L}, - {0x115bc, 0x115bd, direction::NSM}, {0x115be, 0x115be, direction::L}, - {0x115bf, 0x115c0, direction::NSM}, {0x115c1, 0x115db, direction::L}, - {0x115dc, 0x115dd, direction::NSM}, {0x11600, 0x11632, direction::L}, - {0x11633, 0x1163a, direction::NSM}, {0x1163b, 0x1163c, direction::L}, - {0x1163d, 0x1163d, direction::NSM}, {0x1163e, 0x1163e, direction::L}, - {0x1163f, 0x11640, direction::NSM}, {0x11641, 0x11644, direction::L}, - {0x11650, 0x11659, direction::L}, {0x11660, 0x1166c, direction::ON}, - {0x11680, 0x116aa, direction::L}, {0x116ab, 0x116ab, direction::NSM}, - {0x116ac, 0x116ac, direction::L}, {0x116ad, 0x116ad, direction::NSM}, - {0x116ae, 0x116af, direction::L}, {0x116b0, 0x116b5, direction::NSM}, - {0x116b6, 0x116b6, direction::L}, {0x116b7, 0x116b7, direction::NSM}, - {0x116b8, 0x116b8, direction::L}, {0x116c0, 0x116c9, direction::L}, - {0x11700, 0x1171a, direction::L}, {0x1171d, 0x1171f, direction::NSM}, - {0x11720, 0x11721, direction::L}, {0x11722, 0x11725, direction::NSM}, - {0x11726, 0x11726, direction::L}, {0x11727, 0x1172b, direction::NSM}, - {0x11730, 0x1173f, direction::L}, {0x11800, 0x1182e, direction::L}, - {0x1182f, 0x11837, direction::NSM}, {0x11838, 0x11838, direction::L}, - {0x11839, 0x1183a, direction::NSM}, {0x1183b, 0x1183b, direction::L}, - {0x118a0, 0x118f2, direction::L}, {0x118ff, 0x11906, direction::L}, - {0x11909, 0x11909, direction::L}, {0x1190c, 0x11913, direction::L}, - {0x11915, 0x11916, direction::L}, {0x11918, 0x11935, direction::L}, - {0x11937, 0x11938, direction::L}, {0x1193b, 0x1193c, direction::NSM}, - {0x1193d, 0x1193d, direction::L}, {0x1193e, 0x1193e, direction::NSM}, - {0x1193f, 0x11942, direction::L}, {0x11943, 0x11943, direction::NSM}, - {0x11944, 0x11946, direction::L}, {0x11950, 0x11959, direction::L}, - {0x119a0, 0x119a7, direction::L}, {0x119aa, 0x119d3, direction::L}, - {0x119d4, 0x119d7, direction::NSM}, {0x119da, 0x119db, direction::NSM}, - {0x119dc, 0x119df, direction::L}, {0x119e0, 0x119e0, direction::NSM}, - {0x119e1, 0x119e4, direction::L}, {0x11a00, 0x11a00, direction::L}, - {0x11a01, 0x11a06, direction::NSM}, {0x11a07, 0x11a08, direction::L}, - {0x11a09, 0x11a0a, direction::NSM}, {0x11a0b, 0x11a32, direction::L}, - {0x11a33, 0x11a38, direction::NSM}, {0x11a39, 0x11a3a, direction::L}, - {0x11a3b, 0x11a3e, direction::NSM}, {0x11a3f, 0x11a46, direction::L}, - {0x11a47, 0x11a47, direction::NSM}, {0x11a50, 0x11a50, direction::L}, - {0x11a51, 0x11a56, direction::NSM}, {0x11a57, 0x11a58, direction::L}, - {0x11a59, 0x11a5b, direction::NSM}, {0x11a5c, 0x11a89, direction::L}, - {0x11a8a, 0x11a96, direction::NSM}, {0x11a97, 0x11a97, direction::L}, - {0x11a98, 0x11a99, direction::NSM}, {0x11a9a, 0x11aa2, direction::L}, - {0x11ac0, 0x11af8, direction::L}, {0x11c00, 0x11c08, direction::L}, - {0x11c0a, 0x11c2f, direction::L}, {0x11c30, 0x11c36, direction::NSM}, - {0x11c38, 0x11c3d, direction::NSM}, {0x11c3e, 0x11c45, direction::L}, - {0x11c50, 0x11c6c, direction::L}, {0x11c70, 0x11c8f, direction::L}, - {0x11c92, 0x11ca7, direction::NSM}, {0x11ca9, 0x11ca9, direction::L}, - {0x11caa, 0x11cb0, direction::NSM}, {0x11cb1, 0x11cb1, direction::L}, - {0x11cb2, 0x11cb3, direction::NSM}, {0x11cb4, 0x11cb4, direction::L}, - {0x11cb5, 0x11cb6, direction::NSM}, {0x11d00, 0x11d06, direction::L}, - {0x11d08, 0x11d09, direction::L}, {0x11d0b, 0x11d30, direction::L}, - {0x11d31, 0x11d36, direction::NSM}, {0x11d3a, 0x11d3a, direction::NSM}, - {0x11d3c, 0x11d3d, direction::NSM}, {0x11d3f, 0x11d45, direction::NSM}, - {0x11d46, 0x11d46, direction::L}, {0x11d47, 0x11d47, direction::NSM}, - {0x11d50, 0x11d59, direction::L}, {0x11d60, 0x11d65, direction::L}, - {0x11d67, 0x11d68, direction::L}, {0x11d6a, 0x11d8e, direction::L}, - {0x11d90, 0x11d91, direction::NSM}, {0x11d93, 0x11d94, direction::L}, - {0x11d95, 0x11d95, direction::NSM}, {0x11d96, 0x11d96, direction::L}, - {0x11d97, 0x11d97, direction::NSM}, {0x11d98, 0x11d98, direction::L}, - {0x11da0, 0x11da9, direction::L}, {0x11ee0, 0x11ef2, direction::L}, - {0x11ef3, 0x11ef4, direction::NSM}, {0x11ef5, 0x11ef8, direction::L}, - {0x11fb0, 0x11fb0, direction::L}, {0x11fc0, 0x11fd4, direction::L}, - {0x11fd5, 0x11fdc, direction::ON}, {0x11fdd, 0x11fe0, direction::ET}, - {0x11fe1, 0x11ff1, direction::ON}, {0x11fff, 0x12399, direction::L}, - {0x12400, 0x1246e, direction::L}, {0x12470, 0x12474, direction::L}, - {0x12480, 0x12543, direction::L}, {0x13000, 0x1342e, direction::L}, - {0x13430, 0x13438, direction::L}, {0x14400, 0x14646, direction::L}, - {0x16800, 0x16a38, direction::L}, {0x16a40, 0x16a5e, direction::L}, - {0x16a60, 0x16a69, direction::L}, {0x16a6e, 0x16a6f, direction::L}, - {0x16ad0, 0x16aed, direction::L}, {0x16af0, 0x16af4, direction::NSM}, - {0x16af5, 0x16af5, direction::L}, {0x16b00, 0x16b2f, direction::L}, - {0x16b30, 0x16b36, direction::NSM}, {0x16b37, 0x16b45, direction::L}, - {0x16b50, 0x16b59, direction::L}, {0x16b5b, 0x16b61, direction::L}, - {0x16b63, 0x16b77, direction::L}, {0x16b7d, 0x16b8f, direction::L}, - {0x16e40, 0x16e9a, direction::L}, {0x16f00, 0x16f4a, direction::L}, - {0x16f4f, 0x16f4f, direction::NSM}, {0x16f50, 0x16f87, direction::L}, - {0x16f8f, 0x16f92, direction::NSM}, {0x16f93, 0x16f9f, direction::L}, - {0x16fe0, 0x16fe1, direction::L}, {0x16fe2, 0x16fe2, direction::ON}, - {0x16fe3, 0x16fe3, direction::L}, {0x16fe4, 0x16fe4, direction::NSM}, - {0x16ff0, 0x16ff1, direction::L}, {0x17000, 0x187f7, direction::L}, - {0x18800, 0x18cd5, direction::L}, {0x18d00, 0x18d08, direction::L}, - {0x1b000, 0x1b11e, direction::L}, {0x1b150, 0x1b152, direction::L}, - {0x1b164, 0x1b167, direction::L}, {0x1b170, 0x1b2fb, direction::L}, - {0x1bc00, 0x1bc6a, direction::L}, {0x1bc70, 0x1bc7c, direction::L}, - {0x1bc80, 0x1bc88, direction::L}, {0x1bc90, 0x1bc99, direction::L}, - {0x1bc9c, 0x1bc9c, direction::L}, {0x1bc9d, 0x1bc9e, direction::NSM}, - {0x1bc9f, 0x1bc9f, direction::L}, {0x1bca0, 0x1bca3, direction::BN}, - {0x1d000, 0x1d0f5, direction::L}, {0x1d100, 0x1d126, direction::L}, - {0x1d129, 0x1d166, direction::L}, {0x1d167, 0x1d169, direction::NSM}, - {0x1d16a, 0x1d172, direction::L}, {0x1d173, 0x1d17a, direction::BN}, - {0x1d17b, 0x1d182, direction::NSM}, {0x1d183, 0x1d184, direction::L}, - {0x1d185, 0x1d18b, direction::NSM}, {0x1d18c, 0x1d1a9, direction::L}, - {0x1d1aa, 0x1d1ad, direction::NSM}, {0x1d1ae, 0x1d1e8, direction::L}, - {0x1d200, 0x1d241, direction::ON}, {0x1d242, 0x1d244, direction::NSM}, - {0x1d245, 0x1d245, direction::ON}, {0x1d2e0, 0x1d2f3, direction::L}, - {0x1d300, 0x1d356, direction::ON}, {0x1d360, 0x1d378, direction::L}, - {0x1d400, 0x1d454, direction::L}, {0x1d456, 0x1d49c, direction::L}, - {0x1d49e, 0x1d49f, direction::L}, {0x1d4a2, 0x1d4a2, direction::L}, - {0x1d4a5, 0x1d4a6, direction::L}, {0x1d4a9, 0x1d4ac, direction::L}, - {0x1d4ae, 0x1d4b9, direction::L}, {0x1d4bb, 0x1d4bb, direction::L}, - {0x1d4bd, 0x1d4c3, direction::L}, {0x1d4c5, 0x1d505, direction::L}, - {0x1d507, 0x1d50a, direction::L}, {0x1d50d, 0x1d514, direction::L}, - {0x1d516, 0x1d51c, direction::L}, {0x1d51e, 0x1d539, direction::L}, - {0x1d53b, 0x1d53e, direction::L}, {0x1d540, 0x1d544, direction::L}, - {0x1d546, 0x1d546, direction::L}, {0x1d54a, 0x1d550, direction::L}, - {0x1d552, 0x1d6a5, direction::L}, {0x1d6a8, 0x1d6da, direction::L}, - {0x1d6db, 0x1d6db, direction::ON}, {0x1d6dc, 0x1d714, direction::L}, - {0x1d715, 0x1d715, direction::ON}, {0x1d716, 0x1d74e, direction::L}, - {0x1d74f, 0x1d74f, direction::ON}, {0x1d750, 0x1d788, direction::L}, - {0x1d789, 0x1d789, direction::ON}, {0x1d78a, 0x1d7c2, direction::L}, - {0x1d7c3, 0x1d7c3, direction::ON}, {0x1d7c4, 0x1d7cb, direction::L}, - {0x1d7ce, 0x1d7ff, direction::EN}, {0x1d800, 0x1d9ff, direction::L}, - {0x1da00, 0x1da36, direction::NSM}, {0x1da37, 0x1da3a, direction::L}, - {0x1da3b, 0x1da6c, direction::NSM}, {0x1da6d, 0x1da74, direction::L}, - {0x1da75, 0x1da75, direction::NSM}, {0x1da76, 0x1da83, direction::L}, - {0x1da84, 0x1da84, direction::NSM}, {0x1da85, 0x1da8b, direction::L}, - {0x1da9b, 0x1da9f, direction::NSM}, {0x1daa1, 0x1daaf, direction::NSM}, - {0x1e000, 0x1e006, direction::NSM}, {0x1e008, 0x1e018, direction::NSM}, - {0x1e01b, 0x1e021, direction::NSM}, {0x1e023, 0x1e024, direction::NSM}, - {0x1e026, 0x1e02a, direction::NSM}, {0x1e100, 0x1e12c, direction::L}, - {0x1e130, 0x1e136, direction::NSM}, {0x1e137, 0x1e13d, direction::L}, - {0x1e140, 0x1e149, direction::L}, {0x1e14e, 0x1e14f, direction::L}, - {0x1e2c0, 0x1e2eb, direction::L}, {0x1e2ec, 0x1e2ef, direction::NSM}, - {0x1e2f0, 0x1e2f9, direction::L}, {0x1e2ff, 0x1e2ff, direction::ET}, - {0x1e800, 0x1e8c4, direction::R}, {0x1e8c7, 0x1e8cf, direction::R}, - {0x1e8d0, 0x1e8d6, direction::NSM}, {0x1e900, 0x1e943, direction::R}, - {0x1e944, 0x1e94a, direction::NSM}, {0x1e94b, 0x1e94b, direction::R}, - {0x1e950, 0x1e959, direction::R}, {0x1e95e, 0x1e95f, direction::R}, - {0x1ec71, 0x1ecb4, direction::AL}, {0x1ed01, 0x1ed3d, direction::AL}, - {0x1ee00, 0x1ee03, direction::AL}, {0x1ee05, 0x1ee1f, direction::AL}, - {0x1ee21, 0x1ee22, direction::AL}, {0x1ee24, 0x1ee24, direction::AL}, - {0x1ee27, 0x1ee27, direction::AL}, {0x1ee29, 0x1ee32, direction::AL}, - {0x1ee34, 0x1ee37, direction::AL}, {0x1ee39, 0x1ee39, direction::AL}, - {0x1ee3b, 0x1ee3b, direction::AL}, {0x1ee42, 0x1ee42, direction::AL}, - {0x1ee47, 0x1ee47, direction::AL}, {0x1ee49, 0x1ee49, direction::AL}, - {0x1ee4b, 0x1ee4b, direction::AL}, {0x1ee4d, 0x1ee4f, direction::AL}, - {0x1ee51, 0x1ee52, direction::AL}, {0x1ee54, 0x1ee54, direction::AL}, - {0x1ee57, 0x1ee57, direction::AL}, {0x1ee59, 0x1ee59, direction::AL}, - {0x1ee5b, 0x1ee5b, direction::AL}, {0x1ee5d, 0x1ee5d, direction::AL}, - {0x1ee5f, 0x1ee5f, direction::AL}, {0x1ee61, 0x1ee62, direction::AL}, - {0x1ee64, 0x1ee64, direction::AL}, {0x1ee67, 0x1ee6a, direction::AL}, - {0x1ee6c, 0x1ee72, direction::AL}, {0x1ee74, 0x1ee77, direction::AL}, - {0x1ee79, 0x1ee7c, direction::AL}, {0x1ee7e, 0x1ee7e, direction::AL}, - {0x1ee80, 0x1ee89, direction::AL}, {0x1ee8b, 0x1ee9b, direction::AL}, - {0x1eea1, 0x1eea3, direction::AL}, {0x1eea5, 0x1eea9, direction::AL}, - {0x1eeab, 0x1eebb, direction::AL}, {0x1eef0, 0x1eef1, direction::ON}, - {0x1f000, 0x1f02b, direction::ON}, {0x1f030, 0x1f093, direction::ON}, - {0x1f0a0, 0x1f0ae, direction::ON}, {0x1f0b1, 0x1f0bf, direction::ON}, - {0x1f0c1, 0x1f0cf, direction::ON}, {0x1f0d1, 0x1f0f5, direction::ON}, - {0x1f100, 0x1f10a, direction::EN}, {0x1f10b, 0x1f10f, direction::ON}, - {0x1f110, 0x1f12e, direction::L}, {0x1f12f, 0x1f12f, direction::ON}, - {0x1f130, 0x1f169, direction::L}, {0x1f16a, 0x1f16f, direction::ON}, - {0x1f170, 0x1f1ac, direction::L}, {0x1f1ad, 0x1f1ad, direction::ON}, - {0x1f1e6, 0x1f202, direction::L}, {0x1f210, 0x1f23b, direction::L}, - {0x1f240, 0x1f248, direction::L}, {0x1f250, 0x1f251, direction::L}, - {0x1f260, 0x1f265, direction::ON}, {0x1f300, 0x1f6d7, direction::ON}, - {0x1f6e0, 0x1f6ec, direction::ON}, {0x1f6f0, 0x1f6fc, direction::ON}, - {0x1f700, 0x1f773, direction::ON}, {0x1f780, 0x1f7d8, direction::ON}, - {0x1f7e0, 0x1f7eb, direction::ON}, {0x1f800, 0x1f80b, direction::ON}, - {0x1f810, 0x1f847, direction::ON}, {0x1f850, 0x1f859, direction::ON}, - {0x1f860, 0x1f887, direction::ON}, {0x1f890, 0x1f8ad, direction::ON}, - {0x1f8b0, 0x1f8b1, direction::ON}, {0x1f900, 0x1f978, direction::ON}, - {0x1f97a, 0x1f9cb, direction::ON}, {0x1f9cd, 0x1fa53, direction::ON}, - {0x1fa60, 0x1fa6d, direction::ON}, {0x1fa70, 0x1fa74, direction::ON}, - {0x1fa78, 0x1fa7a, direction::ON}, {0x1fa80, 0x1fa86, direction::ON}, - {0x1fa90, 0x1faa8, direction::ON}, {0x1fab0, 0x1fab6, direction::ON}, - {0x1fac0, 0x1fac2, direction::ON}, {0x1fad0, 0x1fad6, direction::ON}, - {0x1fb00, 0x1fb92, direction::ON}, {0x1fb94, 0x1fbca, direction::ON}, - {0x1fbf0, 0x1fbf9, direction::EN}, {0x20000, 0x2a6dd, direction::L}, - {0x2a700, 0x2b734, direction::L}, {0x2b740, 0x2b81d, direction::L}, - {0x2b820, 0x2cea1, direction::L}, {0x2ceb0, 0x2ebe0, direction::L}, - {0x2f800, 0x2fa1d, direction::L}, {0x30000, 0x3134a, direction::L}, - {0xe0001, 0xe0001, direction::BN}, {0xe0020, 0xe007f, direction::BN}, - {0xe0100, 0xe01ef, direction::NSM}, {0xf0000, 0xffffd, direction::L}, - {0x100000, 0x10fffd, direction::L}}; +// Bidi direction ranges live in the compressed blob as const SoA arrays +// (dir_start / dir_final / dir_value). See table_store.hpp layout asserts. // CheckJoiners and CheckBidi are true for URL specification. +// Assumes ensure_tables() has already been called by is_label_valid(). inline static direction find_direction(uint32_t code_point) noexcept { - auto it = std::lower_bound( - std::begin(dir_table), std::end(dir_table), code_point, - [](const directions& d, uint32_t c) { return d.final_code < c; }); - - // next check is almost surely in vain, but we use it for safety. - if (it == std::end(dir_table)) { - return direction::NONE; + // Binary search on dir_final (sorted upper bounds). + size_t lo = 0, hi = dir_table_count; + while (lo < hi) { + size_t mid = lo + (hi - lo) / 2; + if (dir_final[mid] < code_point) { + lo = mid + 1; + } else { + hi = mid; + } } - // We have that d.final_code >= c. - if (code_point >= it->start_code) { - return it->direct; + if (lo == dir_table_count) { + return direction::NONE; } - return direction::NONE; + return code_point >= dir_start[lo] ? static_cast(dir_value[lo]) + : direction::NONE; } inline static size_t find_last_not_of_nsm( @@ -9034,6 +5945,10 @@ bool is_label_valid(const std::u32string_view label) { if (label.empty()) { return true; } + if (!ensure_tables() || combining_ranges == nullptr || dir_start == nullptr || + dir_final == nullptr || dir_value == nullptr) { + return false; + } /////////////// // We have a normalization step which ensures that we are in NFC. @@ -9054,298 +5969,13 @@ bool is_label_valid(const std::u32string_view label) { // The label must not contain a U+002E ( . ) FULL STOP. // if (label.find('.') != std::string_view::npos) return false; - // The label must not begin with a combining mark, that is: - // General_Category=Mark. - constexpr static uint32_t combining[] = { - 0x300, 0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x307, - 0x308, 0x309, 0x30a, 0x30b, 0x30c, 0x30d, 0x30e, 0x30f, - 0x310, 0x311, 0x312, 0x313, 0x314, 0x315, 0x316, 0x317, - 0x318, 0x319, 0x31a, 0x31b, 0x31c, 0x31d, 0x31e, 0x31f, - 0x320, 0x321, 0x322, 0x323, 0x324, 0x325, 0x326, 0x327, - 0x328, 0x329, 0x32a, 0x32b, 0x32c, 0x32d, 0x32e, 0x32f, - 0x330, 0x331, 0x332, 0x333, 0x334, 0x335, 0x336, 0x337, - 0x338, 0x339, 0x33a, 0x33b, 0x33c, 0x33d, 0x33e, 0x33f, - 0x340, 0x341, 0x342, 0x343, 0x344, 0x345, 0x346, 0x347, - 0x348, 0x349, 0x34a, 0x34b, 0x34c, 0x34d, 0x34e, 0x34f, - 0x350, 0x351, 0x352, 0x353, 0x354, 0x355, 0x356, 0x357, - 0x358, 0x359, 0x35a, 0x35b, 0x35c, 0x35d, 0x35e, 0x35f, - 0x360, 0x361, 0x362, 0x363, 0x364, 0x365, 0x366, 0x367, - 0x368, 0x369, 0x36a, 0x36b, 0x36c, 0x36d, 0x36e, 0x36f, - 0x483, 0x484, 0x485, 0x486, 0x487, 0x488, 0x489, 0x591, - 0x592, 0x593, 0x594, 0x595, 0x596, 0x597, 0x598, 0x599, - 0x59a, 0x59b, 0x59c, 0x59d, 0x59e, 0x59f, 0x5a0, 0x5a1, - 0x5a2, 0x5a3, 0x5a4, 0x5a5, 0x5a6, 0x5a7, 0x5a8, 0x5a9, - 0x5aa, 0x5ab, 0x5ac, 0x5ad, 0x5ae, 0x5af, 0x5b0, 0x5b1, - 0x5b2, 0x5b3, 0x5b4, 0x5b5, 0x5b6, 0x5b7, 0x5b8, 0x5b9, - 0x5ba, 0x5bb, 0x5bc, 0x5bd, 0x5bf, 0x5c1, 0x5c2, 0x5c4, - 0x5c5, 0x5c7, 0x610, 0x611, 0x612, 0x613, 0x614, 0x615, - 0x616, 0x617, 0x618, 0x619, 0x61a, 0x64b, 0x64c, 0x64d, - 0x64e, 0x64f, 0x650, 0x651, 0x652, 0x653, 0x654, 0x655, - 0x656, 0x657, 0x658, 0x659, 0x65a, 0x65b, 0x65c, 0x65d, - 0x65e, 0x65f, 0x670, 0x6d6, 0x6d7, 0x6d8, 0x6d9, 0x6da, - 0x6db, 0x6dc, 0x6df, 0x6e0, 0x6e1, 0x6e2, 0x6e3, 0x6e4, - 0x6e7, 0x6e8, 0x6ea, 0x6eb, 0x6ec, 0x6ed, 0x711, 0x730, - 0x731, 0x732, 0x733, 0x734, 0x735, 0x736, 0x737, 0x738, - 0x739, 0x73a, 0x73b, 0x73c, 0x73d, 0x73e, 0x73f, 0x740, - 0x741, 0x742, 0x743, 0x744, 0x745, 0x746, 0x747, 0x748, - 0x749, 0x74a, 0x7a6, 0x7a7, 0x7a8, 0x7a9, 0x7aa, 0x7ab, - 0x7ac, 0x7ad, 0x7ae, 0x7af, 0x7b0, 0x7eb, 0x7ec, 0x7ed, - 0x7ee, 0x7ef, 0x7f0, 0x7f1, 0x7f2, 0x7f3, 0x7fd, 0x816, - 0x817, 0x818, 0x819, 0x81b, 0x81c, 0x81d, 0x81e, 0x81f, - 0x820, 0x821, 0x822, 0x823, 0x825, 0x826, 0x827, 0x829, - 0x82a, 0x82b, 0x82c, 0x82d, 0x859, 0x85a, 0x85b, 0x8d3, - 0x8d4, 0x8d5, 0x8d6, 0x8d7, 0x8d8, 0x8d9, 0x8da, 0x8db, - 0x8dc, 0x8dd, 0x8de, 0x8df, 0x8e0, 0x8e1, 0x8e3, 0x8e4, - 0x8e5, 0x8e6, 0x8e7, 0x8e8, 0x8e9, 0x8ea, 0x8eb, 0x8ec, - 0x8ed, 0x8ee, 0x8ef, 0x8f0, 0x8f1, 0x8f2, 0x8f3, 0x8f4, - 0x8f5, 0x8f6, 0x8f7, 0x8f8, 0x8f9, 0x8fa, 0x8fb, 0x8fc, - 0x8fd, 0x8fe, 0x8ff, 0x900, 0x901, 0x902, 0x903, 0x93a, - 0x93b, 0x93c, 0x93e, 0x93f, 0x940, 0x941, 0x942, 0x943, - 0x944, 0x945, 0x946, 0x947, 0x948, 0x949, 0x94a, 0x94b, - 0x94c, 0x94d, 0x94e, 0x94f, 0x951, 0x952, 0x953, 0x954, - 0x955, 0x956, 0x957, 0x962, 0x963, 0x981, 0x982, 0x983, - 0x9bc, 0x9be, 0x9bf, 0x9c0, 0x9c1, 0x9c2, 0x9c3, 0x9c4, - 0x9c7, 0x9c8, 0x9cb, 0x9cc, 0x9cd, 0x9d7, 0x9e2, 0x9e3, - 0x9fe, 0xa01, 0xa02, 0xa03, 0xa3c, 0xa3e, 0xa3f, 0xa40, - 0xa41, 0xa42, 0xa47, 0xa48, 0xa4b, 0xa4c, 0xa4d, 0xa51, - 0xa70, 0xa71, 0xa75, 0xa81, 0xa82, 0xa83, 0xabc, 0xabe, - 0xabf, 0xac0, 0xac1, 0xac2, 0xac3, 0xac4, 0xac5, 0xac7, - 0xac8, 0xac9, 0xacb, 0xacc, 0xacd, 0xae2, 0xae3, 0xafa, - 0xafb, 0xafc, 0xafd, 0xafe, 0xaff, 0xb01, 0xb02, 0xb03, - 0xb3c, 0xb3e, 0xb3f, 0xb40, 0xb41, 0xb42, 0xb43, 0xb44, - 0xb47, 0xb48, 0xb4b, 0xb4c, 0xb4d, 0xb55, 0xb56, 0xb57, - 0xb62, 0xb63, 0xb82, 0xbbe, 0xbbf, 0xbc0, 0xbc1, 0xbc2, - 0xbc6, 0xbc7, 0xbc8, 0xbca, 0xbcb, 0xbcc, 0xbcd, 0xbd7, - 0xc00, 0xc01, 0xc02, 0xc03, 0xc04, 0xc3e, 0xc3f, 0xc40, - 0xc41, 0xc42, 0xc43, 0xc44, 0xc46, 0xc47, 0xc48, 0xc4a, - 0xc4b, 0xc4c, 0xc4d, 0xc55, 0xc56, 0xc62, 0xc63, 0xc81, - 0xc82, 0xc83, 0xcbc, 0xcbe, 0xcbf, 0xcc0, 0xcc1, 0xcc2, - 0xcc3, 0xcc4, 0xcc6, 0xcc7, 0xcc8, 0xcca, 0xccb, 0xccc, - 0xccd, 0xcd5, 0xcd6, 0xce2, 0xce3, 0xd00, 0xd01, 0xd02, - 0xd03, 0xd3b, 0xd3c, 0xd3e, 0xd3f, 0xd40, 0xd41, 0xd42, - 0xd43, 0xd44, 0xd46, 0xd47, 0xd48, 0xd4a, 0xd4b, 0xd4c, - 0xd4d, 0xd57, 0xd62, 0xd63, 0xd81, 0xd82, 0xd83, 0xdca, - 0xdcf, 0xdd0, 0xdd1, 0xdd2, 0xdd3, 0xdd4, 0xdd6, 0xdd8, - 0xdd9, 0xdda, 0xddb, 0xddc, 0xddd, 0xdde, 0xddf, 0xdf2, - 0xdf3, 0xe31, 0xe34, 0xe35, 0xe36, 0xe37, 0xe38, 0xe39, - 0xe3a, 0xe47, 0xe48, 0xe49, 0xe4a, 0xe4b, 0xe4c, 0xe4d, - 0xe4e, 0xeb1, 0xeb4, 0xeb5, 0xeb6, 0xeb7, 0xeb8, 0xeb9, - 0xeba, 0xebb, 0xebc, 0xec8, 0xec9, 0xeca, 0xecb, 0xecc, - 0xecd, 0xf18, 0xf19, 0xf35, 0xf37, 0xf39, 0xf3e, 0xf3f, - 0xf71, 0xf72, 0xf73, 0xf74, 0xf75, 0xf76, 0xf77, 0xf78, - 0xf79, 0xf7a, 0xf7b, 0xf7c, 0xf7d, 0xf7e, 0xf7f, 0xf80, - 0xf81, 0xf82, 0xf83, 0xf84, 0xf86, 0xf87, 0xf8d, 0xf8e, - 0xf8f, 0xf90, 0xf91, 0xf92, 0xf93, 0xf94, 0xf95, 0xf96, - 0xf97, 0xf99, 0xf9a, 0xf9b, 0xf9c, 0xf9d, 0xf9e, 0xf9f, - 0xfa0, 0xfa1, 0xfa2, 0xfa3, 0xfa4, 0xfa5, 0xfa6, 0xfa7, - 0xfa8, 0xfa9, 0xfaa, 0xfab, 0xfac, 0xfad, 0xfae, 0xfaf, - 0xfb0, 0xfb1, 0xfb2, 0xfb3, 0xfb4, 0xfb5, 0xfb6, 0xfb7, - 0xfb8, 0xfb9, 0xfba, 0xfbb, 0xfbc, 0xfc6, 0x102b, 0x102c, - 0x102d, 0x102e, 0x102f, 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, - 0x1035, 0x1036, 0x1037, 0x1038, 0x1039, 0x103a, 0x103b, 0x103c, - 0x103d, 0x103e, 0x1056, 0x1057, 0x1058, 0x1059, 0x105e, 0x105f, - 0x1060, 0x1062, 0x1063, 0x1064, 0x1067, 0x1068, 0x1069, 0x106a, - 0x106b, 0x106c, 0x106d, 0x1071, 0x1072, 0x1073, 0x1074, 0x1082, - 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, 0x1088, 0x1089, 0x108a, - 0x108b, 0x108c, 0x108d, 0x108f, 0x109a, 0x109b, 0x109c, 0x109d, - 0x135d, 0x135e, 0x135f, 0x1712, 0x1713, 0x1714, 0x1732, 0x1733, - 0x1734, 0x1752, 0x1753, 0x1772, 0x1773, 0x17b4, 0x17b5, 0x17b6, - 0x17b7, 0x17b8, 0x17b9, 0x17ba, 0x17bb, 0x17bc, 0x17bd, 0x17be, - 0x17bf, 0x17c0, 0x17c1, 0x17c2, 0x17c3, 0x17c4, 0x17c5, 0x17c6, - 0x17c7, 0x17c8, 0x17c9, 0x17ca, 0x17cb, 0x17cc, 0x17cd, 0x17ce, - 0x17cf, 0x17d0, 0x17d1, 0x17d2, 0x17d3, 0x17dd, 0x180b, 0x180c, - 0x180d, 0x1885, 0x1886, 0x18a9, 0x1920, 0x1921, 0x1922, 0x1923, - 0x1924, 0x1925, 0x1926, 0x1927, 0x1928, 0x1929, 0x192a, 0x192b, - 0x1930, 0x1931, 0x1932, 0x1933, 0x1934, 0x1935, 0x1936, 0x1937, - 0x1938, 0x1939, 0x193a, 0x193b, 0x1a17, 0x1a18, 0x1a19, 0x1a1a, - 0x1a1b, 0x1a55, 0x1a56, 0x1a57, 0x1a58, 0x1a59, 0x1a5a, 0x1a5b, - 0x1a5c, 0x1a5d, 0x1a5e, 0x1a60, 0x1a61, 0x1a62, 0x1a63, 0x1a64, - 0x1a65, 0x1a66, 0x1a67, 0x1a68, 0x1a69, 0x1a6a, 0x1a6b, 0x1a6c, - 0x1a6d, 0x1a6e, 0x1a6f, 0x1a70, 0x1a71, 0x1a72, 0x1a73, 0x1a74, - 0x1a75, 0x1a76, 0x1a77, 0x1a78, 0x1a79, 0x1a7a, 0x1a7b, 0x1a7c, - 0x1a7f, 0x1ab0, 0x1ab1, 0x1ab2, 0x1ab3, 0x1ab4, 0x1ab5, 0x1ab6, - 0x1ab7, 0x1ab8, 0x1ab9, 0x1aba, 0x1abb, 0x1abc, 0x1abd, 0x1abe, - 0x1abf, 0x1ac0, 0x1b00, 0x1b01, 0x1b02, 0x1b03, 0x1b04, 0x1b34, - 0x1b35, 0x1b36, 0x1b37, 0x1b38, 0x1b39, 0x1b3a, 0x1b3b, 0x1b3c, - 0x1b3d, 0x1b3e, 0x1b3f, 0x1b40, 0x1b41, 0x1b42, 0x1b43, 0x1b44, - 0x1b6b, 0x1b6c, 0x1b6d, 0x1b6e, 0x1b6f, 0x1b70, 0x1b71, 0x1b72, - 0x1b73, 0x1b80, 0x1b81, 0x1b82, 0x1ba1, 0x1ba2, 0x1ba3, 0x1ba4, - 0x1ba5, 0x1ba6, 0x1ba7, 0x1ba8, 0x1ba9, 0x1baa, 0x1bab, 0x1bac, - 0x1bad, 0x1be6, 0x1be7, 0x1be8, 0x1be9, 0x1bea, 0x1beb, 0x1bec, - 0x1bed, 0x1bee, 0x1bef, 0x1bf0, 0x1bf1, 0x1bf2, 0x1bf3, 0x1c24, - 0x1c25, 0x1c26, 0x1c27, 0x1c28, 0x1c29, 0x1c2a, 0x1c2b, 0x1c2c, - 0x1c2d, 0x1c2e, 0x1c2f, 0x1c30, 0x1c31, 0x1c32, 0x1c33, 0x1c34, - 0x1c35, 0x1c36, 0x1c37, 0x1cd0, 0x1cd1, 0x1cd2, 0x1cd4, 0x1cd5, - 0x1cd6, 0x1cd7, 0x1cd8, 0x1cd9, 0x1cda, 0x1cdb, 0x1cdc, 0x1cdd, - 0x1cde, 0x1cdf, 0x1ce0, 0x1ce1, 0x1ce2, 0x1ce3, 0x1ce4, 0x1ce5, - 0x1ce6, 0x1ce7, 0x1ce8, 0x1ced, 0x1cf4, 0x1cf7, 0x1cf8, 0x1cf9, - 0x1dc0, 0x1dc1, 0x1dc2, 0x1dc3, 0x1dc4, 0x1dc5, 0x1dc6, 0x1dc7, - 0x1dc8, 0x1dc9, 0x1dca, 0x1dcb, 0x1dcc, 0x1dcd, 0x1dce, 0x1dcf, - 0x1dd0, 0x1dd1, 0x1dd2, 0x1dd3, 0x1dd4, 0x1dd5, 0x1dd6, 0x1dd7, - 0x1dd8, 0x1dd9, 0x1dda, 0x1ddb, 0x1ddc, 0x1ddd, 0x1dde, 0x1ddf, - 0x1de0, 0x1de1, 0x1de2, 0x1de3, 0x1de4, 0x1de5, 0x1de6, 0x1de7, - 0x1de8, 0x1de9, 0x1dea, 0x1deb, 0x1dec, 0x1ded, 0x1dee, 0x1def, - 0x1df0, 0x1df1, 0x1df2, 0x1df3, 0x1df4, 0x1df5, 0x1df6, 0x1df7, - 0x1df8, 0x1df9, 0x1dfb, 0x1dfc, 0x1dfd, 0x1dfe, 0x1dff, 0x20d0, - 0x20d1, 0x20d2, 0x20d3, 0x20d4, 0x20d5, 0x20d6, 0x20d7, 0x20d8, - 0x20d9, 0x20da, 0x20db, 0x20dc, 0x20dd, 0x20de, 0x20df, 0x20e0, - 0x20e1, 0x20e2, 0x20e3, 0x20e4, 0x20e5, 0x20e6, 0x20e7, 0x20e8, - 0x20e9, 0x20ea, 0x20eb, 0x20ec, 0x20ed, 0x20ee, 0x20ef, 0x20f0, - 0x2cef, 0x2cf0, 0x2cf1, 0x2d7f, 0x2de0, 0x2de1, 0x2de2, 0x2de3, - 0x2de4, 0x2de5, 0x2de6, 0x2de7, 0x2de8, 0x2de9, 0x2dea, 0x2deb, - 0x2dec, 0x2ded, 0x2dee, 0x2def, 0x2df0, 0x2df1, 0x2df2, 0x2df3, - 0x2df4, 0x2df5, 0x2df6, 0x2df7, 0x2df8, 0x2df9, 0x2dfa, 0x2dfb, - 0x2dfc, 0x2dfd, 0x2dfe, 0x2dff, 0x302a, 0x302b, 0x302c, 0x302d, - 0x302e, 0x302f, 0x3099, 0x309a, 0xa66f, 0xa670, 0xa671, 0xa672, - 0xa674, 0xa675, 0xa676, 0xa677, 0xa678, 0xa679, 0xa67a, 0xa67b, - 0xa67c, 0xa67d, 0xa69e, 0xa69f, 0xa6f0, 0xa6f1, 0xa802, 0xa806, - 0xa80b, 0xa823, 0xa824, 0xa825, 0xa826, 0xa827, 0xa82c, 0xa880, - 0xa881, 0xa8b4, 0xa8b5, 0xa8b6, 0xa8b7, 0xa8b8, 0xa8b9, 0xa8ba, - 0xa8bb, 0xa8bc, 0xa8bd, 0xa8be, 0xa8bf, 0xa8c0, 0xa8c1, 0xa8c2, - 0xa8c3, 0xa8c4, 0xa8c5, 0xa8e0, 0xa8e1, 0xa8e2, 0xa8e3, 0xa8e4, - 0xa8e5, 0xa8e6, 0xa8e7, 0xa8e8, 0xa8e9, 0xa8ea, 0xa8eb, 0xa8ec, - 0xa8ed, 0xa8ee, 0xa8ef, 0xa8f0, 0xa8f1, 0xa8ff, 0xa926, 0xa927, - 0xa928, 0xa929, 0xa92a, 0xa92b, 0xa92c, 0xa92d, 0xa947, 0xa948, - 0xa949, 0xa94a, 0xa94b, 0xa94c, 0xa94d, 0xa94e, 0xa94f, 0xa950, - 0xa951, 0xa952, 0xa953, 0xa980, 0xa981, 0xa982, 0xa983, 0xa9b3, - 0xa9b4, 0xa9b5, 0xa9b6, 0xa9b7, 0xa9b8, 0xa9b9, 0xa9ba, 0xa9bb, - 0xa9bc, 0xa9bd, 0xa9be, 0xa9bf, 0xa9c0, 0xa9e5, 0xaa29, 0xaa2a, - 0xaa2b, 0xaa2c, 0xaa2d, 0xaa2e, 0xaa2f, 0xaa30, 0xaa31, 0xaa32, - 0xaa33, 0xaa34, 0xaa35, 0xaa36, 0xaa43, 0xaa4c, 0xaa4d, 0xaa7b, - 0xaa7c, 0xaa7d, 0xaab0, 0xaab2, 0xaab3, 0xaab4, 0xaab7, 0xaab8, - 0xaabe, 0xaabf, 0xaac1, 0xaaeb, 0xaaec, 0xaaed, 0xaaee, 0xaaef, - 0xaaf5, 0xaaf6, 0xabe3, 0xabe4, 0xabe5, 0xabe6, 0xabe7, 0xabe8, - 0xabe9, 0xabea, 0xabec, 0xabed, 0xfb1e, 0xfe00, 0xfe01, 0xfe02, - 0xfe03, 0xfe04, 0xfe05, 0xfe06, 0xfe07, 0xfe08, 0xfe09, 0xfe0a, - 0xfe0b, 0xfe0c, 0xfe0d, 0xfe0e, 0xfe0f, 0xfe20, 0xfe21, 0xfe22, - 0xfe23, 0xfe24, 0xfe25, 0xfe26, 0xfe27, 0xfe28, 0xfe29, 0xfe2a, - 0xfe2b, 0xfe2c, 0xfe2d, 0xfe2e, 0xfe2f, 0x101fd, 0x102e0, 0x10376, - 0x10377, 0x10378, 0x10379, 0x1037a, 0x10a01, 0x10a02, 0x10a03, 0x10a05, - 0x10a06, 0x10a0c, 0x10a0d, 0x10a0e, 0x10a0f, 0x10a38, 0x10a39, 0x10a3a, - 0x10a3f, 0x10ae5, 0x10ae6, 0x10d24, 0x10d25, 0x10d26, 0x10d27, 0x10eab, - 0x10eac, 0x10f46, 0x10f47, 0x10f48, 0x10f49, 0x10f4a, 0x10f4b, 0x10f4c, - 0x10f4d, 0x10f4e, 0x10f4f, 0x10f50, 0x11000, 0x11001, 0x11002, 0x11038, - 0x11039, 0x1103a, 0x1103b, 0x1103c, 0x1103d, 0x1103e, 0x1103f, 0x11040, - 0x11041, 0x11042, 0x11043, 0x11044, 0x11045, 0x11046, 0x1107f, 0x11080, - 0x11081, 0x11082, 0x110b0, 0x110b1, 0x110b2, 0x110b3, 0x110b4, 0x110b5, - 0x110b6, 0x110b7, 0x110b8, 0x110b9, 0x110ba, 0x11100, 0x11101, 0x11102, - 0x11127, 0x11128, 0x11129, 0x1112a, 0x1112b, 0x1112c, 0x1112d, 0x1112e, - 0x1112f, 0x11130, 0x11131, 0x11132, 0x11133, 0x11134, 0x11145, 0x11146, - 0x11173, 0x11180, 0x11181, 0x11182, 0x111b3, 0x111b4, 0x111b5, 0x111b6, - 0x111b7, 0x111b8, 0x111b9, 0x111ba, 0x111bb, 0x111bc, 0x111bd, 0x111be, - 0x111bf, 0x111c0, 0x111c9, 0x111ca, 0x111cb, 0x111cc, 0x111ce, 0x111cf, - 0x1122c, 0x1122d, 0x1122e, 0x1122f, 0x11230, 0x11231, 0x11232, 0x11233, - 0x11234, 0x11235, 0x11236, 0x11237, 0x1123e, 0x112df, 0x112e0, 0x112e1, - 0x112e2, 0x112e3, 0x112e4, 0x112e5, 0x112e6, 0x112e7, 0x112e8, 0x112e9, - 0x112ea, 0x11300, 0x11301, 0x11302, 0x11303, 0x1133b, 0x1133c, 0x1133e, - 0x1133f, 0x11340, 0x11341, 0x11342, 0x11343, 0x11344, 0x11347, 0x11348, - 0x1134b, 0x1134c, 0x1134d, 0x11357, 0x11362, 0x11363, 0x11366, 0x11367, - 0x11368, 0x11369, 0x1136a, 0x1136b, 0x1136c, 0x11370, 0x11371, 0x11372, - 0x11373, 0x11374, 0x11435, 0x11436, 0x11437, 0x11438, 0x11439, 0x1143a, - 0x1143b, 0x1143c, 0x1143d, 0x1143e, 0x1143f, 0x11440, 0x11441, 0x11442, - 0x11443, 0x11444, 0x11445, 0x11446, 0x1145e, 0x114b0, 0x114b1, 0x114b2, - 0x114b3, 0x114b4, 0x114b5, 0x114b6, 0x114b7, 0x114b8, 0x114b9, 0x114ba, - 0x114bb, 0x114bc, 0x114bd, 0x114be, 0x114bf, 0x114c0, 0x114c1, 0x114c2, - 0x114c3, 0x115af, 0x115b0, 0x115b1, 0x115b2, 0x115b3, 0x115b4, 0x115b5, - 0x115b8, 0x115b9, 0x115ba, 0x115bb, 0x115bc, 0x115bd, 0x115be, 0x115bf, - 0x115c0, 0x115dc, 0x115dd, 0x11630, 0x11631, 0x11632, 0x11633, 0x11634, - 0x11635, 0x11636, 0x11637, 0x11638, 0x11639, 0x1163a, 0x1163b, 0x1163c, - 0x1163d, 0x1163e, 0x1163f, 0x11640, 0x116ab, 0x116ac, 0x116ad, 0x116ae, - 0x116af, 0x116b0, 0x116b1, 0x116b2, 0x116b3, 0x116b4, 0x116b5, 0x116b6, - 0x116b7, 0x1171d, 0x1171e, 0x1171f, 0x11720, 0x11721, 0x11722, 0x11723, - 0x11724, 0x11725, 0x11726, 0x11727, 0x11728, 0x11729, 0x1172a, 0x1172b, - 0x1182c, 0x1182d, 0x1182e, 0x1182f, 0x11830, 0x11831, 0x11832, 0x11833, - 0x11834, 0x11835, 0x11836, 0x11837, 0x11838, 0x11839, 0x1183a, 0x11930, - 0x11931, 0x11932, 0x11933, 0x11934, 0x11935, 0x11937, 0x11938, 0x1193b, - 0x1193c, 0x1193d, 0x1193e, 0x11940, 0x11942, 0x11943, 0x119d1, 0x119d2, - 0x119d3, 0x119d4, 0x119d5, 0x119d6, 0x119d7, 0x119da, 0x119db, 0x119dc, - 0x119dd, 0x119de, 0x119df, 0x119e0, 0x119e4, 0x11a01, 0x11a02, 0x11a03, - 0x11a04, 0x11a05, 0x11a06, 0x11a07, 0x11a08, 0x11a09, 0x11a0a, 0x11a33, - 0x11a34, 0x11a35, 0x11a36, 0x11a37, 0x11a38, 0x11a39, 0x11a3b, 0x11a3c, - 0x11a3d, 0x11a3e, 0x11a47, 0x11a51, 0x11a52, 0x11a53, 0x11a54, 0x11a55, - 0x11a56, 0x11a57, 0x11a58, 0x11a59, 0x11a5a, 0x11a5b, 0x11a8a, 0x11a8b, - 0x11a8c, 0x11a8d, 0x11a8e, 0x11a8f, 0x11a90, 0x11a91, 0x11a92, 0x11a93, - 0x11a94, 0x11a95, 0x11a96, 0x11a97, 0x11a98, 0x11a99, 0x11c2f, 0x11c30, - 0x11c31, 0x11c32, 0x11c33, 0x11c34, 0x11c35, 0x11c36, 0x11c38, 0x11c39, - 0x11c3a, 0x11c3b, 0x11c3c, 0x11c3d, 0x11c3e, 0x11c3f, 0x11c92, 0x11c93, - 0x11c94, 0x11c95, 0x11c96, 0x11c97, 0x11c98, 0x11c99, 0x11c9a, 0x11c9b, - 0x11c9c, 0x11c9d, 0x11c9e, 0x11c9f, 0x11ca0, 0x11ca1, 0x11ca2, 0x11ca3, - 0x11ca4, 0x11ca5, 0x11ca6, 0x11ca7, 0x11ca9, 0x11caa, 0x11cab, 0x11cac, - 0x11cad, 0x11cae, 0x11caf, 0x11cb0, 0x11cb1, 0x11cb2, 0x11cb3, 0x11cb4, - 0x11cb5, 0x11cb6, 0x11d31, 0x11d32, 0x11d33, 0x11d34, 0x11d35, 0x11d36, - 0x11d3a, 0x11d3c, 0x11d3d, 0x11d3f, 0x11d40, 0x11d41, 0x11d42, 0x11d43, - 0x11d44, 0x11d45, 0x11d47, 0x11d8a, 0x11d8b, 0x11d8c, 0x11d8d, 0x11d8e, - 0x11d90, 0x11d91, 0x11d93, 0x11d94, 0x11d95, 0x11d96, 0x11d97, 0x11ef3, - 0x11ef4, 0x11ef5, 0x11ef6, 0x16af0, 0x16af1, 0x16af2, 0x16af3, 0x16af4, - 0x16b30, 0x16b31, 0x16b32, 0x16b33, 0x16b34, 0x16b35, 0x16b36, 0x16f4f, - 0x16f51, 0x16f52, 0x16f53, 0x16f54, 0x16f55, 0x16f56, 0x16f57, 0x16f58, - 0x16f59, 0x16f5a, 0x16f5b, 0x16f5c, 0x16f5d, 0x16f5e, 0x16f5f, 0x16f60, - 0x16f61, 0x16f62, 0x16f63, 0x16f64, 0x16f65, 0x16f66, 0x16f67, 0x16f68, - 0x16f69, 0x16f6a, 0x16f6b, 0x16f6c, 0x16f6d, 0x16f6e, 0x16f6f, 0x16f70, - 0x16f71, 0x16f72, 0x16f73, 0x16f74, 0x16f75, 0x16f76, 0x16f77, 0x16f78, - 0x16f79, 0x16f7a, 0x16f7b, 0x16f7c, 0x16f7d, 0x16f7e, 0x16f7f, 0x16f80, - 0x16f81, 0x16f82, 0x16f83, 0x16f84, 0x16f85, 0x16f86, 0x16f87, 0x16f8f, - 0x16f90, 0x16f91, 0x16f92, 0x16fe4, 0x16ff0, 0x16ff1, 0x1bc9d, 0x1bc9e, - 0x1d165, 0x1d166, 0x1d167, 0x1d168, 0x1d169, 0x1d16d, 0x1d16e, 0x1d16f, - 0x1d170, 0x1d171, 0x1d172, 0x1d17b, 0x1d17c, 0x1d17d, 0x1d17e, 0x1d17f, - 0x1d180, 0x1d181, 0x1d182, 0x1d185, 0x1d186, 0x1d187, 0x1d188, 0x1d189, - 0x1d18a, 0x1d18b, 0x1d1aa, 0x1d1ab, 0x1d1ac, 0x1d1ad, 0x1d242, 0x1d243, - 0x1d244, 0x1da00, 0x1da01, 0x1da02, 0x1da03, 0x1da04, 0x1da05, 0x1da06, - 0x1da07, 0x1da08, 0x1da09, 0x1da0a, 0x1da0b, 0x1da0c, 0x1da0d, 0x1da0e, - 0x1da0f, 0x1da10, 0x1da11, 0x1da12, 0x1da13, 0x1da14, 0x1da15, 0x1da16, - 0x1da17, 0x1da18, 0x1da19, 0x1da1a, 0x1da1b, 0x1da1c, 0x1da1d, 0x1da1e, - 0x1da1f, 0x1da20, 0x1da21, 0x1da22, 0x1da23, 0x1da24, 0x1da25, 0x1da26, - 0x1da27, 0x1da28, 0x1da29, 0x1da2a, 0x1da2b, 0x1da2c, 0x1da2d, 0x1da2e, - 0x1da2f, 0x1da30, 0x1da31, 0x1da32, 0x1da33, 0x1da34, 0x1da35, 0x1da36, - 0x1da3b, 0x1da3c, 0x1da3d, 0x1da3e, 0x1da3f, 0x1da40, 0x1da41, 0x1da42, - 0x1da43, 0x1da44, 0x1da45, 0x1da46, 0x1da47, 0x1da48, 0x1da49, 0x1da4a, - 0x1da4b, 0x1da4c, 0x1da4d, 0x1da4e, 0x1da4f, 0x1da50, 0x1da51, 0x1da52, - 0x1da53, 0x1da54, 0x1da55, 0x1da56, 0x1da57, 0x1da58, 0x1da59, 0x1da5a, - 0x1da5b, 0x1da5c, 0x1da5d, 0x1da5e, 0x1da5f, 0x1da60, 0x1da61, 0x1da62, - 0x1da63, 0x1da64, 0x1da65, 0x1da66, 0x1da67, 0x1da68, 0x1da69, 0x1da6a, - 0x1da6b, 0x1da6c, 0x1da75, 0x1da84, 0x1da9b, 0x1da9c, 0x1da9d, 0x1da9e, - 0x1da9f, 0x1daa1, 0x1daa2, 0x1daa3, 0x1daa4, 0x1daa5, 0x1daa6, 0x1daa7, - 0x1daa8, 0x1daa9, 0x1daaa, 0x1daab, 0x1daac, 0x1daad, 0x1daae, 0x1daaf, - 0x1e000, 0x1e001, 0x1e002, 0x1e003, 0x1e004, 0x1e005, 0x1e006, 0x1e008, - 0x1e009, 0x1e00a, 0x1e00b, 0x1e00c, 0x1e00d, 0x1e00e, 0x1e00f, 0x1e010, - 0x1e011, 0x1e012, 0x1e013, 0x1e014, 0x1e015, 0x1e016, 0x1e017, 0x1e018, - 0x1e01b, 0x1e01c, 0x1e01d, 0x1e01e, 0x1e01f, 0x1e020, 0x1e021, 0x1e023, - 0x1e024, 0x1e026, 0x1e027, 0x1e028, 0x1e029, 0x1e02a, 0x1e130, 0x1e131, - 0x1e132, 0x1e133, 0x1e134, 0x1e135, 0x1e136, 0x1e2ec, 0x1e2ed, 0x1e2ee, - 0x1e2ef, 0x1e8d0, 0x1e8d1, 0x1e8d2, 0x1e8d3, 0x1e8d4, 0x1e8d5, 0x1e8d6, - 0x1e944, 0x1e945, 0x1e946, 0x1e947, 0x1e948, 0x1e949, 0x1e94a, 0xe0100, - 0xe0101, 0xe0102, 0xe0103, 0xe0104, 0xe0105, 0xe0106, 0xe0107, 0xe0108, - 0xe0109, 0xe010a, 0xe010b, 0xe010c, 0xe010d, 0xe010e, 0xe010f, 0xe0110, - 0xe0111, 0xe0112, 0xe0113, 0xe0114, 0xe0115, 0xe0116, 0xe0117, 0xe0118, - 0xe0119, 0xe011a, 0xe011b, 0xe011c, 0xe011d, 0xe011e, 0xe011f, 0xe0120, - 0xe0121, 0xe0122, 0xe0123, 0xe0124, 0xe0125, 0xe0126, 0xe0127, 0xe0128, - 0xe0129, 0xe012a, 0xe012b, 0xe012c, 0xe012d, 0xe012e, 0xe012f, 0xe0130, - 0xe0131, 0xe0132, 0xe0133, 0xe0134, 0xe0135, 0xe0136, 0xe0137, 0xe0138, - 0xe0139, 0xe013a, 0xe013b, 0xe013c, 0xe013d, 0xe013e, 0xe013f, 0xe0140, - 0xe0141, 0xe0142, 0xe0143, 0xe0144, 0xe0145, 0xe0146, 0xe0147, 0xe0148, - 0xe0149, 0xe014a, 0xe014b, 0xe014c, 0xe014d, 0xe014e, 0xe014f, 0xe0150, - 0xe0151, 0xe0152, 0xe0153, 0xe0154, 0xe0155, 0xe0156, 0xe0157, 0xe0158, - 0xe0159, 0xe015a, 0xe015b, 0xe015c, 0xe015d, 0xe015e, 0xe015f, 0xe0160, - 0xe0161, 0xe0162, 0xe0163, 0xe0164, 0xe0165, 0xe0166, 0xe0167, 0xe0168, - 0xe0169, 0xe016a, 0xe016b, 0xe016c, 0xe016d, 0xe016e, 0xe016f, 0xe0170, - 0xe0171, 0xe0172, 0xe0173, 0xe0174, 0xe0175, 0xe0176, 0xe0177, 0xe0178, - 0xe0179, 0xe017a, 0xe017b, 0xe017c, 0xe017d, 0xe017e, 0xe017f, 0xe0180, - 0xe0181, 0xe0182, 0xe0183, 0xe0184, 0xe0185, 0xe0186, 0xe0187, 0xe0188, - 0xe0189, 0xe018a, 0xe018b, 0xe018c, 0xe018d, 0xe018e, 0xe018f, 0xe0190, - 0xe0191, 0xe0192, 0xe0193, 0xe0194, 0xe0195, 0xe0196, 0xe0197, 0xe0198, - 0xe0199, 0xe019a, 0xe019b, 0xe019c, 0xe019d, 0xe019e, 0xe019f, 0xe01a0, - 0xe01a1, 0xe01a2, 0xe01a3, 0xe01a4, 0xe01a5, 0xe01a6, 0xe01a7, 0xe01a8, - 0xe01a9, 0xe01aa, 0xe01ab, 0xe01ac, 0xe01ad, 0xe01ae, 0xe01af, 0xe01b0, - 0xe01b1, 0xe01b2, 0xe01b3, 0xe01b4, 0xe01b5, 0xe01b6, 0xe01b7, 0xe01b8, - 0xe01b9, 0xe01ba, 0xe01bb, 0xe01bc, 0xe01bd, 0xe01be, 0xe01bf, 0xe01c0, - 0xe01c1, 0xe01c2, 0xe01c3, 0xe01c4, 0xe01c5, 0xe01c6, 0xe01c7, 0xe01c8, - 0xe01c9, 0xe01ca, 0xe01cb, 0xe01cc, 0xe01cd, 0xe01ce, 0xe01cf, 0xe01d0, - 0xe01d1, 0xe01d2, 0xe01d3, 0xe01d4, 0xe01d5, 0xe01d6, 0xe01d7, 0xe01d8, - 0xe01d9, 0xe01da, 0xe01db, 0xe01dc, 0xe01dd, 0xe01de, 0xe01df, 0xe01e0, - 0xe01e1, 0xe01e2, 0xe01e3, 0xe01e4, 0xe01e5, 0xe01e6, 0xe01e7, 0xe01e8, - 0xe01e9, 0xe01ea, 0xe01eb, 0xe01ec, 0xe01ed, 0xe01ee, 0xe01ef}; - if (std::binary_search(std::begin(combining), std::end(combining), - label.front())) { + // The label must not begin with a combining mark. + // Range membership via lower_bound on range end. + const std::span comb_span{combining_ranges, + combining_range_count}; + const auto comb_it = std::ranges::lower_bound( + comb_span, label.front(), {}, [](const auto& range) { return range[1]; }); + if (comb_it != comb_span.end() && label.front() >= (*comb_it)[0]) { return false; } // We verify this next step as part of the mapping: @@ -9421,8 +6051,7 @@ bool is_label_valid(const std::u32string_view label) { uint32_t c = label[i]; if (c == 0x200c) { if (i > 0) { - if (std::binary_search(std::begin(virama), std::end(virama), - label[i - 1])) { + if (std::ranges::binary_search(virama, label[i - 1])) { return true; } } @@ -9431,12 +6060,12 @@ bool is_label_valid(const std::u32string_view label) { } // we go backward looking for L or D auto is_l_or_d = [](uint32_t code) { - return std::binary_search(std::begin(L), std::end(L), code) || - std::binary_search(std::begin(D), std::end(D), code); + return std::ranges::binary_search(L, code) || + std::ranges::binary_search(D, code); }; auto is_r_or_d = [](uint32_t code) { - return std::binary_search(std::begin(R), std::end(R), code) || - std::binary_search(std::begin(D), std::end(D), code); + return std::ranges::binary_search(R, code) || + std::ranges::binary_search(D, code); }; std::u32string_view before = label.substr(0, i); std::u32string_view after = label.substr(i + 1); @@ -9446,8 +6075,7 @@ bool is_label_valid(const std::u32string_view label) { after.end()); } else if (c == 0x200d) { if (i > 0) { - if (std::binary_search(std::begin(virama), std::end(virama), - label[i - 1])) { + if (std::ranges::binary_search(virama, label[i - 1])) { return true; } } @@ -9503,18 +6131,18 @@ bool is_label_valid(const std::u32string_view label) { // In an LTR label, only characters with the Bidi properties L, EN, // ES, CS, ET, ON, BN, or NSM are allowed. - for (size_t i = 0; i < last_non_nsm_char; i++) { + for (size_t i = 0; i <= last_non_nsm_char; i++) { const direction d = find_direction(label[i]); if (!(d == direction::L || d == direction::EN || d == direction::ES || d == direction::CS || d == direction::ET || d == direction::ON || d == direction::BN || d == direction::NSM)) { return false; } + } - if ((i == last_non_nsm_char) && - !(d == direction::L || d == direction::EN)) { - return false; - } + const direction last_dir = find_direction(label[last_non_nsm_char]); + if (!(last_dir == direction::L || last_dir == direction::EN)) { + return false; } return true; @@ -9522,6 +6150,13 @@ bool is_label_valid(const std::u32string_view label) { } else { // Eval as RTL + // The first character must be R or AL; a leading AN (or any other + // direction) does not start a valid RTL label. + const direction first_dir = find_direction(label[0]); + if (first_dir != direction::R && first_dir != direction::AL) { + return false; + } + bool has_an = false; bool has_en = false; for (size_t i = 0; i <= last_non_nsm_char; i++) { @@ -9558,11 +6193,84 @@ bool is_label_valid(const std::u32string_view label) { } // namespace ada::idna /* end file src/validity.cpp */ /* begin file src/to_ascii.cpp */ +/* begin file include/ada/idna/to_ascii.h */ +#ifndef ADA_IDNA_TO_ASCII_H +#define ADA_IDNA_TO_ASCII_H + +#include +#include + +/* begin file include/ada/idna/limits.h */ +#ifndef ADA_IDNA_LIMITS_H +#define ADA_IDNA_LIMITS_H + +#include + +namespace ada::idna { + +// Maximum accepted UTF-8 domain length for to_ascii / to_unicode. +// Bounds heap growth under untrusted input (DoS resistance). DNS wire limits +// are smaller; this allows long Unicode labels used in URL tests/fixtures. +inline constexpr size_t max_domain_input_bytes = 16384; + +} // namespace ada::idna + +#endif // ADA_IDNA_LIMITS_H +/* end file include/ada/idna/limits.h */ + +namespace ada::idna { + +// Converts a domain (e.g., www.google.com) possibly containing international +// characters to an ascii domain (with punycode). It will not do percent +// decoding: percent decoding should be done prior to calling this function. We +// do not remove tabs and spaces, they should have been removed prior to calling +// this function. We also do not trim control characters. We also assume that +// the input is not empty. We return "" on error. Inputs longer than +// max_domain_input_bytes are rejected. +// +// This function may accept or even produce invalid domains (WHATWG carve-outs). +std::string to_ascii(std::string_view ut8_string); + +// Same as to_ascii, but writes into `out` and returns false on error without +// relying on empty-string ambiguity. +[[nodiscard]] bool to_ascii(std::string_view ut8_string, std::string& out); + +// Returns true if the string contains a forbidden code point according to the +// WHATGL URL specification: +// https://url.spec.whatwg.org/#forbidden-domain-code-point +bool contains_forbidden_domain_code_point(std::string_view ascii_string); + +bool constexpr is_ascii(std::u32string_view view); +bool constexpr is_ascii(std::string_view view); + +} // namespace ada::idna + +#endif // ADA_IDNA_TO_ASCII_H +/* end file include/ada/idna/to_ascii.h */ #include #include +#include #include +/* begin file include/ada/idna/validity.h */ +#ifndef ADA_IDNA_VALIDITY_H +#define ADA_IDNA_VALIDITY_H + +#include +#include + +namespace ada::idna { + +/** + * @see https://www.unicode.org/reports/tr46/#Validity_Criteria + */ +bool is_label_valid(std::u32string_view label); + +} // namespace ada::idna + +#endif // ADA_IDNA_VALIDITY_H +/* end file include/ada/idna/validity.h */ #ifdef ADA_USE_SIMDUTF #include "simdutf.h" @@ -9611,190 +6319,241 @@ bool contains_forbidden_domain_code_point(std::string_view view) { return std::ranges::any_of(view, is_forbidden_domain_code_point); } -// We return "" on error. -static std::string from_ascii_to_ascii(std::string_view ut8_string) { - static const std::string error = ""; - // copy and map - // we could be more efficient by avoiding the copy when unnecessary. - std::string mapped_string = std::string(ut8_string); - ascii_map(mapped_string.data(), mapped_string.size()); - std::string out; - size_t label_start = 0; +// Per the WHATWG URL "domain to ASCII" algorithm, when beStrict is false and +// the input domain is an ASCII string, the result is the input lowercased, +// regardless of the outcome of Unicode ToASCII. +// +// See https://url.spec.whatwg.org/#concept-domain-to-ascii +static void from_ascii_to_ascii(std::string_view ut8_string, std::string& out) { + out.assign(ut8_string); + ascii_map(out.data(), out.size()); +} - while (label_start != mapped_string.size()) { - size_t loc_dot = mapped_string.find('.', label_start); - bool is_last_label = (loc_dot == std::string_view::npos); - size_t label_size = is_last_label ? mapped_string.size() - label_start - : loc_dot - label_start; - size_t label_size_with_dot = is_last_label ? label_size : label_size + 1; - std::string_view label_view(mapped_string.data() + label_start, label_size); - label_start += label_size_with_dot; - if (label_size == 0) { - // empty label? Nothing to do. - } else if (label_view.starts_with("xn--")) { - // The xn-- part is the expensive game. - out.append(label_view); - std::string_view puny_segment_ascii( - out.data() + out.size() - label_view.size() + 4, - label_view.size() - 4); - std::u32string tmp_buffer; - bool is_ok = ada::idna::punycode_to_utf32(puny_segment_ascii, tmp_buffer); - if (!is_ok) { - return error; - } - // If the input is just ASCII, it should not have been encoded - // as punycode. - // https://github.com/whatwg/url/issues/760 - if (is_ascii(tmp_buffer)) { - return error; - } - std::u32string post_map = ada::idna::map(tmp_buffer); - if (tmp_buffer != post_map) { - return error; - } - std::u32string pre_normal = post_map; - normalize(post_map); - if (post_map != pre_normal) { - return error; - } - if (post_map.empty()) { - return error; - } - if (!is_label_valid(post_map)) { - return error; - } - } else { - out.append(label_view); - } - if (!is_last_label) { - out.push_back('.'); - } +// Append ASCII code units from a UTF-32 label (all values < 0x80). +static void append_ascii_label(std::string& out, std::u32string_view label) { + const size_t old = out.size(); + out.resize(old + label.size()); + char* dest = out.data() + old; + for (char32_t c : label) { + *dest++ = static_cast(c); } - return out; } -// We return "" on error. -std::string to_ascii(std::string_view ut8_string) { +// True if label begins with "xn--" (already lowercased by mapping). +static bool is_ace_prefix(std::u32string_view label) noexcept { + return label.size() >= 4 && label[0] == U'x' && label[1] == U'n' && + label[2] == U'-' && label[3] == U'-'; +} + +[[nodiscard]] bool to_ascii(std::string_view ut8_string, std::string& out) { + out.clear(); + if (ut8_string.size() > max_domain_input_bytes) { + return false; + } if (is_ascii(ut8_string)) { - return from_ascii_to_ascii(ut8_string); + from_ascii_to_ascii(ut8_string, out); + return true; } - static const std::string error = ""; - // We convert to UTF-32 #ifdef ADA_USE_SIMDUTF size_t utf32_length = simdutf::utf32_length_from_utf8(ut8_string.data(), ut8_string.size()); - std::u32string utf32(utf32_length, '\0'); + if (utf32_length == 0 && !ut8_string.empty()) { + return false; + } + std::u32string working(utf32_length, U'\0'); size_t actual_utf32_length = simdutf::convert_utf8_to_utf32( - ut8_string.data(), ut8_string.size(), utf32.data()); + ut8_string.data(), ut8_string.size(), working.data()); #else size_t utf32_length = ada::idna::utf32_length_from_utf8(ut8_string.data(), ut8_string.size()); - std::u32string utf32(utf32_length, '\0'); + if (utf32_length == 0 && !ut8_string.empty()) { + return false; + } + std::u32string working(utf32_length, U'\0'); size_t actual_utf32_length = ada::idna::utf8_to_utf32( - ut8_string.data(), ut8_string.size(), utf32.data()); + ut8_string.data(), ut8_string.size(), working.data()); #endif - if (actual_utf32_length == 0) { - return error; + if (actual_utf32_length == 0 || actual_utf32_length != utf32_length) { + return false; } - // mapping - utf32 = ada::idna::map(utf32); - normalize(utf32); - std::string out; - size_t label_start = 0; + working.resize(actual_utf32_length); + + // Map into a second buffer with exact sizing (no growth reallocs). + std::u32string mapped; + if (!ada::idna::map(working, mapped)) { + return false; + } + // Drop UTF-32 input; reuse `working` as scratch for ACE validation below. + working.clear(); + + // Skip NFC when already normalized (ASCII is a fast subset of this check). + if (!is_ascii(mapped) && !is_already_nfc(mapped)) { + if (!normalize(mapped)) { + return false; + } + } + + // Estimate ASCII output size (punycode may expand non-ASCII labels). + out.reserve(mapped.size() + 8); + + // Walk labels with a single pointer scan (no repeated string::find). + const char32_t* p = mapped.data(); + const char32_t* const end = p + mapped.size(); + std::u32string post_map; + + while (p < end) { + const char32_t* label_begin = p; + while (p < end && *p != U'.') { + ++p; + } + const size_t label_size = static_cast(p - label_begin); + std::u32string_view label_view(label_begin, label_size); + const bool is_last_label = (p == end); + if (p < end) { + ++p; // skip dot + } - while (label_start != utf32.size()) { - size_t loc_dot = utf32.find('.', label_start); - bool is_last_label = (loc_dot == std::string_view::npos); - size_t label_size = - is_last_label ? utf32.size() - label_start : loc_dot - label_start; - size_t label_size_with_dot = is_last_label ? label_size : label_size + 1; - std::u32string_view label_view(utf32.data() + label_start, label_size); - label_start += label_size_with_dot; if (label_size == 0) { - // empty label? Nothing to do. - } else if (label_view.starts_with(U"xn--")) { - // we do not need to check, e.g., Xn-- because mapping goes to lower case + // empty label + } else if (is_ace_prefix(label_view)) { for (char32_t c : label_view) { if (c >= 0x80) { - return error; + out.clear(); + return false; } - out += (unsigned char)(c); } + append_ascii_label(out, label_view); std::string_view puny_segment_ascii( - out.data() + out.size() - label_view.size() + 4, - label_view.size() - 4); - std::u32string tmp_buffer; - bool is_ok = ada::idna::punycode_to_utf32(puny_segment_ascii, tmp_buffer); - if (!is_ok) { - return error; - } - // If the input is just ASCII, it should not have been encoded - // as punycode. - // https://github.com/whatwg/url/issues/760 - if (is_ascii(tmp_buffer)) { - return error; + out.data() + (out.size() - label_size) + 4, label_size - 4); + working.clear(); + if (!ada::idna::punycode_to_utf32(puny_segment_ascii, working)) { + out.clear(); + return false; } - std::u32string post_map = ada::idna::map(tmp_buffer); - if (tmp_buffer != post_map) { - return error; + if (is_ascii(working)) { + out.clear(); + return false; } - std::u32string pre_normal = post_map; - normalize(post_map); - if (post_map != pre_normal) { - return error; + if (!ada::idna::map(working, post_map) || working != post_map) { + out.clear(); + return false; } - if (post_map.empty()) { - return error; + // Mapping must be stable; NFC must not change the mapped form either. + if (!is_ascii(post_map) && !is_already_nfc(post_map)) { + if (!normalize(post_map) || post_map != working) { + out.clear(); + return false; + } } - if (!is_label_valid(post_map)) { - return error; + if (post_map.empty() || !is_label_valid(post_map)) { + out.clear(); + return false; } + } else if (is_ascii(label_view)) { + append_ascii_label(out, label_view); } else { - // The fast path here is an ascii label. - if (is_ascii(label_view)) { - // no validation needed. - for (char32_t c : label_view) { - out += (unsigned char)(c); - } - } else { - // slow path. - // first check validity. - if (!is_label_valid(label_view)) { - return error; - } - // It is valid! So now we must encode it as punycode... - out.append("xn--"); - bool is_ok = ada::idna::utf32_to_punycode(label_view, out); - if (!is_ok) { - return error; - } + if (!is_label_valid(label_view)) { + out.clear(); + return false; + } + out.append("xn--"); + if (!ada::idna::utf32_to_punycode(label_view, out)) { + out.clear(); + return false; } } if (!is_last_label) { out.push_back('.'); } } + return true; +} + +std::string to_ascii(std::string_view ut8_string) { + std::string out; + if (!to_ascii(ut8_string, out)) { + return {}; + } return out; } } // namespace ada::idna -/* end file src/to_ascii.cpp */ -/* begin file src/to_unicode.cpp */ +/* end file src/to_ascii.cpp */ +/* begin file src/to_unicode.cpp */ +/* begin file include/ada/idna/to_unicode.h */ +#ifndef ADA_IDNA_TO_UNICODE_H +#define ADA_IDNA_TO_UNICODE_H + +#include +#include + + +namespace ada::idna { + +// UTS #46 ToUnicode. Never fails per the standard: on step failure the original +// label is kept. Inputs longer than max_domain_input_bytes are returned +// unchanged as a safety measure under untrusted input. +std::string to_unicode(std::string_view input); + +// Writes into `out`. Returns false only if the input exceeds +// max_domain_input_bytes (out is left empty). Otherwise always returns true +// (ToUnicode does not fail). +[[nodiscard]] bool to_unicode(std::string_view input, std::string& out); + +} // namespace ada::idna + +#endif // ADA_IDNA_TO_UNICODE_H +/* end file include/ada/idna/to_unicode.h */ #include #include +/* begin file include/idna.h */ +#ifndef ADA_IDNA_H +#define ADA_IDNA_H + +/* begin file include/ada/idna/identifier.h */ +#ifndef ADA_IDNA_IDENTIFIER_H +#define ADA_IDNA_IDENTIFIER_H + +#include +#include + +namespace ada::idna { + +// Verify if it is valid name code point given a Unicode code point and a +// boolean first: If first is true return the result of checking if code point +// is contained in the IdentifierStart set of code points. Otherwise return the +// result of checking if code point is contained in the IdentifierPart set of +// code points. Returns false if the input is empty or the code point is not +// valid. There is minimal Unicode error handling: the input should be valid +// UTF-8. https://urlpattern.spec.whatwg.org/#is-a-valid-name-code-point +bool valid_name_code_point(char32_t code_point, bool first); + +} // namespace ada::idna + +#endif +/* end file include/ada/idna/identifier.h */ + +#endif +/* end file include/idna.h */ #ifdef ADA_USE_SIMDUTF #include "simdutf.h" #endif namespace ada::idna { -std::string to_unicode(std::string_view input) { - std::string output; + +[[nodiscard]] bool to_unicode(std::string_view input, std::string& output) { + output.clear(); + if (input.size() > max_domain_input_bytes) { + return false; + } output.reserve(input.size()); size_t label_start = 0; + std::u32string tmp_buffer; + std::u32string post_map; while (label_start < input.size()) { size_t loc_dot = input.find('.', label_start); bool is_last_label = (loc_dot == std::string_view::npos); @@ -9804,26 +6563,54 @@ std::string to_unicode(std::string_view input) { if (label_view.starts_with("xn--") && ada::idna::is_ascii(label_view)) { label_view.remove_prefix(4); - if (ada::idna::verify_punycode(label_view)) { - std::u32string tmp_buffer; - if (ada::idna::punycode_to_utf32(label_view, tmp_buffer)) { + tmp_buffer.clear(); + if (ada::idna::punycode_to_utf32(label_view, tmp_buffer)) { + // Per UTS #46, the decoded label must be re-validated. Reject decodings + // that are pure ASCII (xn-- encoding of an ASCII-only label), or whose + // mapping/normalization is not stable, or that fail label validity. + bool accept_decoded = true; + if (ada::idna::is_ascii(tmp_buffer)) { + accept_decoded = false; + } else { + post_map.clear(); + if (!ada::idna::map(tmp_buffer, post_map) || post_map != tmp_buffer) { + accept_decoded = false; + } else if (!ada::idna::normalize(post_map) || + post_map != tmp_buffer || post_map.empty() || + !ada::idna::is_label_valid(post_map)) { + accept_decoded = false; + } + } + + if (accept_decoded) { #ifdef ADA_USE_SIMDUTF auto utf8_size = simdutf::utf8_length_from_utf32(tmp_buffer.data(), tmp_buffer.size()); - std::string final_utf8(utf8_size, '\0'); - simdutf::convert_utf32_to_utf8(tmp_buffer.data(), tmp_buffer.size(), - final_utf8.data()); + size_t old_size = output.size(); + output.resize(old_size + utf8_size); + size_t written = simdutf::convert_utf32_to_utf8( + tmp_buffer.data(), tmp_buffer.size(), output.data() + old_size); + if (written != utf8_size) { + output.resize(old_size); + output.append( + std::string_view(input.data() + label_start, label_size)); + } #else auto utf8_size = ada::idna::utf8_length_from_utf32(tmp_buffer.data(), tmp_buffer.size()); - std::string final_utf8(utf8_size, '\0'); - ada::idna::utf32_to_utf8(tmp_buffer.data(), tmp_buffer.size(), - final_utf8.data()); + size_t old_size = output.size(); + output.resize(old_size + utf8_size); + size_t written = ada::idna::utf32_to_utf8( + tmp_buffer.data(), tmp_buffer.size(), output.data() + old_size); + if (written != utf8_size) { + output.resize(old_size); + output.append( + std::string_view(input.data() + label_start, label_size)); + } #endif - output.append(final_utf8); } else { - // ToUnicode never fails. If any step fails, then the original input - // sequence is returned immediately in that step. + // ToUnicode never fails. If any step fails, return the original + // input sequence for the label. output.append( std::string_view(input.data() + label_start, label_size)); } @@ -9841,6 +6628,16 @@ std::string to_unicode(std::string_view input) { label_start += label_size + 1; } + return true; +} + +std::string to_unicode(std::string_view input) { + std::string output; + if (!to_unicode(input, output)) { + // Over-limit input: return original (ToUnicode never fails in the sense of + // producing no answer for valid-length inputs). + return std::string(input); + } return output; } } // namespace ada::idna @@ -9849,10 +6646,12 @@ std::string to_unicode(std::string_view input) { #include #include +#include #include /* begin file src/id_tables.cpp */ // IDNA 17.0.0 +// Identifier range tables are stored in the compressed blob (table_store.hpp). // clang-format off #ifndef ADA_IDNA_IDENTIFIER_TABLES_H @@ -9861,565 +6660,10 @@ std::string to_unicode(std::string_view input) { namespace ada::idna { -const uint32_t id_continue[1418][2] = -{ - {48, 57}, {65, 90}, {95, 95}, {97, 122}, - {170, 170}, {181, 181}, {183, 183}, {186, 186}, - {192, 214}, {216, 246}, {248, 442}, {443, 443}, - {444, 447}, {448, 451}, {452, 659}, {660, 661}, - {662, 687}, {688, 705}, {710, 721}, {736, 740}, - {748, 748}, {750, 750}, {768, 879}, {880, 883}, - {884, 884}, {886, 887}, {890, 890}, {891, 893}, - {895, 895}, {902, 902}, {903, 903}, {904, 906}, - {908, 908}, {910, 929}, {931, 1013}, {1015, 1153}, - {1155, 1159}, {1162, 1327}, {1329, 1366}, {1369, 1369}, - {1376, 1416}, {1425, 1469}, {1471, 1471}, {1473, 1474}, - {1476, 1477}, {1479, 1479}, {1488, 1514}, {1519, 1522}, - {1552, 1562}, {1568, 1599}, {1600, 1600}, {1601, 1610}, - {1611, 1631}, {1632, 1641}, {1646, 1647}, {1648, 1648}, - {1649, 1747}, {1749, 1749}, {1750, 1756}, {1759, 1764}, - {1765, 1766}, {1767, 1768}, {1770, 1773}, {1774, 1775}, - {1776, 1785}, {1786, 1788}, {1791, 1791}, {1808, 1808}, - {1809, 1809}, {1810, 1839}, {1840, 1866}, {1869, 1957}, - {1958, 1968}, {1969, 1969}, {1984, 1993}, {1994, 2026}, - {2027, 2035}, {2036, 2037}, {2042, 2042}, {2045, 2045}, - {2048, 2069}, {2070, 2073}, {2074, 2074}, {2075, 2083}, - {2084, 2084}, {2085, 2087}, {2088, 2088}, {2089, 2093}, - {2112, 2136}, {2137, 2139}, {2144, 2154}, {2160, 2183}, - {2185, 2191}, {2199, 2207}, {2208, 2248}, {2249, 2249}, - {2250, 2273}, {2275, 2306}, {2307, 2307}, {2308, 2361}, - {2362, 2362}, {2363, 2363}, {2364, 2364}, {2365, 2365}, - {2366, 2368}, {2369, 2376}, {2377, 2380}, {2381, 2381}, - {2382, 2383}, {2384, 2384}, {2385, 2391}, {2392, 2401}, - {2402, 2403}, {2406, 2415}, {2417, 2417}, {2418, 2432}, - {2433, 2433}, {2434, 2435}, {2437, 2444}, {2447, 2448}, - {2451, 2472}, {2474, 2480}, {2482, 2482}, {2486, 2489}, - {2492, 2492}, {2493, 2493}, {2494, 2496}, {2497, 2500}, - {2503, 2504}, {2507, 2508}, {2509, 2509}, {2510, 2510}, - {2519, 2519}, {2524, 2525}, {2527, 2529}, {2530, 2531}, - {2534, 2543}, {2544, 2545}, {2556, 2556}, {2558, 2558}, - {2561, 2562}, {2563, 2563}, {2565, 2570}, {2575, 2576}, - {2579, 2600}, {2602, 2608}, {2610, 2611}, {2613, 2614}, - {2616, 2617}, {2620, 2620}, {2622, 2624}, {2625, 2626}, - {2631, 2632}, {2635, 2637}, {2641, 2641}, {2649, 2652}, - {2654, 2654}, {2662, 2671}, {2672, 2673}, {2674, 2676}, - {2677, 2677}, {2689, 2690}, {2691, 2691}, {2693, 2701}, - {2703, 2705}, {2707, 2728}, {2730, 2736}, {2738, 2739}, - {2741, 2745}, {2748, 2748}, {2749, 2749}, {2750, 2752}, - {2753, 2757}, {2759, 2760}, {2761, 2761}, {2763, 2764}, - {2765, 2765}, {2768, 2768}, {2784, 2785}, {2786, 2787}, - {2790, 2799}, {2809, 2809}, {2810, 2815}, {2817, 2817}, - {2818, 2819}, {2821, 2828}, {2831, 2832}, {2835, 2856}, - {2858, 2864}, {2866, 2867}, {2869, 2873}, {2876, 2876}, - {2877, 2877}, {2878, 2878}, {2879, 2879}, {2880, 2880}, - {2881, 2884}, {2887, 2888}, {2891, 2892}, {2893, 2893}, - {2901, 2902}, {2903, 2903}, {2908, 2909}, {2911, 2913}, - {2914, 2915}, {2918, 2927}, {2929, 2929}, {2946, 2946}, - {2947, 2947}, {2949, 2954}, {2958, 2960}, {2962, 2965}, - {2969, 2970}, {2972, 2972}, {2974, 2975}, {2979, 2980}, - {2984, 2986}, {2990, 3001}, {3006, 3007}, {3008, 3008}, - {3009, 3010}, {3014, 3016}, {3018, 3020}, {3021, 3021}, - {3024, 3024}, {3031, 3031}, {3046, 3055}, {3072, 3072}, - {3073, 3075}, {3076, 3076}, {3077, 3084}, {3086, 3088}, - {3090, 3112}, {3114, 3129}, {3132, 3132}, {3133, 3133}, - {3134, 3136}, {3137, 3140}, {3142, 3144}, {3146, 3149}, - {3157, 3158}, {3160, 3162}, {3164, 3165}, {3168, 3169}, - {3170, 3171}, {3174, 3183}, {3200, 3200}, {3201, 3201}, - {3202, 3203}, {3205, 3212}, {3214, 3216}, {3218, 3240}, - {3242, 3251}, {3253, 3257}, {3260, 3260}, {3261, 3261}, - {3262, 3262}, {3263, 3263}, {3264, 3268}, {3270, 3270}, - {3271, 3272}, {3274, 3275}, {3276, 3277}, {3285, 3286}, - {3292, 3294}, {3296, 3297}, {3298, 3299}, {3302, 3311}, - {3313, 3314}, {3315, 3315}, {3328, 3329}, {3330, 3331}, - {3332, 3340}, {3342, 3344}, {3346, 3386}, {3387, 3388}, - {3389, 3389}, {3390, 3392}, {3393, 3396}, {3398, 3400}, - {3402, 3404}, {3405, 3405}, {3406, 3406}, {3412, 3414}, - {3415, 3415}, {3423, 3425}, {3426, 3427}, {3430, 3439}, - {3450, 3455}, {3457, 3457}, {3458, 3459}, {3461, 3478}, - {3482, 3505}, {3507, 3515}, {3517, 3517}, {3520, 3526}, - {3530, 3530}, {3535, 3537}, {3538, 3540}, {3542, 3542}, - {3544, 3551}, {3558, 3567}, {3570, 3571}, {3585, 3632}, - {3633, 3633}, {3634, 3635}, {3636, 3642}, {3648, 3653}, - {3654, 3654}, {3655, 3662}, {3664, 3673}, {3713, 3714}, - {3716, 3716}, {3718, 3722}, {3724, 3747}, {3749, 3749}, - {3751, 3760}, {3761, 3761}, {3762, 3763}, {3764, 3772}, - {3773, 3773}, {3776, 3780}, {3782, 3782}, {3784, 3790}, - {3792, 3801}, {3804, 3807}, {3840, 3840}, {3864, 3865}, - {3872, 3881}, {3893, 3893}, {3895, 3895}, {3897, 3897}, - {3902, 3903}, {3904, 3911}, {3913, 3948}, {3953, 3966}, - {3967, 3967}, {3968, 3972}, {3974, 3975}, {3976, 3980}, - {3981, 3991}, {3993, 4028}, {4038, 4038}, {4096, 4138}, - {4139, 4140}, {4141, 4144}, {4145, 4145}, {4146, 4151}, - {4152, 4152}, {4153, 4154}, {4155, 4156}, {4157, 4158}, - {4159, 4159}, {4160, 4169}, {4176, 4181}, {4182, 4183}, - {4184, 4185}, {4186, 4189}, {4190, 4192}, {4193, 4193}, - {4194, 4196}, {4197, 4198}, {4199, 4205}, {4206, 4208}, - {4209, 4212}, {4213, 4225}, {4226, 4226}, {4227, 4228}, - {4229, 4230}, {4231, 4236}, {4237, 4237}, {4238, 4238}, - {4239, 4239}, {4240, 4249}, {4250, 4252}, {4253, 4253}, - {4256, 4293}, {4295, 4295}, {4301, 4301}, {4304, 4346}, - {4348, 4348}, {4349, 4351}, {4352, 4680}, {4682, 4685}, - {4688, 4694}, {4696, 4696}, {4698, 4701}, {4704, 4744}, - {4746, 4749}, {4752, 4784}, {4786, 4789}, {4792, 4798}, - {4800, 4800}, {4802, 4805}, {4808, 4822}, {4824, 4880}, - {4882, 4885}, {4888, 4954}, {4957, 4959}, {4969, 4977}, - {4992, 5007}, {5024, 5109}, {5112, 5117}, {5121, 5740}, - {5743, 5759}, {5761, 5786}, {5792, 5866}, {5870, 5872}, - {5873, 5880}, {5888, 5905}, {5906, 5908}, {5909, 5909}, - {5919, 5937}, {5938, 5939}, {5940, 5940}, {5952, 5969}, - {5970, 5971}, {5984, 5996}, {5998, 6000}, {6002, 6003}, - {6016, 6067}, {6068, 6069}, {6070, 6070}, {6071, 6077}, - {6078, 6085}, {6086, 6086}, {6087, 6088}, {6089, 6099}, - {6103, 6103}, {6108, 6108}, {6109, 6109}, {6112, 6121}, - {6155, 6157}, {6159, 6159}, {6160, 6169}, {6176, 6210}, - {6211, 6211}, {6212, 6264}, {6272, 6276}, {6277, 6278}, - {6279, 6312}, {6313, 6313}, {6314, 6314}, {6320, 6389}, - {6400, 6430}, {6432, 6434}, {6435, 6438}, {6439, 6440}, - {6441, 6443}, {6448, 6449}, {6450, 6450}, {6451, 6456}, - {6457, 6459}, {6470, 6479}, {6480, 6509}, {6512, 6516}, - {6528, 6571}, {6576, 6601}, {6608, 6617}, {6618, 6618}, - {6656, 6678}, {6679, 6680}, {6681, 6682}, {6683, 6683}, - {6688, 6740}, {6741, 6741}, {6742, 6742}, {6743, 6743}, - {6744, 6750}, {6752, 6752}, {6753, 6753}, {6754, 6754}, - {6755, 6756}, {6757, 6764}, {6765, 6770}, {6771, 6780}, - {6783, 6783}, {6784, 6793}, {6800, 6809}, {6823, 6823}, - {6832, 6845}, {6847, 6877}, {6880, 6891}, {6912, 6915}, - {6916, 6916}, {6917, 6963}, {6964, 6964}, {6965, 6965}, - {6966, 6970}, {6971, 6971}, {6972, 6972}, {6973, 6977}, - {6978, 6978}, {6979, 6980}, {6981, 6988}, {6992, 7001}, - {7019, 7027}, {7040, 7041}, {7042, 7042}, {7043, 7072}, - {7073, 7073}, {7074, 7077}, {7078, 7079}, {7080, 7081}, - {7082, 7082}, {7083, 7085}, {7086, 7087}, {7088, 7097}, - {7098, 7141}, {7142, 7142}, {7143, 7143}, {7144, 7145}, - {7146, 7148}, {7149, 7149}, {7150, 7150}, {7151, 7153}, - {7154, 7155}, {7168, 7203}, {7204, 7211}, {7212, 7219}, - {7220, 7221}, {7222, 7223}, {7232, 7241}, {7245, 7247}, - {7248, 7257}, {7258, 7287}, {7288, 7293}, {7296, 7306}, - {7312, 7354}, {7357, 7359}, {7376, 7378}, {7380, 7392}, - {7393, 7393}, {7394, 7400}, {7401, 7404}, {7405, 7405}, - {7406, 7411}, {7412, 7412}, {7413, 7414}, {7415, 7415}, - {7416, 7417}, {7418, 7418}, {7424, 7467}, {7468, 7530}, - {7531, 7543}, {7544, 7544}, {7545, 7578}, {7579, 7615}, - {7616, 7679}, {7680, 7957}, {7960, 7965}, {7968, 8005}, - {8008, 8013}, {8016, 8023}, {8025, 8025}, {8027, 8027}, - {8029, 8029}, {8031, 8061}, {8064, 8116}, {8118, 8124}, - {8126, 8126}, {8130, 8132}, {8134, 8140}, {8144, 8147}, - {8150, 8155}, {8160, 8172}, {8178, 8180}, {8182, 8188}, - {8204, 8205}, {8255, 8256}, {8276, 8276}, {8305, 8305}, - {8319, 8319}, {8336, 8348}, {8400, 8412}, {8417, 8417}, - {8421, 8432}, {8450, 8450}, {8455, 8455}, {8458, 8467}, - {8469, 8469}, {8472, 8472}, {8473, 8477}, {8484, 8484}, - {8486, 8486}, {8488, 8488}, {8490, 8493}, {8494, 8494}, - {8495, 8500}, {8501, 8504}, {8505, 8505}, {8508, 8511}, - {8517, 8521}, {8526, 8526}, {8544, 8578}, {8579, 8580}, - {8581, 8584}, {11264, 11387}, {11388, 11389}, {11390, 11492}, - {11499, 11502}, {11503, 11505}, {11506, 11507}, {11520, 11557}, - {11559, 11559}, {11565, 11565}, {11568, 11623}, {11631, 11631}, - {11647, 11647}, {11648, 11670}, {11680, 11686}, {11688, 11694}, - {11696, 11702}, {11704, 11710}, {11712, 11718}, {11720, 11726}, - {11728, 11734}, {11736, 11742}, {11744, 11775}, {12293, 12293}, - {12294, 12294}, {12295, 12295}, {12321, 12329}, {12330, 12333}, - {12334, 12335}, {12337, 12341}, {12344, 12346}, {12347, 12347}, - {12348, 12348}, {12353, 12438}, {12441, 12442}, {12443, 12444}, - {12445, 12446}, {12447, 12447}, {12449, 12538}, {12539, 12539}, - {12540, 12542}, {12543, 12543}, {12549, 12591}, {12593, 12686}, - {12704, 12735}, {12784, 12799}, {13312, 19903}, {19968, 40980}, - {40981, 40981}, {40982, 42124}, {42192, 42231}, {42232, 42237}, - {42240, 42507}, {42508, 42508}, {42512, 42527}, {42528, 42537}, - {42538, 42539}, {42560, 42605}, {42606, 42606}, {42607, 42607}, - {42612, 42621}, {42623, 42623}, {42624, 42651}, {42652, 42653}, - {42654, 42655}, {42656, 42725}, {42726, 42735}, {42736, 42737}, - {42775, 42783}, {42786, 42863}, {42864, 42864}, {42865, 42887}, - {42888, 42888}, {42891, 42894}, {42895, 42895}, {42896, 42972}, - {42993, 42996}, {42997, 42998}, {42999, 42999}, {43000, 43001}, - {43002, 43002}, {43003, 43009}, {43010, 43010}, {43011, 43013}, - {43014, 43014}, {43015, 43018}, {43019, 43019}, {43020, 43042}, - {43043, 43044}, {43045, 43046}, {43047, 43047}, {43052, 43052}, - {43072, 43123}, {43136, 43137}, {43138, 43187}, {43188, 43203}, - {43204, 43205}, {43216, 43225}, {43232, 43249}, {43250, 43255}, - {43259, 43259}, {43261, 43262}, {43263, 43263}, {43264, 43273}, - {43274, 43301}, {43302, 43309}, {43312, 43334}, {43335, 43345}, - {43346, 43347}, {43360, 43388}, {43392, 43394}, {43395, 43395}, - {43396, 43442}, {43443, 43443}, {43444, 43445}, {43446, 43449}, - {43450, 43451}, {43452, 43453}, {43454, 43456}, {43471, 43471}, - {43472, 43481}, {43488, 43492}, {43493, 43493}, {43494, 43494}, - {43495, 43503}, {43504, 43513}, {43514, 43518}, {43520, 43560}, - {43561, 43566}, {43567, 43568}, {43569, 43570}, {43571, 43572}, - {43573, 43574}, {43584, 43586}, {43587, 43587}, {43588, 43595}, - {43596, 43596}, {43597, 43597}, {43600, 43609}, {43616, 43631}, - {43632, 43632}, {43633, 43638}, {43642, 43642}, {43643, 43643}, - {43644, 43644}, {43645, 43645}, {43646, 43695}, {43696, 43696}, - {43697, 43697}, {43698, 43700}, {43701, 43702}, {43703, 43704}, - {43705, 43709}, {43710, 43711}, {43712, 43712}, {43713, 43713}, - {43714, 43714}, {43739, 43740}, {43741, 43741}, {43744, 43754}, - {43755, 43755}, {43756, 43757}, {43758, 43759}, {43762, 43762}, - {43763, 43764}, {43765, 43765}, {43766, 43766}, {43777, 43782}, - {43785, 43790}, {43793, 43798}, {43808, 43814}, {43816, 43822}, - {43824, 43866}, {43868, 43871}, {43872, 43880}, {43881, 43881}, - {43888, 43967}, {43968, 44002}, {44003, 44004}, {44005, 44005}, - {44006, 44007}, {44008, 44008}, {44009, 44010}, {44012, 44012}, - {44013, 44013}, {44016, 44025}, {44032, 55203}, {55216, 55238}, - {55243, 55291}, {63744, 64109}, {64112, 64217}, {64256, 64262}, - {64275, 64279}, {64285, 64285}, {64286, 64286}, {64287, 64296}, - {64298, 64310}, {64312, 64316}, {64318, 64318}, {64320, 64321}, - {64323, 64324}, {64326, 64433}, {64467, 64829}, {64848, 64911}, - {64914, 64967}, {65008, 65019}, {65024, 65039}, {65056, 65071}, - {65075, 65076}, {65101, 65103}, {65136, 65140}, {65142, 65276}, - {65296, 65305}, {65313, 65338}, {65343, 65343}, {65345, 65370}, - {65381, 65381}, {65382, 65391}, {65392, 65392}, {65393, 65437}, - {65438, 65439}, {65440, 65470}, {65474, 65479}, {65482, 65487}, - {65490, 65495}, {65498, 65500}, {65536, 65547}, {65549, 65574}, - {65576, 65594}, {65596, 65597}, {65599, 65613}, {65616, 65629}, - {65664, 65786}, {65856, 65908}, {66045, 66045}, {66176, 66204}, - {66208, 66256}, {66272, 66272}, {66304, 66335}, {66349, 66368}, - {66369, 66369}, {66370, 66377}, {66378, 66378}, {66384, 66421}, - {66422, 66426}, {66432, 66461}, {66464, 66499}, {66504, 66511}, - {66513, 66517}, {66560, 66639}, {66640, 66717}, {66720, 66729}, - {66736, 66771}, {66776, 66811}, {66816, 66855}, {66864, 66915}, - {66928, 66938}, {66940, 66954}, {66956, 66962}, {66964, 66965}, - {66967, 66977}, {66979, 66993}, {66995, 67001}, {67003, 67004}, - {67008, 67059}, {67072, 67382}, {67392, 67413}, {67424, 67431}, - {67456, 67461}, {67463, 67504}, {67506, 67514}, {67584, 67589}, - {67592, 67592}, {67594, 67637}, {67639, 67640}, {67644, 67644}, - {67647, 67669}, {67680, 67702}, {67712, 67742}, {67808, 67826}, - {67828, 67829}, {67840, 67861}, {67872, 67897}, {67904, 67929}, - {67968, 68023}, {68030, 68031}, {68096, 68096}, {68097, 68099}, - {68101, 68102}, {68108, 68111}, {68112, 68115}, {68117, 68119}, - {68121, 68149}, {68152, 68154}, {68159, 68159}, {68192, 68220}, - {68224, 68252}, {68288, 68295}, {68297, 68324}, {68325, 68326}, - {68352, 68405}, {68416, 68437}, {68448, 68466}, {68480, 68497}, - {68608, 68680}, {68736, 68786}, {68800, 68850}, {68864, 68899}, - {68900, 68903}, {68912, 68921}, {68928, 68937}, {68938, 68941}, - {68942, 68942}, {68943, 68943}, {68944, 68965}, {68969, 68973}, - {68975, 68975}, {68976, 68997}, {69248, 69289}, {69291, 69292}, - {69296, 69297}, {69314, 69316}, {69317, 69317}, {69318, 69319}, - {69370, 69375}, {69376, 69404}, {69415, 69415}, {69424, 69445}, - {69446, 69456}, {69488, 69505}, {69506, 69509}, {69552, 69572}, - {69600, 69622}, {69632, 69632}, {69633, 69633}, {69634, 69634}, - {69635, 69687}, {69688, 69702}, {69734, 69743}, {69744, 69744}, - {69745, 69746}, {69747, 69748}, {69749, 69749}, {69759, 69761}, - {69762, 69762}, {69763, 69807}, {69808, 69810}, {69811, 69814}, - {69815, 69816}, {69817, 69818}, {69826, 69826}, {69840, 69864}, - {69872, 69881}, {69888, 69890}, {69891, 69926}, {69927, 69931}, - {69932, 69932}, {69933, 69940}, {69942, 69951}, {69956, 69956}, - {69957, 69958}, {69959, 69959}, {69968, 70002}, {70003, 70003}, - {70006, 70006}, {70016, 70017}, {70018, 70018}, {70019, 70066}, - {70067, 70069}, {70070, 70078}, {70079, 70080}, {70081, 70084}, - {70089, 70092}, {70094, 70094}, {70095, 70095}, {70096, 70105}, - {70106, 70106}, {70108, 70108}, {70144, 70161}, {70163, 70187}, - {70188, 70190}, {70191, 70193}, {70194, 70195}, {70196, 70196}, - {70197, 70197}, {70198, 70199}, {70206, 70206}, {70207, 70208}, - {70209, 70209}, {70272, 70278}, {70280, 70280}, {70282, 70285}, - {70287, 70301}, {70303, 70312}, {70320, 70366}, {70367, 70367}, - {70368, 70370}, {70371, 70378}, {70384, 70393}, {70400, 70401}, - {70402, 70403}, {70405, 70412}, {70415, 70416}, {70419, 70440}, - {70442, 70448}, {70450, 70451}, {70453, 70457}, {70459, 70460}, - {70461, 70461}, {70462, 70463}, {70464, 70464}, {70465, 70468}, - {70471, 70472}, {70475, 70477}, {70480, 70480}, {70487, 70487}, - {70493, 70497}, {70498, 70499}, {70502, 70508}, {70512, 70516}, - {70528, 70537}, {70539, 70539}, {70542, 70542}, {70544, 70581}, - {70583, 70583}, {70584, 70586}, {70587, 70592}, {70594, 70594}, - {70597, 70597}, {70599, 70602}, {70604, 70605}, {70606, 70606}, - {70607, 70607}, {70608, 70608}, {70609, 70609}, {70610, 70610}, - {70611, 70611}, {70625, 70626}, {70656, 70708}, {70709, 70711}, - {70712, 70719}, {70720, 70721}, {70722, 70724}, {70725, 70725}, - {70726, 70726}, {70727, 70730}, {70736, 70745}, {70750, 70750}, - {70751, 70753}, {70784, 70831}, {70832, 70834}, {70835, 70840}, - {70841, 70841}, {70842, 70842}, {70843, 70846}, {70847, 70848}, - {70849, 70849}, {70850, 70851}, {70852, 70853}, {70855, 70855}, - {70864, 70873}, {71040, 71086}, {71087, 71089}, {71090, 71093}, - {71096, 71099}, {71100, 71101}, {71102, 71102}, {71103, 71104}, - {71128, 71131}, {71132, 71133}, {71168, 71215}, {71216, 71218}, - {71219, 71226}, {71227, 71228}, {71229, 71229}, {71230, 71230}, - {71231, 71232}, {71236, 71236}, {71248, 71257}, {71296, 71338}, - {71339, 71339}, {71340, 71340}, {71341, 71341}, {71342, 71343}, - {71344, 71349}, {71350, 71350}, {71351, 71351}, {71352, 71352}, - {71360, 71369}, {71376, 71395}, {71424, 71450}, {71453, 71453}, - {71454, 71454}, {71455, 71455}, {71456, 71457}, {71458, 71461}, - {71462, 71462}, {71463, 71467}, {71472, 71481}, {71488, 71494}, - {71680, 71723}, {71724, 71726}, {71727, 71735}, {71736, 71736}, - {71737, 71738}, {71840, 71903}, {71904, 71913}, {71935, 71942}, - {71945, 71945}, {71948, 71955}, {71957, 71958}, {71960, 71983}, - {71984, 71989}, {71991, 71992}, {71995, 71996}, {71997, 71997}, - {71998, 71998}, {71999, 71999}, {72000, 72000}, {72001, 72001}, - {72002, 72002}, {72003, 72003}, {72016, 72025}, {72096, 72103}, - {72106, 72144}, {72145, 72147}, {72148, 72151}, {72154, 72155}, - {72156, 72159}, {72160, 72160}, {72161, 72161}, {72163, 72163}, - {72164, 72164}, {72192, 72192}, {72193, 72202}, {72203, 72242}, - {72243, 72248}, {72249, 72249}, {72250, 72250}, {72251, 72254}, - {72263, 72263}, {72272, 72272}, {72273, 72278}, {72279, 72280}, - {72281, 72283}, {72284, 72329}, {72330, 72342}, {72343, 72343}, - {72344, 72345}, {72349, 72349}, {72368, 72440}, {72544, 72544}, - {72545, 72545}, {72546, 72548}, {72549, 72549}, {72550, 72550}, - {72551, 72551}, {72640, 72672}, {72688, 72697}, {72704, 72712}, - {72714, 72750}, {72751, 72751}, {72752, 72758}, {72760, 72765}, - {72766, 72766}, {72767, 72767}, {72768, 72768}, {72784, 72793}, - {72818, 72847}, {72850, 72871}, {72873, 72873}, {72874, 72880}, - {72881, 72881}, {72882, 72883}, {72884, 72884}, {72885, 72886}, - {72960, 72966}, {72968, 72969}, {72971, 73008}, {73009, 73014}, - {73018, 73018}, {73020, 73021}, {73023, 73029}, {73030, 73030}, - {73031, 73031}, {73040, 73049}, {73056, 73061}, {73063, 73064}, - {73066, 73097}, {73098, 73102}, {73104, 73105}, {73107, 73108}, - {73109, 73109}, {73110, 73110}, {73111, 73111}, {73112, 73112}, - {73120, 73129}, {73136, 73176}, {73177, 73177}, {73178, 73179}, - {73184, 73193}, {73440, 73458}, {73459, 73460}, {73461, 73462}, - {73472, 73473}, {73474, 73474}, {73475, 73475}, {73476, 73488}, - {73490, 73523}, {73524, 73525}, {73526, 73530}, {73534, 73535}, - {73536, 73536}, {73537, 73537}, {73538, 73538}, {73552, 73561}, - {73562, 73562}, {73648, 73648}, {73728, 74649}, {74752, 74862}, - {74880, 75075}, {77712, 77808}, {77824, 78895}, {78912, 78912}, - {78913, 78918}, {78919, 78933}, {78944, 82938}, {82944, 83526}, - {90368, 90397}, {90398, 90409}, {90410, 90412}, {90413, 90415}, - {90416, 90425}, {92160, 92728}, {92736, 92766}, {92768, 92777}, - {92784, 92862}, {92864, 92873}, {92880, 92909}, {92912, 92916}, - {92928, 92975}, {92976, 92982}, {92992, 92995}, {93008, 93017}, - {93027, 93047}, {93053, 93071}, {93504, 93506}, {93507, 93546}, - {93547, 93548}, {93552, 93561}, {93760, 93823}, {93856, 93880}, - {93883, 93907}, {93952, 94026}, {94031, 94031}, {94032, 94032}, - {94033, 94087}, {94095, 94098}, {94099, 94111}, {94176, 94177}, - {94179, 94179}, {94180, 94180}, {94192, 94193}, {94194, 94195}, - {94196, 94198}, {94208, 101589}, {101631, 101662}, {101760, 101874}, - {110576, 110579}, {110581, 110587}, {110589, 110590}, {110592, 110882}, - {110898, 110898}, {110928, 110930}, {110933, 110933}, {110948, 110951}, - {110960, 111355}, {113664, 113770}, {113776, 113788}, {113792, 113800}, - {113808, 113817}, {113821, 113822}, {118000, 118009}, {118528, 118573}, - {118576, 118598}, {119141, 119142}, {119143, 119145}, {119149, 119154}, - {119163, 119170}, {119173, 119179}, {119210, 119213}, {119362, 119364}, - {119808, 119892}, {119894, 119964}, {119966, 119967}, {119970, 119970}, - {119973, 119974}, {119977, 119980}, {119982, 119993}, {119995, 119995}, - {119997, 120003}, {120005, 120069}, {120071, 120074}, {120077, 120084}, - {120086, 120092}, {120094, 120121}, {120123, 120126}, {120128, 120132}, - {120134, 120134}, {120138, 120144}, {120146, 120485}, {120488, 120512}, - {120514, 120538}, {120540, 120570}, {120572, 120596}, {120598, 120628}, - {120630, 120654}, {120656, 120686}, {120688, 120712}, {120714, 120744}, - {120746, 120770}, {120772, 120779}, {120782, 120831}, {121344, 121398}, - {121403, 121452}, {121461, 121461}, {121476, 121476}, {121499, 121503}, - {121505, 121519}, {122624, 122633}, {122634, 122634}, {122635, 122654}, - {122661, 122666}, {122880, 122886}, {122888, 122904}, {122907, 122913}, - {122915, 122916}, {122918, 122922}, {122928, 122989}, {123023, 123023}, - {123136, 123180}, {123184, 123190}, {123191, 123197}, {123200, 123209}, - {123214, 123214}, {123536, 123565}, {123566, 123566}, {123584, 123627}, - {123628, 123631}, {123632, 123641}, {124112, 124138}, {124139, 124139}, - {124140, 124143}, {124144, 124153}, {124368, 124397}, {124398, 124399}, - {124400, 124400}, {124401, 124410}, {124608, 124638}, {124640, 124642}, - {124643, 124643}, {124644, 124645}, {124646, 124646}, {124647, 124653}, - {124654, 124655}, {124656, 124660}, {124661, 124661}, {124670, 124670}, - {124671, 124671}, {124896, 124902}, {124904, 124907}, {124909, 124910}, - {124912, 124926}, {124928, 125124}, {125136, 125142}, {125184, 125251}, - {125252, 125258}, {125259, 125259}, {125264, 125273}, {126464, 126467}, - {126469, 126495}, {126497, 126498}, {126500, 126500}, {126503, 126503}, - {126505, 126514}, {126516, 126519}, {126521, 126521}, {126523, 126523}, - {126530, 126530}, {126535, 126535}, {126537, 126537}, {126539, 126539}, - {126541, 126543}, {126545, 126546}, {126548, 126548}, {126551, 126551}, - {126553, 126553}, {126555, 126555}, {126557, 126557}, {126559, 126559}, - {126561, 126562}, {126564, 126564}, {126567, 126570}, {126572, 126578}, - {126580, 126583}, {126585, 126588}, {126590, 126590}, {126592, 126601}, - {126603, 126619}, {126625, 126627}, {126629, 126633}, {126635, 126651}, - {130032, 130041}, {131072, 173791}, {173824, 178205}, {178208, 183981}, - {183984, 191456}, {191472, 192093}, {194560, 195101}, {196608, 201546}, - {201552, 210041}, {917760, 917999} -}; -const uint32_t id_start[776][2] = -{ - {65, 90}, {97, 122}, {170, 170}, {181, 181}, - {186, 186}, {192, 214}, {216, 246}, {248, 442}, - {443, 443}, {444, 447}, {448, 451}, {452, 659}, - {660, 661}, {662, 687}, {688, 705}, {710, 721}, - {736, 740}, {748, 748}, {750, 750}, {880, 883}, - {884, 884}, {886, 887}, {890, 890}, {891, 893}, - {895, 895}, {902, 902}, {904, 906}, {908, 908}, - {910, 929}, {931, 1013}, {1015, 1153}, {1162, 1327}, - {1329, 1366}, {1369, 1369}, {1376, 1416}, {1488, 1514}, - {1519, 1522}, {1568, 1599}, {1600, 1600}, {1601, 1610}, - {1646, 1647}, {1649, 1747}, {1749, 1749}, {1765, 1766}, - {1774, 1775}, {1786, 1788}, {1791, 1791}, {1808, 1808}, - {1810, 1839}, {1869, 1957}, {1969, 1969}, {1994, 2026}, - {2036, 2037}, {2042, 2042}, {2048, 2069}, {2074, 2074}, - {2084, 2084}, {2088, 2088}, {2112, 2136}, {2144, 2154}, - {2160, 2183}, {2185, 2191}, {2208, 2248}, {2249, 2249}, - {2308, 2361}, {2365, 2365}, {2384, 2384}, {2392, 2401}, - {2417, 2417}, {2418, 2432}, {2437, 2444}, {2447, 2448}, - {2451, 2472}, {2474, 2480}, {2482, 2482}, {2486, 2489}, - {2493, 2493}, {2510, 2510}, {2524, 2525}, {2527, 2529}, - {2544, 2545}, {2556, 2556}, {2565, 2570}, {2575, 2576}, - {2579, 2600}, {2602, 2608}, {2610, 2611}, {2613, 2614}, - {2616, 2617}, {2649, 2652}, {2654, 2654}, {2674, 2676}, - {2693, 2701}, {2703, 2705}, {2707, 2728}, {2730, 2736}, - {2738, 2739}, {2741, 2745}, {2749, 2749}, {2768, 2768}, - {2784, 2785}, {2809, 2809}, {2821, 2828}, {2831, 2832}, - {2835, 2856}, {2858, 2864}, {2866, 2867}, {2869, 2873}, - {2877, 2877}, {2908, 2909}, {2911, 2913}, {2929, 2929}, - {2947, 2947}, {2949, 2954}, {2958, 2960}, {2962, 2965}, - {2969, 2970}, {2972, 2972}, {2974, 2975}, {2979, 2980}, - {2984, 2986}, {2990, 3001}, {3024, 3024}, {3077, 3084}, - {3086, 3088}, {3090, 3112}, {3114, 3129}, {3133, 3133}, - {3160, 3162}, {3164, 3165}, {3168, 3169}, {3200, 3200}, - {3205, 3212}, {3214, 3216}, {3218, 3240}, {3242, 3251}, - {3253, 3257}, {3261, 3261}, {3292, 3294}, {3296, 3297}, - {3313, 3314}, {3332, 3340}, {3342, 3344}, {3346, 3386}, - {3389, 3389}, {3406, 3406}, {3412, 3414}, {3423, 3425}, - {3450, 3455}, {3461, 3478}, {3482, 3505}, {3507, 3515}, - {3517, 3517}, {3520, 3526}, {3585, 3632}, {3634, 3635}, - {3648, 3653}, {3654, 3654}, {3713, 3714}, {3716, 3716}, - {3718, 3722}, {3724, 3747}, {3749, 3749}, {3751, 3760}, - {3762, 3763}, {3773, 3773}, {3776, 3780}, {3782, 3782}, - {3804, 3807}, {3840, 3840}, {3904, 3911}, {3913, 3948}, - {3976, 3980}, {4096, 4138}, {4159, 4159}, {4176, 4181}, - {4186, 4189}, {4193, 4193}, {4197, 4198}, {4206, 4208}, - {4213, 4225}, {4238, 4238}, {4256, 4293}, {4295, 4295}, - {4301, 4301}, {4304, 4346}, {4348, 4348}, {4349, 4351}, - {4352, 4680}, {4682, 4685}, {4688, 4694}, {4696, 4696}, - {4698, 4701}, {4704, 4744}, {4746, 4749}, {4752, 4784}, - {4786, 4789}, {4792, 4798}, {4800, 4800}, {4802, 4805}, - {4808, 4822}, {4824, 4880}, {4882, 4885}, {4888, 4954}, - {4992, 5007}, {5024, 5109}, {5112, 5117}, {5121, 5740}, - {5743, 5759}, {5761, 5786}, {5792, 5866}, {5870, 5872}, - {5873, 5880}, {5888, 5905}, {5919, 5937}, {5952, 5969}, - {5984, 5996}, {5998, 6000}, {6016, 6067}, {6103, 6103}, - {6108, 6108}, {6176, 6210}, {6211, 6211}, {6212, 6264}, - {6272, 6276}, {6277, 6278}, {6279, 6312}, {6314, 6314}, - {6320, 6389}, {6400, 6430}, {6480, 6509}, {6512, 6516}, - {6528, 6571}, {6576, 6601}, {6656, 6678}, {6688, 6740}, - {6823, 6823}, {6917, 6963}, {6981, 6988}, {7043, 7072}, - {7086, 7087}, {7098, 7141}, {7168, 7203}, {7245, 7247}, - {7258, 7287}, {7288, 7293}, {7296, 7306}, {7312, 7354}, - {7357, 7359}, {7401, 7404}, {7406, 7411}, {7413, 7414}, - {7418, 7418}, {7424, 7467}, {7468, 7530}, {7531, 7543}, - {7544, 7544}, {7545, 7578}, {7579, 7615}, {7680, 7957}, - {7960, 7965}, {7968, 8005}, {8008, 8013}, {8016, 8023}, - {8025, 8025}, {8027, 8027}, {8029, 8029}, {8031, 8061}, - {8064, 8116}, {8118, 8124}, {8126, 8126}, {8130, 8132}, - {8134, 8140}, {8144, 8147}, {8150, 8155}, {8160, 8172}, - {8178, 8180}, {8182, 8188}, {8305, 8305}, {8319, 8319}, - {8336, 8348}, {8450, 8450}, {8455, 8455}, {8458, 8467}, - {8469, 8469}, {8472, 8472}, {8473, 8477}, {8484, 8484}, - {8486, 8486}, {8488, 8488}, {8490, 8493}, {8494, 8494}, - {8495, 8500}, {8501, 8504}, {8505, 8505}, {8508, 8511}, - {8517, 8521}, {8526, 8526}, {8544, 8578}, {8579, 8580}, - {8581, 8584}, {11264, 11387}, {11388, 11389}, {11390, 11492}, - {11499, 11502}, {11506, 11507}, {11520, 11557}, {11559, 11559}, - {11565, 11565}, {11568, 11623}, {11631, 11631}, {11648, 11670}, - {11680, 11686}, {11688, 11694}, {11696, 11702}, {11704, 11710}, - {11712, 11718}, {11720, 11726}, {11728, 11734}, {11736, 11742}, - {12293, 12293}, {12294, 12294}, {12295, 12295}, {12321, 12329}, - {12337, 12341}, {12344, 12346}, {12347, 12347}, {12348, 12348}, - {12353, 12438}, {12443, 12444}, {12445, 12446}, {12447, 12447}, - {12449, 12538}, {12540, 12542}, {12543, 12543}, {12549, 12591}, - {12593, 12686}, {12704, 12735}, {12784, 12799}, {13312, 19903}, - {19968, 40980}, {40981, 40981}, {40982, 42124}, {42192, 42231}, - {42232, 42237}, {42240, 42507}, {42508, 42508}, {42512, 42527}, - {42538, 42539}, {42560, 42605}, {42606, 42606}, {42623, 42623}, - {42624, 42651}, {42652, 42653}, {42656, 42725}, {42726, 42735}, - {42775, 42783}, {42786, 42863}, {42864, 42864}, {42865, 42887}, - {42888, 42888}, {42891, 42894}, {42895, 42895}, {42896, 42972}, - {42993, 42996}, {42997, 42998}, {42999, 42999}, {43000, 43001}, - {43002, 43002}, {43003, 43009}, {43011, 43013}, {43015, 43018}, - {43020, 43042}, {43072, 43123}, {43138, 43187}, {43250, 43255}, - {43259, 43259}, {43261, 43262}, {43274, 43301}, {43312, 43334}, - {43360, 43388}, {43396, 43442}, {43471, 43471}, {43488, 43492}, - {43494, 43494}, {43495, 43503}, {43514, 43518}, {43520, 43560}, - {43584, 43586}, {43588, 43595}, {43616, 43631}, {43632, 43632}, - {43633, 43638}, {43642, 43642}, {43646, 43695}, {43697, 43697}, - {43701, 43702}, {43705, 43709}, {43712, 43712}, {43714, 43714}, - {43739, 43740}, {43741, 43741}, {43744, 43754}, {43762, 43762}, - {43763, 43764}, {43777, 43782}, {43785, 43790}, {43793, 43798}, - {43808, 43814}, {43816, 43822}, {43824, 43866}, {43868, 43871}, - {43872, 43880}, {43881, 43881}, {43888, 43967}, {43968, 44002}, - {44032, 55203}, {55216, 55238}, {55243, 55291}, {63744, 64109}, - {64112, 64217}, {64256, 64262}, {64275, 64279}, {64285, 64285}, - {64287, 64296}, {64298, 64310}, {64312, 64316}, {64318, 64318}, - {64320, 64321}, {64323, 64324}, {64326, 64433}, {64467, 64829}, - {64848, 64911}, {64914, 64967}, {65008, 65019}, {65136, 65140}, - {65142, 65276}, {65313, 65338}, {65345, 65370}, {65382, 65391}, - {65392, 65392}, {65393, 65437}, {65438, 65439}, {65440, 65470}, - {65474, 65479}, {65482, 65487}, {65490, 65495}, {65498, 65500}, - {65536, 65547}, {65549, 65574}, {65576, 65594}, {65596, 65597}, - {65599, 65613}, {65616, 65629}, {65664, 65786}, {65856, 65908}, - {66176, 66204}, {66208, 66256}, {66304, 66335}, {66349, 66368}, - {66369, 66369}, {66370, 66377}, {66378, 66378}, {66384, 66421}, - {66432, 66461}, {66464, 66499}, {66504, 66511}, {66513, 66517}, - {66560, 66639}, {66640, 66717}, {66736, 66771}, {66776, 66811}, - {66816, 66855}, {66864, 66915}, {66928, 66938}, {66940, 66954}, - {66956, 66962}, {66964, 66965}, {66967, 66977}, {66979, 66993}, - {66995, 67001}, {67003, 67004}, {67008, 67059}, {67072, 67382}, - {67392, 67413}, {67424, 67431}, {67456, 67461}, {67463, 67504}, - {67506, 67514}, {67584, 67589}, {67592, 67592}, {67594, 67637}, - {67639, 67640}, {67644, 67644}, {67647, 67669}, {67680, 67702}, - {67712, 67742}, {67808, 67826}, {67828, 67829}, {67840, 67861}, - {67872, 67897}, {67904, 67929}, {67968, 68023}, {68030, 68031}, - {68096, 68096}, {68112, 68115}, {68117, 68119}, {68121, 68149}, - {68192, 68220}, {68224, 68252}, {68288, 68295}, {68297, 68324}, - {68352, 68405}, {68416, 68437}, {68448, 68466}, {68480, 68497}, - {68608, 68680}, {68736, 68786}, {68800, 68850}, {68864, 68899}, - {68938, 68941}, {68942, 68942}, {68943, 68943}, {68944, 68965}, - {68975, 68975}, {68976, 68997}, {69248, 69289}, {69296, 69297}, - {69314, 69316}, {69317, 69317}, {69318, 69319}, {69376, 69404}, - {69415, 69415}, {69424, 69445}, {69488, 69505}, {69552, 69572}, - {69600, 69622}, {69635, 69687}, {69745, 69746}, {69749, 69749}, - {69763, 69807}, {69840, 69864}, {69891, 69926}, {69956, 69956}, - {69959, 69959}, {69968, 70002}, {70006, 70006}, {70019, 70066}, - {70081, 70084}, {70106, 70106}, {70108, 70108}, {70144, 70161}, - {70163, 70187}, {70207, 70208}, {70272, 70278}, {70280, 70280}, - {70282, 70285}, {70287, 70301}, {70303, 70312}, {70320, 70366}, - {70405, 70412}, {70415, 70416}, {70419, 70440}, {70442, 70448}, - {70450, 70451}, {70453, 70457}, {70461, 70461}, {70480, 70480}, - {70493, 70497}, {70528, 70537}, {70539, 70539}, {70542, 70542}, - {70544, 70581}, {70583, 70583}, {70609, 70609}, {70611, 70611}, - {70656, 70708}, {70727, 70730}, {70751, 70753}, {70784, 70831}, - {70852, 70853}, {70855, 70855}, {71040, 71086}, {71128, 71131}, - {71168, 71215}, {71236, 71236}, {71296, 71338}, {71352, 71352}, - {71424, 71450}, {71488, 71494}, {71680, 71723}, {71840, 71903}, - {71935, 71942}, {71945, 71945}, {71948, 71955}, {71957, 71958}, - {71960, 71983}, {71999, 71999}, {72001, 72001}, {72096, 72103}, - {72106, 72144}, {72161, 72161}, {72163, 72163}, {72192, 72192}, - {72203, 72242}, {72250, 72250}, {72272, 72272}, {72284, 72329}, - {72349, 72349}, {72368, 72440}, {72640, 72672}, {72704, 72712}, - {72714, 72750}, {72768, 72768}, {72818, 72847}, {72960, 72966}, - {72968, 72969}, {72971, 73008}, {73030, 73030}, {73056, 73061}, - {73063, 73064}, {73066, 73097}, {73112, 73112}, {73136, 73176}, - {73177, 73177}, {73178, 73179}, {73440, 73458}, {73474, 73474}, - {73476, 73488}, {73490, 73523}, {73648, 73648}, {73728, 74649}, - {74752, 74862}, {74880, 75075}, {77712, 77808}, {77824, 78895}, - {78913, 78918}, {78944, 82938}, {82944, 83526}, {90368, 90397}, - {92160, 92728}, {92736, 92766}, {92784, 92862}, {92880, 92909}, - {92928, 92975}, {92992, 92995}, {93027, 93047}, {93053, 93071}, - {93504, 93506}, {93507, 93546}, {93547, 93548}, {93760, 93823}, - {93856, 93880}, {93883, 93907}, {93952, 94026}, {94032, 94032}, - {94099, 94111}, {94176, 94177}, {94179, 94179}, {94194, 94195}, - {94196, 94198}, {94208, 101589}, {101631, 101662}, {101760, 101874}, - {110576, 110579}, {110581, 110587}, {110589, 110590}, {110592, 110882}, - {110898, 110898}, {110928, 110930}, {110933, 110933}, {110948, 110951}, - {110960, 111355}, {113664, 113770}, {113776, 113788}, {113792, 113800}, - {113808, 113817}, {119808, 119892}, {119894, 119964}, {119966, 119967}, - {119970, 119970}, {119973, 119974}, {119977, 119980}, {119982, 119993}, - {119995, 119995}, {119997, 120003}, {120005, 120069}, {120071, 120074}, - {120077, 120084}, {120086, 120092}, {120094, 120121}, {120123, 120126}, - {120128, 120132}, {120134, 120134}, {120138, 120144}, {120146, 120485}, - {120488, 120512}, {120514, 120538}, {120540, 120570}, {120572, 120596}, - {120598, 120628}, {120630, 120654}, {120656, 120686}, {120688, 120712}, - {120714, 120744}, {120746, 120770}, {120772, 120779}, {122624, 122633}, - {122634, 122634}, {122635, 122654}, {122661, 122666}, {122928, 122989}, - {123136, 123180}, {123191, 123197}, {123214, 123214}, {123536, 123565}, - {123584, 123627}, {124112, 124138}, {124139, 124139}, {124368, 124397}, - {124400, 124400}, {124608, 124638}, {124640, 124642}, {124644, 124645}, - {124647, 124653}, {124656, 124660}, {124670, 124670}, {124671, 124671}, - {124896, 124902}, {124904, 124907}, {124909, 124910}, {124912, 124926}, - {124928, 125124}, {125184, 125251}, {125259, 125259}, {126464, 126467}, - {126469, 126495}, {126497, 126498}, {126500, 126500}, {126503, 126503}, - {126505, 126514}, {126516, 126519}, {126521, 126521}, {126523, 126523}, - {126530, 126530}, {126535, 126535}, {126537, 126537}, {126539, 126539}, - {126541, 126543}, {126545, 126546}, {126548, 126548}, {126551, 126551}, - {126553, 126553}, {126555, 126555}, {126557, 126557}, {126559, 126559}, - {126561, 126562}, {126564, 126564}, {126567, 126570}, {126572, 126578}, - {126580, 126583}, {126585, 126588}, {126590, 126590}, {126592, 126601}, - {126603, 126619}, {126625, 126627}, {126629, 126633}, {126635, 126651}, - {131072, 173791}, {173824, 178205}, {178208, 183981}, {183984, 191456}, - {191472, 192093}, {194560, 195101}, {196608, 201546}, {201552, 210041} -}; - +// id_continue / id_start pointers and counts are provided by table_store.hpp. -} // namespace ada::idna -#endif // ADA_IDNA_IDENTIFIER_TABLES_H +} // namespace ada::idna +#endif // ADA_IDNA_IDENTIFIER_TABLES_H /* end file src/id_tables.cpp */ namespace ada::idna { @@ -10434,39 +6678,51 @@ constexpr bool is_ascii_letter_or_digit(char32_t c) noexcept { bool valid_name_code_point(char32_t code_point, bool first) { // https://tc39.es/ecma262/#prod-IdentifierStart - // Fast paths: - if (first && - (code_point == '$' || code_point == '_' || is_ascii_letter(code_point))) { + + // Fast paths (no table needed) + if (first && (code_point == U'$' || code_point == U'_' || + is_ascii_letter(code_point))) { return true; } - if (!first && (code_point == '$' || is_ascii_letter_or_digit(code_point))) { + if (!first && (code_point == U'$' || is_ascii_letter_or_digit(code_point))) { return true; } - // Slow path... - if (code_point == 0xffffffff) { - return false; // minimal error handling + + // Minimal error handling for invalid code point + if (code_point > 0x10FFFF) { + return false; } - if (first) { - auto iter = std::lower_bound( - std::begin(ada::idna::id_start), std::end(ada::idna::id_start), - code_point, - [](const uint32_t* range, uint32_t cp) { return range[1] < cp; }); - return iter != std::end(id_start) && code_point >= (*iter)[0]; - } else { - auto iter = std::lower_bound( - std::begin(id_continue), std::end(id_continue), code_point, - [](const uint32_t* range, uint32_t cp) { return range[1] < cp; }); - return iter != std::end(id_start) && code_point >= (*iter)[0]; + if (code_point >= 0xD800 && code_point <= 0xDFFF) { + return false; } + + if (!ensure_tables() || id_start == nullptr || id_continue == nullptr) { + return false; + } + + // Slow path: binary search through the appropriate Unicode range table. + // Each entry is a [low, high] inclusive range. + const std::span ranges = + first ? std::span{ada::idna::id_start, + ada::idna::id_start_count} + : std::span{ada::idna::id_continue, + ada::idna::id_continue_count}; + + const auto iter = std::ranges::lower_bound( + ranges, code_point, {}, + [](const auto& range) { return range[1]; }); // project to range-high + + return iter != ranges.end() && code_point >= (*iter)[0]; } } // namespace ada::idna /* end file src/identifier.cpp */ /* end file src/idna.cpp */ -// NOLINTEND /* end file src/ada_idna.cpp */ ADA_POP_DISABLE_WARNINGS #include +#include +#include #if ADA_SSSE3 #include #elif ADA_NEON @@ -10939,6 +7195,88 @@ std::string percent_decode(const std::string_view input, size_t first_percent) { return dest; } +// 0..15 for hex digits, 0xFF otherwise - validate and decode with two loads. +constexpr static std::array unhex_table = []() consteval { + std::array t{}; + for (size_t i = 0; i < 256; ++i) { + t[i] = 0xFF; + } + for (uint8_t i = 0; i < 10; ++i) { + t[static_cast('0') + i] = i; + } + for (uint8_t i = 0; i < 6; ++i) { + t[static_cast('A') + i] = static_cast(10 + i); + t[static_cast('a') + i] = static_cast(10 + i); + } + return t; +}(); + +std::string form_urlencoded_decode(const std::string_view input) { + const size_t len = input.size(); + if (len == 0) [[unlikely]] { + return {}; + } + + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) + const char* const src = input.data(); + const char* const end = src + len; + const char* p = src; + + // Advance over the untransformed prefix. + while (p < end && *p != '+' && *p != '%') { + ++p; + } + if (p == end) { + return std::string(input); + } + + // Output is always at most as long as the input: write into a single + // pre-sized buffer, then shrink to the final length. + std::string out(len, '\0'); + char* d = out.data(); + char* const d0 = d; + + const size_t prefix = static_cast(p - src); + std::memcpy(d, src, prefix); + d += prefix; + + while (p < end) { + const char c = *p; + if (c == '+') { + *d++ = ' '; + ++p; + } else if (c == '%') { + // Decode runs of valid %XX tightly (common for nested URL query values). + while (p + 2 < end && *p == '%') { + const uint8_t hi = unhex_table[static_cast(p[1])]; + const uint8_t lo = unhex_table[static_cast(p[2])]; + if ((hi | lo) >= 16) { + break; + } + *d++ = static_cast((hi << 4) | lo); + p += 3; + } + if (p < end && *p == '%') { + // Invalid escape: copy '%' literally and continue. + *d++ = *p++; + } + } else { + // Copy a plain run until the next '+' or '%'. + const char* start = p; + ++p; + while (p < end && *p != '+' && *p != '%') { + ++p; + } + const size_t n = static_cast(p - start); + std::memcpy(d, start, n); + d += n; + } + } + + out.resize(static_cast(d - d0)); + return out; +} + std::string percent_encode(const std::string_view input, const uint8_t character_set[]) { auto pointer = std::ranges::find_if(input, [character_set](const char c) { @@ -11037,51 +7375,106 @@ std::string percent_encode(const std::string_view input, } // namespace ada::unicode /* end file src/unicode.cpp */ /* begin file src/serializers.cpp */ + #include -#include +#include +#include #include namespace ada::serializers { +namespace { + +// Digit pair LUT for fast decimal write: index 0..99 -> two chars. +constexpr std::array make_digit_pairs() noexcept { + std::array t{}; + for (size_t i = 0; i < 100; ++i) { + t[i * 2] = static_cast('0' + i / 10); + t[i * 2 + 1] = static_cast('0' + i % 10); + } + return t; +} + +constexpr auto digit_pairs = make_digit_pairs(); + +ada_really_inline char* write_u8(char* p, uint8_t v) noexcept { + if (v < 10) { + *p++ = static_cast('0' + v); + } else if (v < 100) { + std::memcpy(p, &digit_pairs[static_cast(v) * 2], 2); + p += 2; + } else { + *p++ = static_cast('0' + v / 100); + std::memcpy(p, &digit_pairs[static_cast(v % 100) * 2], 2); + p += 2; + } + return p; +} + +ada_really_inline char* write_hex_u16(char* p, uint16_t v) noexcept { + static constexpr char kHex[] = "0123456789abcdef"; + if (v >= 0x1000) { + *p++ = kHex[(v >> 12) & 0xf]; + *p++ = kHex[(v >> 8) & 0xf]; + *p++ = kHex[(v >> 4) & 0xf]; + *p++ = kHex[v & 0xf]; + } else if (v >= 0x100) { + *p++ = kHex[(v >> 8) & 0xf]; + *p++ = kHex[(v >> 4) & 0xf]; + *p++ = kHex[v & 0xf]; + } else if (v >= 0x10) { + *p++ = kHex[(v >> 4) & 0xf]; + *p++ = kHex[v & 0xf]; + } else { + *p++ = kHex[v & 0xf]; + } + return p; +} + +} // namespace void find_longest_sequence_of_ipv6_pieces( const std::array& address, size_t& compress, size_t& compress_length) noexcept { - for (size_t i = 0; i < 8; i++) { - if (address[i] == 0) { - size_t next = i + 1; - while (next != 8 && address[next] == 0) ++next; - const size_t count = next - i; - if (compress_length < count) { - compress_length = count; - compress = i; - if (next == 8) break; - i = next; - } + compress = 0; + compress_length = 0; + size_t i = 0; + while (i < 8) { + if (address[i] != 0) { + ++i; + continue; + } + size_t next = i + 1; + while (next < 8 && address[next] == 0) { + ++next; } + const size_t count = next - i; + if (count > compress_length) { + compress_length = count; + compress = i; + } + i = next; } } std::string ipv6(const std::array& address) { - size_t compress_length = 0; // The length of a long sequence of zeros. - size_t compress = 0; // The start of a long sequence of zeros. + size_t compress = 0; + size_t compress_length = 0; find_longest_sequence_of_ipv6_pieces(address, compress, compress_length); + // Skip compression when the longest zero run is a single piece. if (compress_length <= 1) { - // Optimization opportunity: Find a faster way then snprintf for imploding - // and return here. compress = compress_length = 8; } + // Max: '[' + 8*4 hex + 7 ':' + ']' = 41 std::string output(4 * 8 + 7 + 2, '\0'); - size_t piece_index = 0; char* point = output.data(); - char* point_end = output.data() + output.size(); *point++ = '['; + size_t piece_index = 0; while (true) { if (piece_index == compress) { *point++ = ':'; - // If we skip a value initially, we need to write '::', otherwise - // a single ':' will do since it follows a previous ':'. + // If we skip a value initially, we need to write '::'. if (piece_index == 0) { *point++ = ':'; } @@ -11090,28 +7483,29 @@ std::string ipv6(const std::array& address) { break; } } - point = std::to_chars(point, point_end, address[piece_index], 16).ptr; - piece_index++; + point = write_hex_u16(point, address[piece_index]); + ++piece_index; if (piece_index == 8) { break; } *point++ = ':'; } *point++ = ']'; - output.resize(point - output.data()); + output.resize(static_cast(point - output.data())); return output; } std::string ipv4(const uint64_t address) { std::string output(15, '\0'); char* point = output.data(); - char* point_end = output.data() + output.size(); - point = std::to_chars(point, point_end, uint8_t(address >> 24)).ptr; - for (int i = 2; i >= 0; i--) { - *point++ = '.'; - point = std::to_chars(point, point_end, uint8_t(address >> (i * 8))).ptr; - } - output.resize(point - output.data()); + point = write_u8(point, static_cast(address >> 24)); + *point++ = '.'; + point = write_u8(point, static_cast(address >> 16)); + *point++ = '.'; + point = write_u8(point, static_cast(address >> 8)); + *point++ = '.'; + point = write_u8(point, static_cast(address)); + output.resize(static_cast(point - output.data())); return output; } @@ -11119,16 +7513,274 @@ std::string ipv4(const uint64_t address) { /* end file src/serializers.cpp */ /* begin file src/implementation.cpp */ +#include +#include +#include #include namespace ada { +static std::atomic max_input_length_{ + std::numeric_limits::max()}; + +void set_max_input_length(uint32_t length) { + max_input_length_.store(length, std::memory_order_relaxed); +} + +uint32_t get_max_input_length() { + return max_input_length_.load(std::memory_order_relaxed); +} + +namespace { + +// @private +// Fast-path validator for can_parse. +// +// Validates absolute special (non-file) URLs without constructing any +// url_aggregator object and without running the state machine. +// Performs a single forward scan over the input bytes. +// +// Returns: +// true -- URL is structurally valid +// false -- URL is definitely invalid +// nullopt -- edge case; fall through to the full parser +// (credentials, IDNA, IPv4/6, tabs/newlines, relative URLs, ...) +std::optional try_can_parse_absolute_fast( + std::string_view input) noexcept { + const uint8_t* b = reinterpret_cast(input.data()); + size_t len = input.size(); + + // -- Inline C0 whitespace trim (no allocation) -------------------------- + // Note: \t (0x09), \n (0x0a), \r (0x0d) are all <= 0x20, so any + // leading/trailing tabs or newlines are correctly stripped here, matching + // the WHATWG spec's "remove leading/trailing C0 control and space" step. + while (len > 0 && b[0] <= 0x20) { + b++; + len--; + } + while (len > 0 && b[len - 1] <= 0x20) { + len--; + } + if (len == 0) return false; + + // -- Scheme detection ----------------------------------------------------- + // Fast path for HTTP and HTTPS (covers ~90%+ of real-world URLs). + // Avoids the general scheme loop, buffer copy, and perfect hash lookup. + // We know HTTP and HTTPS are special non-file schemes, so no further + // scheme_type checks are needed on the fast path -- only `pos` matters. + size_t pos; + + if (len >= 7 && (b[0] | 0x20) == 'h' && (b[1] | 0x20) == 't' && + (b[2] | 0x20) == 't' && (b[3] | 0x20) == 'p') { + if (b[4] == ':' && b[5] == '/' && b[6] == '/') { + pos = 7; + goto skip_extra_slashes; + } + if (len >= 8 && (b[4] | 0x20) == 's' && b[5] == ':' && b[6] == '/' && + b[7] == '/') { + pos = 8; + goto skip_extra_slashes; + } + // Fall through: could be "httpe://", tabs in scheme, etc. + } + + { + // General scheme detection for ws, wss, ftp, and edge cases. + if (!checkers::is_alpha(static_cast(b[0]))) return false; + + // Scan for ':' within the first 7 bytes. All special schemes are <= 5 + // chars ("https"), so any URL whose first ':' is beyond byte 6 is either + // non-special or relative -- both require the full parser. + size_t colon_pos = 0; + for (size_t i = 1;; ++i) { + if (i >= 7 || i >= len) return std::nullopt; + const char c = static_cast(b[i]); + if (c == ':') { + colon_pos = i; + break; + } + // Tabs/newlines in the scheme require the full parser to strip them. + if (c == '\t' || c == '\n' || c == '\r') return std::nullopt; + if (!unicode::is_alnum_plus(c)) return false; + } + + // Lowercase scheme bytes inline and classify via the existing perfect + // hash. + char scheme_buf[6]; + scheme_buf[0] = static_cast(b[0] | 0x20); + for (size_t i = 1; i < colon_pos; ++i) + scheme_buf[i] = static_cast(b[i] | 0x20); + + const ada::scheme::type scheme_type = + ada::scheme::get_scheme_type({scheme_buf, colon_pos}); + + // Only handle special, non-file schemes. + if (scheme_type == ada::scheme::NOT_SPECIAL) return std::nullopt; + if (scheme_type == ada::scheme::FILE) return std::nullopt; + + // Per WHATWG, special URLs don't require "//": "http:example.com" is valid + // (SPECIAL_AUTHORITY_IGNORE_SLASHES just skips leading slashes and + // proceeds to AUTHORITY). Defer to the inline fallback for any input + // without "://". + pos = colon_pos + 1; + if (pos + 2 > len || b[pos] != '/' || b[pos + 1] != '/') { + return std::nullopt; + } + pos += 2; + } + +skip_extra_slashes: + // SPECIAL_AUTHORITY_IGNORE_SLASHES: the full parser skips any additional + // leading '/' or '\' after the initial "//". Mirror that here so we don't + // mis-identify the host as empty when there are extra slashes. + while (pos < len && (b[pos] == '/' || b[pos] == '\\')) { + ++pos; + } + + // Early IPv6 bail-out: if the authority starts with '[', it's an IPv6 + // literal which requires the full parser. Checking here avoids scanning + // the entire bracketed address only to bail out afterward. + if (pos < len && b[pos] == '[') return std::nullopt; + + // -- Merged authority + host scan ------------------------------------------ + // A single forward pass over the authority bytes that simultaneously: + // - finds the authority end and port colon + // - validates host characters (forbidden domain code points) + // - tracks IPv4 indicators (all-decimal-dots, last non-dot char) + // - detects xn-- prefixes (IDNA punycode) + // - detects tabs/newlines (which require the full parser to strip) + // This replaces 4 separate scans over the host bytes. + const size_t auth_start = pos; + size_t auth_end = pos; + size_t port_colon = SIZE_MAX; + bool all_dec_dots = true; + uint8_t last_non_dot = 0; + + for (; auth_end < len; ++auth_end) { + const uint8_t c = b[auth_end]; + + // Non-ASCII -> needs IDNA processing -> full parser. + if (c >= 0x80) return std::nullopt; + + // Authority delimiters. + if (c == '/' || c == '?' || c == '#' || c == '\\') break; + + // Port separator. + if (c == ':') { + if (port_colon == SIZE_MAX) port_colon = auth_end; + continue; + } + + // Credentials or percent-encoding -> full parser. + if (c == '@' || c == '%') return std::nullopt; + + // Tabs/newlines anywhere in the authority require the full parser to + // strip them before validation. Without this, a tab in the port (e.g. + // "http://host:8\t0/") would be mis-rejected by port validation. + if (c == '\t' || c == '\n' || c == '\r') return std::nullopt; + + // Skip remaining host-specific checks for port bytes. Port digits are + // validated separately below, and no forbidden-domain-code-point check + // is needed on port characters. + if (port_colon != SIZE_MAX) continue; + + // -- Host byte validation (inlined) ------------------------------------ + // Forbidden domain code points that are not already caught above: + // C0 controls and space (0x00-0x20), DEL (0x7F), <, >, [, ], ^, |. + // At this stage, the input may still be userinfo or be normalized later + // (e.g., percent-encoded), so we do not reject here and defer to the + // parser. Characters already caught: >= 0x80 (non-ASCII), '/' '?' '#' '\\' + // (delimiters), ':' (port), '@' '%' (bail), '\t' '\n' '\r' (bail). + if (c <= 0x20 || c == 0x7F || c == '<' || c == '>' || c == '[' || + c == ']' || c == '^' || c == '|') { + return std::nullopt; + } + + // Track whether host is all decimal digits and dots (potential IPv4). + if (c != '.' && (c < '0' || c > '9')) all_dec_dots = false; + + // Track last non-dot character for the IPv4 hex/octal heuristic. + if (c != '.') last_non_dot = c; + + // Detect xn-- prefix inline (IDNA punycode -> needs full parser). + // Checking at every position mirrors the original behavior: any + // occurrence of "xn--" in the host (not just at label boundaries) + // triggers a bail-out to the full IDNA validator. + if ((c | 0x20) == 'x' && auth_end + 4 <= len && + (b[auth_end + 1] | 0x20) == 'n' && b[auth_end + 2] == '-' && + b[auth_end + 3] == '-') { + return std::nullopt; + } + } + + const size_t host_end = (port_colon != SIZE_MAX) ? port_colon : auth_end; + + // Empty host is invalid for special URLs. + if (auth_start == host_end) return false; + + // -- IPv4 handling --------------------------------------------------------- + const char* host_ptr = reinterpret_cast(b + auth_start); + const size_t host_len = host_end - auth_start; + + if (all_dec_dots) { + // Host is all decimal digits and dots -> try the fast IPv4 parser. + if (checkers::try_parse_ipv4_fast({host_ptr, host_len}) != + checkers::ipv4_fast_fail) { + // Valid decimal IPv4 host. Do NOT return true yet: the port still + // needs to be validated below before we can declare the URL valid. + goto validate_port; + } + // Fast IPv4 parsing failed (e.g. host is ".", "..", "1.2.3.500"). + // Such hosts may still be valid domain names; defer to the full parser. + return std::nullopt; + } + + // Last-significant-character heuristic for non-decimal IPv4 (hex/octal): + // if the last non-dot char is a digit, 'a'-'f', or 'x' the host might be + // an IPv4 address that the fast path can't validate -- fall through. + // last_non_dot was tracked during the authority scan above. + { + const uint8_t lc = last_non_dot | 0x20; + if ((last_non_dot >= '0' && last_non_dot <= '9') || + (lc >= 'a' && lc <= 'f') || lc == 'x') { + return std::nullopt; + } + } + + // -- Port validation ------------------------------------------------------- +validate_port: + if (port_colon != SIZE_MAX) { + const uint8_t* pp = b + port_colon + 1; + size_t pl = auth_end - port_colon - 1; + if (pl > 0) { + // Strip leading zeros: "0000001" == 1, "0000000000000" == 0, both valid. + // Only the significant digits count toward the 5-digit maximum. + while (pl > 0 && *pp == '0') { + ++pp; + --pl; + } + if (pl > 5) return false; // significant digits > 99999 + uint32_t pv = 0; + for (size_t i = 0; i < pl; ++i) { + if (pp[i] < '0' || pp[i] > '9') return false; + pv = pv * 10 + (pp[i] - '0'); + } + if (pv > 65535) return false; + } + } + + // Path, query, and fragment are structurally always valid for can_parse -- + // the parser would encode whatever is there. + return true; +} + +} // namespace + template ada_warn_unused tl::expected parse( std::string_view input, const result_type* base_url) { - result_type u = - ada::parser::parse_url_impl(input, base_url); + result_type u = ada::parser::parse_url_impl(input, base_url); if (!u.is_valid) { return tl::unexpected(errors::type_error); } @@ -11141,6 +7793,14 @@ template ada::result parse( std::string_view input, const url_aggregator* base_url = nullptr); std::string href_from_file(std::string_view input) { + // Match ada::parse / setters: refuse inputs that already exceed the limit. + // Path percent-encoding can still expand the result, so we also check the + // final href below. + const uint32_t max_length = ada::get_max_input_length(); + if (input.size() > max_length) { + return {}; + } + // This is going to be much faster than constructing a URL. std::string tmp_buffer; std::string_view internal_input; @@ -11160,26 +7820,89 @@ std::string href_from_file(std::string_view input) { } else { helpers::parse_prepared_path(internal_input, ada::scheme::type::FILE, path); } - return "file://" + path; + std::string result = "file://" + path; + if (result.size() > max_length) { + return {}; + } + return result; } bool can_parse(std::string_view input, const std::string_view* base_input) { - ada::url_aggregator base_aggregator; - ada::url_aggregator* base_pointer = nullptr; + // Must match parse().has_value(), including post-normalization max length. + // Percent-encoding expands a byte by at most 3x, but IDNA expands more: a + // 3-byte UTF-8 label such as U+337F becomes the 17-byte "xn--6oqv20b1zgzxr", + // so a dotted host sustains 4.5x. When the input (plus base, if any) fits in + // max_length/5, the normalized href cannot exceed max_length, so + // validation-only parsing (store_values=false) is safe. + + // Hot path first: absolute special URLs, no base. Avoid loading max_length + // until we need it (common absolute-fast true/false cases). + if (base_input == nullptr) { + if (const auto r = try_can_parse_absolute_fast(input)) { + if (!*r) { + return false; + } + // size <= max/5 => normalized href cannot exceed max (4.5x expansion). + // Check this first: default max is ~4GB so almost all URLs return true. + const uint32_t max_length = ada::get_max_input_length(); + if (input.size() <= static_cast(max_length) / 5) { + return true; + } + if (input.size() > max_length) { + return false; + } + return ada::parser::parse_url_impl(input, + nullptr) + .is_valid; + } + } - if (base_input != nullptr) { - base_aggregator = ada::parser::parse_url_impl( - *base_input, nullptr); - if (!base_aggregator.is_valid) { - return false; + const uint32_t max_length = ada::get_max_input_length(); + if (input.size() > max_length) { + return false; + } + if (base_input != nullptr && base_input->size() > max_length) { + return false; + } + + // Relative resolution combines base + input; bound the sum so 4.5x expansion + // of either side cannot push the final href past max_length. + const size_t combined = + input.size() + (base_input == nullptr ? 0 : base_input->size()); + const bool size_safe = combined <= static_cast(max_length) / 5; + + if (size_safe) { + // Validation-only: no buffer build, host still fully checked. + ada::url_aggregator base_agg; + ada::url_aggregator* base_ptr = nullptr; + if (base_input != nullptr) { + base_agg = ada::parser::parse_url_impl( + *base_input, nullptr); + if (!base_agg.is_valid) { + return false; + } + base_ptr = &base_agg; } - base_pointer = &base_aggregator; + return ada::parser::parse_url_impl(input, + base_ptr) + .is_valid; } - ada::url_aggregator result = - ada::parser::parse_url_impl(input, - base_pointer); - return result.is_valid; + // Near the limit: full parse so post-normalization length matches parse(). + if (base_input == nullptr) { + return ada::parser::parse_url_impl(input, + nullptr) + .is_valid; + } + ada::url_aggregator base_agg = + ada::parser::parse_url_impl(*base_input, + nullptr); + if (!base_agg.is_valid) { + return false; + } + return ada::parser::parse_url_impl(input, + &base_agg) + .is_valid; } ada_warn_unused std::string_view to_string(ada::encoding_type type) { @@ -11489,7 +8212,7 @@ ada_really_inline size_t find_next_host_delimiter_special( uint8x16_t classify = vandq_u8(lowpart, highpart); if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); - uint16_t is_non_zero = ~to_bitmask(is_zero); + uint16_t is_non_zero = static_cast(~to_bitmask(is_zero)); return i + trailing_zeroes(is_non_zero); } } @@ -11502,7 +8225,7 @@ ada_really_inline size_t find_next_host_delimiter_special( uint8x16_t classify = vandq_u8(lowpart, highpart); if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); - uint16_t is_non_zero = ~to_bitmask(is_zero); + uint16_t is_non_zero = static_cast(~to_bitmask(is_zero)); return view.length() - 16 + trailing_zeroes(is_non_zero); } } @@ -11778,7 +8501,7 @@ ada_really_inline size_t find_next_host_delimiter(std::string_view view, uint8x16_t classify = vandq_u8(lowpart, highpart); if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); - uint16_t is_non_zero = ~to_bitmask(is_zero); + uint16_t is_non_zero = static_cast(~to_bitmask(is_zero)); return i + trailing_zeroes(is_non_zero); } } @@ -11791,7 +8514,7 @@ ada_really_inline size_t find_next_host_delimiter(std::string_view view, uint8x16_t classify = vandq_u8(lowpart, highpart); if (vmaxvq_u32(vreinterpretq_u32_u8(classify)) != 0) { uint8x16_t is_zero = vceqq_u8(classify, zero); - uint16_t is_non_zero = ~to_bitmask(is_zero); + uint16_t is_non_zero = static_cast(~to_bitmask(is_zero)); return view.length() - 16 + trailing_zeroes(is_non_zero); } } @@ -12262,10 +8985,205 @@ ada_warn_unused std::string to_string(ada::state state) { } // namespace ada /* end file src/helpers.cpp */ /* begin file src/url.cpp */ +/* begin file include/ada/url_ip-inl.h */ +/** + * @file url_ip-inl.h + * @brief Shared IPv4/IPv6 parsing helpers used by url and url_aggregator. + * + * Not part of the public API. Defined inline so the single-TU amalgamation + * (ada.cpp) can include them from multiple translation-unit sources once. + */ +#ifndef ADA_URL_IP_INL_H +#define ADA_URL_IP_INL_H + + +#include +#include + +#if defined(ADA_AVX512) +#include +#endif + +namespace ada::detail { + +// 256-entry: 0xff = not hex, else nibble value. +inline constexpr std::array make_hex_nibble_table() noexcept { + std::array t{}; + for (size_t i = 0; i < 256; ++i) { + t[i] = 0xff; + } + for (size_t d = 0; d < 10; ++d) { + t[size_t{'0'} + d] = static_cast(d); + } + for (size_t d = 0; d < 6; ++d) { + t[size_t{'a'} + d] = static_cast(10 + d); + t[size_t{'A'} + d] = static_cast(10 + d); + } + return t; +} + +inline constexpr auto hex_nibble = make_hex_nibble_table(); + +inline bool parse_ipv4_number(const char*& p, const char* end, uint64_t& value, + bool& is_pure_decimal) noexcept { + is_pure_decimal = false; + if (p >= end) [[unlikely]] { + return false; + } + if (end - p >= 2 && p[0] == '0' && ((p[1] | 0x20) == 'x')) { + p += 2; + if (p == end || *p == '.') { + value = 0; + return true; + } + uint64_t v = 0; + int digits = 0; + while (p < end && *p != '.') { + const uint8_t nib = hex_nibble[static_cast(*p)]; + if (nib == 0xff) [[unlikely]] { + return false; + } + if (v > (0xFFFFFFFFULL >> 4)) [[unlikely]] { + return false; + } + v = (v << 4) | nib; + ++p; + ++digits; + } + if (digits == 0) [[unlikely]] { + return false; + } + value = v; + return true; + } + if (end - p >= 2 && p[0] == '0' && p[1] >= '0' && p[1] <= '9') { + ++p; + uint64_t v = 0; + while (p < end && *p != '.') { + const char c = *p; + if (c < '0' || c > '7') [[unlikely]] { + return false; + } + if (v > (0xFFFFFFFFULL >> 3)) [[unlikely]] { + return false; + } + v = (v << 3) | static_cast(c - '0'); + ++p; + } + value = v; + return true; + } + if (*p < '0' || *p > '9') [[unlikely]] { + return false; + } + is_pure_decimal = true; + uint64_t v = static_cast(*p - '0'); + ++p; + while (p < end && *p != '.') { + const char c = *p; + if (c < '0' || c > '9') [[unlikely]] { + return false; + } + if (v > 429496729ULL) [[unlikely]] { + return false; + } + v = v * 10u + static_cast(c - '0'); + if (v > 0xFFFFFFFFULL) [[unlikely]] { + return false; + } + ++p; + } + value = v; + return true; +} + +// Parse up to 4 hex digits. Returns digit count (0 if none). +inline int parse_hex_piece(const char*& pointer, const char* end, + uint16_t& value) noexcept { + if (pointer == end) { + return 0; + } + const uint8_t n0 = hex_nibble[static_cast(*pointer)]; + if (n0 == 0xff) { + return 0; + } + uint32_t v = n0; + ++pointer; + int length = 1; + if (pointer != end) { + const uint8_t n1 = hex_nibble[static_cast(*pointer)]; + if (n1 != 0xff) { + v = (v << 4) | n1; + ++pointer; + ++length; + if (pointer != end) { + const uint8_t n2 = hex_nibble[static_cast(*pointer)]; + if (n2 != 0xff) { + v = (v << 4) | n2; + ++pointer; + ++length; + if (pointer != end) { + const uint8_t n3 = hex_nibble[static_cast(*pointer)]; + if (n3 != 0xff) { + v = (v << 4) | n3; + ++pointer; + ++length; + } + } + } + } + } + } + value = static_cast(v); + return length; +} + +#if defined(ADA_AVX512) +// Classify an IPv6 host (no brackets) with one masked 512-bit load. +// Returns false if the colon/dot shape is impossible (e.g. two "::", >8 +// colons, full form without 7 colons). Used as a cheap prefilter before the +// full WHATWG piece parser. +ada_really_inline bool ipv6_structure_plausible(const char* data, + size_t len) noexcept { + if (len < 2 || len > 45) { + return false; + } + const __mmask64 live = static_cast<__mmask64>((1ULL << len) - 1ULL); + const __m512i input = + _mm512_maskz_loadu_epi8(live, reinterpret_cast(data)); + const __mmask64 is_colon = + _mm512_mask_cmpeq_epi8_mask(live, input, _mm512_set1_epi8(':')); + const __mmask64 is_dot = + _mm512_mask_cmpeq_epi8_mask(live, input, _mm512_set1_epi8('.')); + const int colons = + static_cast(_mm_popcnt_u64(static_cast(is_colon))); + if (colons > 8) { + return false; + } + const uint64_t doubles = + static_cast(is_colon) & (static_cast(is_colon) << 1); + if (doubles != 0 && (doubles & (doubles - 1)) != 0) { + return false; // more than one "::" (or ":::...") + } + const bool has_double = doubles != 0; + const bool has_dot = is_dot != 0; + if (!has_double && !has_dot && colons != 7) { + return false; + } + return true; +} +#endif // ADA_AVX512 + +} // namespace ada::detail + +#endif // ADA_URL_IP_INL_H +/* end file include/ada/url_ip-inl.h */ -#include #include +#include +#include #include +#include #include #include #include @@ -12287,303 +9205,197 @@ bool url::parse_opaque_host(std::string_view input) { bool url::parse_ipv4(std::string_view input) { ada_log("parse_ipv4 ", input, " [", input.size(), " bytes]"); + if (input.empty()) { + return is_valid = false; + } + std::string_view original_input = input; + if (original_input.back() == '.') { + original_input.remove_suffix(1); + } if (input.back() == '.') { input.remove_suffix(1); + if (input.empty()) { + return is_valid = false; + } } - size_t digit_count{0}; - int pure_decimal_count = 0; // entries that are decimal - std::string_view original_input = - input; // we might use this if pure_decimal_count == 4. - uint64_t ipv4{0}; - // we could unroll for better performance? - for (; (digit_count < 4) && !(input.empty()); digit_count++) { - uint32_t - segment_result{}; // If any number exceeds 32 bits, we have an error. - bool is_hex = checkers::has_hex_prefix(input); - if (is_hex && ((input.length() == 2) || - ((input.length() > 2) && (input[2] == '.')))) { - // special case - segment_result = 0; - input.remove_prefix(2); - } else { - std::from_chars_result r{}; - if (is_hex) { - r = std::from_chars(input.data() + 2, input.data() + input.size(), - segment_result, 16); - } else if ((input.length() >= 2) && input[0] == '0' && - checkers::is_digit(input[1])) { - r = std::from_chars(input.data() + 1, input.data() + input.size(), - segment_result, 8); - } else { - pure_decimal_count++; - r = std::from_chars(input.data(), input.data() + input.size(), - segment_result, 10); - } - if (r.ec != std::errc()) { - return is_valid = false; - } - input.remove_prefix(r.ptr - input.data()); + + const uint64_t fast = checkers::try_parse_ipv4_fast(input); + if (fast < checkers::ipv4_fast_fail) [[likely]] { + host = original_input; + host_type = IPV4; + return true; + } + + const char* p = input.data(); + const char* end = p + input.size(); + uint64_t ipv4 = 0; + int digit_count = 0; + int pure_decimal_count = 0; + + for (; digit_count < 4 && p < end; ++digit_count) { + uint64_t segment = 0; + bool pure = false; + if (!detail::parse_ipv4_number(p, end, segment, pure)) { + return is_valid = false; } - if (input.empty()) { - // We have the last value. - // At this stage, ipv4 contains digit_count*8 bits. - // So we have 32-digit_count*8 bits left. - if (segment_result >= (uint64_t(1) << (32 - digit_count * 8))) { - return is_valid = false; - } - ipv4 <<= (32 - digit_count * 8); - ipv4 |= segment_result; - goto final; - } else { - // There is more, so that the value must no be larger than 255 - // and we must have a '.'. - if ((segment_result > 255) || (input[0] != '.')) { + if (pure) { + ++pure_decimal_count; + } + if (p >= end) { + const unsigned shift = static_cast(32 - digit_count * 8); + if (segment >= (uint64_t{1} << shift)) { return is_valid = false; } - ipv4 <<= 8; - ipv4 |= segment_result; - input.remove_prefix(1); // remove '.' + ipv4 = (ipv4 << shift) | segment; + host = (pure_decimal_count == 4) ? std::string(original_input) + : ada::serializers::ipv4(ipv4); + host_type = IPV4; + return true; + } + if (segment > 255 || *p != '.') { + return is_valid = false; } + ipv4 = (ipv4 << 8) | segment; + ++p; } - if ((digit_count != 4) || (!input.empty())) { + if (digit_count != 4 || p != end) { return is_valid = false; } -final: - // We could also check r.ptr to see where the parsing ended. - if (pure_decimal_count == 4) { - host = original_input; // The original input was already all decimal and we - // validated it. - } else { - host = ada::serializers::ipv4(ipv4); // We have to reserialize the address. - } + host = (pure_decimal_count == 4) ? std::string(original_input) + : ada::serializers::ipv4(ipv4); host_type = IPV4; return true; } bool url::parse_ipv6(std::string_view input) { ada_log("parse_ipv6 ", input, " [", input.size(), " bytes]"); - - if (input.empty()) { + if (input.empty() || input.size() > 45) [[unlikely]] { return is_valid = false; } - // Let address be a new IPv6 address whose IPv6 pieces are all 0. - std::array address{}; +#if defined(ADA_AVX512) + // One masked load classifies colon/dot shape; rejects impossible inputs + // before the piece parser (free on AVX-512BW+VL builds). + if (!detail::ipv6_structure_plausible(input.data(), input.size())) + [[unlikely]] { + return is_valid = false; + } +#endif - // Let pieceIndex be 0. + std::array address{}; + const char* pointer = input.data(); + const char* const end = pointer + input.size(); int piece_index = 0; + int compress = -1; - // Let compress be null. - std::optional compress{}; - - // Let pointer be a pointer for input. - std::string_view::iterator pointer = input.begin(); - - // If c is U+003A (:), then: - if (input[0] == ':') { - // If remaining does not start with U+003A (:), validation error, return - // failure. - if (input.size() == 1 || input[1] != ':') { - ada_log("parse_ipv6 starts with : but the rest does not start with :"); + if (*pointer == ':') { + if (input.size() == 1 || pointer[1] != ':') [[unlikely]] { return is_valid = false; } - - // Increase pointer by 2. pointer += 2; - - // Increase pieceIndex by 1 and then set compress to pieceIndex. compress = ++piece_index; } - // While c is not the EOF code point: - while (pointer != input.end()) { - // If pieceIndex is 8, validation error, return failure. - if (piece_index == 8) { - ada_log("parse_ipv6 piece_index == 8"); + while (pointer != end) { + if (piece_index == 8) [[unlikely]] { return is_valid = false; } - - // If c is U+003A (:), then: if (*pointer == ':') { - // If compress is non-null, validation error, return failure. - if (compress.has_value()) { - ada_log("parse_ipv6 compress is non-null"); + if (compress != -1) [[unlikely]] { return is_valid = false; } - - // Increase pointer and pieceIndex by 1, set compress to pieceIndex, and - // then continue. - pointer++; + ++pointer; compress = ++piece_index; continue; } - // Let value and length be 0. - uint16_t value = 0, length = 0; + uint16_t value = 0; + const int length = detail::parse_hex_piece(pointer, end, value); - // While length is less than 4 and c is an ASCII hex digit, - // set value to value times 0x10 + c interpreted as hexadecimal number, and - // increase pointer and length by 1. - while (length < 4 && pointer != input.end() && - unicode::is_ascii_hex_digit(*pointer)) { - // https://stackoverflow.com/questions/39060852/why-does-the-addition-of-two-shorts-return-an-int - value = uint16_t(value * 0x10 + unicode::convert_hex_to_binary(*pointer)); - pointer++; - length++; - } - - // If c is U+002E (.), then: - if (pointer != input.end() && *pointer == '.') { - // If length is 0, validation error, return failure. - if (length == 0) { - ada_log("parse_ipv6 length is 0"); + if (pointer != end && *pointer == '.') { + if (length == 0) [[unlikely]] { return is_valid = false; } - - // Decrease pointer by length. pointer -= length; - - // If pieceIndex is greater than 6, validation error, return failure. - if (piece_index > 6) { - ada_log("parse_ipv6 piece_index > 6"); + if (piece_index > 6) [[unlikely]] { return is_valid = false; } - // Let numbersSeen be 0. int numbers_seen = 0; - - // While c is not the EOF code point: - while (pointer != input.end()) { - // Let ipv4Piece be null. - std::optional ipv4_piece{}; - - // If numbersSeen is greater than 0, then: + while (pointer != end) { + int ipv4_piece = -1; if (numbers_seen > 0) { - // If c is a U+002E (.) and numbersSeen is less than 4, then increase - // pointer by 1. if (*pointer == '.' && numbers_seen < 4) { - pointer++; - } - // Otherwise, validation error, return failure. - else { - ada_log("parse_ipv6 Otherwise, validation error, return failure"); + ++pointer; + } else { return is_valid = false; } } - - // If c is not an ASCII digit, validation error, return failure. - if (pointer == input.end() || !checkers::is_digit(*pointer)) { - ada_log( - "parse_ipv6 If c is not an ASCII digit, validation error, return " - "failure"); + if (pointer == end || *pointer < '0' || *pointer > '9') [[unlikely]] { return is_valid = false; } - - // While c is an ASCII digit: - while (pointer != input.end() && checkers::is_digit(*pointer)) { - // Let number be c interpreted as decimal number. - int number = *pointer - '0'; - - // If ipv4Piece is null, then set ipv4Piece to number. - if (!ipv4_piece.has_value()) { - ipv4_piece = number; - } - // Otherwise, if ipv4Piece is 0, validation error, return failure. - else if (ipv4_piece == 0) { - ada_log("parse_ipv6 if ipv4Piece is 0, validation error"); + ipv4_piece = *pointer - '0'; + ++pointer; + if (pointer != end && *pointer >= '0' && *pointer <= '9') { + if (ipv4_piece == 0) [[unlikely]] { return is_valid = false; } - // Otherwise, set ipv4Piece to ipv4Piece times 10 + number. - else { - ipv4_piece = *ipv4_piece * 10 + number; - } - - // If ipv4Piece is greater than 255, validation error, return failure. - if (ipv4_piece > 255) { - ada_log("parse_ipv6 ipv4_piece > 255"); - return is_valid = false; + ipv4_piece = ipv4_piece * 10 + (*pointer - '0'); + ++pointer; + if (pointer != end && *pointer >= '0' && *pointer <= '9') { + ipv4_piece = ipv4_piece * 10 + (*pointer - '0'); + ++pointer; + if (ipv4_piece > 255) [[unlikely]] { + return is_valid = false; + } } - - // Increase pointer by 1. - pointer++; } - - // Set address[pieceIndex] to address[pieceIndex] times 0x100 + - // ipv4Piece. - // https://stackoverflow.com/questions/39060852/why-does-the-addition-of-two-shorts-return-an-int - address[piece_index] = - uint16_t(address[piece_index] * 0x100 + *ipv4_piece); - - // Increase numbersSeen by 1. - numbers_seen++; - - // If numbersSeen is 2 or 4, then increase pieceIndex by 1. + address[static_cast(piece_index)] = static_cast( + address[static_cast(piece_index)] * 0x100 + + static_cast(ipv4_piece)); + ++numbers_seen; if (numbers_seen == 2 || numbers_seen == 4) { - piece_index++; + ++piece_index; } } - - // If numbersSeen is not 4, validation error, return failure. - if (numbers_seen != 4) { + if (numbers_seen != 4) [[unlikely]] { return is_valid = false; } - - // Break. break; } - // Otherwise, if c is U+003A (:): - else if ((pointer != input.end()) && (*pointer == ':')) { - // Increase pointer by 1. - pointer++; - // If c is the EOF code point, validation error, return failure. - if (pointer == input.end()) { - ada_log( - "parse_ipv6 If c is the EOF code point, validation error, return " - "failure"); + if (length == 0) [[unlikely]] { + return is_valid = false; + } + + if (pointer != end && *pointer == ':') { + ++pointer; + if (pointer == end) [[unlikely]] { return is_valid = false; } - } - // Otherwise, if c is not the EOF code point, validation error, return - // failure. - else if (pointer != input.end()) { - ada_log( - "parse_ipv6 Otherwise, if c is not the EOF code point, validation " - "error, return failure"); + } else if (pointer != end) [[unlikely]] { return is_valid = false; } - // Set address[pieceIndex] to value. - address[piece_index] = value; - - // Increase pieceIndex by 1. - piece_index++; + address[static_cast(piece_index)] = value; + ++piece_index; } - // If compress is non-null, then: - if (compress.has_value()) { - // Let swaps be pieceIndex - compress. - int swaps = piece_index - *compress; - - // Set pieceIndex to 7. - piece_index = 7; - - // While pieceIndex is not 0 and swaps is greater than 0, - // swap address[pieceIndex] with address[compress + swaps - 1], and then - // decrease both pieceIndex and swaps by 1. - while (piece_index != 0 && swaps > 0) { - std::swap(address[piece_index], address[*compress + swaps - 1]); - piece_index--; - swaps--; + if (compress != -1) { + const int right = piece_index - compress; + if (right > 0) { + const size_t dest = static_cast(8 - right); + const size_t src = static_cast(compress); + if (dest != src) { + for (size_t i = static_cast(right); i-- > 0;) { + address[dest + i] = address[src + i]; + address[src + i] = 0; + } + } } - } - // Otherwise, if compress is null and pieceIndex is not 8, validation error, - // return failure. - else if (piece_index != 8) { - ada_log( - "parse_ipv6 if compress is null and pieceIndex is not 8, validation " - "error, return failure"); + } else if (piece_index != 8) [[unlikely]] { return is_valid = false; } + host = ada::serializers::ipv6(address); ada_log("parse_ipv6 ", *host); host_type = IPV6; @@ -12616,7 +9428,7 @@ ada_really_inline bool url::parse_scheme(const std::string_view input) { // If url's scheme is "file" and its host is an empty host, then return. // An empty host is the empty string. if (type == ada::scheme::type::FILE && host.has_value() && - host.value().empty()) { + host->empty()) { return false; } } @@ -12644,24 +9456,29 @@ ada_really_inline bool url::parse_scheme(const std::string_view input) { unicode::to_lower_ascii(_buffer.data(), _buffer.size()); if constexpr (has_state_override) { + // The state-override validation errors below ("return" in the WHATWG URL + // parser) leave the URL unchanged. The setter contract is + // "true on success, false if the scheme is invalid" -- the fast path + // above already returns false here, so the slow path must agree. + // If url's scheme is a special scheme and buffer is not a special scheme, // then return. If url's scheme is not a special scheme and buffer is a // special scheme, then return. if (is_special() != ada::scheme::is_special(_buffer)) { - return true; + return false; } // If url includes credentials or has a non-null port, and buffer is // "file", then return. if ((has_credentials() || port.has_value()) && _buffer == "file") { - return true; + return false; } // If url's scheme is "file" and its host is an empty host, then return. // An empty host is the empty string. if (type == ada::scheme::type::FILE && host.has_value() && - host.value().empty()) { - return true; + host->empty()) { + return false; } } @@ -12720,6 +9537,7 @@ ada_really_inline bool url::parse_host(std::string_view input) { host = input; } host_type = IPV4; + is_valid = true; ada_log("parse_host fast path decimal ipv4"); return true; } @@ -12735,7 +9553,8 @@ ada_really_inline bool url::parse_host(std::string_view input) { unicode::to_lower_ascii(buffer.data(), buffer.size()); bool is_forbidden = unicode::contains_forbidden_domain_code_point( buffer.data(), buffer.size()); - if (is_forbidden == 0 && buffer.find("xn-") == std::string_view::npos) { + static constexpr std::string_view xn_dash{"xn-", 3}; + if (is_forbidden == 0 && buffer.find(xn_dash) == std::string_view::npos) { // fast path host = std::move(buffer); @@ -12745,18 +9564,19 @@ ada_really_inline bool url::parse_host(std::string_view input) { return parse_ipv4(host.value()); } ada_log("parse_host fast path ", *host); + is_valid = true; return true; } ada_log("parse_host calling to_ascii"); is_valid = ada::unicode::to_ascii(host, input, input.find('%')); - if (!is_valid) { + if (!is_valid || !host.has_value()) { ada_log("parse_host to_ascii returns false"); return is_valid = false; } ada_log("parse_host to_ascii succeeded ", *host, " [", host->size(), " bytes]"); - if (std::any_of(host.value().begin(), host.value().end(), + if (std::any_of(host->begin(), host->end(), ada::unicode::is_forbidden_domain_code_point)) { host = std::nullopt; return is_valid = false; @@ -12764,9 +9584,9 @@ ada_really_inline bool url::parse_host(std::string_view input) { // If asciiDomain ends in a number, then return the result of IPv4 parsing // asciiDomain. - if (checkers::is_ipv4(host.value())) { + if (checkers::is_ipv4(*host)) { ada_log("parse_host got ipv4 ", *host); - return parse_ipv4(host.value()); + return parse_ipv4(*host); } return true; @@ -12862,7 +9682,7 @@ ada_really_inline void url::parse_path(std::string_view input) { if (!host.has_value()) { return false; } - return checkers::verify_dns_length(host.value()); + return checkers::verify_dns_length(*host); } [[nodiscard]] std::string url::get_origin() const { @@ -12920,8 +9740,7 @@ ada_really_inline void url::parse_path(std::string_view input) { [[nodiscard]] std::string url::get_search() const { // If this's URL's query is either null or the empty string, then return the // empty string. Return U+003F (?), followed by this's URL's query. - return (!query.has_value() || (query.value().empty())) ? "" - : "?" + query.value(); + return (!query.has_value() || (query->empty())) ? "" : "?" + query.value(); } [[nodiscard]] const std::string& url::get_username() const noexcept { @@ -12939,8 +9758,7 @@ ada_really_inline void url::parse_path(std::string_view input) { [[nodiscard]] std::string url::get_hash() const { // If this's URL's fragment is either null or the empty string, then return // the empty string. Return U+0023 (#), followed by this's URL's fragment. - return (!hash.has_value() || (hash.value().empty())) ? "" - : "#" + hash.value(); + return (!hash.has_value() || (hash->empty())) ? "" : "#" + hash.value(); } template @@ -12949,8 +9767,7 @@ bool url::set_host_or_hostname(const std::string_view input) { return false; } - std::optional previous_host = host; - std::optional previous_port = port; + url saved_url(*this); size_t host_end_pos = input.find('#'); std::string _host(input.data(), host_end_pos != std::string_view::npos @@ -12959,6 +9776,14 @@ bool url::set_host_or_hostname(const std::string_view input) { helpers::remove_ascii_tab_or_newline(_host); std::string_view new_host(_host); + auto check_url_size = [&]() -> bool { + if (get_href_size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } + return true; + }; + // If url's scheme is "file", then set state to file host state, instead of // host state. if (type != ada::scheme::type::FILE) { @@ -12986,8 +9811,7 @@ bool url::set_host_or_hostname(const std::string_view input) { // Let host be the result of host parsing buffer with url is not special. bool succeeded = parse_host(buffer); if (!succeeded) { - host = std::move(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } @@ -12997,7 +9821,7 @@ bool url::set_host_or_hostname(const std::string_view input) { if (!port_buffer.empty()) { set_port(port_buffer); } - return true; + return check_url_size(); } // Otherwise, if one of the following is true: // - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#) @@ -13020,16 +9844,15 @@ bool url::set_host_or_hostname(const std::string_view input) { // special. if (host_view.empty() && !is_special()) { host = ""; - return true; + return check_url_size(); } bool succeeded = parse_host(host_view); if (!succeeded) { - host = std::move(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } - return true; + return check_url_size(); } } @@ -13044,8 +9867,7 @@ bool url::set_host_or_hostname(const std::string_view input) { } else { // Let host be the result of host parsing buffer with url is not special. if (!parse_host(new_host)) { - host = std::move(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } @@ -13054,7 +9876,7 @@ bool url::set_host_or_hostname(const std::string_view input) { host = ""; } } - return true; + return check_url_size(); } bool url::set_host(const std::string_view input) { @@ -13069,8 +9891,13 @@ bool url::set_username(const std::string_view input) { if (cannot_have_credentials_or_port()) { return false; } + auto previous_username = std::move(username); username = ada::unicode::percent_encode( input, character_sets::USERINFO_PERCENT_ENCODE); + if (get_href_size() > ada::get_max_input_length()) { + username = std::move(previous_username); + return false; + } return true; } @@ -13078,8 +9905,13 @@ bool url::set_password(const std::string_view input) { if (cannot_have_credentials_or_port()) { return false; } + auto previous_password = std::move(password); password = ada::unicode::percent_encode( input, character_sets::USERINFO_PERCENT_ENCODE); + if (get_href_size() > ada::get_max_input_length()) { + password = std::move(previous_password); + return false; + } return true; } @@ -13115,6 +9947,10 @@ bool url::set_port(const std::string_view input) { std::optional previous_port = port; parse_port(digits_to_parse); if (is_valid) { + if (get_href_size() > ada::get_max_input_length()) { + port = std::move(previous_port); + return false; + } return true; } port = std::move(previous_port); @@ -13132,8 +9968,12 @@ void url::set_hash(const std::string_view input) { std::string new_value; new_value = input[0] == '#' ? input.substr(1) : input; helpers::remove_ascii_tab_or_newline(new_value); + auto previous_hash = std::move(hash); hash = unicode::percent_encode(new_value, ada::character_sets::FRAGMENT_PERCENT_ENCODE); + if (get_href_size() > ada::get_max_input_length()) { + hash = std::move(previous_hash); + } } void url::set_search(const std::string_view input) { @@ -13151,15 +9991,24 @@ void url::set_search(const std::string_view input) { is_special() ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE : ada::character_sets::QUERY_PERCENT_ENCODE; + auto previous_query = std::move(query); query = ada::unicode::percent_encode(new_value, query_percent_encode_set); + if (get_href_size() > ada::get_max_input_length()) { + query = std::move(previous_query); + } } bool url::set_pathname(const std::string_view input) { if (has_opaque_path) { return false; } + auto previous_path = std::move(path); path.clear(); parse_path(input); + if (get_href_size() > ada::get_max_input_length()) { + path = std::move(previous_path); + return false; + } return true; } @@ -13181,8 +10030,14 @@ bool url::set_protocol(const std::string_view input) { std::ranges::find_if_not(view, unicode::is_alnum_plus); if (pointer != view.end() && *pointer == ':') { - return parse_scheme( + url saved_url(*this); + bool result = parse_scheme( std::string_view(view.data(), pointer - view.begin())); + if (result && get_href_size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } + return result; } return false; } @@ -13191,6 +10046,11 @@ bool url::set_href(const std::string_view input) { ada::result out = ada::parse(input); if (out) { + // The parser enforces get_max_input_length() on both the input and the + // normalized result. This is a defense-in-depth check. + if (out->get_href_size() > ada::get_max_input_length()) { + return false; + } *this = *out; } @@ -13201,12 +10061,315 @@ bool url::set_href(const std::string_view input) { /* end file src/url.cpp */ /* begin file src/parser.cpp */ +#include +#include #include #include namespace ada::parser { +// 0 = host byte, 1 = host delimiter (/ ? #), 2 = reject +namespace { + +constexpr std::array k_host_class = []() consteval { + std::array t{}; + for (size_t i = 0; i < 256; ++i) { + t[i] = 2; + } + for (size_t i = 0x21; i <= 0x7E; ++i) { + t[i] = 0; + } + for (uint8_t c : + {'#', '/', ':', '<', '>', '?', '@', '[', '\\', ']', '^', '|', '%'}) { + t[c] = 2; + } + t[static_cast('/')] = 1; + t[static_cast('?')] = 1; + t[static_cast('#')] = 1; + return t; +}(); + +// 0 = ok, 1 = ?/#, 2 = reject. Path rejects '%' so "%2e" falls through. +constexpr std::array k_rest = []() consteval { + std::array t{}; + for (size_t i = 0; i < 256; ++i) { + t[i] = 2; + } + for (uint8_t c = 0x21; c <= 0x7E; ++c) { + t[c] = 0; + } + for (uint8_t c : {static_cast('"'), static_cast('<'), + static_cast('>'), static_cast('`'), + static_cast('{'), static_cast('}'), + static_cast('^'), static_cast('\\'), + static_cast('%'), static_cast('\'')}) { + t[c] = 2; + } + t[static_cast('?')] = 1; + t[static_cast('#')] = 1; + return t; +}(); + +} // namespace + +// Fast path for already-normalized absolute http(s) URLs. noinline keeps +// the fallthrough path small (IPv4 microbenches). +template +ada_never_inline bool try_parse_simple_absolute(std::string_view input, + result_type& out) { + constexpr bool is_ada_url = std::is_same_v; + constexpr bool is_aggregator = + std::is_same_v; + static_assert(is_ada_url || is_aggregator); + + const size_t len = input.size(); + if (len < 8) [[unlikely]] { + return false; + } + const auto* b = reinterpret_cast(input.data()); + + size_t pos; + ada::scheme::type scheme_type; + uint32_t protocol_end; + if (b[0] == 'h' && b[1] == 't' && b[2] == 't' && b[3] == 'p') { + if (b[4] == ':' && b[5] == '/' && b[6] == '/') { + pos = 7; + scheme_type = ada::scheme::type::HTTP; + protocol_end = 5; + } else if (len >= 8 && b[4] == 's' && b[5] == ':' && b[6] == '/' && + b[7] == '/') { + pos = 8; + scheme_type = ada::scheme::type::HTTPS; + protocol_end = 6; + } else { + return false; + } + } else { + return false; + } + if (pos < len && (b[pos] == '/' || b[pos] == '\\')) [[unlikely]] { + return false; + } + + // Digit-led hosts are IPv4/numeric; skip before scanning. + if (pos < len && b[pos] >= '0' && b[pos] <= '9') { + return false; + } + + const size_t host_start = pos; + bool has_upper = false; + size_t i = pos; + for (; i < len; ++i) { + const uint8_t c = b[i]; + const uint8_t cls = k_host_class[c]; + if (cls == 1) { + break; + } + if (cls == 2) [[unlikely]] { + return false; + } + if (c >= 'A' && c <= 'Z') { + has_upper = true; + } + } + const size_t host_end = i; + if (host_start == host_end) [[unlikely]] { + return false; + } + const size_t host_len = host_end - host_start; + if (host_len > 253) [[unlikely]] { + return false; + } + { + std::string_view hv(input.data() + host_start, host_len); + char host_buf[256]; + if (has_upper) [[unlikely]] { + std::memcpy(host_buf, input.data() + host_start, host_len); + unicode::to_lower_ascii(host_buf, host_len); + hv = std::string_view(host_buf, host_len); + } + if (checkers::is_ipv4(hv)) [[unlikely]] { + return false; + } + static constexpr std::string_view xn{"xn-", 3}; + if (hv.find(xn) != std::string_view::npos) [[unlikely]] { + return false; + } + } + + size_t path_start = host_end; + size_t path_end = host_end; + size_t query_start = std::string_view::npos; + size_t hash_start = std::string_view::npos; + bool has_path = false; + bool path_has_dot = false; + + if (i < len && b[i] == '/') { + has_path = true; + path_start = i; + ++i; + for (; i < len; ++i) { + const uint8_t c = b[i]; + const uint8_t cls = k_rest[c]; + if (cls == 0) { + path_has_dot |= (c == '.'); + continue; + } + if (cls == 1) { + path_end = i; + if (c == '?') { + query_start = i; + ++i; + goto scan_query; + } + hash_start = i; + ++i; + goto scan_hash; + } + return false; + } + path_end = i; + } else if (i < len && b[i] == '?') { + query_start = i; + ++i; + goto scan_query; + } else if (i < len && b[i] == '#') { + hash_start = i; + ++i; + goto scan_hash; + } + goto after_rest; + +scan_query: + for (; i < len; ++i) { + const uint8_t c = b[i]; + if (c == '#') { + hash_start = i; + ++i; + goto scan_hash; + } + if (c == '?' || c == '%') { + continue; + } + if (k_rest[c] == 2) [[unlikely]] { + return false; + } + } + goto after_rest; + +scan_hash: + for (; i < len; ++i) { + const uint8_t c = b[i]; + if (c == '?' || c == '#' || c == '%') { + continue; + } + if (k_rest[c] == 2) [[unlikely]] { + return false; + } + } + +after_rest: + if (path_has_dot) [[unlikely]] { + const std::string_view path_body(input.data() + path_start, + path_end - path_start); + if (path_body.size() >= 2 && path_body[1] == '.') { + if (path_body.size() == 2 || path_body[2] == '/' || + (path_body.size() >= 3 && path_body[2] == '.' && + (path_body.size() == 3 || path_body[3] == '/'))) { + return false; + } + } + static constexpr std::string_view slash_dot{"/.", 2}; + size_t p = 1; + while ((p = path_body.find(slash_dot, p)) != std::string_view::npos) { + const size_t after = p + 2; + if (after == path_body.size() || path_body[after] == '/' || + (after + 1 <= path_body.size() && path_body[after] == '.' && + (after + 1 == path_body.size() || path_body[after + 1] == '/'))) { + return false; + } + p = after; + } + } + + const bool need_slash = !has_path; + out.type = scheme_type; + out.is_valid = true; + out.has_opaque_path = false; + out.host_type = DEFAULT; + + if constexpr (is_aggregator) { + if (!need_slash) { + out.buffer.resize(len); + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) + std::memcpy(out.buffer.data(), input.data(), len); + if (has_upper) { + unicode::to_lower_ascii(out.buffer.data() + host_start, + host_end - host_start); + } + out.components.protocol_end = protocol_end; + out.components.username_end = protocol_end + 2; + out.components.host_start = protocol_end + 2; + out.components.host_end = static_cast(host_end); + out.components.port = url_components::omitted; + out.components.pathname_start = static_cast(path_start); + out.components.search_start = (query_start != std::string_view::npos) + ? static_cast(query_start) + : url_components::omitted; + out.components.hash_start = (hash_start != std::string_view::npos) + ? static_cast(hash_start) + : url_components::omitted; + } else { + out.buffer.resize(len + 1); + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) + std::memcpy(out.buffer.data(), input.data(), host_end); + out.buffer[host_end] = '/'; + if (host_end < len) { + std::memcpy(out.buffer.data() + host_end + 1, input.data() + host_end, + len - host_end); + } + if (has_upper) { + unicode::to_lower_ascii(out.buffer.data() + host_start, + host_end - host_start); + } + out.components.protocol_end = protocol_end; + out.components.username_end = protocol_end + 2; + out.components.host_start = protocol_end + 2; + out.components.host_end = static_cast(host_end); + out.components.port = url_components::omitted; + out.components.pathname_start = static_cast(host_end); + out.components.search_start = (query_start != std::string_view::npos) + ? static_cast(query_start + 1) + : url_components::omitted; + out.components.hash_start = (hash_start != std::string_view::npos) + ? static_cast(hash_start + 1) + : url_components::omitted; + } + } else { + std::string host_str(input.substr(host_start, host_end - host_start)); + if (has_upper) { + unicode::to_lower_ascii(host_str.data(), host_str.size()); + } + out.host = std::move(host_str); + if (need_slash) { + out.path = "/"; + } else { + out.path.assign(input.data() + path_start, path_end - path_start); + } + if (query_start != std::string_view::npos) { + const size_t q_end = + (hash_start != std::string_view::npos) ? hash_start : len; + out.query.emplace(input.data() + query_start + 1, + q_end - query_start - 1); + } + if (hash_start != std::string_view::npos) { + out.hash.emplace(input.data() + hash_start + 1, len - hash_start - 1); + } + } + return true; +} + template result_type parse_url_impl(std::string_view user_input, const result_type* base_url) { @@ -13229,9 +10392,12 @@ result_type parse_url_impl(std::string_view user_input, state state = state::SCHEME_START; result_type url{}; - // We refuse to parse URL strings that exceed 4GB. Such strings are almost - // surely the result of a bug or are otherwise a security concern. - if (user_input.size() > std::numeric_limits::max()) [[unlikely]] { + const uint32_t max_input_length = ada::get_max_input_length(); + + // We refuse to parse URL strings that exceed the maximum input length. + // By default, this is 4GB but can be configured via + // ada::set_max_input_length(). + if (user_input.size() > max_input_length) [[unlikely]] { url.is_valid = false; } // Going forward, user_input.size() is in [0, @@ -13243,6 +10409,48 @@ result_type parse_url_impl(std::string_view user_input, if (!url.is_valid) { return url; } + + // Simple absolute http(s) fast path (before tabs/newline scan). + // Skip digit-led hosts (IPv4) with a cheap peek. + if constexpr (store_values) { + if (base_url == nullptr) { + const auto* p = reinterpret_cast(user_input.data()); + const size_t n = user_input.size(); + const bool digit_led_host = (n >= 8 && p[4] == ':' && p[5] == '/' && + p[6] == '/' && p[7] >= '0' && p[7] <= '9') || + (n >= 9 && p[5] == ':' && p[6] == '/' && + p[7] == '/' && p[8] >= '0' && p[8] <= '9'); + if (!digit_led_host && try_parse_simple_absolute(user_input, url)) { + if constexpr (result_type_is_ada_url_aggregator) { + if (url.buffer.size() > max_input_length) [[unlikely]] { + url.is_valid = false; + } + } else { + if (url.get_href_size() > max_input_length) [[unlikely]] { + url.is_valid = false; + } + } + return url; + } + } + } + + std::string tmp_buffer; + std::string_view url_data; + if (unicode::has_tabs_or_newline(user_input)) [[unlikely]] { + tmp_buffer = user_input; + // Optimization opportunity: Instead of copying and then pruning, we could + // just directly build the string from user_input. + helpers::remove_ascii_tab_or_newline(tmp_buffer); + url_data = tmp_buffer; + } else [[likely]] { + url_data = user_input; + } + + // Leading and trailing control characters are uncommon and easy to deal with + // (no performance concern). + helpers::trim_c0_whitespace(url_data); + if constexpr (result_type_is_ada_url_aggregator && store_values) { // Most of the time, we just need user_input.size(). // In some instances, we may need a bit more. @@ -13258,25 +10466,10 @@ result_type parse_url_impl(std::string_view user_input, uint32_t reserve_capacity = (0xFFFFFFFF >> helpers::leading_zeroes(uint32_t(1 | user_input.size()))) + - 1; - url.reserve(reserve_capacity); - } - std::string tmp_buffer; - std::string_view url_data; - if (unicode::has_tabs_or_newline(user_input)) [[unlikely]] { - tmp_buffer = user_input; - // Optimization opportunity: Instead of copying and then pruning, we could - // just directly build the string from user_input. - helpers::remove_ascii_tab_or_newline(tmp_buffer); - url_data = tmp_buffer; - } else [[likely]] { - url_data = user_input; + 1; + url.reserve(reserve_capacity); } - // Leading and trailing control characters are uncommon and easy to deal with - // (no performance concern). - helpers::trim_c0_whitespace(url_data); - // Optimization opportunity. Most websites do not have fragment. std::optional fragment = helpers::prune_hash(url_data); // We add it last so that an implementation like ada::url_aggregator @@ -13339,6 +10532,7 @@ result_type parse_url_impl(std::string_view user_input, ada_log("SCHEME the scheme is ", url.get_protocol()); // If url's scheme is "file", then: + // NOLINTNEXTLINE(bugprone-branch-clone) if (url.type == scheme::type::FILE) { // Set state to file state. state = state::FILE; @@ -13382,10 +10576,14 @@ result_type parse_url_impl(std::string_view user_input, } case state::NO_SCHEME: { ada_log("NO_SCHEME ", helpers::substring(url_data, input_position)); + // The fragment was pruned from url_data before the state machine ran, + // so 'c is U+0023 (#)' holds exactly when a fragment was found and + // nothing else remains in front of it. + const bool c_is_hash = + fragment.has_value() && input_position == input_size; // If base is null, or base has an opaque path and c is not U+0023 (#), // validation error, return failure. - if (base_url == nullptr || - (base_url->has_opaque_path && !fragment.has_value())) { + if (base_url == nullptr || (base_url->has_opaque_path && !c_is_hash)) { ada_log("NO_SCHEME validation error"); url.is_valid = false; return url; @@ -13393,8 +10591,7 @@ result_type parse_url_impl(std::string_view user_input, // Otherwise, if base has an opaque path and c is U+0023 (#), // set url's scheme to base's scheme, url's path to base's path, url's // query to base's query, and set state to fragment state. - else if (base_url->has_opaque_path && fragment.has_value() && - input_position == input_size) { + else if (base_url->has_opaque_path && c_is_hash) { ada_log("NO_SCHEME opaque base with fragment"); url.copy_scheme(*base_url); url.has_opaque_path = base_url->has_opaque_path; @@ -13417,6 +10614,7 @@ result_type parse_url_impl(std::string_view user_input, } // Otherwise, if base's scheme is not "file", set state to relative // state and decrease pointer by 1. + // NOLINTNEXTLINE(bugprone-branch-clone) else if (base_url->type != scheme::type::FILE) { ada_log("NO_SCHEME non-file relative path"); state = state::RELATIVE_SCHEME; @@ -13677,6 +10875,7 @@ result_type parse_url_impl(std::string_view user_input, helpers::substring(url_data, input_position)); // If url is special and c is U+002F (/) or U+005C (\), then: + // NOLINTNEXTLINE(bugprone-branch-clone) if (url.is_special() && (input_position != input_size) && (url_data[input_position] == '/' || url_data[input_position] == '\\')) { @@ -13818,6 +11017,17 @@ result_type parse_url_impl(std::string_view user_input, } case state::OPAQUE_PATH: { ada_log("OPAQUE_PATH ", helpers::substring(url_data, input_position)); + // Opaque path, query, and fragment are structurally always valid: + // the parser would just percent-encode whatever is there. When we + // are not storing values (can_parse), we can return immediately. + // We must set has_opaque_path = true before returning so that when + // this URL is used as an internal base inside can_parse, NO_SCHEME + // correctly rejects relative inputs against an opaque-path base + // (e.g. can_parse("", &"W:") must return false). + if constexpr (!store_values) { + url.has_opaque_path = true; + return url; + } std::string_view view = url_data.substr(input_position); // If c is U+003F (?), then set url's query to the empty string and // state to query state. @@ -13856,6 +11066,13 @@ result_type parse_url_impl(std::string_view user_input, } case state::PATH_START: { ada_log("PATH_START ", helpers::substring(url_data, input_position)); + // Path, query, and fragment are structurally always valid: the + // parser would just percent-encode whatever is there. When we are + // not storing values (can_parse), we can return immediately since + // no subsequent state can invalidate the URL. + if constexpr (!store_values) { + return url; + } // If url is special, then: if (url.is_special()) { @@ -13903,6 +11120,13 @@ result_type parse_url_impl(std::string_view user_input, } case state::PATH: { ada_log("PATH ", helpers::substring(url_data, input_position)); + // Path, query, and fragment are structurally always valid: the + // parser would just percent-encode whatever is there. When we are + // not storing values (can_parse), we can return immediately since + // no subsequent state can invalidate the URL. + if constexpr (!store_values) { + return url; + } std::string_view view = url_data.substr(input_position); // Most time, we do not need percent encoding. @@ -13986,9 +11210,8 @@ result_type parse_url_impl(std::string_view user_input, std::string_view view = url_data.substr(input_position); size_t location = view.find_first_of("/\\?"); - std::string_view file_host_buffer( - view.data(), - (location != std::string_view::npos) ? location : view.size()); + std::string_view file_host_buffer = view.substr( + 0, (location != std::string_view::npos) ? location : view.size()); if (checkers::is_windows_drive_letter(file_host_buffer)) { state = state::PATH; @@ -14120,12 +11343,30 @@ result_type parse_url_impl(std::string_view user_input, url.update_unencoded_base_hash(*fragment); } } + // Check the resulting (normalized) URL size against the maximum input length. + // Normalization (percent-encoding, IDNA, etc.) can expand the URL beyond the + // original input size. + if constexpr (store_values) { + if (url.is_valid) { + if constexpr (result_type_is_ada_url_aggregator) { + if (url.buffer.size() > max_input_length) { + url.is_valid = false; + } + } else { + if (url.get_href_size() > max_input_length) { + url.is_valid = false; + } + } + } + } return url; } -template url parse_url_impl(std::string_view user_input, - const url* base_url = nullptr); -template url_aggregator parse_url_impl( +template url parse_url_impl(std::string_view user_input, + const url* base_url = nullptr); +template url_aggregator parse_url_impl( + std::string_view user_input, const url_aggregator* base_url = nullptr); +template url_aggregator parse_url_impl( std::string_view user_input, const url_aggregator* base_url = nullptr); template @@ -14192,11 +11433,32 @@ namespace ada { /* end file src/url_components.cpp */ /* begin file src/url_aggregator.cpp */ +#include +#include +#include #include #include #include #include +namespace { + +ada_really_inline void apply_shifted_non_scheme_offsets( + ada::url_components& components, uint32_t new_difference) { + components.username_end += new_difference; + components.host_start += new_difference; + components.host_end += new_difference; + components.pathname_start += new_difference; + if (components.search_start != ada::url_components::omitted) { + components.search_start += new_difference; + } + if (components.hash_start != ada::url_components::omitted) { + components.hash_start += new_difference; + } +} + +} // namespace + namespace ada { template [[nodiscard]] ada_really_inline bool url_aggregator::parse_scheme_with_colon( @@ -14242,10 +11504,12 @@ template // This is uncommon. uint16_t urls_scheme_port = get_special_port(); - // If url's port is url's scheme's default port, then set url's port to - // null. - if (components.port == urls_scheme_port) { - clear_port(); + if (urls_scheme_port) { + // If url's port is url's scheme's default port, then set url's port to + // null. + if (components.port == urls_scheme_port) { + clear_port(); + } } } } else { // slow path @@ -14256,25 +11520,30 @@ template unicode::to_lower_ascii(_buffer.data(), _buffer.size()); if constexpr (has_state_override) { + // The state-override validation errors below ("return" in the WHATWG URL + // parser) leave the URL unchanged. The setter contract is + // "true on success, false if the scheme is invalid" -- the fast path + // above already returns false here, so the slow path must agree. + // If url's scheme is a special scheme and buffer is not a special scheme, // then return. If url's scheme is not a special scheme and buffer is a // special scheme, then return. if (is_special() != ada::scheme::is_special(_buffer)) { - return true; + return false; } // If url includes credentials or has a non-null port, and buffer is // "file", then return. if ((has_credentials() || components.port != url_components::omitted) && _buffer == "file") { - return true; + return false; } // If url's scheme is "file" and its host is an empty host, then return. // An empty host is the empty string. if (type == ada::scheme::type::FILE && components.host_start == components.host_end) { - return true; + return false; } } @@ -14284,10 +11553,12 @@ template // This is uncommon. uint16_t urls_scheme_port = get_special_port(); - // If url's port is url's scheme's default port, then set url's port to - // null. - if (components.port == urls_scheme_port) { - clear_port(); + if (urls_scheme_port) { + // If url's port is url's scheme's default port, then set url's port to + // null. + if (components.port == urls_scheme_port) { + clear_port(); + } } } } @@ -14301,6 +11572,7 @@ inline void url_aggregator::copy_scheme(const url_aggregator& u) { // next line could overflow but unsigned arithmetic has well-defined // overflows. uint32_t new_difference = u.components.protocol_end - components.protocol_end; + type = u.type; buffer.erase(0, components.protocol_end); buffer.insert(0, u.get_protocol()); @@ -14311,17 +11583,7 @@ inline void url_aggregator::copy_scheme(const url_aggregator& u) { return; } - // Update the rest of the components. - components.username_end += new_difference; - components.host_start += new_difference; - components.host_end += new_difference; - components.pathname_start += new_difference; - if (components.search_start != url_components::omitted) { - components.search_start += new_difference; - } - if (components.hash_start != url_components::omitted) { - components.hash_start += new_difference; - } + apply_shifted_non_scheme_offsets(components, new_difference); ADA_ASSERT_TRUE(validate()); } @@ -14345,17 +11607,7 @@ inline void url_aggregator::set_scheme_from_view_with_colon( } components.protocol_end += new_difference; - // Update the rest of the components. - components.username_end += new_difference; - components.host_start += new_difference; - components.host_end += new_difference; - components.pathname_start += new_difference; - if (components.search_start != url_components::omitted) { - components.search_start += new_difference; - } - if (components.hash_start != url_components::omitted) { - components.hash_start += new_difference; - } + apply_shifted_non_scheme_offsets(components, new_difference); ADA_ASSERT_TRUE(validate()); } @@ -14377,17 +11629,7 @@ inline void url_aggregator::set_scheme(std::string_view new_scheme) { } components.protocol_end = uint32_t(new_scheme.size() + 1); - // Update the rest of the components. - components.username_end += new_difference; - components.host_start += new_difference; - components.host_end += new_difference; - components.pathname_start += new_difference; - if (components.search_start != url_components::omitted) { - components.search_start += new_difference; - } - if (components.hash_start != url_components::omitted) { - components.hash_start += new_difference; - } + apply_shifted_non_scheme_offsets(components, new_difference); ADA_ASSERT_TRUE(validate()); } @@ -14412,8 +11654,14 @@ bool url_aggregator::set_protocol(const std::string_view input) { std::ranges::find_if_not(view, unicode::is_alnum_plus); if (pointer != view.end() && *pointer == ':') { - return parse_scheme_with_colon( + url_aggregator saved_url(*this); + bool result = parse_scheme_with_colon( view.substr(0, pointer - view.begin() + 1)); + if (result && buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } + return result; } return false; } @@ -14425,6 +11673,7 @@ bool url_aggregator::set_username(const std::string_view input) { if (cannot_have_credentials_or_port()) { return false; } + url_aggregator saved_url(*this); size_t idx = ada::unicode::percent_encode_index( input, character_sets::USERINFO_PERCENT_ENCODE); if (idx == input.size()) { @@ -14434,6 +11683,10 @@ bool url_aggregator::set_username(const std::string_view input) { update_base_username(ada::unicode::percent_encode( input, character_sets::USERINFO_PERCENT_ENCODE, idx)); } + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } ADA_ASSERT_TRUE(validate()); return true; } @@ -14445,6 +11698,7 @@ bool url_aggregator::set_password(const std::string_view input) { if (cannot_have_credentials_or_port()) { return false; } + url_aggregator saved_url(*this); size_t idx = ada::unicode::percent_encode_index( input, character_sets::USERINFO_PERCENT_ENCODE); if (idx == input.size()) { @@ -14454,6 +11708,10 @@ bool url_aggregator::set_password(const std::string_view input) { update_base_password(ada::unicode::percent_encode( input, character_sets::USERINFO_PERCENT_ENCODE, idx)); } + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } ADA_ASSERT_TRUE(validate()); return true; } @@ -14490,12 +11748,16 @@ bool url_aggregator::set_port(const std::string_view input) { std::string_view(trimmed.data(), first_non_digit - trimmed.begin()); // Revert changes if parse_port fails. - uint32_t previous_port = components.port; + url_aggregator saved_url(*this); parse_port(digits_to_parse); if (is_valid) { + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } return true; } - update_base_port(previous_port); + *this = std::move(saved_url); is_valid = true; ADA_ASSERT_TRUE(validate()); return false; @@ -14508,6 +11770,7 @@ bool url_aggregator::set_pathname(const std::string_view input) { if (has_opaque_path) { return false; } + url_aggregator saved_url(*this); clear_pathname(); parse_path(input); if (get_pathname().starts_with("//") && !has_authority() && !has_dash_dot()) { @@ -14520,6 +11783,10 @@ bool url_aggregator::set_pathname(const std::string_view input) { components.hash_start += 2; } } + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } ADA_ASSERT_TRUE(validate()); return true; } @@ -14583,7 +11850,12 @@ void url_aggregator::set_search(const std::string_view input) { is_special() ? ada::character_sets::SPECIAL_QUERY_PERCENT_ENCODE : ada::character_sets::QUERY_PERCENT_ENCODE; + url_aggregator saved_url(*this); update_base_search(new_value, query_percent_encode_set); + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return; + } ADA_ASSERT_TRUE(validate()); } @@ -14603,7 +11875,12 @@ void url_aggregator::set_hash(const std::string_view input) { std::string new_value; new_value = input[0] == '#' ? input.substr(1) : input; helpers::remove_ascii_tab_or_newline(new_value); + url_aggregator saved_url(*this); update_unencoded_base_hash(new_value); + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return; + } ADA_ASSERT_TRUE(validate()); } @@ -14614,6 +11891,11 @@ bool url_aggregator::set_href(const std::string_view input) { ada_log("url_aggregator::set_href, success :", out.has_value()); if (out) { + // The parser enforces get_max_input_length() on both the input and the + // normalized result. This is a defense-in-depth check. + if (out->buffer.size() > ada::get_max_input_length()) { + return false; + } ada_log("url_aggregator::set_href, parsed ", out->to_string()); // TODO: Figure out why the following line puts test to never finish. *this = *out; @@ -14670,6 +11952,7 @@ ada_really_inline bool url_aggregator::parse_host(std::string_view input) { update_base_hostname(input); } host_type = IPV4; + is_valid = true; ada_log("parse_host fast path decimal ipv4"); ADA_ASSERT_TRUE(validate()); return true; @@ -14683,8 +11966,9 @@ ada_really_inline bool url_aggregator::parse_host(std::string_view input) { // could also check whether x and n and - are present, and so we could skip // some of the checks below. However, the gains are likely to be small, and // the code would be more complex. + static constexpr std::string_view xn_dash{"xn-", 3}; if (is_forbidden_or_upper == 0 && - input.find("xn-") == std::string_view::npos) { + input.find(xn_dash) == std::string_view::npos) { // fast path update_base_hostname(input); @@ -14694,6 +11978,7 @@ ada_really_inline bool url_aggregator::parse_host(std::string_view input) { return parse_ipv4(get_hostname(), true); } ada_log("parse_host fast path ", get_hostname()); + is_valid = true; return true; } // We have encountered at least one forbidden code point or the input contains @@ -14736,8 +12021,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { return false; } - std::string previous_host(get_hostname()); - uint32_t previous_port = components.port; + url_aggregator saved_url(*this); size_t host_end_pos = input.find('#'); std::string _host(input.data(), host_end_pos != std::string_view::npos @@ -14746,6 +12030,14 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { helpers::remove_ascii_tab_or_newline(_host); std::string_view new_host(_host); + auto check_url_size = [&]() -> bool { + if (buffer.size() > ada::get_max_input_length()) { + *this = std::move(saved_url); + return false; + } + return true; + }; + // If url's scheme is "file", then set state to file host state, instead of // host state. if (type != ada::scheme::type::FILE) { @@ -14773,9 +12065,13 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { // Let host be the result of host parsing buffer with url is not special. bool succeeded = parse_host(host_buffer); if (!succeeded) { - update_base_hostname(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; + } else if (has_dash_dot()) { + // The url now has a non-null host, so the "/." that guarded a + // leading "//" path is no longer needed. Drop it before the port is + // inserted at host_end, otherwise it stays wedged in the path. + delete_dash_dot(); } // Set url's host to host, buffer to the empty string, and state to port @@ -14784,7 +12080,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { if (!port_buffer.empty()) { set_port(port_buffer); } - return true; + return check_url_size(); } // Otherwise, if one of the following is true: // - c is the EOF code point, U+002F (/), U+003F (?), or U+0023 (#) @@ -14811,20 +12107,23 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { } else if (has_dash_dot()) { add_authority_slashes_if_needed(); delete_dash_dot(); + } else { + // The url has no authority yet (e.g. "foo:/bar"); setting an empty + // host must still give it an (empty) authority, matching ada::url. + add_authority_slashes_if_needed(); } - return true; + return check_url_size(); } bool succeeded = parse_host(host_view); if (!succeeded) { - update_base_hostname(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } else if (has_dash_dot()) { // Should remove dash_dot from pathname delete_dash_dot(); } - return true; + return check_url_size(); } } @@ -14839,8 +12138,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { } else { // Let host be the result of host parsing buffer with url is not special. if (!parse_host(new_host)) { - update_base_hostname(previous_host); - update_base_port(previous_port); + *this = std::move(saved_url); return false; } @@ -14851,7 +12149,7 @@ bool url_aggregator::set_host_or_hostname(const std::string_view input) { } } ADA_ASSERT_TRUE(validate()); - return true; + return check_url_size(); } bool url_aggregator::set_host(const std::string_view input) { @@ -15094,7 +12392,14 @@ bool url_aggregator::set_hostname(const std::string_view input) { if (components.host_start == components.host_end) { return false; } - return checkers::verify_dns_length(get_hostname()); + // Avoid allocation: construct a string_view directly into the buffer. + size_t start = components.host_start; + if (components.host_end > components.host_start && + buffer[components.host_start] == '@') { + start++; + } + return checkers::verify_dns_length( + std::string_view(buffer.data() + start, components.host_end - start)); } bool url_aggregator::parse_ipv4(std::string_view input, bool in_place) { @@ -15102,91 +12407,70 @@ bool url_aggregator::parse_ipv4(std::string_view input, bool in_place) { " bytes], overlaps with buffer: ", helpers::overlaps(input, buffer) ? "yes" : "no"); ADA_ASSERT_TRUE(validate()); + if (input.empty()) { + return is_valid = false; + } const bool trailing_dot = (input.back() == '.'); if (trailing_dot) { input.remove_suffix(1); + if (input.empty()) { + return is_valid = false; + } } - size_t digit_count{0}; - int pure_decimal_count = 0; // entries that are decimal - uint64_t ipv4{0}; - // we could unroll for better performance? - for (; (digit_count < 4) && !(input.empty()); digit_count++) { - uint32_t - segment_result{}; // If any number exceeds 32 bits, we have an error. - bool is_hex = checkers::has_hex_prefix(input); - if (is_hex && ((input.length() == 2) || - ((input.length() > 2) && (input[2] == '.')))) { - // special case - segment_result = 0; - input.remove_prefix(2); - } else { - std::from_chars_result r{}; - if (is_hex) { - ada_log("parse_ipv4 trying to parse hex number"); - r = std::from_chars(input.data() + 2, input.data() + input.size(), - segment_result, 16); - } else if ((input.length() >= 2) && input[0] == '0' && - checkers::is_digit(input[1])) { - ada_log("parse_ipv4 trying to parse octal number"); - r = std::from_chars(input.data() + 1, input.data() + input.size(), - segment_result, 8); - } else { - ada_log("parse_ipv4 trying to parse decimal number"); - pure_decimal_count++; - r = std::from_chars(input.data(), input.data() + input.size(), - segment_result, 10); - } - if (r.ec != std::errc()) { - ada_log("parse_ipv4 parsing failed"); - return is_valid = false; - } - ada_log("parse_ipv4 parsed ", segment_result); - input.remove_prefix(r.ptr - input.data()); + + const uint64_t fast = checkers::try_parse_ipv4_fast(input); + if (fast < checkers::ipv4_fast_fail) [[likely]] { + // Pure decimal: keep the buffer when it already holds the address. + // Otherwise write the (trailing-dot-stripped) input. + if (!(in_place && !trailing_dot)) { + update_base_hostname(input); } - if (input.empty()) { - // We have the last value. - // At this stage, ipv4 contains digit_count*8 bits. - // So we have 32-digit_count*8 bits left. - if (segment_result >= (uint64_t(1) << (32 - digit_count * 8))) { - return is_valid = false; - } - ipv4 <<= (32 - digit_count * 8); - ipv4 |= segment_result; - goto final; - } else { - // There is more, so that the value must no be larger than 255 - // and we must have a '.'. - if ((segment_result > 255) || (input[0] != '.')) { + host_type = IPV4; + ADA_ASSERT_TRUE(validate()); + return true; + } + + const char* p = input.data(); + const char* end = p + input.size(); + uint64_t ipv4 = 0; + int digit_count = 0; + int pure_decimal_count = 0; + + for (; digit_count < 4 && p < end; ++digit_count) { + uint64_t segment = 0; + bool pure = false; + if (!detail::parse_ipv4_number(p, end, segment, pure)) { + return is_valid = false; + } + if (pure) { + ++pure_decimal_count; + } + if (p >= end) { + const unsigned shift = static_cast(32 - digit_count * 8); + if (segment >= (uint64_t{1} << shift)) { return is_valid = false; } - ipv4 <<= 8; - ipv4 |= segment_result; - input.remove_prefix(1); // remove '.' + ipv4 = (ipv4 << shift) | segment; + goto ipv4_done; + } + if (segment > 255 || *p != '.') { + return is_valid = false; } + ipv4 = (ipv4 << 8) | segment; + ++p; } - if ((digit_count != 4) || (!input.empty())) { - ada_log("parse_ipv4 found invalid (more than 4 numbers or empty) "); + if (digit_count != 4 || p != end) { return is_valid = false; } -final: +ipv4_done: ada_log("url_aggregator::parse_ipv4 completed ", get_href(), " host: ", get_host()); - - // We could also check r.ptr to see where the parsing ended. if (in_place && pure_decimal_count == 4 && !trailing_dot) { ada_log( "url_aggregator::parse_ipv4 completed and was already correct in the " "buffer"); - // The original input was already all decimal and we validated it. So we - // don't need to do anything. } else { - ada_log("url_aggregator::parse_ipv4 completed and we need to update it"); - // Optimization opportunity: Get rid of unnecessary string return in ipv4 - // serializer. - // TODO: This is likely a bug because it goes back update_base_hostname, not - // what we want to do. - update_base_hostname( - ada::serializers::ipv4(ipv4)); // We have to reserialize the address. + update_base_hostname(ada::serializers::ipv4(ipv4)); } host_type = IPV4; ADA_ASSERT_TRUE(validate()); @@ -15194,237 +12478,143 @@ bool url_aggregator::parse_ipv4(std::string_view input, bool in_place) { } bool url_aggregator::parse_ipv6(std::string_view input) { - // TODO: Implement in_place optimization: we know that input points - // in the buffer, so we can just check whether the buffer is already - // well formatted. - // TODO: Find a way to merge parse_ipv6 with url.cpp implementation. ada_log("parse_ipv6 ", input, " [", input.size(), " bytes]"); ADA_ASSERT_TRUE(validate()); ADA_ASSERT_TRUE(!helpers::overlaps(input, buffer)); - if (input.empty()) { + if (input.empty() || input.size() > 45) [[unlikely]] { return is_valid = false; } - // Let address be a new IPv6 address whose IPv6 pieces are all 0. - std::array address{}; +#if defined(ADA_AVX512) + if (!detail::ipv6_structure_plausible(input.data(), input.size())) + [[unlikely]] { + return is_valid = false; + } +#endif - // Let pieceIndex be 0. + std::array address{}; + const char* pointer = input.data(); + const char* const end = pointer + input.size(); int piece_index = 0; + int compress = -1; - // Let compress be null. - std::optional compress{}; - - // Let pointer be a pointer for input. - std::string_view::iterator pointer = input.begin(); - - // If c is U+003A (:), then: - if (input[0] == ':') { - // If remaining does not start with U+003A (:), validation error, return - // failure. - if (input.size() == 1 || input[1] != ':') { - ada_log("parse_ipv6 starts with : but the rest does not start with :"); + if (*pointer == ':') { + if (input.size() == 1 || pointer[1] != ':') [[unlikely]] { return is_valid = false; } - - // Increase pointer by 2. pointer += 2; - - // Increase pieceIndex by 1 and then set compress to pieceIndex. compress = ++piece_index; } - // While c is not the EOF code point: - while (pointer != input.end()) { - // If pieceIndex is 8, validation error, return failure. - if (piece_index == 8) { - ada_log("parse_ipv6 piece_index == 8"); + while (pointer != end) { + if (piece_index == 8) [[unlikely]] { return is_valid = false; } - - // If c is U+003A (:), then: if (*pointer == ':') { - // If compress is non-null, validation error, return failure. - if (compress.has_value()) { - ada_log("parse_ipv6 compress is non-null"); + if (compress != -1) [[unlikely]] { return is_valid = false; } - - // Increase pointer and pieceIndex by 1, set compress to pieceIndex, and - // then continue. - pointer++; + ++pointer; compress = ++piece_index; continue; } - // Let value and length be 0. - uint16_t value = 0, length = 0; - - // While length is less than 4 and c is an ASCII hex digit, - // set value to value times 0x10 + c interpreted as hexadecimal number, and - // increase pointer and length by 1. - while (length < 4 && pointer != input.end() && - unicode::is_ascii_hex_digit(*pointer)) { - // https://stackoverflow.com/questions/39060852/why-does-the-addition-of-two-shorts-return-an-int - value = uint16_t(value * 0x10 + unicode::convert_hex_to_binary(*pointer)); - pointer++; - length++; - } + uint16_t value = 0; + const int length = detail::parse_hex_piece(pointer, end, value); - // If c is U+002E (.), then: - if (pointer != input.end() && *pointer == '.') { - // If length is 0, validation error, return failure. - if (length == 0) { - ada_log("parse_ipv6 length is 0"); + if (pointer != end && *pointer == '.') { + if (length == 0) [[unlikely]] { return is_valid = false; } - - // Decrease pointer by length. pointer -= length; - - // If pieceIndex is greater than 6, validation error, return failure. - if (piece_index > 6) { - ada_log("parse_ipv6 piece_index > 6"); + if (piece_index > 6) [[unlikely]] { return is_valid = false; } - // Let numbersSeen be 0. int numbers_seen = 0; - - // While c is not the EOF code point: - while (pointer != input.end()) { - // Let ipv4Piece be null. - std::optional ipv4_piece{}; - - // If numbersSeen is greater than 0, then: + while (pointer != end) { + int ipv4_piece = -1; if (numbers_seen > 0) { - // If c is a U+002E (.) and numbersSeen is less than 4, then increase - // pointer by 1. if (*pointer == '.' && numbers_seen < 4) { - pointer++; + ++pointer; } else { - // Otherwise, validation error, return failure. - ada_log("parse_ipv6 Otherwise, validation error, return failure"); return is_valid = false; } } - - // If c is not an ASCII digit, validation error, return failure. - if (pointer == input.end() || !checkers::is_digit(*pointer)) { - ada_log( - "parse_ipv6 If c is not an ASCII digit, validation error, return " - "failure"); + if (pointer == end || *pointer < '0' || *pointer > '9') [[unlikely]] { return is_valid = false; } - - // While c is an ASCII digit: - while (pointer != input.end() && checkers::is_digit(*pointer)) { - // Let number be c interpreted as decimal number. - int number = *pointer - '0'; - - // If ipv4Piece is null, then set ipv4Piece to number. - if (!ipv4_piece.has_value()) { - ipv4_piece = number; - } - // Otherwise, if ipv4Piece is 0, validation error, return failure. - else if (ipv4_piece == 0) { - ada_log("parse_ipv6 if ipv4Piece is 0, validation error"); + ipv4_piece = *pointer - '0'; + ++pointer; + if (pointer != end && *pointer >= '0' && *pointer <= '9') { + if (ipv4_piece == 0) [[unlikely]] { return is_valid = false; } - // Otherwise, set ipv4Piece to ipv4Piece times 10 + number. - else { - ipv4_piece = *ipv4_piece * 10 + number; - } - - // If ipv4Piece is greater than 255, validation error, return failure. - if (ipv4_piece > 255) { - ada_log("parse_ipv6 ipv4_piece > 255"); - return is_valid = false; + ipv4_piece = ipv4_piece * 10 + (*pointer - '0'); + ++pointer; + if (pointer != end && *pointer >= '0' && *pointer <= '9') { + ipv4_piece = ipv4_piece * 10 + (*pointer - '0'); + ++pointer; + if (ipv4_piece > 255) [[unlikely]] { + return is_valid = false; + } } - - // Increase pointer by 1. - pointer++; } - - // Set address[pieceIndex] to address[pieceIndex] times 0x100 + - // ipv4Piece. - // https://stackoverflow.com/questions/39060852/why-does-the-addition-of-two-shorts-return-an-int - address[piece_index] = - uint16_t(address[piece_index] * 0x100 + *ipv4_piece); - - // Increase numbersSeen by 1. - numbers_seen++; - - // If numbersSeen is 2 or 4, then increase pieceIndex by 1. + address[static_cast(piece_index)] = static_cast( + address[static_cast(piece_index)] * 0x100 + + static_cast(ipv4_piece)); + ++numbers_seen; if (numbers_seen == 2 || numbers_seen == 4) { - piece_index++; + ++piece_index; } } - - // If numbersSeen is not 4, validation error, return failure. - if (numbers_seen != 4) { + if (numbers_seen != 4) [[unlikely]] { return is_valid = false; } - - // Break. break; } - // Otherwise, if c is U+003A (:): - else if ((pointer != input.end()) && (*pointer == ':')) { - // Increase pointer by 1. - pointer++; - // If c is the EOF code point, validation error, return failure. - if (pointer == input.end()) { - ada_log( - "parse_ipv6 If c is the EOF code point, validation error, return " - "failure"); + if (length == 0) [[unlikely]] { + return is_valid = false; + } + + if (pointer != end && *pointer == ':') { + ++pointer; + if (pointer == end) [[unlikely]] { return is_valid = false; } - } - // Otherwise, if c is not the EOF code point, validation error, return - // failure. - else if (pointer != input.end()) { - ada_log( - "parse_ipv6 Otherwise, if c is not the EOF code point, validation " - "error, return failure"); + } else if (pointer != end) [[unlikely]] { return is_valid = false; } - // Set address[pieceIndex] to value. - address[piece_index] = value; - - // Increase pieceIndex by 1. - piece_index++; + address[static_cast(piece_index)] = value; + ++piece_index; } - // If compress is non-null, then: - if (compress.has_value()) { - // Let swaps be pieceIndex - compress. - int swaps = piece_index - *compress; - - // Set pieceIndex to 7. - piece_index = 7; - - // While pieceIndex is not 0 and swaps is greater than 0, - // swap address[pieceIndex] with address[compress + swaps - 1], and then - // decrease both pieceIndex and swaps by 1. - while (piece_index != 0 && swaps > 0) { - std::swap(address[piece_index], address[*compress + swaps - 1]); - piece_index--; - swaps--; + if (compress != -1) { + const int right = piece_index - compress; + if (right > 0) { + const size_t dest = static_cast(8 - right); + const size_t src = static_cast(compress); + if (dest != src) { + for (size_t i = static_cast(right); i-- > 0;) { + address[dest + i] = address[src + i]; + address[src + i] = 0; + } + } } - } - // Otherwise, if compress is null and pieceIndex is not 8, validation error, - // return failure. - else if (piece_index != 8) { - ada_log( - "parse_ipv6 if compress is null and pieceIndex is not 8, validation " - "error, return failure"); + } else if (piece_index != 8) [[unlikely]] { return is_valid = false; } - // TODO: Optimization opportunity: Get rid of unnecessary string creation. - // TODO: This is likely a bug because it goes back update_base_hostname, not - // what we want to do. - update_base_hostname(ada::serializers::ipv6(address)); + + // Serialize once; skip rewrite when hostname is already canonical. + const std::string serialized = ada::serializers::ipv6(address); + const std::string_view current = get_hostname(); + if (current.size() == serialized.size() && + std::memcmp(current.data(), serialized.data(), serialized.size()) == 0) { + ada_log("parse_ipv6 in-place canonical match"); + } else { + update_base_hostname(serialized); + } ada_log("parse_ipv6 ", get_hostname()); ADA_ASSERT_TRUE(validate()); host_type = IPV6; @@ -15928,22 +13118,28 @@ tl::expected url_pattern_init::process( // "search", then: if (!init.protocol && !init.hostname && !init.port && !init.pathname && !init.search) { - // Let baseQuery be baseURL's query. + // Let baseQuery be baseURL's query. get_search() carries the leading "?" + // delimiter, but the spec inherits the query itself, so drop it. + std::string_view base_query = base_url->get_search(); + if (base_query.starts_with("?")) base_query.remove_prefix(1); // Set result["search"] to the result of processing a base URL string // given baseQuery and type. - result.search = url_pattern_helpers::process_base_url_string( - base_url->get_search(), type); + result.search = + url_pattern_helpers::process_base_url_string(base_query, type); } // If init contains none of "protocol", "hostname", "port", "pathname", // "search", and "hash", then: if (!init.protocol && !init.hostname && !init.port && !init.pathname && !init.search && !init.hash) { - // Let baseFragment be baseURL's fragment. + // Let baseFragment be baseURL's fragment. get_hash() carries the leading + // "#" delimiter, but the spec inherits the fragment itself, so drop it. + std::string_view base_fragment = base_url->get_hash(); + if (base_fragment.starts_with("#")) base_fragment.remove_prefix(1); // Set result["hash"] to the result of processing a base URL string given // baseFragment and type. - result.hash = url_pattern_helpers::process_base_url_string( - base_url->get_hash(), type); + result.hash = + url_pattern_helpers::process_base_url_string(base_fragment, type); } } @@ -16496,13 +13692,21 @@ tl::expected canonicalize_hostname( return ""; } - // Fast path: simple hostnames (lowercase ASCII, digits, -, .) need no IDNA + // Fast path: simple hostnames (lowercase ASCII, digits, -, .) need no IDNA. + // The simple character set also covers IPv4-shaped hosts, which the slow + // path rewrites ("0" -> "0.0.0.0", "0x7f.1" -> "127.0.0.1"). Exclude those + // so the fast path can't return a non-canonical hostname. + // + // Pure-ASCII "xn--" labels are intentionally left on the fast path: with + // beStrict=false, domain-to-ASCII returns the lowercased ASCII input even + // when Unicode ToASCII would fail (e.g. invalid ACE "xn--a"). See + // https://url.spec.whatwg.org/#concept-domain-to-ascii bool needs_processing = false; for (char c : input) { needs_processing |= !(char_class_table[static_cast(c)] & CHAR_SIMPLE_HOSTNAME); } - if (!needs_processing) { + if (!needs_processing && !checkers::is_ipv4(input)) { return std::string(input); } @@ -16566,8 +13770,18 @@ tl::expected canonicalize_port( std::string_view digits_to_parse = std::string_view(trimmed.data(), first_non_digit - trimmed.begin()); - // Here we have that a range of ASCII digit characters identified - // by digits_to_parse. It is none empty. + // Here we have a range of ASCII digit characters identified by + // digits_to_parse. It is non-empty. The port state of the URL parser reads + // it as an integer, so leading zeros are part of the number: "0080" is 80 + // and "065535" is 65535, not a six-digit overflow. Only the significant + // digits count toward the 5-digit maximum, matching the fast path in + // implementation.cpp. + size_t first_significant = digits_to_parse.find_first_not_of('0'); + if (first_significant == std::string_view::npos) { + // The value is all zeros, i.e. port 0. + return "0"; + } + digits_to_parse.remove_prefix(first_significant); // We want to determine whether it is a valid port number (0-65535). // Clearly, if the length is greater than 5, it is invalid. // If the length is 5, we need to compare lexicographically to "65535". @@ -16579,10 +13793,6 @@ tl::expected canonicalize_port( } else if (digits_to_parse.size() > 5) { return tl::unexpected(errors::type_error); } - if (digits_to_parse[0] == '0' && digits_to_parse.size() > 1) { - // Leading zeros are not allowed for multi-digit ports - return tl::unexpected(errors::type_error); - } // It is valid! Most times, we do not need to parse it into an integer. return std::string(digits_to_parse); } @@ -16622,6 +13832,7 @@ tl::expected canonicalize_port_with_protocol( // Parse the port number uint16_t parsed_port{}; + // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage) auto result = std::from_chars(digits_to_parse.data(), digits_to_parse.data() + digits_to_parse.size(), parsed_port); @@ -16668,25 +13879,33 @@ tl::expected canonicalize_pathname( const bool leading_slash = input.starts_with("/"); // Let modified value be "/-" if leading slash is false and otherwise the // empty string. - const auto modified_value = leading_slash ? "" : "/-"; - const auto full_url = - std::string("fake://fake-url") + modified_value + std::string(input); - if (auto url = ada::parse(full_url, nullptr)) { - const auto pathname = url->get_pathname(); - // If leading slash is false, then set result to the code point substring - // from 2 to the end of the string within result. - if (!leading_slash) { - // pathname should start with "/-" but path traversal (e.g. "../../") - // can reduce it to just "/" which is shorter than 2 characters. - if (pathname.size() < 2) { - return tl::unexpected(errors::type_error); - } - return std::string(pathname.substr(2)); + const auto modified_value = + (leading_slash ? std::string() : std::string("/-")) + std::string(input); + // The spec runs the basic URL parser with the path in state override, where + // '?' and '#' are ordinary path code points (percent-encoded) and leading or + // trailing C0 control or space is kept. Building a full URL string and + // parsing it (no state override) instead let '?' and '#' start the + // query/fragment, so the pathname was silently truncated at the first literal + // '?' or '#'. set_pathname runs the parser in path state override, matching + // how canonicalize_hostname uses set_hostname. + auto url = ada::parse("fake://fake-url", nullptr); + ADA_ASSERT_TRUE(url); + if (!url->set_pathname(modified_value)) { + // If parseResult is failure, then throw a TypeError. + return tl::unexpected(errors::type_error); + } + const auto pathname = url->get_pathname(); + // If leading slash is false, then set result to the code point substring + // from 2 to the end of the string within result. + if (!leading_slash) { + // pathname should start with "/-" but path traversal (e.g. "../../") + // can reduce it to just "/" which is shorter than 2 characters. + if (pathname.size() < 2) { + return tl::unexpected(errors::type_error); } - return std::string(pathname); + return std::string(pathname.substr(2)); } - // If parseResult is failure, then throw a TypeError. - return tl::unexpected(errors::type_error); + return std::string(pathname); } tl::expected canonicalize_opaque_pathname( @@ -16713,9 +13932,10 @@ tl::expected canonicalize_search(std::string_view input) { if (input.empty()) [[unlikely]] { return ""; } - // Remove leading '?' if present - std::string new_value; - new_value = input[0] == '?' ? input.substr(1) : input; + // A leading '?' is a valid query code point here: it is the caller (process a + // search) that removes a single delimiter, not this step, which mirrors the + // basic URL parser's query state. + std::string new_value(input); // Remove ASCII tab or newline characters helpers::remove_ascii_tab_or_newline(new_value); @@ -16742,9 +13962,10 @@ tl::expected canonicalize_hash(std::string_view input) { if (input.empty()) [[unlikely]] { return ""; } - // Remove leading '#' if present - std::string new_value; - new_value = input[0] == '#' ? input.substr(1) : input; + // A leading '#' is a valid fragment code point here: it is the caller + // (process a hash) that removes a single delimiter, not this step, which + // mirrors the basic URL parser's fragment state. + std::string new_value(input); // Remove ASCII tab or newline characters helpers::remove_ascii_tab_or_newline(new_value); @@ -16777,6 +13998,16 @@ tl::expected, errors> tokenize(std::string_view input, // index. tokenizer.seek_and_get_next_code_point(tokenizer.index); + // Malformed UTF-8 must not stall tokenization: report an invalid-char + // token (lenient) or fail fast (strict), while always making progress. + if (tokenizer.had_invalid_code_point()) { + if (auto error = tokenizer.process_tokenizing_error(tokenizer.next_index, + tokenizer.index)) { + return tl::unexpected(*error); + } + continue; + } + // If tokenizer's code point is U+002A (*): if (tokenizer.code_point == '*') { // Run add a token with default position and length given tokenizer and @@ -16815,6 +14046,13 @@ tl::expected, errors> tokenize(std::string_view input, auto escaped_index = tokenizer.next_index; // Run get the next code point given tokenizer. tokenizer.get_next_code_point(); + if (tokenizer.had_invalid_code_point()) { + if (auto error = tokenizer.process_tokenizing_error( + tokenizer.next_index, escaped_index)) { + return tl::unexpected(*error); + } + continue; + } // Run add a token with default length given tokenizer, "escaped-char", // tokenizer's next index, and escaped index. tokenizer.add_token_with_default_length( @@ -16849,11 +14087,20 @@ tl::expected, errors> tokenize(std::string_view input, auto name_position = tokenizer.next_index; // Let name start be name position. auto name_start = name_position; + bool invalid_name = false; // While name position is less than tokenizer's input's code point length: while (name_position < tokenizer.input.size()) { // Run seek and get the next code point given tokenizer and name // position. tokenizer.seek_and_get_next_code_point(name_position); + if (tokenizer.had_invalid_code_point()) { + if (auto error = tokenizer.process_tokenizing_error( + tokenizer.next_index, name_position)) { + return tl::unexpected(*error); + } + invalid_name = true; + break; + } // Let first code point be true if name position equals name start and // false otherwise. bool first_code_point = name_position == name_start; @@ -16870,6 +14117,10 @@ tl::expected, errors> tokenize(std::string_view input, name_position = tokenizer.next_index; } + if (invalid_name) { + continue; + } + // If name position is less than or equal to name start: if (name_position <= name_start) { // Run process a tokenizing error given tokenizer, name start, and @@ -16907,6 +14158,14 @@ tl::expected, errors> tokenize(std::string_view input, // Run seek and get the next code point given tokenizer and regexp // position. tokenizer.seek_and_get_next_code_point(regexp_position); + if (tokenizer.had_invalid_code_point()) { + if (auto process_error = tokenizer.process_tokenizing_error( + tokenizer.next_index, regexp_position)) { + return tl::unexpected(*process_error); + } + error = true; + break; + } // TODO: Optimization opportunity: The next 2 if statements can be // merged. If the result of running is ASCII given tokenizer's code @@ -16952,7 +14211,16 @@ tl::expected, errors> tokenize(std::string_view input, break; } // Run get the next code point given tokenizer. + auto escaped_index = tokenizer.next_index; tokenizer.get_next_code_point(); + if (tokenizer.had_invalid_code_point()) { + if (auto process_error = tokenizer.process_tokenizing_error( + tokenizer.next_index, escaped_index)) { + return tl::unexpected(*process_error); + } + error = true; + break; + } // If the result of running is ASCII given tokenizer's code point is // false: if (!unicode::is_ascii(tokenizer.code_point)) { @@ -17004,6 +14272,14 @@ tl::expected, errors> tokenize(std::string_view input, auto temporary_position = tokenizer.next_index; // Run get the next code point given tokenizer. tokenizer.get_next_code_point(); + if (tokenizer.had_invalid_code_point()) { + if (auto process_error = tokenizer.process_tokenizing_error( + tokenizer.next_index, temporary_position)) { + return tl::unexpected(*process_error); + } + error = true; + break; + } // If tokenizer's code point is not U+003F (?): if (tokenizer.code_point != '?') { // Run process a tokenizing error given tokenizer, regexp start, and @@ -17220,8 +14496,8 @@ std::string generate_pattern_string( // point. bool needs_grouping = !part.suffix.empty() || - (!part.prefix.empty() && !options.get_prefix().empty() && - part.prefix[0] != options.get_prefix()[0]); + (!part.prefix.empty() && (options.get_prefix().empty() || + part.prefix[0] != options.get_prefix()[0])); // If all of the following are true: // - needs grouping is false; and @@ -17394,14 +14670,23 @@ std_regex_provider::regex_search(std::string_view input, return std::nullopt; } std::vector> matches; - // If input is empty, let's assume the result will be empty as well. - if (input.empty() || match_result.empty()) { + // An empty input can still match with capture groups (e.g. "(x*)" or an + // optional ":a?" against ""), so the group values must be extracted here + // just like for a non-empty input. A successful regex_search always leaves + // the full match at index 0, so match_result is never empty at this point. + if (match_result.empty()) { return matches; } matches.reserve(match_result.size()); for (size_t i = 1; i < match_result.size(); ++i) { if (auto entry = match_result[i]; entry.matched) { matches.emplace_back(entry.str()); + } else { + // A capture group that did not participate in the match is undefined, + // not absent. Emitting nullopt keeps the result aligned by position with + // the component's group name list; dropping it shifts every later group + // onto the wrong name. + matches.emplace_back(std::nullopt); } } return matches; @@ -18170,6 +15455,14 @@ bool ada_search_params_entries_iter_has_next( return (*r)->has_next(); } +void ada_set_max_input_length(uint32_t length) noexcept { + ada::set_max_input_length(length); +} + +uint32_t ada_get_max_input_length() noexcept { + return ada::get_max_input_length(); +} + typedef struct { int major; int minor; diff --git a/deps/ada/ada.h b/deps/ada/ada.h index 8f9089d2210a74..dc96fe8343080d 100644 --- a/deps/ada/ada.h +++ b/deps/ada/ada.h @@ -1,4 +1,4 @@ -/* auto-generated on 2026-03-23 17:52:13 -0400. Do not edit! */ +/* auto-generated on 2026-07-27 16:10:09 -0400. Do not edit! */ /* begin file include/ada.h */ /** * @file ada.h @@ -30,7 +30,7 @@ #define ADA_H /* begin file include/ada/ada_idna.h */ -/* auto-generated on 2026-01-30 12:00:02 -0500. Do not edit! */ +/* auto-generated on 2026-07-12 20:34:08 -0400. Do not edit! */ /* begin file include/idna.h */ #ifndef ADA_IDNA_H #define ADA_IDNA_H @@ -69,6 +69,10 @@ namespace ada::idna { void ascii_map(char* input, size_t length); // Map the characters according to IDNA, returning the empty string on error. std::u32string map(std::u32string_view input); +// Map into an existing buffer (cleared on entry). Returns false if any code +// point is disallowed. Reusing the buffer avoids repeated heap allocations +// when called in a loop over multiple labels. +bool map(std::u32string_view input, std::u32string& out); } // namespace ada::idna @@ -83,8 +87,15 @@ std::u32string map(std::u32string_view input); namespace ada::idna { +// Returns true if `input` is already in Unicode Normalization Form C. +// Requires that internal tables have been loaded (call ensure via normalize +// or map first, or this returns false if tables are unavailable). +[[nodiscard]] bool is_already_nfc(std::u32string_view input) noexcept; + // Normalize the characters according to IDNA (Unicode Normalization Form C). -void normalize(std::u32string& input); +// Returns false if the internal Unicode tables could not be loaded; in that +// case `input` is left unchanged. Skips work when the string is already NFC. +[[nodiscard]] bool normalize(std::u32string& input); } // namespace ada::idna #endif @@ -131,6 +142,24 @@ bool is_label_valid(std::u32string_view label); #include #include +/* begin file include/ada/idna/limits.h */ +#ifndef ADA_IDNA_LIMITS_H +#define ADA_IDNA_LIMITS_H + +#include + +namespace ada::idna { + +// Maximum accepted UTF-8 domain length for to_ascii / to_unicode. +// Bounds heap growth under untrusted input (DoS resistance). DNS wire limits +// are smaller; this allows long Unicode labels used in URL tests/fixtures. +inline constexpr size_t max_domain_input_bytes = 16384; + +} // namespace ada::idna + +#endif // ADA_IDNA_LIMITS_H +/* end file include/ada/idna/limits.h */ + namespace ada::idna { // Converts a domain (e.g., www.google.com) possibly containing international @@ -138,12 +167,16 @@ namespace ada::idna { // decoding: percent decoding should be done prior to calling this function. We // do not remove tabs and spaces, they should have been removed prior to calling // this function. We also do not trim control characters. We also assume that -// the input is not empty. We return "" on error. +// the input is not empty. We return "" on error. Inputs longer than +// max_domain_input_bytes are rejected. // -// -// This function may accept or even produce invalid domains. +// This function may accept or even produce invalid domains (WHATWG carve-outs). std::string to_ascii(std::string_view ut8_string); +// Same as to_ascii, but writes into `out` and returns false on error without +// relying on empty-string ambiguity. +[[nodiscard]] bool to_ascii(std::string_view ut8_string, std::string& out); + // Returns true if the string contains a forbidden code point according to the // WHATGL URL specification: // https://url.spec.whatwg.org/#forbidden-domain-code-point @@ -157,16 +190,24 @@ bool constexpr is_ascii(std::string_view view); #endif // ADA_IDNA_TO_ASCII_H /* end file include/ada/idna/to_ascii.h */ /* begin file include/ada/idna/to_unicode.h */ - #ifndef ADA_IDNA_TO_UNICODE_H #define ADA_IDNA_TO_UNICODE_H +#include #include namespace ada::idna { +// UTS #46 ToUnicode. Never fails per the standard: on step failure the original +// label is kept. Inputs longer than max_domain_input_bytes are returned +// unchanged as a safety measure under untrusted input. std::string to_unicode(std::string_view input); +// Writes into `out`. Returns false only if the input exceeds +// max_domain_input_bytes (out is left empty). Otherwise always returns true +// (ToUnicode does not fail). +[[nodiscard]] bool to_unicode(std::string_view input, std::string& out); + } // namespace ada::idna #endif // ADA_IDNA_TO_UNICODE_H @@ -254,10 +295,10 @@ bool valid_name_code_point(char32_t code_point, bool first); #endif // Align to N-byte boundary -#define ADA_ROUNDUP_N(a, n) (((a) + ((n)-1)) & ~((n)-1)) -#define ADA_ROUNDDOWN_N(a, n) ((a) & ~((n)-1)) +#define ADA_ROUNDUP_N(a, n) (((a) + ((n) - 1)) & ~((n) - 1)) +#define ADA_ROUNDDOWN_N(a, n) ((a) & ~((n) - 1)) -#define ADA_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n)-1)) == 0) +#define ADA_ISALIGNED_N(ptr, n) (((uintptr_t)(ptr) & ((n) - 1)) == 0) #if defined(ADA_REGULAR_VISUAL_STUDIO) @@ -457,6 +498,12 @@ namespace ada { #define ADA_SSE2 1 #endif +// AVX-512 byte/word ops + 128/256-bit vectors of AVX-512 instructions. +// Used for optional high-performance IP address parsing kernels. +#if defined(__AVX512BW__) && defined(__AVX512VL__) +#define ADA_AVX512 1 +#endif + #if defined(__aarch64__) || defined(_M_ARM64) #define ADA_NEON 1 #endif @@ -1041,6 +1088,8 @@ ada_really_inline constexpr bool bit_at(const uint8_t a[], const uint8_t i) { #define ADA_CHECKERS_INL_H #include +#include +#include #include /* begin file include/ada/checkers.h */ /** @@ -1163,8 +1212,7 @@ ada_really_inline constexpr bool verify_dns_length( * This is optimized for the common case where the input is a well-formed * decimal IPv4 address with exactly 4 octets. */ -ada_really_inline constexpr uint64_t try_parse_ipv4_fast( - std::string_view input) noexcept; +ada_really_inline uint64_t try_parse_ipv4_fast(std::string_view input) noexcept; /** * Sentinel value indicating try_parse_ipv4_fast() did not succeed. @@ -1177,6 +1225,10 @@ constexpr uint64_t ipv4_fast_fail = uint64_t(1) << 32; #endif // ADA_CHECKERS_H /* end file include/ada/checkers.h */ +#if defined(ADA_AVX512) +#include +#endif + namespace ada::checkers { constexpr bool has_hex_prefix_unsafe(std::string_view input) { @@ -1215,67 +1267,153 @@ constexpr bool is_windows_drive_letter(std::string_view input) noexcept { constexpr bool is_normalized_windows_drive_letter( std::string_view input) noexcept { - return input.size() >= 2 && (is_alpha(input[0]) && (input[1] == ':')); + return input.size() == 2 && (is_alpha(input[0]) && (input[1] == ':')); } -ada_really_inline constexpr uint64_t try_parse_ipv4_fast( - std::string_view input) noexcept { - const char* p = input.data(); - const char* const pend = p + input.size(); +namespace detail { +// Unrolled pure-decimal IPv4. The common portable path for 7-16 byte hosts. +ada_really_inline uint64_t +parse_ipv4_decimal_scalar(const char* p, const char* pend) noexcept { uint32_t ipv4 = 0; - for (int i = 0; i < 4; ++i) { - if (p == pend) { + if (p == pend) [[unlikely]] { return ipv4_fast_fail; } - uint32_t val; char c = *p; - if (c >= '0' && c <= '9') { - val = c - '0'; - p++; + if (c >= '0' && c <= '9') [[likely]] { + val = static_cast(c - '0'); + ++p; } else { return ipv4_fast_fail; } - if (p < pend) { c = *p; if (c >= '0' && c <= '9') { - if (val == 0) return ipv4_fast_fail; - val = val * 10 + (c - '0'); - p++; + if (val == 0) [[unlikely]] { + return ipv4_fast_fail; + } + val = val * 10u + static_cast(c - '0'); + ++p; if (p < pend) { c = *p; if (c >= '0' && c <= '9') { - val = val * 10 + (c - '0'); - p++; - if (val > 255) return ipv4_fast_fail; + val = val * 10u + static_cast(c - '0'); + ++p; + if (val > 255u) [[unlikely]] { + return ipv4_fast_fail; + } } } } } - ipv4 = (ipv4 << 8) | val; - if (i < 3) { - if (p == pend || *p != '.') { + if (p == pend || *p != '.') [[unlikely]] { return ipv4_fast_fail; } - p++; + ++p; } } - if (p != pend) { if (p == pend - 1 && *p == '.') { return ipv4; } return ipv4_fast_fail; } - return ipv4; } +#if defined(ADA_AVX512) +// After SIMD validation: fewer rejection branches on convert. +ada_really_inline uint64_t +parse_ipv4_decimal_trusted(const char* p, const char* pend) noexcept { + uint32_t ipv4 = 0; + for (int i = 0; i < 4; ++i) { + uint32_t val = static_cast(*p - '0'); + ++p; + if (p < pend && static_cast(*p - '0') <= 9) { + if (val == 0) [[unlikely]] { + return ipv4_fast_fail; + } + val = val * 10u + static_cast(*p - '0'); + ++p; + if (p < pend && static_cast(*p - '0') <= 9) { + val = val * 10u + static_cast(*p - '0'); + ++p; + if (val > 255u) [[unlikely]] { + return ipv4_fast_fail; + } + } + } + ipv4 = (ipv4 << 8) | val; + if (i < 3) { + ++p; // trusted '.' + } + } + return ipv4; // trailing-dot already accounted for by caller via pend +} + +// AVX-512 pure-decimal IPv4 (Lemire/Mula-style masked load + parallel checks). +// No over-read of the source string. Wins when the binary is built with +// -mavx512bw -mavx512vl (or -march that enables them). +ada_really_inline uint64_t try_parse_ipv4_avx512(const char* data, + size_t len) noexcept { + const __mmask16 live = static_cast<__mmask16>((1u << len) - 1u); + const __m128i input = + _mm_maskz_loadu_epi8(live, reinterpret_cast(data)); + const __mmask16 is_dot = + _mm_mask_cmpeq_epi8_mask(live, input, _mm_set1_epi8('.')); + const __m128i shifted = _mm_sub_epi8(input, _mm_set1_epi8('0')); + const __mmask16 is_digit = + _mm_mask_cmplt_epu8_mask(live, shifted, _mm_set1_epi8(10)); + if ((is_digit | is_dot) != live) { + return ipv4_fast_fail; + } + const unsigned dot_count = + static_cast(_mm_popcnt_u32(static_cast(is_dot))); + size_t effective_len = len; + if (dot_count == 3) { + // ok + } else if (dot_count == 4 && data[len - 1] == '.') { + effective_len = len - 1; // strip trailing dot for convert + } else { + return ipv4_fast_fail; + } + // Convert from a tiny stack copy so trusted peeks stay in-bounds. + alignas(16) char buf[16]{}; + std::memcpy(buf, data, effective_len); + return parse_ipv4_decimal_trusted(buf, buf + effective_len); +} +#endif // ADA_AVX512 + +} // namespace detail + +/** + * Fast pure-decimal IPv4 parse. Returns packed address or ipv4_fast_fail. + * Accepts an optional single trailing dot. + * + * On AVX-512BW+VL targets, uses a masked-load SIMD kernel (no source + * over-read) inspired by Lemire/Mula. Otherwise uses an unrolled scalar path + * (typically faster than SSE2/NEON pre-validation for these 7-16 byte hosts). + */ +ada_really_inline uint64_t +try_parse_ipv4_fast(std::string_view input) noexcept { + const size_t len = input.size(); + // Shortest pure decimal: "0.0.0.0" (7). Longest + trailing dot: 16. + if (len < 7 || len > 16) [[unlikely]] { + return ipv4_fast_fail; + } + const char* data = input.data(); + +#if defined(ADA_AVX512) + return detail::try_parse_ipv4_avx512(data, len); +#else + return detail::parse_ipv4_decimal_scalar(data, data + len); +#endif +} + } // namespace ada::checkers #endif // ADA_CHECKERS_INL_H @@ -2002,25 +2140,25 @@ class unexpected { static_assert(!std::is_same::value, "E must not be void"); unexpected() = delete; - constexpr explicit unexpected(const E &e) : m_val(e) {} + constexpr explicit unexpected(const E& e) : m_val(e) {} - constexpr explicit unexpected(E &&e) : m_val(std::move(e)) {} + constexpr explicit unexpected(E&& e) : m_val(std::move(e)) {} template ::value>::type * = nullptr> - constexpr explicit unexpected(Args &&...args) + E, Args&&...>::value>::type* = nullptr> + constexpr explicit unexpected(Args&&... args) : m_val(std::forward(args)...) {} template < class U, class... Args, typename std::enable_if &, Args &&...>::value>::type * = nullptr> - constexpr explicit unexpected(std::initializer_list l, Args &&...args) + E, std::initializer_list&, Args&&...>::value>::type* = nullptr> + constexpr explicit unexpected(std::initializer_list l, Args&&... args) : m_val(l, std::forward(args)...) {} - constexpr const E &value() const & { return m_val; } - TL_EXPECTED_11_CONSTEXPR E &value() & { return m_val; } - TL_EXPECTED_11_CONSTEXPR E &&value() && { return std::move(m_val); } - constexpr const E &&value() const && { return std::move(m_val); } + constexpr const E& value() const& { return m_val; } + TL_EXPECTED_11_CONSTEXPR E& value() & { return m_val; } + TL_EXPECTED_11_CONSTEXPR E&& value() && { return std::move(m_val); } + constexpr const E&& value() const&& { return std::move(m_val); } private: E m_val; @@ -2032,32 +2170,32 @@ unexpected(E) -> unexpected; #endif template -constexpr bool operator==(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator==(const unexpected& lhs, const unexpected& rhs) { return lhs.value() == rhs.value(); } template -constexpr bool operator!=(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator!=(const unexpected& lhs, const unexpected& rhs) { return lhs.value() != rhs.value(); } template -constexpr bool operator<(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator<(const unexpected& lhs, const unexpected& rhs) { return lhs.value() < rhs.value(); } template -constexpr bool operator<=(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator<=(const unexpected& lhs, const unexpected& rhs) { return lhs.value() <= rhs.value(); } template -constexpr bool operator>(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator>(const unexpected& lhs, const unexpected& rhs) { return lhs.value() > rhs.value(); } template -constexpr bool operator>=(const unexpected &lhs, const unexpected &rhs) { +constexpr bool operator>=(const unexpected& lhs, const unexpected& rhs) { return lhs.value() >= rhs.value(); } template -unexpected::type> make_unexpected(E &&e) { +unexpected::type> make_unexpected(E&& e) { return unexpected::type>(std::forward(e)); } @@ -2068,7 +2206,7 @@ static constexpr unexpect_t unexpect{}; namespace detail { template -[[noreturn]] TL_EXPECTED_11_CONSTEXPR void throw_exception(E &&e) { +[[noreturn]] TL_EXPECTED_11_CONSTEXPR void throw_exception(E&& e) { #ifdef TL_EXPECTED_EXCEPTIONS_ENABLED throw std::forward(e); #else @@ -2127,16 +2265,16 @@ template struct is_pointer_to_non_const_member_func : std::true_type {}; template -struct is_pointer_to_non_const_member_func +struct is_pointer_to_non_const_member_func : std::true_type {}; template -struct is_pointer_to_non_const_member_func +struct is_pointer_to_non_const_member_func : std::true_type {}; template struct is_const_or_const_ref : std::false_type {}; template -struct is_const_or_const_ref : std::true_type {}; +struct is_const_or_const_ref : std::true_type {}; template struct is_const_or_const_ref : std::true_type {}; #endif @@ -2150,7 +2288,7 @@ template < is_const_or_const_ref::value)>, #endif typename = enable_if_t>::value>, int = 0> -constexpr auto invoke(Fn &&f, Args &&...args) noexcept( +constexpr auto invoke(Fn&& f, Args&&... args) noexcept( noexcept(std::mem_fn(f)(std::forward(args)...))) -> decltype(std::mem_fn(f)(std::forward(args)...)) { return std::mem_fn(f)(std::forward(args)...); @@ -2158,7 +2296,7 @@ constexpr auto invoke(Fn &&f, Args &&...args) noexcept( template >::value>> -constexpr auto invoke(Fn &&f, Args &&...args) noexcept( +constexpr auto invoke(Fn&& f, Args&&... args) noexcept( noexcept(std::forward(f)(std::forward(args)...))) -> decltype(std::forward(f)(std::forward(args)...)) { return std::forward(f)(std::forward(args)...); @@ -2198,7 +2336,7 @@ namespace swap_adl_tests { struct tag {}; template -tag swap(T &, T &); +tag swap(T&, T&); template tag swap(T (&a)[N], T (&b)[N]); @@ -2207,14 +2345,14 @@ tag swap(T (&a)[N], T (&b)[N]); template std::false_type can_swap(...) noexcept(false); template (), std::declval()))> -std::true_type can_swap(int) noexcept(noexcept(swap(std::declval(), - std::declval()))); + class = decltype(swap(std::declval(), std::declval()))> +std::true_type can_swap(int) noexcept(noexcept(swap(std::declval(), + std::declval()))); template std::false_type uses_std(...); template -std::is_same(), std::declval())), tag> +std::is_same(), std::declval())), tag> uses_std(int); template @@ -2271,7 +2409,7 @@ using is_expected = is_expected_impl>; template using expected_enable_forward_value = detail::enable_if_t< - std::is_constructible::value && + std::is_constructible::value && !std::is_same, in_place_t>::value && !std::is_same, detail::decay_t>::value && !std::is_same, detail::decay_t>::value>; @@ -2280,14 +2418,14 @@ template using expected_enable_from_other = detail::enable_if_t< std::is_constructible::value && std::is_constructible::value && - !std::is_constructible &>::value && - !std::is_constructible &&>::value && - !std::is_constructible &>::value && - !std::is_constructible &&>::value && - !std::is_convertible &, T>::value && - !std::is_convertible &&, T>::value && - !std::is_convertible &, T>::value && - !std::is_convertible &&, T>::value>; + !std::is_constructible&>::value && + !std::is_constructible&&>::value && + !std::is_constructible&>::value && + !std::is_constructible&&>::value && + !std::is_convertible&, T>::value && + !std::is_convertible&&, T>::value && + !std::is_convertible&, T>::value && + !std::is_convertible&&, T>::value>; template using is_void_or = conditional_t::value, std::true_type, U>; @@ -2325,29 +2463,29 @@ struct expected_storage_base { constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected_storage_base(in_place_t, Args &&...args) + constexpr expected_storage_base(in_place_t, Args&&... args) : m_val(std::forward(args)...), m_has_val(true) {} template &, Args &&...>::value> * = nullptr> + T, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr expected_storage_base(in_place_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_val(il, std::forward(args)...), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { @@ -2373,29 +2511,29 @@ struct expected_storage_base { constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected_storage_base(in_place_t, Args &&...args) + constexpr expected_storage_base(in_place_t, Args&&... args) : m_val(std::forward(args)...), m_has_val(true) {} template &, Args &&...>::value> * = nullptr> + T, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr expected_storage_base(in_place_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_val(il, std::forward(args)...), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() = default; @@ -2415,29 +2553,29 @@ struct expected_storage_base { : m_no_init(), m_has_val(false) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected_storage_base(in_place_t, Args &&...args) + constexpr expected_storage_base(in_place_t, Args&&... args) : m_val(std::forward(args)...), m_has_val(true) {} template &, Args &&...>::value> * = nullptr> + T, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr expected_storage_base(in_place_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_val(il, std::forward(args)...), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { @@ -2461,29 +2599,29 @@ struct expected_storage_base { constexpr expected_storage_base(no_init_t) : m_no_init(), m_has_val(false) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected_storage_base(in_place_t, Args &&...args) + constexpr expected_storage_base(in_place_t, Args&&... args) : m_val(std::forward(args)...), m_has_val(true) {} template &, Args &&...>::value> * = nullptr> + T, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr expected_storage_base(in_place_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_val(il, std::forward(args)...), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { @@ -2514,17 +2652,17 @@ struct expected_storage_base { constexpr expected_storage_base(in_place_t) : m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() = default; @@ -2545,17 +2683,17 @@ struct expected_storage_base { constexpr expected_storage_base(in_place_t) : m_dummy(), m_has_val(true) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected_storage_base(unexpect_t, Args &&...args) + constexpr explicit expected_storage_base(unexpect_t, Args&&... args) : m_unexpect(std::forward(args)...), m_has_val(false) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected_storage_base(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : m_unexpect(il, std::forward(args)...), m_has_val(false) {} ~expected_storage_base() { @@ -2578,20 +2716,20 @@ struct expected_operations_base : expected_storage_base { using expected_storage_base::expected_storage_base; template - void construct(Args &&...args) noexcept { + void construct(Args&&... args) noexcept { new (std::addressof(this->m_val)) T(std::forward(args)...); this->m_has_val = true; } template // NOLINTNEXTLINE(bugprone-exception-escape) - void construct_with(Rhs &&rhs) noexcept { + void construct_with(Rhs&& rhs) noexcept { new (std::addressof(this->m_val)) T(std::forward(rhs).get()); this->m_has_val = true; } template - void construct_error(Args &&...args) noexcept { + void construct_error(Args&&... args) noexcept { new (std::addressof(this->m_unexpect)) unexpected(std::forward(args)...); this->m_has_val = false; @@ -2606,9 +2744,9 @@ struct expected_operations_base : expected_storage_base { // This overload handles the case where we can just copy-construct `T` // directly into place without throwing. template ::value> - * = nullptr> - void assign(const expected_operations_base &rhs) noexcept { + detail::enable_if_t::value>* = + nullptr> + void assign(const expected_operations_base& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { geterr().~unexpected(); construct(rhs.get()); @@ -2621,9 +2759,9 @@ struct expected_operations_base : expected_storage_base { // `T`, then no-throw move it into place if the copy was successful. template ::value && - std::is_nothrow_move_constructible::value> - * = nullptr> - void assign(const expected_operations_base &rhs) noexcept { + std::is_nothrow_move_constructible::value>* = + nullptr> + void assign(const expected_operations_base& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { T tmp = rhs.get(); geterr().~unexpected(); @@ -2639,10 +2777,10 @@ struct expected_operations_base : expected_storage_base { // then we move the old unexpected value back into place before rethrowing the // exception. template ::value && - !std::is_nothrow_move_constructible::value> - * = nullptr> - void assign(const expected_operations_base &rhs) { + detail::enable_if_t< + !std::is_nothrow_copy_constructible::value && + !std::is_nothrow_move_constructible::value>* = nullptr> + void assign(const expected_operations_base& rhs) { if (!this->m_has_val && rhs.m_has_val) { auto tmp = std::move(geterr()); geterr().~unexpected(); @@ -2664,9 +2802,9 @@ struct expected_operations_base : expected_storage_base { // These overloads do the same as above, but for rvalues template ::value> - * = nullptr> - void assign(expected_operations_base &&rhs) noexcept { + detail::enable_if_t::value>* = + nullptr> + void assign(expected_operations_base&& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { geterr().~unexpected(); construct(std::move(rhs).get()); @@ -2676,9 +2814,9 @@ struct expected_operations_base : expected_storage_base { } template ::value> - * = nullptr> - void assign(expected_operations_base &&rhs) { + detail::enable_if_t< + !std::is_nothrow_move_constructible::value>* = nullptr> + void assign(expected_operations_base&& rhs) { if (!this->m_has_val && rhs.m_has_val) { auto tmp = std::move(geterr()); geterr().~unexpected(); @@ -2700,7 +2838,7 @@ struct expected_operations_base : expected_storage_base { #else // If exceptions are disabled then we can just copy-construct - void assign(const expected_operations_base &rhs) noexcept { + void assign(const expected_operations_base& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { geterr().~unexpected(); construct(rhs.get()); @@ -2709,7 +2847,7 @@ struct expected_operations_base : expected_storage_base { } } - void assign(expected_operations_base &&rhs) noexcept { + void assign(expected_operations_base&& rhs) noexcept { if (!this->m_has_val && rhs.m_has_val) { geterr().~unexpected(); construct(std::move(rhs).get()); @@ -2722,7 +2860,7 @@ struct expected_operations_base : expected_storage_base { // The common part of move/copy assigning template - void assign_common(Rhs &&rhs) { + void assign_common(Rhs&& rhs) { if (this->m_has_val) { if (rhs.m_has_val) { get() = std::forward(rhs).get(); @@ -2739,22 +2877,22 @@ struct expected_operations_base : expected_storage_base { bool has_value() const { return this->m_has_val; } - TL_EXPECTED_11_CONSTEXPR T &get() & { return this->m_val; } - constexpr const T &get() const & { return this->m_val; } - TL_EXPECTED_11_CONSTEXPR T &&get() && { return std::move(this->m_val); } + TL_EXPECTED_11_CONSTEXPR T& get() & { return this->m_val; } + constexpr const T& get() const& { return this->m_val; } + TL_EXPECTED_11_CONSTEXPR T&& get() && { return std::move(this->m_val); } #ifndef TL_EXPECTED_NO_CONSTRR - constexpr const T &&get() const && { return std::move(this->m_val); } + constexpr const T&& get() const&& { return std::move(this->m_val); } #endif - TL_EXPECTED_11_CONSTEXPR unexpected &geterr() & { + TL_EXPECTED_11_CONSTEXPR unexpected& geterr() & { return this->m_unexpect; } - constexpr const unexpected &geterr() const & { return this->m_unexpect; } - TL_EXPECTED_11_CONSTEXPR unexpected &&geterr() && { + constexpr const unexpected& geterr() const& { return this->m_unexpect; } + TL_EXPECTED_11_CONSTEXPR unexpected&& geterr() && { return std::move(this->m_unexpect); } #ifndef TL_EXPECTED_NO_CONSTRR - constexpr const unexpected &&geterr() const && { + constexpr const unexpected&& geterr() const&& { return std::move(this->m_unexpect); } #endif @@ -2776,19 +2914,19 @@ struct expected_operations_base : expected_storage_base { // This function doesn't use its argument, but needs it so that code in // levels above this can work independently of whether T is void template - void construct_with(Rhs &&) noexcept { + void construct_with(Rhs&&) noexcept { this->m_has_val = true; } template - void construct_error(Args &&...args) noexcept { + void construct_error(Args&&... args) noexcept { new (std::addressof(this->m_unexpect)) unexpected(std::forward(args)...); this->m_has_val = false; } template - void assign(Rhs &&rhs) noexcept { + void assign(Rhs&& rhs) noexcept { if (!this->m_has_val) { if (rhs.m_has_val) { geterr().~unexpected(); @@ -2805,15 +2943,15 @@ struct expected_operations_base : expected_storage_base { bool has_value() const { return this->m_has_val; } - TL_EXPECTED_11_CONSTEXPR unexpected &geterr() & { + TL_EXPECTED_11_CONSTEXPR unexpected& geterr() & { return this->m_unexpect; } - constexpr const unexpected &geterr() const & { return this->m_unexpect; } - TL_EXPECTED_11_CONSTEXPR unexpected &&geterr() && { + constexpr const unexpected& geterr() const& { return this->m_unexpect; } + TL_EXPECTED_11_CONSTEXPR unexpected&& geterr() && { return std::move(this->m_unexpect); } #ifndef TL_EXPECTED_NO_CONSTRR - constexpr const unexpected &&geterr() const && { + constexpr const unexpected&& geterr() const&& { return std::move(this->m_unexpect); } #endif @@ -2839,7 +2977,7 @@ struct expected_copy_base : expected_operations_base { using expected_operations_base::expected_operations_base; expected_copy_base() = default; - expected_copy_base(const expected_copy_base &rhs) + expected_copy_base(const expected_copy_base& rhs) : expected_operations_base(no_init) { if (rhs.has_value()) { this->construct_with(rhs); @@ -2848,9 +2986,9 @@ struct expected_copy_base : expected_operations_base { } } - expected_copy_base(expected_copy_base &&rhs) = default; - expected_copy_base &operator=(const expected_copy_base &rhs) = default; - expected_copy_base &operator=(expected_copy_base &&rhs) = default; + expected_copy_base(expected_copy_base&& rhs) = default; + expected_copy_base& operator=(const expected_copy_base& rhs) = default; + expected_copy_base& operator=(expected_copy_base&& rhs) = default; }; // This class manages conditionally having a trivial move constructor @@ -2875,9 +3013,9 @@ struct expected_move_base : expected_copy_base { using expected_copy_base::expected_copy_base; expected_move_base() = default; - expected_move_base(const expected_move_base &rhs) = default; + expected_move_base(const expected_move_base& rhs) = default; - expected_move_base(expected_move_base &&rhs) noexcept( + expected_move_base(expected_move_base&& rhs) noexcept( std::is_nothrow_move_constructible::value) : expected_copy_base(no_init) { if (rhs.has_value()) { @@ -2886,8 +3024,8 @@ struct expected_move_base : expected_copy_base { this->construct_error(std::move(rhs.geterr())); } } - expected_move_base &operator=(const expected_move_base &rhs) = default; - expected_move_base &operator=(expected_move_base &&rhs) = default; + expected_move_base& operator=(const expected_move_base& rhs) = default; + expected_move_base& operator=(expected_move_base&& rhs) = default; }; // This class manages conditionally having a trivial copy assignment operator @@ -2910,14 +3048,14 @@ struct expected_copy_assign_base : expected_move_base { using expected_move_base::expected_move_base; expected_copy_assign_base() = default; - expected_copy_assign_base(const expected_copy_assign_base &rhs) = default; + expected_copy_assign_base(const expected_copy_assign_base& rhs) = default; - expected_copy_assign_base(expected_copy_assign_base &&rhs) = default; - expected_copy_assign_base &operator=(const expected_copy_assign_base &rhs) { + expected_copy_assign_base(expected_copy_assign_base&& rhs) = default; + expected_copy_assign_base& operator=(const expected_copy_assign_base& rhs) { this->assign(rhs); return *this; } - expected_copy_assign_base &operator=(expected_copy_assign_base &&rhs) = + expected_copy_assign_base& operator=(expected_copy_assign_base&& rhs) = default; }; @@ -2950,17 +3088,17 @@ struct expected_move_assign_base using expected_copy_assign_base::expected_copy_assign_base; expected_move_assign_base() = default; - expected_move_assign_base(const expected_move_assign_base &rhs) = default; + expected_move_assign_base(const expected_move_assign_base& rhs) = default; - expected_move_assign_base(expected_move_assign_base &&rhs) = default; + expected_move_assign_base(expected_move_assign_base&& rhs) = default; - expected_move_assign_base &operator=(const expected_move_assign_base &rhs) = + expected_move_assign_base& operator=(const expected_move_assign_base& rhs) = default; - expected_move_assign_base &operator=( - expected_move_assign_base - &&rhs) noexcept(std::is_nothrow_move_constructible::value && - std::is_nothrow_move_assignable::value) { + expected_move_assign_base& + operator=(expected_move_assign_base&& rhs) noexcept( + std::is_nothrow_move_constructible::value && + std::is_nothrow_move_assignable::value) { this->assign(std::move(rhs)); return *this; } @@ -2975,44 +3113,44 @@ template ::value)> struct expected_delete_ctor_base { expected_delete_ctor_base() = default; - expected_delete_ctor_base(const expected_delete_ctor_base &) = default; - expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = default; - expected_delete_ctor_base &operator=(const expected_delete_ctor_base &) = + expected_delete_ctor_base(const expected_delete_ctor_base&) = default; + expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = default; + expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default; - expected_delete_ctor_base &operator=(expected_delete_ctor_base &&) noexcept = + expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default; }; template struct expected_delete_ctor_base { expected_delete_ctor_base() = default; - expected_delete_ctor_base(const expected_delete_ctor_base &) = default; - expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = delete; - expected_delete_ctor_base &operator=(const expected_delete_ctor_base &) = + expected_delete_ctor_base(const expected_delete_ctor_base&) = default; + expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = delete; + expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default; - expected_delete_ctor_base &operator=(expected_delete_ctor_base &&) noexcept = + expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default; }; template struct expected_delete_ctor_base { expected_delete_ctor_base() = default; - expected_delete_ctor_base(const expected_delete_ctor_base &) = delete; - expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = default; - expected_delete_ctor_base &operator=(const expected_delete_ctor_base &) = + expected_delete_ctor_base(const expected_delete_ctor_base&) = delete; + expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = default; + expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default; - expected_delete_ctor_base &operator=(expected_delete_ctor_base &&) noexcept = + expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default; }; template struct expected_delete_ctor_base { expected_delete_ctor_base() = default; - expected_delete_ctor_base(const expected_delete_ctor_base &) = delete; - expected_delete_ctor_base(expected_delete_ctor_base &&) noexcept = delete; - expected_delete_ctor_base &operator=(const expected_delete_ctor_base &) = + expected_delete_ctor_base(const expected_delete_ctor_base&) = delete; + expected_delete_ctor_base(expected_delete_ctor_base&&) noexcept = delete; + expected_delete_ctor_base& operator=(const expected_delete_ctor_base&) = default; - expected_delete_ctor_base &operator=(expected_delete_ctor_base &&) noexcept = + expected_delete_ctor_base& operator=(expected_delete_ctor_base&&) noexcept = default; }; @@ -3030,49 +3168,45 @@ template ::value)> struct expected_delete_assign_base { expected_delete_assign_base() = default; - expected_delete_assign_base(const expected_delete_assign_base &) = default; - expected_delete_assign_base(expected_delete_assign_base &&) noexcept = + expected_delete_assign_base(const expected_delete_assign_base&) = default; + expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default; + expected_delete_assign_base& operator=(const expected_delete_assign_base&) = default; - expected_delete_assign_base &operator=(const expected_delete_assign_base &) = - default; - expected_delete_assign_base &operator=( - expected_delete_assign_base &&) noexcept = default; + expected_delete_assign_base& operator=( + expected_delete_assign_base&&) noexcept = default; }; template struct expected_delete_assign_base { expected_delete_assign_base() = default; - expected_delete_assign_base(const expected_delete_assign_base &) = default; - expected_delete_assign_base(expected_delete_assign_base &&) noexcept = - default; - expected_delete_assign_base &operator=(const expected_delete_assign_base &) = + expected_delete_assign_base(const expected_delete_assign_base&) = default; + expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default; + expected_delete_assign_base& operator=(const expected_delete_assign_base&) = default; - expected_delete_assign_base &operator=( - expected_delete_assign_base &&) noexcept = delete; + expected_delete_assign_base& operator=( + expected_delete_assign_base&&) noexcept = delete; }; template struct expected_delete_assign_base { expected_delete_assign_base() = default; - expected_delete_assign_base(const expected_delete_assign_base &) = default; - expected_delete_assign_base(expected_delete_assign_base &&) noexcept = - default; - expected_delete_assign_base &operator=(const expected_delete_assign_base &) = + expected_delete_assign_base(const expected_delete_assign_base&) = default; + expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default; + expected_delete_assign_base& operator=(const expected_delete_assign_base&) = delete; - expected_delete_assign_base &operator=( - expected_delete_assign_base &&) noexcept = default; + expected_delete_assign_base& operator=( + expected_delete_assign_base&&) noexcept = default; }; template struct expected_delete_assign_base { expected_delete_assign_base() = default; - expected_delete_assign_base(const expected_delete_assign_base &) = default; - expected_delete_assign_base(expected_delete_assign_base &&) noexcept = - default; - expected_delete_assign_base &operator=(const expected_delete_assign_base &) = + expected_delete_assign_base(const expected_delete_assign_base&) = default; + expected_delete_assign_base(expected_delete_assign_base&&) noexcept = default; + expected_delete_assign_base& operator=(const expected_delete_assign_base&) = delete; - expected_delete_assign_base &operator=( - expected_delete_assign_base &&) noexcept = delete; + expected_delete_assign_base& operator=( + expected_delete_assign_base&&) noexcept = delete; }; // This is needed to be able to construct the expected_default_ctor_base which @@ -3090,13 +3224,13 @@ template struct expected_default_ctor_base { constexpr expected_default_ctor_base() noexcept = delete; constexpr expected_default_ctor_base( - expected_default_ctor_base const &) noexcept = default; - constexpr expected_default_ctor_base(expected_default_ctor_base &&) noexcept = + expected_default_ctor_base const&) noexcept = default; + constexpr expected_default_ctor_base(expected_default_ctor_base&&) noexcept = + default; + expected_default_ctor_base& operator=( + expected_default_ctor_base const&) noexcept = default; + expected_default_ctor_base& operator=(expected_default_ctor_base&&) noexcept = default; - expected_default_ctor_base &operator=( - expected_default_ctor_base const &) noexcept = default; - expected_default_ctor_base &operator=( - expected_default_ctor_base &&) noexcept = default; constexpr explicit expected_default_ctor_base(default_constructor_tag) {} }; @@ -3123,14 +3257,14 @@ class bad_expected_access : public std::exception { public: explicit bad_expected_access(E e) : m_val(std::move(e)) {} - virtual const char *what() const noexcept override { + virtual const char* what() const noexcept override { return "Bad expected access"; } - const E &error() const & { return m_val; } - E &error() & { return m_val; } - const E &&error() const && { return std::move(m_val); } - E &&error() && { return std::move(m_val); } + const E& error() const& { return m_val; } + E& error() & { return m_val; } + const E&& error() const&& { return std::move(m_val); } + E&& error() && { return std::move(m_val); } private: E m_val; @@ -3158,26 +3292,26 @@ class expected : private detail::expected_move_assign_base, "T must not be unexpected"); static_assert(!std::is_reference::value, "E must not be a reference"); - T *valptr() { return std::addressof(this->m_val); } - const T *valptr() const { return std::addressof(this->m_val); } - unexpected *errptr() { return std::addressof(this->m_unexpect); } - const unexpected *errptr() const { + T* valptr() { return std::addressof(this->m_val); } + const T* valptr() const { return std::addressof(this->m_val); } + unexpected* errptr() { return std::addressof(this->m_unexpect); } + const unexpected* errptr() const { return std::addressof(this->m_unexpect); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &val() { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U& val() { return this->m_val; } - TL_EXPECTED_11_CONSTEXPR unexpected &err() { return this->m_unexpect; } + TL_EXPECTED_11_CONSTEXPR unexpected& err() { return this->m_unexpect; } template ::value> * = nullptr> - constexpr const U &val() const { + detail::enable_if_t::value>* = nullptr> + constexpr const U& val() const { return this->m_val; } - constexpr const unexpected &err() const { return this->m_unexpect; } + constexpr const unexpected& err() const { return this->m_unexpect; } using impl_base = detail::expected_move_assign_base; using ctor_base = detail::expected_default_ctor_base; @@ -3190,46 +3324,46 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto and_then(F&& f) & { return and_then_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto and_then(F&& f) && { return and_then_impl(std::move(*this), std::forward(f)); } template - constexpr auto and_then(F &&f) const & { + constexpr auto and_then(F&& f) const& { return and_then_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr auto and_then(F &&f) const && { + constexpr auto and_then(F&& f) const&& { return and_then_impl(std::move(*this), std::forward(f)); } #endif #else template - TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) & -> decltype(and_then_impl( - std::declval(), std::forward(f))) { + TL_EXPECTED_11_CONSTEXPR auto and_then(F&& f) & -> decltype(and_then_impl( + std::declval(), std::forward(f))) { return and_then_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto and_then(F &&f) && -> decltype(and_then_impl( - std::declval(), std::forward(f))) { + TL_EXPECTED_11_CONSTEXPR auto and_then(F&& f) && -> decltype(and_then_impl( + std::declval(), std::forward(f))) { return and_then_impl(std::move(*this), std::forward(f)); } template - constexpr auto and_then(F &&f) const & -> decltype(and_then_impl( - std::declval(), std::forward(f))) { + constexpr auto and_then(F&& f) const& -> decltype(and_then_impl( + std::declval(), std::forward(f))) { return and_then_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr auto and_then(F &&f) const && -> decltype(and_then_impl( - std::declval(), std::forward(f))) { + constexpr auto and_then(F&& f) const&& -> decltype(and_then_impl( + std::declval(), std::forward(f))) { return and_then_impl(std::move(*this), std::forward(f)); } #endif @@ -3238,46 +3372,45 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto map(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto map(F&& f) & { return expected_map_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto map(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto map(F&& f) && { return expected_map_impl(std::move(*this), std::forward(f)); } template - constexpr auto map(F &&f) const & { + constexpr auto map(F&& f) const& { return expected_map_impl(*this, std::forward(f)); } template - constexpr auto map(F &&f) const && { + constexpr auto map(F&& f) const&& { return expected_map_impl(std::move(*this), std::forward(f)); } #else template TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl( - std::declval(), std::declval())) - map(F &&f) & { + std::declval(), std::declval())) map(F&& f) & { return expected_map_impl(*this, std::forward(f)); } template TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl(std::declval(), - std::declval())) - map(F &&f) && { + std::declval())) + map(F&& f) && { return expected_map_impl(std::move(*this), std::forward(f)); } template - constexpr decltype(expected_map_impl(std::declval(), - std::declval())) - map(F &&f) const & { + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) + map(F&& f) const& { return expected_map_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr decltype(expected_map_impl(std::declval(), - std::declval())) - map(F &&f) const && { + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) map(F&& f) + const&& { return expected_map_impl(std::move(*this), std::forward(f)); } #endif @@ -3286,46 +3419,45 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto transform(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto transform(F&& f) & { return expected_map_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto transform(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto transform(F&& f) && { return expected_map_impl(std::move(*this), std::forward(f)); } template - constexpr auto transform(F &&f) const & { + constexpr auto transform(F&& f) const& { return expected_map_impl(*this, std::forward(f)); } template - constexpr auto transform(F &&f) const && { + constexpr auto transform(F&& f) const&& { return expected_map_impl(std::move(*this), std::forward(f)); } #else template TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl( - std::declval(), std::declval())) - transform(F &&f) & { + std::declval(), std::declval())) transform(F&& f) & { return expected_map_impl(*this, std::forward(f)); } template TL_EXPECTED_11_CONSTEXPR decltype(expected_map_impl(std::declval(), - std::declval())) - transform(F &&f) && { + std::declval())) + transform(F&& f) && { return expected_map_impl(std::move(*this), std::forward(f)); } template - constexpr decltype(expected_map_impl(std::declval(), - std::declval())) - transform(F &&f) const & { + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) + transform(F&& f) const& { return expected_map_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr decltype(expected_map_impl(std::declval(), - std::declval())) - transform(F &&f) const && { + constexpr decltype(expected_map_impl(std::declval(), + std::declval())) transform(F&& f) + const&& { return expected_map_impl(std::move(*this), std::forward(f)); } #endif @@ -3334,46 +3466,45 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto map_error(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto map_error(F&& f) & { return map_error_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto map_error(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto map_error(F&& f) && { return map_error_impl(std::move(*this), std::forward(f)); } template - constexpr auto map_error(F &&f) const & { + constexpr auto map_error(F&& f) const& { return map_error_impl(*this, std::forward(f)); } template - constexpr auto map_error(F &&f) const && { + constexpr auto map_error(F&& f) const&& { return map_error_impl(std::move(*this), std::forward(f)); } #else template - TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), - std::declval())) - map_error(F &&f) & { + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl( + std::declval(), std::declval())) map_error(F&& f) & { return map_error_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), - std::declval())) - map_error(F &&f) && { + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), + std::declval())) + map_error(F&& f) && { return map_error_impl(std::move(*this), std::forward(f)); } template - constexpr decltype(map_error_impl(std::declval(), - std::declval())) - map_error(F &&f) const & { + constexpr decltype(map_error_impl(std::declval(), + std::declval())) + map_error(F&& f) const& { return map_error_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr decltype(map_error_impl(std::declval(), - std::declval())) - map_error(F &&f) const && { + constexpr decltype(map_error_impl(std::declval(), + std::declval())) map_error(F&& f) + const&& { return map_error_impl(std::move(*this), std::forward(f)); } #endif @@ -3381,149 +3512,147 @@ class expected : private detail::expected_move_assign_base, #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template - TL_EXPECTED_11_CONSTEXPR auto transform_error(F &&f) & { + TL_EXPECTED_11_CONSTEXPR auto transform_error(F&& f) & { return map_error_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR auto transform_error(F &&f) && { + TL_EXPECTED_11_CONSTEXPR auto transform_error(F&& f) && { return map_error_impl(std::move(*this), std::forward(f)); } template - constexpr auto transform_error(F &&f) const & { + constexpr auto transform_error(F&& f) const& { return map_error_impl(*this, std::forward(f)); } template - constexpr auto transform_error(F &&f) const && { + constexpr auto transform_error(F&& f) const&& { return map_error_impl(std::move(*this), std::forward(f)); } #else template - TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), - std::declval())) - transform_error(F &&f) & { + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl( + std::declval(), + std::declval())) transform_error(F&& f) & { return map_error_impl(*this, std::forward(f)); } template - TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), - std::declval())) - transform_error(F &&f) && { + TL_EXPECTED_11_CONSTEXPR decltype(map_error_impl(std::declval(), + std::declval())) + transform_error(F&& f) && { return map_error_impl(std::move(*this), std::forward(f)); } template - constexpr decltype(map_error_impl(std::declval(), - std::declval())) - transform_error(F &&f) const & { + constexpr decltype(map_error_impl(std::declval(), + std::declval())) + transform_error(F&& f) const& { return map_error_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - constexpr decltype(map_error_impl(std::declval(), - std::declval())) - transform_error(F &&f) const && { + constexpr decltype(map_error_impl(std::declval(), + std::declval())) transform_error(F&& f) + const&& { return map_error_impl(std::move(*this), std::forward(f)); } #endif #endif template - expected TL_EXPECTED_11_CONSTEXPR or_else(F &&f) & { + expected TL_EXPECTED_11_CONSTEXPR or_else(F&& f) & { return or_else_impl(*this, std::forward(f)); } template - expected TL_EXPECTED_11_CONSTEXPR or_else(F &&f) && { + expected TL_EXPECTED_11_CONSTEXPR or_else(F&& f) && { return or_else_impl(std::move(*this), std::forward(f)); } template - expected constexpr or_else(F &&f) const & { + expected constexpr or_else(F&& f) const& { return or_else_impl(*this, std::forward(f)); } #ifndef TL_EXPECTED_NO_CONSTRR template - expected constexpr or_else(F &&f) const && { + expected constexpr or_else(F&& f) const&& { return or_else_impl(std::move(*this), std::forward(f)); } #endif constexpr expected() = default; - constexpr expected(const expected &rhs) = default; - constexpr expected(expected &&rhs) = default; - expected &operator=(const expected &rhs) = default; - expected &operator=(expected &&rhs) = default; + constexpr expected(const expected& rhs) = default; + constexpr expected(expected&& rhs) = default; + expected& operator=(const expected& rhs) = default; + expected& operator=(expected&& rhs) = default; template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr expected(in_place_t, Args &&...args) + constexpr expected(in_place_t, Args&&... args) : impl_base(in_place, std::forward(args)...), ctor_base(detail::default_constructor_tag{}) {} template &, Args &&...>::value> * = nullptr> - constexpr expected(in_place_t, std::initializer_list il, Args &&...args) + T, std::initializer_list&, Args&&...>::value>* = nullptr> + constexpr expected(in_place_t, std::initializer_list il, Args&&... args) : impl_base(in_place, il, std::forward(args)...), ctor_base(detail::default_constructor_tag{}) {} - template ::value> * = - nullptr, - detail::enable_if_t::value> * = - nullptr> - explicit constexpr expected(const unexpected &e) + template < + class G = E, + detail::enable_if_t::value>* = nullptr, + detail::enable_if_t::value>* = nullptr> + explicit constexpr expected(const unexpected& e) : impl_base(unexpect, e.value()), ctor_base(detail::default_constructor_tag{}) {} template < class G = E, - detail::enable_if_t::value> * = - nullptr, - detail::enable_if_t::value> * = nullptr> - constexpr expected(unexpected const &e) + detail::enable_if_t::value>* = nullptr, + detail::enable_if_t::value>* = nullptr> + constexpr expected(unexpected const& e) : impl_base(unexpect, e.value()), ctor_base(detail::default_constructor_tag{}) {} template < class G = E, - detail::enable_if_t::value> * = nullptr, - detail::enable_if_t::value> * = nullptr> - explicit constexpr expected(unexpected &&e) noexcept( - std::is_nothrow_constructible::value) + detail::enable_if_t::value>* = nullptr, + detail::enable_if_t::value>* = nullptr> + explicit constexpr expected(unexpected&& e) noexcept( + std::is_nothrow_constructible::value) : impl_base(unexpect, std::move(e.value())), ctor_base(detail::default_constructor_tag{}) {} template < class G = E, - detail::enable_if_t::value> * = nullptr, - detail::enable_if_t::value> * = nullptr> - constexpr expected(unexpected &&e) noexcept( - std::is_nothrow_constructible::value) + detail::enable_if_t::value>* = nullptr, + detail::enable_if_t::value>* = nullptr> + constexpr expected(unexpected&& e) noexcept( + std::is_nothrow_constructible::value) : impl_base(unexpect, std::move(e.value())), ctor_base(detail::default_constructor_tag{}) {} template ::value> * = + detail::enable_if_t::value>* = nullptr> - constexpr explicit expected(unexpect_t, Args &&...args) + constexpr explicit expected(unexpect_t, Args&&... args) : impl_base(unexpect, std::forward(args)...), ctor_base(detail::default_constructor_tag{}) {} template &, Args &&...>::value> * = nullptr> + E, std::initializer_list&, Args&&...>::value>* = nullptr> constexpr explicit expected(unexpect_t, std::initializer_list il, - Args &&...args) + Args&&... args) : impl_base(unexpect, il, std::forward(args)...), ctor_base(detail::default_constructor_tag{}) {} template ::value && - std::is_convertible::value)> * = + detail::enable_if_t::value && + std::is_convertible::value)>* = nullptr, - detail::expected_enable_from_other - * = nullptr> - explicit TL_EXPECTED_11_CONSTEXPR expected(const expected &rhs) + detail::expected_enable_from_other* = nullptr> + explicit TL_EXPECTED_11_CONSTEXPR expected(const expected& rhs) : ctor_base(detail::default_constructor_tag{}) { if (rhs.has_value()) { this->construct(*rhs); @@ -3532,13 +3661,13 @@ class expected : private detail::expected_move_assign_base, } } - template ::value && - std::is_convertible::value)> * = - nullptr, - detail::expected_enable_from_other - * = nullptr> - TL_EXPECTED_11_CONSTEXPR expected(const expected &rhs) + template < + class U, class G, + detail::enable_if_t<(std::is_convertible::value && + std::is_convertible::value)>* = nullptr, + detail::expected_enable_from_other* = + nullptr> + TL_EXPECTED_11_CONSTEXPR expected(const expected& rhs) : ctor_base(detail::default_constructor_tag{}) { if (rhs.has_value()) { this->construct(*rhs); @@ -3549,10 +3678,10 @@ class expected : private detail::expected_move_assign_base, template < class U, class G, - detail::enable_if_t::value && - std::is_convertible::value)> * = nullptr, - detail::expected_enable_from_other * = nullptr> - explicit TL_EXPECTED_11_CONSTEXPR expected(expected &&rhs) + detail::enable_if_t::value && + std::is_convertible::value)>* = nullptr, + detail::expected_enable_from_other* = nullptr> + explicit TL_EXPECTED_11_CONSTEXPR expected(expected&& rhs) : ctor_base(detail::default_constructor_tag{}) { if (rhs.has_value()) { this->construct(std::move(*rhs)); @@ -3563,10 +3692,10 @@ class expected : private detail::expected_move_assign_base, template < class U, class G, - detail::enable_if_t<(std::is_convertible::value && - std::is_convertible::value)> * = nullptr, - detail::expected_enable_from_other * = nullptr> - TL_EXPECTED_11_CONSTEXPR expected(expected &&rhs) + detail::enable_if_t<(std::is_convertible::value && + std::is_convertible::value)>* = nullptr, + detail::expected_enable_from_other* = nullptr> + TL_EXPECTED_11_CONSTEXPR expected(expected&& rhs) : ctor_base(detail::default_constructor_tag{}) { if (rhs.has_value()) { this->construct(std::move(*rhs)); @@ -3575,33 +3704,31 @@ class expected : private detail::expected_move_assign_base, } } - template < - class U = T, - detail::enable_if_t::value> * = nullptr, - detail::expected_enable_forward_value * = nullptr> - explicit TL_EXPECTED_MSVC2015_CONSTEXPR expected(U &&v) + template ::value>* = nullptr, + detail::expected_enable_forward_value* = nullptr> + explicit TL_EXPECTED_MSVC2015_CONSTEXPR expected(U&& v) : expected(in_place, std::forward(v)) {} - template < - class U = T, - detail::enable_if_t::value> * = nullptr, - detail::expected_enable_forward_value * = nullptr> - TL_EXPECTED_MSVC2015_CONSTEXPR expected(U &&v) + template ::value>* = nullptr, + detail::expected_enable_forward_value* = nullptr> + TL_EXPECTED_MSVC2015_CONSTEXPR expected(U&& v) : expected(in_place, std::forward(v)) {} template < class U = T, class G = T, - detail::enable_if_t::value> * = + detail::enable_if_t::value>* = nullptr, - detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value>* = nullptr, detail::enable_if_t< (!std::is_same, detail::decay_t>::value && !detail::conjunction, std::is_same>>::value && std::is_constructible::value && - std::is_assignable::value && - std::is_nothrow_move_constructible::value)> * = nullptr> - expected &operator=(U &&v) { + std::is_assignable::value && + std::is_nothrow_move_constructible::value)>* = nullptr> + expected& operator=(U&& v) { if (has_value()) { val() = std::forward(v); } else { @@ -3615,17 +3742,17 @@ class expected : private detail::expected_move_assign_base, template < class U = T, class G = T, - detail::enable_if_t::value> * = + detail::enable_if_t::value>* = nullptr, - detail::enable_if_t::value> * = nullptr, + detail::enable_if_t::value>* = nullptr, detail::enable_if_t< (!std::is_same, detail::decay_t>::value && !detail::conjunction, std::is_same>>::value && std::is_constructible::value && - std::is_assignable::value && - std::is_nothrow_move_constructible::value)> * = nullptr> - expected &operator=(U &&v) { + std::is_assignable::value && + std::is_nothrow_move_constructible::value)>* = nullptr> + expected& operator=(U&& v) { if (has_value()) { val() = std::forward(v); } else { @@ -3651,8 +3778,8 @@ class expected : private detail::expected_move_assign_base, template ::value && - std::is_assignable::value> * = nullptr> - expected &operator=(const unexpected &rhs) { + std::is_assignable::value>* = nullptr> + expected& operator=(const unexpected& rhs) { if (!has_value()) { err() = rhs; } else { @@ -3666,8 +3793,8 @@ class expected : private detail::expected_move_assign_base, template ::value && - std::is_move_assignable::value> * = nullptr> - expected &operator=(unexpected &&rhs) noexcept { + std::is_move_assignable::value>* = nullptr> + expected& operator=(unexpected&& rhs) noexcept { if (!has_value()) { err() = std::move(rhs); } else { @@ -3680,8 +3807,8 @@ class expected : private detail::expected_move_assign_base, } template ::value> * = nullptr> - void emplace(Args &&...args) { + T, Args&&...>::value>* = nullptr> + void emplace(Args&&... args) { if (has_value()) { val().~T(); } else { @@ -3692,8 +3819,8 @@ class expected : private detail::expected_move_assign_base, } template ::value> * = nullptr> - void emplace(Args &&...args) { + T, Args&&...>::value>* = nullptr> + void emplace(Args&&... args) { if (has_value()) { val().~T(); ::new (valptr()) T(std::forward(args)...); @@ -3718,8 +3845,8 @@ class expected : private detail::expected_move_assign_base, template &, Args &&...>::value> * = nullptr> - void emplace(std::initializer_list il, Args &&...args) { + T, std::initializer_list&, Args&&...>::value>* = nullptr> + void emplace(std::initializer_list il, Args&&... args) { if (has_value()) { T t(il, std::forward(args)...); val() = std::move(t); @@ -3732,8 +3859,8 @@ class expected : private detail::expected_move_assign_base, template &, Args &&...>::value> * = nullptr> - void emplace(std::initializer_list il, Args &&...args) { + T, std::initializer_list&, Args&&...>::value>* = nullptr> + void emplace(std::initializer_list il, Args&&... args) { if (has_value()) { T t(il, std::forward(args)...); val() = std::move(t); @@ -3764,30 +3891,30 @@ class expected : private detail::expected_move_assign_base, using e_is_nothrow_move_constructible = std::true_type; using move_constructing_e_can_throw = std::false_type; - void swap_where_both_have_value(expected & /*rhs*/, t_is_void) noexcept { + void swap_where_both_have_value(expected& /*rhs*/, t_is_void) noexcept { // swapping void is a no-op } - void swap_where_both_have_value(expected &rhs, t_is_not_void) { + void swap_where_both_have_value(expected& rhs, t_is_not_void) { using std::swap; swap(val(), rhs.val()); } - void swap_where_only_one_has_value(expected &rhs, t_is_void) noexcept( + void swap_where_only_one_has_value(expected& rhs, t_is_void) noexcept( std::is_nothrow_move_constructible::value) { ::new (errptr()) unexpected_type(std::move(rhs.err())); rhs.err().~unexpected_type(); std::swap(this->m_has_val, rhs.m_has_val); } - void swap_where_only_one_has_value(expected &rhs, t_is_not_void) { + void swap_where_only_one_has_value(expected& rhs, t_is_not_void) { swap_where_only_one_has_value_and_t_is_not_void( rhs, typename std::is_nothrow_move_constructible::type{}, typename std::is_nothrow_move_constructible::type{}); } void swap_where_only_one_has_value_and_t_is_not_void( - expected &rhs, t_is_nothrow_move_constructible, + expected& rhs, t_is_nothrow_move_constructible, e_is_nothrow_move_constructible) noexcept { auto temp = std::move(val()); val().~T(); @@ -3798,7 +3925,7 @@ class expected : private detail::expected_move_assign_base, } void swap_where_only_one_has_value_and_t_is_not_void( - expected &rhs, t_is_nothrow_move_constructible, + expected& rhs, t_is_nothrow_move_constructible, move_constructing_e_can_throw) { auto temp = std::move(val()); val().~T(); @@ -3821,7 +3948,7 @@ class expected : private detail::expected_move_assign_base, } void swap_where_only_one_has_value_and_t_is_not_void( - expected &rhs, move_constructing_t_can_throw, + expected& rhs, move_constructing_t_can_throw, e_is_nothrow_move_constructible) { auto temp = std::move(rhs.err()); rhs.err().~unexpected_type(); @@ -3849,7 +3976,7 @@ class expected : private detail::expected_move_assign_base, detail::is_swappable::value && (std::is_nothrow_move_constructible::value || std::is_nothrow_move_constructible::value)> - swap(expected &rhs) noexcept(std::is_nothrow_move_constructible::value && + swap(expected& rhs) noexcept(std::is_nothrow_move_constructible::value && detail::is_nothrow_swappable::value && std::is_nothrow_move_constructible::value && detail::is_nothrow_swappable::value) { @@ -3865,36 +3992,36 @@ class expected : private detail::expected_move_assign_base, } } - constexpr const T *operator->() const { + constexpr const T* operator->() const { TL_ASSERT(has_value()); return valptr(); } - TL_EXPECTED_11_CONSTEXPR T *operator->() { + TL_EXPECTED_11_CONSTEXPR T* operator->() { TL_ASSERT(has_value()); return valptr(); } template ::value> * = nullptr> - constexpr const U &operator*() const & { + detail::enable_if_t::value>* = nullptr> + constexpr const U& operator*() const& { TL_ASSERT(has_value()); return val(); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &operator*() & { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U& operator*() & { TL_ASSERT(has_value()); return val(); } template ::value> * = nullptr> - constexpr const U &&operator*() const && { + detail::enable_if_t::value>* = nullptr> + constexpr const U&& operator*() const&& { TL_ASSERT(has_value()); return std::move(val()); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &&operator*() && { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U&& operator*() && { TL_ASSERT(has_value()); return std::move(val()); } @@ -3903,62 +4030,62 @@ class expected : private detail::expected_move_assign_base, constexpr explicit operator bool() const noexcept { return this->m_has_val; } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR const U &value() const & { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR const U& value() const& { if (!has_value()) detail::throw_exception(bad_expected_access(err().value())); return val(); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &value() & { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U& value() & { if (!has_value()) detail::throw_exception(bad_expected_access(err().value())); return val(); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR const U &&value() const && { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR const U&& value() const&& { if (!has_value()) detail::throw_exception(bad_expected_access(std::move(err()).value())); return std::move(val()); } template ::value> * = nullptr> - TL_EXPECTED_11_CONSTEXPR U &&value() && { + detail::enable_if_t::value>* = nullptr> + TL_EXPECTED_11_CONSTEXPR U&& value() && { if (!has_value()) detail::throw_exception(bad_expected_access(std::move(err()).value())); return std::move(val()); } - constexpr const E &error() const & { + constexpr const E& error() const& { TL_ASSERT(!has_value()); return err().value(); } - TL_EXPECTED_11_CONSTEXPR E &error() & { + TL_EXPECTED_11_CONSTEXPR E& error() & { TL_ASSERT(!has_value()); return err().value(); } - constexpr const E &&error() const && { + constexpr const E&& error() const&& { TL_ASSERT(!has_value()); return std::move(err().value()); } - TL_EXPECTED_11_CONSTEXPR E &&error() && { + TL_EXPECTED_11_CONSTEXPR E&& error() && { TL_ASSERT(!has_value()); return std::move(err().value()); } template - constexpr T value_or(U &&v) const & { + constexpr T value_or(U&& v) const& { static_assert(std::is_copy_constructible::value && - std::is_convertible::value, + std::is_convertible::value, "T must be copy-constructible and convertible to from U&&"); return bool(*this) ? **this : static_cast(std::forward(v)); } template - TL_EXPECTED_11_CONSTEXPR T value_or(U &&v) && { + TL_EXPECTED_11_CONSTEXPR T value_or(U&& v) && { static_assert(std::is_move_constructible::value && - std::is_convertible::value, + std::is_convertible::value, "T must be move-constructible and convertible to from U&&"); return bool(*this) ? std::move(**this) : static_cast(std::forward(v)); } @@ -3974,10 +4101,10 @@ using ret_t = expected>; #ifdef TL_EXPECTED_CXX14 template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval()))> -constexpr auto and_then_impl(Exp &&exp, F &&f) { +constexpr auto and_then_impl(Exp&& exp, F&& f) { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() @@ -3986,9 +4113,9 @@ constexpr auto and_then_impl(Exp &&exp, F &&f) { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval()))> -constexpr auto and_then_impl(Exp &&exp, F &&f) { +constexpr auto and_then_impl(Exp&& exp, F&& f) { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() ? detail::invoke(std::forward(f)) @@ -4000,8 +4127,8 @@ struct TC; template (), *std::declval())), - detail::enable_if_t>::value> * = nullptr> -auto and_then_impl(Exp &&exp, F &&f) -> Ret { + detail::enable_if_t>::value>* = nullptr> +auto and_then_impl(Exp&& exp, F&& f) -> Ret { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() @@ -4011,8 +4138,8 @@ auto and_then_impl(Exp &&exp, F &&f) -> Ret { template ())), - detail::enable_if_t>::value> * = nullptr> -constexpr auto and_then_impl(Exp &&exp, F &&f) -> Ret { + detail::enable_if_t>::value>* = nullptr> +constexpr auto and_then_impl(Exp&& exp, F&& f) -> Ret { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() ? detail::invoke(std::forward(f)) @@ -4022,11 +4149,11 @@ constexpr auto and_then_impl(Exp &&exp, F &&f) -> Ret { #ifdef TL_EXPECTED_CXX14 template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), - detail::enable_if_t::value> * = nullptr> -constexpr auto expected_map_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto expected_map_impl(Exp&& exp, F&& f) { using result = ret_t>; return exp.has_value() ? result(detail::invoke(std::forward(f), *std::forward(exp))) @@ -4034,11 +4161,11 @@ constexpr auto expected_map_impl(Exp &&exp, F &&f) { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), - detail::enable_if_t::value> * = nullptr> -auto expected_map_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +auto expected_map_impl(Exp&& exp, F&& f) { using result = expected>; if (exp.has_value()) { detail::invoke(std::forward(f), *std::forward(exp)); @@ -4049,20 +4176,20 @@ auto expected_map_impl(Exp &&exp, F &&f) { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval())), - detail::enable_if_t::value> * = nullptr> -constexpr auto expected_map_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto expected_map_impl(Exp&& exp, F&& f) { using result = ret_t>; return exp.has_value() ? result(detail::invoke(std::forward(f))) : result(unexpect, std::forward(exp).error()); } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval())), - detail::enable_if_t::value> * = nullptr> -auto expected_map_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +auto expected_map_impl(Exp&& exp, F&& f) { using result = expected>; if (exp.has_value()) { detail::invoke(std::forward(f)); @@ -4073,12 +4200,12 @@ auto expected_map_impl(Exp &&exp, F &&f) { } #else template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), - detail::enable_if_t::value> * = nullptr> + detail::enable_if_t::value>* = nullptr> -constexpr auto expected_map_impl(Exp &&exp, F &&f) +constexpr auto expected_map_impl(Exp&& exp, F&& f) -> ret_t> { using result = ret_t>; @@ -4088,12 +4215,12 @@ constexpr auto expected_map_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), - detail::enable_if_t::value> * = nullptr> + detail::enable_if_t::value>* = nullptr> -auto expected_map_impl(Exp &&exp, F &&f) -> expected> { +auto expected_map_impl(Exp&& exp, F&& f) -> expected> { if (exp.has_value()) { detail::invoke(std::forward(f), *std::forward(exp)); return {}; @@ -4103,11 +4230,11 @@ auto expected_map_impl(Exp &&exp, F &&f) -> expected> { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval())), - detail::enable_if_t::value> * = nullptr> + detail::enable_if_t::value>* = nullptr> -constexpr auto expected_map_impl(Exp &&exp, F &&f) +constexpr auto expected_map_impl(Exp&& exp, F&& f) -> ret_t> { using result = ret_t>; @@ -4116,11 +4243,11 @@ constexpr auto expected_map_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval())), - detail::enable_if_t::value> * = nullptr> + detail::enable_if_t::value>* = nullptr> -auto expected_map_impl(Exp &&exp, F &&f) -> expected> { +auto expected_map_impl(Exp&& exp, F&& f) -> expected> { if (exp.has_value()) { detail::invoke(std::forward(f)); return {}; @@ -4133,11 +4260,11 @@ auto expected_map_impl(Exp &&exp, F &&f) -> expected> { #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \ !defined(TL_EXPECTED_GCC54) && !defined(TL_EXPECTED_GCC55) template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto map_error_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto map_error_impl(Exp&& exp, F&& f) { using result = expected, detail::decay_t>; return exp.has_value() ? result(*std::forward(exp)) @@ -4145,11 +4272,11 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) { std::forward(exp).error())); } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto map_error_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +auto map_error_impl(Exp&& exp, F&& f) { using result = expected, monostate>; if (exp.has_value()) { return result(*std::forward(exp)); @@ -4159,11 +4286,11 @@ auto map_error_impl(Exp &&exp, F &&f) { return result(unexpect, monostate{}); } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto map_error_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto map_error_impl(Exp&& exp, F&& f) { using result = expected, detail::decay_t>; return exp.has_value() ? result() @@ -4171,11 +4298,11 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) { std::forward(exp).error())); } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto map_error_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +auto map_error_impl(Exp&& exp, F&& f) { using result = expected, monostate>; if (exp.has_value()) { return result(); @@ -4186,11 +4313,11 @@ auto map_error_impl(Exp &&exp, F &&f) { } #else template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto map_error_impl(Exp &&exp, F &&f) + detail::enable_if_t::value>* = nullptr> +constexpr auto map_error_impl(Exp&& exp, F&& f) -> expected, detail::decay_t> { using result = expected, detail::decay_t>; @@ -4201,11 +4328,11 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { + detail::enable_if_t::value>* = nullptr> +auto map_error_impl(Exp&& exp, F&& f) -> expected, monostate> { using result = expected, monostate>; if (exp.has_value()) { return result(*std::forward(exp)); @@ -4216,11 +4343,11 @@ auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto map_error_impl(Exp &&exp, F &&f) + detail::enable_if_t::value>* = nullptr> +constexpr auto map_error_impl(Exp&& exp, F&& f) -> expected, detail::decay_t> { using result = expected, detail::decay_t>; @@ -4231,11 +4358,11 @@ constexpr auto map_error_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, + detail::enable_if_t>::value>* = nullptr, class Ret = decltype(detail::invoke(std::declval(), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { + detail::enable_if_t::value>* = nullptr> +auto map_error_impl(Exp&& exp, F&& f) -> expected, monostate> { using result = expected, monostate>; if (exp.has_value()) { return result(); @@ -4250,8 +4377,8 @@ auto map_error_impl(Exp &&exp, F &&f) -> expected, monostate> { template (), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -constexpr auto or_else_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +constexpr auto or_else_impl(Exp&& exp, F&& f) { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() ? std::forward(exp) : detail::invoke(std::forward(f), @@ -4261,8 +4388,8 @@ constexpr auto or_else_impl(Exp &&exp, F &&f) { template (), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -detail::decay_t or_else_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +detail::decay_t or_else_impl(Exp&& exp, F&& f) { return exp.has_value() ? std::forward(exp) : (detail::invoke(std::forward(f), std::forward(exp).error()), @@ -4272,8 +4399,8 @@ detail::decay_t or_else_impl(Exp &&exp, F &&f) { template (), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -auto or_else_impl(Exp &&exp, F &&f) -> Ret { + detail::enable_if_t::value>* = nullptr> +auto or_else_impl(Exp&& exp, F&& f) -> Ret { static_assert(detail::is_expected::value, "F must return an expected"); return exp.has_value() ? std::forward(exp) : detail::invoke(std::forward(f), @@ -4283,8 +4410,8 @@ auto or_else_impl(Exp &&exp, F &&f) -> Ret { template (), std::declval().error())), - detail::enable_if_t::value> * = nullptr> -detail::decay_t or_else_impl(Exp &&exp, F &&f) { + detail::enable_if_t::value>* = nullptr> +detail::decay_t or_else_impl(Exp&& exp, F&& f) { return exp.has_value() ? std::forward(exp) : (detail::invoke(std::forward(f), std::forward(exp).error()), @@ -4294,65 +4421,65 @@ detail::decay_t or_else_impl(Exp &&exp, F &&f) { } // namespace detail template -constexpr bool operator==(const expected &lhs, - const expected &rhs) { +constexpr bool operator==(const expected& lhs, + const expected& rhs) { return (lhs.has_value() != rhs.has_value()) ? false : (!lhs.has_value() ? lhs.error() == rhs.error() : *lhs == *rhs); } template -constexpr bool operator!=(const expected &lhs, - const expected &rhs) { +constexpr bool operator!=(const expected& lhs, + const expected& rhs) { return (lhs.has_value() != rhs.has_value()) ? true : (!lhs.has_value() ? lhs.error() != rhs.error() : *lhs != *rhs); } template -constexpr bool operator==(const expected &lhs, - const expected &rhs) { +constexpr bool operator==(const expected& lhs, + const expected& rhs) { return (lhs.has_value() != rhs.has_value()) ? false : (!lhs.has_value() ? lhs.error() == rhs.error() : true); } template -constexpr bool operator!=(const expected &lhs, - const expected &rhs) { +constexpr bool operator!=(const expected& lhs, + const expected& rhs) { return (lhs.has_value() != rhs.has_value()) ? true : (!lhs.has_value() ? lhs.error() == rhs.error() : false); } template -constexpr bool operator==(const expected &x, const U &v) { +constexpr bool operator==(const expected& x, const U& v) { return x.has_value() ? *x == v : false; } template -constexpr bool operator==(const U &v, const expected &x) { +constexpr bool operator==(const U& v, const expected& x) { return x.has_value() ? *x == v : false; } template -constexpr bool operator!=(const expected &x, const U &v) { +constexpr bool operator!=(const expected& x, const U& v) { return x.has_value() ? *x != v : true; } template -constexpr bool operator!=(const U &v, const expected &x) { +constexpr bool operator!=(const U& v, const expected& x) { return x.has_value() ? *x != v : true; } template -constexpr bool operator==(const expected &x, const unexpected &e) { +constexpr bool operator==(const expected& x, const unexpected& e) { return x.has_value() ? false : x.error() == e.value(); } template -constexpr bool operator==(const unexpected &e, const expected &x) { +constexpr bool operator==(const unexpected& e, const expected& x) { return x.has_value() ? false : x.error() == e.value(); } template -constexpr bool operator!=(const expected &x, const unexpected &e) { +constexpr bool operator!=(const expected& x, const unexpected& e) { return x.has_value() ? true : x.error() != e.value(); } template -constexpr bool operator!=(const unexpected &e, const expected &x) { +constexpr bool operator!=(const unexpected& e, const expected& x) { return x.has_value() ? true : x.error() != e.value(); } @@ -4361,9 +4488,9 @@ template ::value) && detail::is_swappable::value && std::is_move_constructible::value && - detail::is_swappable::value> * = nullptr> -void swap(expected &lhs, - expected &rhs) noexcept(noexcept(lhs.swap(rhs))) { + detail::is_swappable::value>* = nullptr> +void swap(expected& lhs, + expected& rhs) noexcept(noexcept(lhs.swap(rhs))) { lhs.swap(rhs); } } // namespace tl @@ -4640,10 +4767,16 @@ template result_type parse_url_impl(std::string_view user_input, const result_type* base_url = nullptr); -extern template url_aggregator parse_url_impl( +extern template url_aggregator parse_url_impl( + std::string_view user_input, const url_aggregator* base_url); +extern template url_aggregator parse_url_impl( std::string_view user_input, const url_aggregator* base_url); -extern template url parse_url_impl(std::string_view user_input, - const url* base_url); +extern template url parse_url_impl(std::string_view user_input, + const url* base_url); + +/** @private */ +template +bool try_parse_simple_absolute(std::string_view input, result_type& out); #if ADA_INCLUDE_URL_PATTERN template @@ -4760,10 +4893,10 @@ struct url_components { constexpr static uint32_t omitted = uint32_t(-1); url_components() = default; - url_components(const url_components &u) = default; - url_components(url_components &&u) noexcept = default; - url_components &operator=(url_components &&u) noexcept = default; - url_components &operator=(const url_components &u) = default; + url_components(const url_components& u) = default; + url_components(url_components&& u) noexcept = default; + url_components& operator=(url_components&& u) noexcept = default; + url_components& operator=(const url_components& u) = default; ~url_components() = default; /** Offset of the end of the protocol/scheme (position of ':'). */ @@ -4849,25 +4982,19 @@ struct url_aggregator; */ struct url : url_base { url() = default; - url(const url &u) = default; - url(url &&u) noexcept = default; - url &operator=(url &&u) noexcept = default; - url &operator=(const url &u) = default; + url(const url& u) = default; + url(url&& u) noexcept = default; + url& operator=(url&& u) noexcept = default; + url& operator=(const url& u) = default; ~url() override = default; - /** - * @private - * A URL's username is an ASCII string identifying a username. It is initially - * the empty string. - */ - std::string username{}; - - /** - * @private - * A URL's password is an ASCII string identifying a password. It is initially - * the empty string. - */ - std::string password{}; + // Fields are ordered so that the most frequently accessed components + // tend to occupy earlier cache lines and remain close together in memory. + // + // Note: The exact object layout (including cache-line boundaries, byte + // offsets, and member sizes) is implementation- and platform-dependent. + // This ordering expresses an intent for better cache locality but does not + // guarantee any specific in-memory layout. /** * @private @@ -4875,13 +5002,6 @@ struct url : url_base { */ std::optional host{}; - /** - * @private - * A URL's port is either null or a 16-bit unsigned integer that identifies a - * networking port. It is initially null. - */ - std::optional port{}; - /** * @private * A URL's path is either an ASCII string or a list of zero or more ASCII @@ -4903,6 +5023,27 @@ struct url : url_base { */ std::optional hash{}; + /** + * @private + * A URL's port is either null or a 16-bit unsigned integer that identifies a + * networking port. It is initially null. + */ + std::optional port{}; + + /** + * @private + * A URL's username is an ASCII string identifying a username. It is initially + * the empty string. + */ + std::string username{}; + + /** + * @private + * A URL's password is an ASCII string identifying a password. It is initially + * the empty string. + */ + std::string password{}; + /** * Checks if the URL has an empty hostname (host is set but empty string). * @return `true` if host exists but is empty, `false` otherwise. @@ -4942,6 +5083,12 @@ struct url : url_base { */ [[nodiscard]] ada_really_inline std::string get_href() const; + /** + * Returns the byte length of the serialized URL without allocating a string. + * @return Size of the href in bytes. + */ + [[nodiscard]] size_t get_href_size() const noexcept; + /** * Returns the URL's origin as a string (scheme + host + port for special * URLs). @@ -5000,7 +5147,7 @@ struct url : url_base { * @return A constant reference to the username string. * @see https://url.spec.whatwg.org/#dom-url-username */ - [[nodiscard]] const std::string &get_username() const noexcept; + [[nodiscard]] const std::string& get_username() const noexcept; /** * Sets the URL's username, percent-encoding special characters. @@ -5085,7 +5232,7 @@ struct url : url_base { * @return A constant reference to the password string. * @see https://url.spec.whatwg.org/#dom-url-password */ - [[nodiscard]] const std::string &get_password() const noexcept; + [[nodiscard]] const std::string& get_password() const noexcept; /** * Returns the URL's port as a string (e.g., "8080"). @@ -5128,8 +5275,7 @@ struct url : url_base { * @return A newly constructed url_components struct. * @see https://github.com/servo/rust-url */ - [[nodiscard]] ada_really_inline ada::url_components get_components() - const noexcept; + [[nodiscard]] ada_really_inline ada::url_components get_components() const; /** * Checks if the URL has a fragment/hash component. @@ -5145,22 +5291,27 @@ struct url : url_base { private: friend ada::url ada::parser::parse_url(std::string_view, - const ada::url *); + const ada::url*); friend ada::url_aggregator ada::parser::parse_url( - std::string_view, const ada::url_aggregator *); + std::string_view, const ada::url_aggregator*); friend void ada::helpers::strip_trailing_spaces_from_opaque_path( - ada::url &url); + ada::url& url); friend ada::url ada::parser::parse_url_impl(std::string_view, - const ada::url *); + const ada::url*); friend ada::url_aggregator ada::parser::parse_url_impl< - ada::url_aggregator, true>(std::string_view, const ada::url_aggregator *); + ada::url_aggregator, true>(std::string_view, const ada::url_aggregator*); + friend ada::url_aggregator ada::parser::parse_url_impl< + ada::url_aggregator, false>(std::string_view, const ada::url_aggregator*); + template + friend bool ada::parser::try_parse_simple_absolute(std::string_view, + result_type&); inline void update_unencoded_base_hash(std::string_view input); inline void update_base_hostname(std::string_view input); inline void update_base_search(std::string_view input, const uint8_t query_percent_encode_set[]); - inline void update_base_search(std::optional &&input); + inline void update_base_search(std::optional&& input); inline void update_base_pathname(std::string_view input); inline void update_base_username(std::string_view input); inline void update_base_password(std::string_view input); @@ -5250,23 +5401,23 @@ struct url : url_base { * scheme string, be lower-cased, not contain spaces or tabs. It should * have no spurious trailing or leading content. */ - inline void set_scheme(std::string &&new_scheme) noexcept; + inline void set_scheme(std::string&& new_scheme) noexcept; /** * Take the scheme from another URL. The scheme string is moved from the * provided url. */ - constexpr void copy_scheme(ada::url &&u); + constexpr void copy_scheme(ada::url&& u); /** * Take the scheme from another URL. The scheme string is copied from the * provided url. */ - constexpr void copy_scheme(const ada::url &u); + constexpr void copy_scheme(const ada::url& u); }; // struct url -inline std::ostream &operator<<(std::ostream &out, const ada::url &u); +inline std::ostream& operator<<(std::ostream& out, const ada::url& u); } // namespace ada #endif // ADA_URL_H @@ -5317,6 +5468,11 @@ using result = tl::expected; * * @note The parser is fully compliant with the WHATWG URL Standard. * + * Parsing fails if the input or the resulting normalized URL exceeds + * `get_max_input_length()` bytes (default ~4 GB, configurable via + * `set_max_input_length()`). This accounts for percent-encoding expansion: + * a short input that normalizes into a long URL is still rejected. + * * @example * ```cpp * // Parse an absolute URL @@ -5351,29 +5507,12 @@ extern template ada::result parse( /** * Checks whether a URL string can be successfully parsed. * - * This is a fast validation function that checks if a URL string is valid - * according to the WHATWG URL Standard without fully constructing a URL - * object. Use this when you only need to validate URLs without needing - * their parsed components. + * Equivalent to `parse(input, base).has_value()` for every input, including + * when `set_max_input_length` rejects a normalized href that exceeds the limit. * * @param input The URL string to validate. Must be valid ASCII or UTF-8. - * @param base_input Optional pointer to a base URL string for resolving - * relative URLs. If nullptr (default), the input is validated as - * an absolute URL. - * - * @return `true` if the URL can be parsed successfully, `false` otherwise. - * - * @example - * ```cpp - * // Check absolute URL - * bool valid = ada::can_parse("https://example.com"); // true - * bool invalid = ada::can_parse("not a url"); // false - * - * // Check relative URL with base - * std::string_view base = "https://example.com/"; - * bool relative_valid = ada::can_parse("../path", &base); // true - * ``` - * + * @param base_input Optional base URL string for relative inputs. + * @return `true` if parsing would succeed, `false` otherwise. * @see https://url.spec.whatwg.org/#dom-url-canparse */ bool can_parse(std::string_view input, @@ -5413,11 +5552,37 @@ parse_url_pattern(std::variant&& input, * Creates a properly formatted file URL from a local file system path. * Handles platform-specific path separators and percent-encoding. * + * Respects `get_max_input_length()`: if the input path or the resulting + * `file://` href would exceed the limit, returns an empty string. + * * @param path The file system path to convert. Must be valid ASCII or UTF-8. * - * @return A file:// URL string representing the given path. + * @return A file:// URL string representing the given path, or empty on + * length-limit rejection. */ std::string href_from_file(std::string_view path); + +/** + * Sets the maximum allowed length for URLs. + * + * Both the raw input and the resulting normalized URL (the href) are checked + * against this limit. Parsing or setter calls that would produce a URL + * exceeding this length are rejected. The same limit also applies to + * `href_from_file` and to query strings passed to `url_search_params` + * construction / `reset`. The value must fit in a uint32_t. + * The default is std::numeric_limits::max() (approximately 4 GB). + * + * @param length The new maximum URL length in bytes. + */ +void set_max_input_length(uint32_t length); + +/** + * Returns the current maximum allowed length for URLs. + * + * @return The current maximum URL length in bytes. + */ +uint32_t get_max_input_length(); + } // namespace ada #endif // ADA_IMPLEMENTATION_H @@ -5515,7 +5680,7 @@ struct url_pattern_compile_component_options { url_pattern_compile_component_options() = default; explicit url_pattern_compile_component_options( std::optional new_delimiter = std::nullopt, - std::optional new_prefix = std::nullopt) + std::optional new_prefix = std::nullopt) noexcept : delimiter(new_delimiter), prefix(new_prefix) {} inline std::string_view get_delimiter() const ada_warn_unused; @@ -5935,6 +6100,9 @@ class Tokenizer { // @see https://urlpattern.spec.whatwg.org/#get-the-next-code-point constexpr void get_next_code_point(); + // True when the most recent decoded unit was malformed UTF-8. + bool had_invalid_code_point() const { return invalid_code_point; } + // @see https://urlpattern.spec.whatwg.org/#seek-and-get-the-next-code-point constexpr void seek_and_get_next_code_point(size_t index); @@ -5971,6 +6139,8 @@ class Tokenizer { size_t next_index = 0; // has an associated code point, a Unicode code point, initially null. char32_t code_point{}; + // Tracks whether the last decoded code point was malformed UTF-8. + bool invalid_code_point = false; }; // @see https://urlpattern.spec.whatwg.org/#constructor-string-parser @@ -6483,7 +6653,7 @@ constexpr uint64_t scheme_keys[] = { // @private // branchless load of up to 5 characters into a uint64_t, padding with zeros if // n < 5 -inline uint64_t branchless_load5(const char *p, size_t n) { +inline uint64_t branchless_load5(const char* p, size_t n) { uint64_t input = (uint8_t)p[0]; input |= ((uint64_t)(uint8_t)p[n > 1] << 8) & (0 - (uint64_t)(n > 1)); input |= ((uint64_t)(uint8_t)p[(n > 2) * 2] << 16) & (0 - (uint64_t)(n > 2)); @@ -6955,6 +7125,16 @@ ada_really_inline unsigned constexpr convert_hex_to_binary(char c) noexcept; */ std::string percent_decode(std::string_view input, size_t first_percent); +/** + * Decode an application/x-www-form-urlencoded component: map '+' to space, + * then percent-decode. Single allocation; no intermediate string. + * + * @param input A form-urlencoded component (key or value). + * @return The decoded string. + * @see https://url.spec.whatwg.org/#concept-urlencoded-parser + */ +std::string form_urlencoded_decode(std::string_view input); + /** * @private * Returns a percent-encoding string whether percent encoding was needed or not. @@ -7042,6 +7222,7 @@ url_base::scheme_default_port() const noexcept { #include +#include #include #include #if ADA_REGULAR_VISUAL_STUDIO @@ -7056,19 +7237,18 @@ namespace ada { return port.has_value(); } [[nodiscard]] inline bool url::cannot_have_credentials_or_port() const { - return !host.has_value() || host.value().empty() || - type == ada::scheme::type::FILE; + return !host.has_value() || host->empty() || type == ada::scheme::type::FILE; } [[nodiscard]] inline bool url::has_empty_hostname() const noexcept { if (!host.has_value()) { return false; } - return host.value().empty(); + return host->empty(); } [[nodiscard]] inline bool url::has_hostname() const noexcept { return host.has_value(); } -inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { +inline std::ostream& operator<<(std::ostream& out, const ada::url& u) { return out << u.to_string(); } @@ -7081,7 +7261,7 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { } [[nodiscard]] ada_really_inline ada::url_components url::get_components() - const noexcept { + const { url_components out{}; // protocol ends with ':'. for example: "https:" @@ -7104,12 +7284,12 @@ inline std::ostream &operator<<(std::ostream &out, const ada::url &u) { out.host_start += uint32_t(password.size() + 1); } - out.host_end = uint32_t(out.host_start + host.value().size()); + out.host_end = uint32_t(out.host_start + host->size()); } else { out.username_end = out.host_start; // Host does not start with "@" if it does not include credentials. - out.host_end = uint32_t(out.host_start + host.value().size()) - 1; + out.host_end = uint32_t(out.host_start + host->size()) - 1; } running_index = out.host_end + 1; @@ -7166,7 +7346,7 @@ inline void url::update_base_search(std::string_view input, query = ada::unicode::percent_encode(input, query_percent_encode_set); } -inline void url::update_base_search(std::optional &&input) { +inline void url::update_base_search(std::optional&& input) { query = std::move(input); } @@ -7200,7 +7380,7 @@ constexpr void url::clear_search() { query = std::nullopt; } constexpr void url::set_protocol_as_file() { type = ada::scheme::type::FILE; } -inline void url::set_scheme(std::string &&new_scheme) noexcept { +inline void url::set_scheme(std::string&& new_scheme) noexcept { type = ada::scheme::get_scheme_type(new_scheme); // We only move the 'scheme' if it is non-special. if (!is_special()) { @@ -7208,48 +7388,142 @@ inline void url::set_scheme(std::string &&new_scheme) noexcept { } } -constexpr void url::copy_scheme(ada::url &&u) { +constexpr void url::copy_scheme(ada::url&& u) { non_special_scheme = u.non_special_scheme; type = u.type; } -constexpr void url::copy_scheme(const ada::url &u) { +constexpr void url::copy_scheme(const ada::url& u) { non_special_scheme = u.non_special_scheme; type = u.type; } [[nodiscard]] ada_really_inline std::string url::get_href() const { - std::string output = get_protocol(); + if (is_special() && host.has_value() && username.empty() && + password.empty() && !port.has_value()) [[likely]] { + const std::string_view scheme = ada::scheme::details::is_special_list[type]; + const size_t host_size = host->size(); + const size_t path_size = path.size(); + const size_t query_size = query.has_value() ? query->size() : 0; + const size_t hash_size = hash.has_value() ? hash->size() : 0; + const size_t total = scheme.size() + 3 + host_size + path_size + + (query.has_value() ? query_size + 1 : 0) + + (hash.has_value() ? hash_size + 1 : 0); + std::string output(total, '\0'); + char* p = output.data(); + std::memcpy(p, scheme.data(), scheme.size()); + p += scheme.size(); + p[0] = ':'; + p[1] = '/'; + p[2] = '/'; + p += 3; + // NOLINTNEXTLINE(bugprone-not-null-terminated-result) + std::memcpy(p, host->data(), host_size); + p += host_size; + std::memcpy(p, path.data(), path_size); + p += path_size; + if (query.has_value()) { + *p++ = '?'; + // NOLINTNEXTLINE(bugprone-not-null-terminated-result) + std::memcpy(p, query->data(), query_size); + p += query_size; + } + if (hash.has_value()) { + *p++ = '#'; + // NOLINTNEXTLINE(bugprone-not-null-terminated-result) + std::memcpy(p, hash->data(), hash_size); + } + return output; + } + + std::string output; + output.reserve(get_href_size()); + + if (is_special()) { + output.append(ada::scheme::details::is_special_list[type]); + output += ':'; + } else { + output.append(non_special_scheme); + output += ':'; + } if (host.has_value()) { - output += "//"; + output += '/'; + output += '/'; if (has_credentials()) { - output += username; + output.append(username); if (!password.empty()) { - output += ":" + get_password(); + output += ':'; + output.append(password); } - output += "@"; + output += '@'; } - output += host.value(); + output.append(*host); if (port.has_value()) { - output += ":" + get_port(); + output += ':'; + char port_buf[5]; + auto [ptr, ec] = std::to_chars(port_buf, port_buf + 5, *port); + (void)ec; + output.append(port_buf, static_cast(ptr - port_buf)); } } else if (!has_opaque_path && path.starts_with("//")) { // If url's host is null, url does not have an opaque path, url's path's // size is greater than 1, and url's path[0] is the empty string, then // append U+002F (/) followed by U+002E (.) to output. - output += "/."; + output += '/'; + output += '.'; } - output += path; + output.append(path); if (query.has_value()) { - output += "?" + query.value(); + output += '?'; + output.append(*query); } if (hash.has_value()) { - output += "#" + hash.value(); + output += '#'; + output.append(*hash); } return output; } +[[nodiscard]] inline size_t url::get_href_size() const noexcept { + size_t size = 0; + if (is_special()) { + size += ada::scheme::details::is_special_list[type].size() + 1; + } else { + size += non_special_scheme.size() + 1; + } + if (host.has_value()) { + size += host->size(); + size += 2; + if (has_credentials()) { + size += username.size(); + if (!password.empty()) { + size += 1 + password.size(); + } + size += 1; + } + if (port.has_value()) { + size += 1; + uint16_t p = *port; + size += (p >= 10000) ? 5 + : (p >= 1000) ? 4 + : (p >= 100) ? 3 + : (p >= 10) ? 2 + : 1; + } + } else if (!has_opaque_path && path.starts_with("//")) { + size += 2; + } + size += path.size(); + if (query.has_value()) { + size += 1 + query->size(); + } + if (hash.has_value()) { + size += 1 + hash->size(); + } + return size; +} + ada_really_inline size_t url::parse_port(std::string_view view, bool check_trailing_content) noexcept { ada_log("parse_port('", view, "') ", view.size()); @@ -7419,10 +7693,10 @@ namespace parser {} */ struct url_aggregator : url_base { url_aggregator() = default; - url_aggregator(const url_aggregator &u) = default; - url_aggregator(url_aggregator &&u) noexcept = default; - url_aggregator &operator=(url_aggregator &&u) noexcept = default; - url_aggregator &operator=(const url_aggregator &u) = default; + url_aggregator(const url_aggregator& u) = default; + url_aggregator(url_aggregator&& u) noexcept = default; + url_aggregator& operator=(url_aggregator&& u) noexcept = default; + url_aggregator& operator=(const url_aggregator& u) = default; ~url_aggregator() override = default; /** @@ -7478,6 +7752,12 @@ struct url_aggregator : url_base { [[nodiscard]] constexpr std::string_view get_href() const noexcept ada_lifetime_bound; + /** + * Returns the byte length of the serialized URL without allocating a string. + * @return Size of the href in bytes. + */ + [[nodiscard]] constexpr size_t get_href_size() const noexcept; + /** * Returns the URL's username component. * Does not allocate memory. The returned view becomes invalid if this @@ -7593,7 +7873,7 @@ struct url_aggregator : url_base { * @return A constant reference to the url_components struct. * @see https://github.com/servo/rust-url */ - [[nodiscard]] ada_really_inline const url_components &get_components() + [[nodiscard]] ada_really_inline const url_components& get_components() const noexcept; /** @@ -7681,27 +7961,32 @@ struct url_aggregator : url_base { private: // helper methods friend void helpers::strip_trailing_spaces_from_opaque_path( - url_aggregator &url); + url_aggregator& url); // parse_url methods friend url_aggregator parser::parse_url( - std::string_view, const url_aggregator *); + std::string_view, const url_aggregator*); friend url_aggregator parser::parse_url_impl( - std::string_view, const url_aggregator *); + std::string_view, const url_aggregator*); friend url_aggregator parser::parse_url_impl( - std::string_view, const url_aggregator *); + std::string_view, const url_aggregator*); + template + friend bool parser::try_parse_simple_absolute(std::string_view, result_type&); #if ADA_INCLUDE_URL_PATTERN // url_pattern methods template friend tl::expected, errors> parse_url_pattern_impl( - std::variant &&input, - const std::string_view *base_url, const url_pattern_options *options); + std::variant&& input, + const std::string_view* base_url, const url_pattern_options* options); #endif // ADA_INCLUDE_URL_PATTERN - std::string buffer{}; + // components is declared before buffer so that the offset fields land + // close to url_base in memory, improving cache locality for getter calls. + // Note: exact cache-line placement is implementation- and platform-dependent. url_components components{}; + std::string buffer{}; /** * Returns true if neither the search, nor the hash nor the pathname @@ -7759,12 +8044,12 @@ struct url_aggregator : url_base { ada_really_inline bool parse_host(std::string_view input); inline void update_base_authority(std::string_view base_buffer, - const url_components &base); + const url_components& base); inline void update_unencoded_base_hash(std::string_view input); inline void update_base_hostname(std::string_view input); inline void update_base_search(std::string_view input); inline void update_base_search(std::string_view input, - const uint8_t *query_percent_encode_set); + const uint8_t* query_percent_encode_set); inline void update_base_pathname(std::string_view input); inline void update_base_username(std::string_view input); inline void append_base_username(std::string_view input); @@ -7793,13 +8078,13 @@ struct url_aggregator : url_base { */ inline void set_scheme_from_view_with_colon( std::string_view new_scheme_with_colon); - inline void copy_scheme(const url_aggregator &u); + inline void copy_scheme(const url_aggregator& u); inline void update_host_to_base_host(const std::string_view input); }; // url_aggregator -inline std::ostream &operator<<(std::ostream &out, const url &u); +inline std::ostream& operator<<(std::ostream& out, const url& u); } // namespace ada #endif @@ -7870,7 +8155,7 @@ ada_really_inline size_t percent_encode_index(const std::string_view input, namespace ada { inline void url_aggregator::update_base_authority( - std::string_view base_buffer, const ada::url_components &base) { + std::string_view base_buffer, const ada::url_components& base) { std::string_view input = base_buffer.substr( base.protocol_end, base.host_start - base.protocol_end); ada_log("url_aggregator::update_base_authority ", input); @@ -8578,7 +8863,7 @@ constexpr bool url_aggregator::cannot_have_credentials_or_port() const { components.host_start == components.host_end; } -[[nodiscard]] ada_really_inline const ada::url_components & +[[nodiscard]] ada_really_inline const ada::url_components& url_aggregator::get_components() const noexcept { return components; } @@ -8589,8 +8874,8 @@ url_aggregator::get_components() const noexcept { // Performance: instead of doing this potentially expensive check, we could // have a boolean in the struct. return components.protocol_end + 2 <= components.host_start && - helpers::substring(buffer, components.protocol_end, - components.protocol_end + 2) == "//"; + buffer[components.protocol_end] == '/' && + buffer[components.protocol_end + 1] == '/'; } inline void ada::url_aggregator::add_authority_slashes_if_needed() { @@ -8702,6 +8987,10 @@ constexpr bool url_aggregator::has_port() const noexcept { return buffer; } +[[nodiscard]] constexpr size_t url_aggregator::get_href_size() const noexcept { + return buffer.size(); +} + ada_really_inline size_t url_aggregator::parse_port(std::string_view view, bool check_trailing_content) { ada_log("url_aggregator::parse_port('", view, "') ", view.size()); @@ -8956,8 +9245,8 @@ constexpr void url_aggregator::set_protocol_as_file() { return helpers::substring(buffer, components.pathname_start, ending_index); } -inline std::ostream &operator<<(std::ostream &out, - const ada::url_aggregator &u) { +inline std::ostream& operator<<(std::ostream& out, + const ada::url_aggregator& u) { return out << u.to_string(); } @@ -9043,6 +9332,10 @@ using url_search_params_entries_iter = * All string inputs must be valid UTF-8. The caller is responsible for * ensuring UTF-8 validity. * + * Construction and `reset` refuse query strings longer than + * `get_max_input_length()` (the object is left empty). Individual `append` / + * `set` calls are not length-capped. + * * @see https://url.spec.whatwg.org/#interface-urlsearchparams */ struct url_search_params { @@ -9051,15 +9344,16 @@ struct url_search_params { /** * Constructs url_search_params by parsing a query string. * @param input A query string (with or without leading '?'). Must be UTF-8. + * If longer than `get_max_input_length()`, the object stays empty. */ explicit url_search_params(const std::string_view input) { initialize(input); } - url_search_params(const url_search_params &u) = default; - url_search_params(url_search_params &&u) noexcept = default; - url_search_params &operator=(url_search_params &&u) noexcept = default; - url_search_params &operator=(const url_search_params &u) = default; + url_search_params(const url_search_params& u) = default; + url_search_params(url_search_params&& u) noexcept = default; + url_search_params& operator=(url_search_params&& u) noexcept = default; + url_search_params& operator=(const url_search_params& u) = default; ~url_search_params() = default; /** @@ -9211,11 +9505,11 @@ struct url_search_params { template struct url_search_params_iter { inline url_search_params_iter() : params(EMPTY) {} - url_search_params_iter(const url_search_params_iter &u) = default; - url_search_params_iter(url_search_params_iter &&u) noexcept = default; - url_search_params_iter &operator=(url_search_params_iter &&u) noexcept = + url_search_params_iter(const url_search_params_iter& u) = default; + url_search_params_iter(url_search_params_iter&& u) noexcept = default; + url_search_params_iter& operator=(url_search_params_iter&& u) noexcept = default; - url_search_params_iter &operator=(const url_search_params_iter &u) = default; + url_search_params_iter& operator=(const url_search_params_iter& u) = default; ~url_search_params_iter() = default; /** @@ -9232,9 +9526,9 @@ struct url_search_params_iter { private: static url_search_params EMPTY; - inline url_search_params_iter(url_search_params ¶ms_) : params(params_) {} + inline url_search_params_iter(url_search_params& params_) : params(params_) {} - url_search_params ¶ms; + url_search_params& params; size_t pos = 0; friend struct url_search_params; @@ -9253,6 +9547,7 @@ struct url_search_params_iter { #include +#include #include #include #include @@ -9261,6 +9556,10 @@ struct url_search_params_iter { namespace ada { +// Declared in implementation.h; used here as a DoS bound on untrusted query +// strings (ada.h includes both headers). +uint32_t get_max_input_length(); + // A default, empty url_search_params for use with empty iterators. template url_search_params url_search_params_iter::EMPTY; @@ -9274,28 +9573,29 @@ inline void url_search_params::initialize(std::string_view input) { if (!input.empty() && input.front() == '?') { input.remove_prefix(1); } + if (input.empty()) { + return; + } + // Refuse overlong query strings (same process-wide cap as URL parsing). + if (input.size() > get_max_input_length()) { + return; + } - auto process_key_value = [&](const std::string_view current) { - auto equal = current.find('='); + params.reserve(size_t(std::count(input.begin(), input.end(), '&')) + 1); + auto process_key_value = [&](const std::string_view current) { + const auto equal = current.find('='); if (equal == std::string_view::npos) { - std::string name(current); - std::ranges::replace(name, '+', ' '); - params.emplace_back(unicode::percent_decode(name, name.find('%')), ""); + params.emplace_back(unicode::form_urlencoded_decode(current), ""); } else { - std::string name(current.substr(0, equal)); - std::string value(current.substr(equal + 1)); - - std::ranges::replace(name, '+', ' '); - std::ranges::replace(value, '+', ' '); - - params.emplace_back(unicode::percent_decode(name, name.find('%')), - unicode::percent_decode(value, value.find('%'))); + params.emplace_back( + unicode::form_urlencoded_decode(current.substr(0, equal)), + unicode::form_urlencoded_decode(current.substr(equal + 1))); } }; while (!input.empty()) { - auto ampersand_index = input.find('&'); + const auto ampersand_index = input.find('&'); if (ampersand_index == std::string_view::npos) { if (!input.empty()) { @@ -9320,7 +9620,7 @@ inline size_t url_search_params::size() const noexcept { return params.size(); } inline std::optional url_search_params::get( const std::string_view key) { auto entry = std::ranges::find_if( - params, [&key](const auto ¶m) { return param.first == key; }); + params, [&key](const auto& param) { return param.first == key; }); if (entry == params.end()) { return std::nullopt; @@ -9333,7 +9633,7 @@ inline std::vector url_search_params::get_all( const std::string_view key) { std::vector out{}; - for (auto ¶m : params) { + for (auto& param : params) { if (param.first == key) { out.emplace_back(param.second); } @@ -9344,13 +9644,13 @@ inline std::vector url_search_params::get_all( inline bool url_search_params::has(const std::string_view key) noexcept { auto entry = std::ranges::find_if( - params, [&key](const auto ¶m) { return param.first == key; }); + params, [&key](const auto& param) { return param.first == key; }); return entry != params.end(); } inline bool url_search_params::has(std::string_view key, std::string_view value) noexcept { - auto entry = std::ranges::find_if(params, [&key, &value](const auto ¶m) { + auto entry = std::ranges::find_if(params, [&key, &value](const auto& param) { return param.first == key && param.second == value; }); return entry != params.end(); @@ -9379,7 +9679,7 @@ inline std::string url_search_params::to_string() const { inline void url_search_params::set(const std::string_view key, const std::string_view value) { - const auto find = [&key](const auto ¶m) { return param.first == key; }; + const auto find = [&key](const auto& param) { return param.first == key; }; auto it = std::ranges::find_if(params, find); @@ -9394,12 +9694,12 @@ inline void url_search_params::set(const std::string_view key, inline void url_search_params::remove(const std::string_view key) { std::erase_if(params, - [&key](const auto ¶m) { return param.first == key; }); + [&key](const auto& param) { return param.first == key; }); } inline void url_search_params::remove(const std::string_view key, const std::string_view value) { - std::erase_if(params, [&key, &value](const auto ¶m) { + std::erase_if(params, [&key, &value](const auto& param) { return param.first == key && param.second == value; }); } @@ -9407,8 +9707,8 @@ inline void url_search_params::remove(const std::string_view key, inline void url_search_params::sort() { // Keys are expected to be valid UTF-8, but percent_decode can produce // arbitrary byte sequences. Handle truncated/invalid sequences gracefully. - std::ranges::stable_sort(params, [](const key_value_pair &lhs, - const key_value_pair &rhs) { + std::ranges::stable_sort(params, [](const key_value_pair& lhs, + const key_value_pair& rhs) { size_t i = 0, j = 0; uint32_t low_surrogate1 = 0, low_surrogate2 = 0; while ((i < lhs.first.size() || low_surrogate1 != 0) && @@ -10496,9 +10796,13 @@ constexpr bool constructor_string_parser::is_port_prefix() constexpr void Tokenizer::get_next_code_point() { ada_log("Tokenizer::get_next_code_point called with index=", next_index); ADA_ASSERT_TRUE(next_index < input.size()); - // this assumes that we have a valid, non-truncated UTF-8 stream. + // Decode the next UTF-8 code point. If malformed or truncated, mark it as + // invalid, return the offending byte as the code point, and advance by one + // to guarantee forward progress. + invalid_code_point = false; code_point = 0; size_t number_bytes = 0; + const size_t initial_index = next_index; unsigned char first_byte = input[next_index]; if ((first_byte & 0x80) == 0) { @@ -10526,10 +10830,40 @@ constexpr void Tokenizer::get_next_code_point() { number_bytes = 4; ada_log("Tokenizer::get_next_code_point four bytes"); } - ADA_ASSERT_TRUE(number_bytes + next_index <= input.size()); + + // Invalid leading bytes that still match a multi-byte prefix. + if ((number_bytes == 2 && first_byte < 0xC2) || + (number_bytes == 4 && first_byte > 0xF4)) { + invalid_code_point = true; + code_point = first_byte; + next_index = initial_index + 1; + return; + } + + // Invalid leading byte (e.g., continuation byte outside a sequence). + if (number_bytes == 0) { + invalid_code_point = true; + code_point = first_byte; + next_index = initial_index + 1; + return; + } + + // Truncated UTF-8 sequence. + if (number_bytes + next_index > input.size()) { + invalid_code_point = true; + code_point = first_byte; + next_index = initial_index + 1; + return; + } for (size_t i = 1 + next_index; i < number_bytes + next_index; ++i) { unsigned char byte = input[i]; + if ((byte & 0xC0) != 0x80) { + invalid_code_point = true; + code_point = first_byte; + next_index = initial_index + 1; + return; + } ada_log("Tokenizer::get_next_code_point read byte=", uint32_t(byte)); code_point = (code_point << 6) | (byte & 0x3F); } @@ -10959,7 +11293,8 @@ bool protocol_component_matches_special_scheme( component.exact_match_value == "https" || component.exact_match_value == "ws" || component.exact_match_value == "wss" || - component.exact_match_value == "ftp"; + component.exact_match_value == "ftp" || + component.exact_match_value == "file"; case url_pattern_component_type::FULL_WILDCARD: // Full wildcard matches everything including special schemes return true; @@ -10970,7 +11305,8 @@ bool protocol_component_matches_special_scheme( regex_provider::regex_match("https", regex) || regex_provider::regex_match("ws", regex) || regex_provider::regex_match("wss", regex) || - regex_provider::regex_match("ftp", regex); + regex_provider::regex_match("ftp", regex) || + regex_provider::regex_match("file", regex); } ada::unreachable(); } @@ -11067,6 +11403,8 @@ constructor_string_parser::parse(std::string_view input) { parser.group_depth += 1; // Increment parser's token index by parser's token increment. parser.token_index += parser.token_increment; + // Continue. + continue; } // If parser's group depth is greater than 0: @@ -11268,14 +11606,14 @@ constructor_string_parser::parse(std::string_view input) { #ifndef ADA_ADA_VERSION_H #define ADA_ADA_VERSION_H -#define ADA_VERSION "3.4.4" +#define ADA_VERSION "4.0.0" namespace ada { enum { - ADA_VERSION_MAJOR = 3, - ADA_VERSION_MINOR = 4, - ADA_VERSION_REVISION = 4, + ADA_VERSION_MAJOR = 4, + ADA_VERSION_MINOR = 0, + ADA_VERSION_REVISION = 0, }; } // namespace ada diff --git a/deps/ada/ada_c.h b/deps/ada/ada_c.h index 5e124984cf7601..98e4ce20ccd58a 100644 --- a/deps/ada/ada_c.h +++ b/deps/ada/ada_c.h @@ -13,7 +13,12 @@ // It represents "uint32_t(-1)" #define ada_url_omitted 0xffffffff -// string that is owned by the ada_url instance +// string that points to data stored in the ada_url instance +// +// Lifetime rules: +// - This pointer remains valid only while the underlying ada_url is unchanged. +// - Any mutation (e.g., ada_set_* and ada_clear_*) may invalidate previously +// returned ada_string pointers. typedef struct { const char* data; size_t length; @@ -57,6 +62,9 @@ bool ada_is_valid(ada_url result); // url_aggregator getters // if ada_is_valid(result)) is false, an empty string is returned +// +// Important: this invalidation rule applies only to getters that return +// ada_string. The ada_get_origin getter returns ada_owned_string. ada_owned_string ada_get_origin(ada_url result); ada_string ada_get_href(ada_url result); ada_string ada_get_username(ada_url result); @@ -184,6 +192,10 @@ ada_string_pair ada_search_params_entries_iter_next( bool ada_search_params_entries_iter_has_next( ada_url_search_params_entries_iter result); +// max URL length configuration +void ada_set_max_input_length(uint32_t length); +uint32_t ada_get_max_input_length(void); + // Definitions for Ada's version number. typedef struct { int major; diff --git a/test/benchmark/test-benchmark-url.js b/test/benchmark/test-benchmark-url.js index 664e7c4d8dc827..e11f0c029376cb 100644 --- a/test/benchmark/test-benchmark-url.js +++ b/test/benchmark/test-benchmark-url.js @@ -1,6 +1,10 @@ 'use strict'; -require('../common'); +const { skip } = require('../common'); + +if (process.config.variables.node_shared_ada) { + skip('WHATWG URL parsing is affected by different versions of Ada'); +} const runBenchmark = require('../common/benchmark'); diff --git a/test/fixtures/wpt/url/resources/IdnaTestV2.json b/test/fixtures/wpt/url/resources/IdnaTestV2.json index e152e256996207..ed4d433ebeeb8e 100644 --- a/test/fixtures/wpt/url/resources/IdnaTestV2.json +++ b/test/fixtures/wpt/url/resources/IdnaTestV2.json @@ -79,7 +79,7 @@ { "comment": "C1", "input": "xn--ab-j1t", - "output": null + "output": "xn--ab-j1t" }, { "input": "a\u094d\u200cb", @@ -131,7 +131,7 @@ { "comment": "C2", "input": "xn--ab-m1t", - "output": null + "output": "xn--ab-m1t" }, { "input": "a\u094d\u200db", @@ -547,7 +547,7 @@ { "comment": "V1", "input": "xn--u-ccb", - "output": null + "output": "xn--u-ccb" }, { "comment": "V7", @@ -571,22 +571,22 @@ { "comment": "V7", "input": "xn--acom-0w1b", - "output": null + "output": "xn--acom-0w1b" }, { "comment": "V7", "input": "xn--a-ecp.ru", - "output": null + "output": "xn--a-ecp.ru" }, { "comment": "P4", "input": "xn--0.pt", - "output": null + "output": "xn--0.pt" }, { "comment": "V7", "input": "xn--a.pt", - "output": null + "output": "xn--a.pt" }, { "comment": "P4", @@ -631,7 +631,7 @@ { "comment": "V4; V2 (ignored)", "input": "xn--xn--a--gua.pt", - "output": null + "output": "xn--xn--a--gua.pt" }, { "input": "\u65e5\u672c\u8a9e\u3002\uff2a\uff30", @@ -754,7 +754,7 @@ { "comment": "C1; C2; A4_2 (ignored)", "input": "1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc", - "output": null + "output": "1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc" }, { "comment": "C1; C2; A4_2 (ignored)", @@ -764,7 +764,7 @@ { "comment": "C1; C2; A4_2 (ignored)", "input": "1.xn--abcdexyz-qyacaaabaaaaaaabaaaaaaaaabaaaaaaaaabaaaaaaaa010ze2isb1140zba8cc", - "output": null + "output": "1.xn--abcdexyz-qyacaaabaaaaaaabaaaaaaaaabaaaaaaaaabaaaaaaaa010ze2isb1140zba8cc" }, { "comment": "C1; C2", @@ -797,7 +797,7 @@ { "comment": "C1; C2", "input": "xn--xn--bss-7z6ccid", - "output": null + "output": "xn--xn--bss-7z6ccid" }, { "comment": "C1; C2", @@ -807,7 +807,7 @@ { "comment": "C1; C2", "input": "xn--xn--b-pqa5796ccahd", - "output": null + "output": "xn--xn--b-pqa5796ccahd" }, { "input": "\u02e3\u034f\u2115\u200b\ufe63\u00ad\uff0d\u180c\u212c\ufe00\u017f\u2064\ud835\udd30\udb40\uddef\ufb04", @@ -1111,7 +1111,7 @@ { "comment": "V4; V2 (ignored)", "input": "xn--xn---epa", - "output": null + "output": "xn--xn---epa" }, { "comment": "A4_2 (ignored)", @@ -1276,7 +1276,7 @@ { "comment": "V6", "input": "a.b.xn--c-bcb.d", - "output": null + "output": "a.b.xn--c-bcb.d" }, { "input": "A0", @@ -1366,7 +1366,7 @@ { "comment": "C2", "input": "xn--dmc225h", - "output": null + "output": "xn--dmc225h" }, { "comment": "C2", @@ -1376,7 +1376,7 @@ { "comment": "C2", "input": "xn--1ug", - "output": null + "output": "xn--1ug" }, { "input": "\u0bb9\u0bcd\u200c", @@ -1394,7 +1394,7 @@ { "comment": "C1", "input": "xn--dmc025h", - "output": null + "output": "xn--dmc025h" }, { "comment": "C1", @@ -1404,7 +1404,7 @@ { "comment": "C1", "input": "xn--0ug", - "output": null + "output": "xn--0ug" }, { "input": "\u0644\u0670\u200c\u06ed\u06ef", @@ -1494,7 +1494,7 @@ { "comment": "C1", "input": "xn--cmba004q", - "output": null + "output": "xn--cmba004q" }, { "input": "xn--ghb", @@ -1562,17 +1562,17 @@ { "comment": "P4; A4_1 (ignored); A4_2 (ignored)", "input": "xn--", - "output": null + "output": "xn--" }, { "comment": "P4", "input": "xn---", - "output": null + "output": "xn---" }, { "comment": "P4", "input": "xn--ASCII-", - "output": null + "output": "xn--ascii-" }, { "input": "ascii", @@ -1581,7 +1581,7 @@ { "comment": "P4", "input": "xn--unicode-.org", - "output": null + "output": "xn--unicode-.org" }, { "input": "unicode.org", @@ -1722,12 +1722,12 @@ { "comment": "V7; V3 (ignored)", "input": "14.xn--7hb713l3v90n.-", - "output": null + "output": "14.xn--7hb713l3v90n.-" }, { "comment": "V7; V3 (ignored)", "input": "xn--7hb713lfwbi1311b.-", - "output": null + "output": "xn--7hb713lfwbi1311b.-" }, { "input": "\ua863.\u07cf", @@ -1780,17 +1780,17 @@ { "comment": "C2", "input": "xn--jbf929a90b0b.xn----p9j493ivi4l", - "output": null + "output": "xn--jbf929a90b0b.xn----p9j493ivi4l" }, { "comment": "V7", "input": "xn--jbf911clb.xn----6zg521d196p", - "output": null + "output": "xn--jbf911clb.xn----6zg521d196p" }, { "comment": "C2; V7", "input": "xn--jbf929a90b0b.xn----6zg521d196p", - "output": null + "output": "xn--jbf929a90b0b.xn----6zg521d196p" }, { "comment": "V7", @@ -1810,7 +1810,7 @@ { "comment": "V7", "input": "xn--gw68a.xn--ifb57ev2psc6027m", - "output": null + "output": "xn--gw68a.xn--ifb57ev2psc6027m" }, { "comment": "V6", @@ -1820,7 +1820,7 @@ { "comment": "V6", "input": "xn--nsa95820a.xn--wz1d", - "output": null + "output": "xn--nsa95820a.xn--wz1d" }, { "comment": "C1; V7", @@ -1835,22 +1835,22 @@ { "comment": "V7", "input": "xn--bn95b.xn--9kj2034e", - "output": null + "output": "xn--bn95b.xn--9kj2034e" }, { "comment": "C1; V7", "input": "xn--0ug15083f.xn--9kj2034e", - "output": null + "output": "xn--0ug15083f.xn--9kj2034e" }, { "comment": "V7", "input": "xn--bn95b.xn--qnd6272k", - "output": null + "output": "xn--bn95b.xn--qnd6272k" }, { "comment": "C1; V7", "input": "xn--0ug15083f.xn--qnd6272k", - "output": null + "output": "xn--0ug15083f.xn--qnd6272k" }, { "comment": "V7", @@ -1890,12 +1890,12 @@ { "comment": "V7", "input": "xn--gl0as212a.xn--8-o89h", - "output": null + "output": "xn--gl0as212a.xn--8-o89h" }, { "comment": "V7", "input": "xn--1ug6928ac48e.xn--8-o89h", - "output": null + "output": "xn--1ug6928ac48e.xn--8-o89h" }, { "comment": "V6; A4_2 (ignored)", @@ -1910,7 +1910,7 @@ { "comment": "V6; A4_2 (ignored)", "input": ".xn--ph4h", - "output": null + "output": ".xn--ph4h" }, { "comment": "C2", @@ -1955,12 +1955,12 @@ { "comment": "C2", "input": "xn--ss-59d.xn--1ug", - "output": null + "output": "xn--ss-59d.xn--1ug" }, { "comment": "C2", "input": "xn--zca012a.xn--1ug", - "output": null + "output": "xn--zca012a.xn--1ug" }, { "comment": "C1; V7", @@ -1975,22 +1975,22 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--1-bs31m..xn--tv36e", - "output": null + "output": "xn--1-bs31m..xn--tv36e" }, { "comment": "C1; V7; A4_2 (ignored)", "input": "xn--1-rgn37671n..xn--tv36e", - "output": null + "output": "xn--1-rgn37671n..xn--tv36e" }, { "comment": "V7", "input": "xn--tshz2001k.xn--tv36e", - "output": null + "output": "xn--tshz2001k.xn--tv36e" }, { "comment": "C1; V7", "input": "xn--0ug88o47900b.xn--tv36e", - "output": null + "output": "xn--0ug88o47900b.xn--tv36e" }, { "comment": "V7", @@ -2015,12 +2015,12 @@ { "comment": "V7", "input": "xn--ss-3xd2839nncy1m.xn--bb79d", - "output": null + "output": "xn--ss-3xd2839nncy1m.xn--bb79d" }, { "comment": "V7", "input": "xn--zca92z0t7n5w96j.xn--bb79d", - "output": null + "output": "xn--zca92z0t7n5w96j.xn--bb79d" }, { "comment": "C1; C2; V7", @@ -2035,12 +2035,12 @@ { "comment": "V7", "input": "xn--4pb2977v.xn--z0nt555ukbnv", - "output": null + "output": "xn--4pb2977v.xn--z0nt555ukbnv" }, { "comment": "C1; C2; V7", "input": "xn--4pb607jjt73a.xn--1ug236ke314donv1a", - "output": null + "output": "xn--4pb607jjt73a.xn--1ug236ke314donv1a" }, { "comment": "V6; A4_2 (ignored)", @@ -2060,7 +2060,7 @@ { "comment": "V6; A4_2 (ignored)", "input": "xn--n3b445e53p.", - "output": null + "output": "xn--n3b445e53p." }, { "comment": "V6; A4_2 (ignored)", @@ -2070,22 +2070,22 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--n3b742bkqf4ty.", - "output": null + "output": "xn--n3b742bkqf4ty." }, { "comment": "V7; A4_2 (ignored)", "input": "xn--n3b468aoqa89r.", - "output": null + "output": "xn--n3b468aoqa89r." }, { "comment": "V7; A4_2 (ignored)", "input": "xn--n3b445e53po6d.", - "output": null + "output": "xn--n3b445e53po6d." }, { "comment": "V7; A4_2 (ignored)", "input": "xn--n3b468azngju2a.", - "output": null + "output": "xn--n3b468azngju2a." }, { "comment": "C2; V6", @@ -2100,12 +2100,12 @@ { "comment": "V6", "input": "xn--pei.xn--0fb32q3w7q2g4d", - "output": null + "output": "xn--pei.xn--0fb32q3w7q2g4d" }, { "comment": "C2; V6", "input": "xn--1ugy10a.xn--0fb32q3w7q2g4d", - "output": null + "output": "xn--1ugy10a.xn--0fb32q3w7q2g4d" }, { "comment": "V6", @@ -2115,7 +2115,7 @@ { "comment": "V6", "input": "xn--nua.xn--bc6k", - "output": null + "output": "xn--nua.xn--bc6k" }, { "comment": "V6; A4_2 (ignored)", @@ -2130,12 +2130,12 @@ { "comment": "V6; A4_2 (ignored)", "input": "xn--ok3d.", - "output": null + "output": "xn--ok3d." }, { "comment": "V6; V7", "input": "xn--ok3d.xn--psd", - "output": null + "output": "xn--ok3d.xn--psd" }, { "comment": "V6", @@ -2150,12 +2150,12 @@ { "comment": "V6", "input": "xn--uy1a.xn--jk3d", - "output": null + "output": "xn--uy1a.xn--jk3d" }, { "comment": "V7", "input": "xn--8g1d12120a.xn--5l6h", - "output": null + "output": "xn--8g1d12120a.xn--5l6h" }, { "comment": "V6; V7", @@ -2170,7 +2170,7 @@ { "comment": "V6; V7", "input": "xn--2-5z4eu89y.xn--97l02706d", - "output": null + "output": "xn--2-5z4eu89y.xn--97l02706d" }, { "comment": "V7; A4_2 (ignored)", @@ -2195,12 +2195,12 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--4xa192qmp03d.", - "output": null + "output": "xn--4xa192qmp03d." }, { "comment": "V7; A4_2 (ignored)", "input": "xn--3xa392qmp03d.", - "output": null + "output": "xn--3xa392qmp03d." }, { "comment": "V7; A4_2 (ignored)", @@ -2215,22 +2215,22 @@ { "comment": "V7", "input": "xn--4xa192qmp03d.xn--psd", - "output": null + "output": "xn--4xa192qmp03d.xn--psd" }, { "comment": "V7", "input": "xn--3xa392qmp03d.xn--psd", - "output": null + "output": "xn--3xa392qmp03d.xn--psd" }, { "comment": "V7", "input": "xn--4xa192qmp03d.xn--cl7c", - "output": null + "output": "xn--4xa192qmp03d.xn--cl7c" }, { "comment": "V7", "input": "xn--3xa392qmp03d.xn--cl7c", - "output": null + "output": "xn--3xa392qmp03d.xn--cl7c" }, { "comment": "C2; V6; V7", @@ -2245,12 +2245,12 @@ { "comment": "V6; V7", "input": "xn--b726ey18m.xn--ldb8734fg0qcyzzg", - "output": null + "output": "xn--b726ey18m.xn--ldb8734fg0qcyzzg" }, { "comment": "C2; V6; V7", "input": "xn--1ug66101lt8me.xn--ldb8734fg0qcyzzg", - "output": null + "output": "xn--1ug66101lt8me.xn--ldb8734fg0qcyzzg" }, { "comment": "V7; A4_2 (ignored)", @@ -2270,12 +2270,12 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--4xa68573c7n64d.xn--f29c", - "output": null + "output": ".xn--4xa68573c7n64d.xn--f29c" }, { "comment": "V7; A4_2 (ignored)", "input": ".xn--3xa88573c7n64d.xn--f29c", - "output": null + "output": ".xn--3xa88573c7n64d.xn--f29c" }, { "comment": "V7", @@ -2310,7 +2310,7 @@ { "comment": "V7", "input": "2.xn--1chz4101l.xn--45iz7d6b", - "output": null + "output": "2.xn--1chz4101l.xn--45iz7d6b" }, { "comment": "V7", @@ -2325,17 +2325,17 @@ { "comment": "V7", "input": "xn--1ch07f91401d.xn--45iz7d6b", - "output": null + "output": "xn--1ch07f91401d.xn--45iz7d6b" }, { "comment": "V7", "input": "2.xn--1chz4101l.xn--gnd9b297j", - "output": null + "output": "2.xn--1chz4101l.xn--gnd9b297j" }, { "comment": "V7", "input": "xn--1ch07f91401d.xn--gnd9b297j", - "output": null + "output": "xn--1ch07f91401d.xn--gnd9b297j" }, { "input": "\ud83a\udd37.\ud802\udf90\ud83a\udc81\ud803\ude60\u0624", @@ -2370,12 +2370,12 @@ { "comment": "V7; V3 (ignored); U1 (ignored)", "input": "xn----hg4ei0361g.xn--8,-k362evu488a", - "output": null + "output": "xn----hg4ei0361g.xn--8,-k362evu488a" }, { "comment": "V7; V3 (ignored)", "input": "xn----hg4ei0361g.xn--207ht163h7m94c", - "output": null + "output": "xn----hg4ei0361g.xn--207ht163h7m94c" }, { "comment": "C1; V6", @@ -2390,12 +2390,12 @@ { "comment": "V6; A4_2 (ignored)", "input": ".xn--yua", - "output": null + "output": ".xn--yua" }, { "comment": "C1; V6", "input": "xn--0ug.xn--yua", - "output": null + "output": "xn--0ug.xn--yua" }, { "input": "\ud83a\udd25\udb40\udd6e\uff0e\u1844\u10ae", @@ -2448,7 +2448,7 @@ { "comment": "V7", "input": "xn--de6h.xn--mnd799a", - "output": null + "output": "xn--de6h.xn--mnd799a" }, { "input": "\ud83a\udd25.\u1844\u10ae", @@ -2472,7 +2472,7 @@ { "comment": "V6; V7", "input": "xn--0fd40533g.xn--1-tws", - "output": null + "output": "xn--0fd40533g.xn--1-tws" }, { "comment": "V6; V7", @@ -2482,7 +2482,7 @@ { "comment": "V6; V7", "input": "xn--0fd40533g.xn--1-q1g", - "output": null + "output": "xn--0fd40533g.xn--1-q1g" }, { "comment": "V7", @@ -2507,12 +2507,12 @@ { "comment": "V7", "input": "xn--8-zmb14974n.xn--su6h", - "output": null + "output": "xn--8-zmb14974n.xn--su6h" }, { "comment": "V7", "input": "xn--8-xmb44974n.xn--su6h", - "output": null + "output": "xn--8-xmb44974n.xn--su6h" }, { "comment": "V7", @@ -2542,7 +2542,7 @@ { "comment": "C1; V3 (ignored)", "input": "xn--0ug3307c.xn----d87b", - "output": null + "output": "xn--0ug3307c.xn----d87b" }, { "comment": "V6", @@ -2557,12 +2557,12 @@ { "comment": "V6", "input": "xn--lwwp69lqs7m.xn--b7b", - "output": null + "output": "xn--lwwp69lqs7m.xn--b7b" }, { "comment": "V6", "input": "xn--lwwp69lqs7m.xn--b7b605i", - "output": null + "output": "xn--lwwp69lqs7m.xn--b7b605i" }, { "comment": "V6", @@ -2587,7 +2587,7 @@ { "comment": "V6", "input": "xn--1uf.xn----nmlz65aub", - "output": null + "output": "xn--1uf.xn----nmlz65aub" }, { "comment": "V6", @@ -2612,7 +2612,7 @@ { "comment": "V6", "input": "xn--1zf224e.xn--73g3065g", - "output": null + "output": "xn--1zf224e.xn--73g3065g" }, { "comment": "V6", @@ -2627,17 +2627,17 @@ { "comment": "V6; V7", "input": "xn--pnd26a55x.xn--73g3065g", - "output": null + "output": "xn--pnd26a55x.xn--73g3065g" }, { "comment": "V6; V7", "input": "xn--osd925cvyn.xn--73g3065g", - "output": null + "output": "xn--osd925cvyn.xn--73g3065g" }, { "comment": "V6; V7", "input": "xn--pnd26a55x.xn--f3g7465g", - "output": null + "output": "xn--pnd26a55x.xn--f3g7465g" }, { "comment": "V7", @@ -2672,7 +2672,7 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--gdh892bbz0d5438s..", - "output": null + "output": "xn--gdh892bbz0d5438s.." }, { "comment": "V7", @@ -2687,17 +2687,17 @@ { "comment": "V7", "input": "xn--gdh892bbz0d5438s.xn--y86c", - "output": null + "output": "xn--gdh892bbz0d5438s.xn--y86c" }, { "comment": "V7; A4_2 (ignored)", "input": "xn--hnd212gz32d54x5r..", - "output": null + "output": "xn--hnd212gz32d54x5r.." }, { "comment": "V7", "input": "xn--hnd212gz32d54x5r.xn--y86c", - "output": null + "output": "xn--hnd212gz32d54x5r.xn--y86c" }, { "comment": "C1; V3 (ignored)", @@ -2737,7 +2737,7 @@ { "comment": "C1; V3 (ignored)", "input": "xn----1fa1788k.xn--0ug", - "output": null + "output": "xn----1fa1788k.xn--0ug" }, { "comment": "C1; V3 (ignored)", @@ -2772,22 +2772,22 @@ { "comment": "V6; A4_2 (ignored)", "input": "xn--ct2b0738h.xn--772h.", - "output": null + "output": "xn--ct2b0738h.xn--772h." }, { "comment": "C1; C2; V6; A4_2 (ignored)", "input": "xn--0ugb3358ili2v.xn--772h.", - "output": null + "output": "xn--0ugb3358ili2v.xn--772h." }, { "comment": "V6; V7", "input": "xn--ct2b0738h.xn--y86cl899a", - "output": null + "output": "xn--ct2b0738h.xn--y86cl899a" }, { "comment": "C1; C2; V6; V7", "input": "xn--0ugb3358ili2v.xn--y86cl899a", - "output": null + "output": "xn--0ugb3358ili2v.xn--y86cl899a" }, { "comment": "V6; V7; U1 (ignored)", @@ -2817,12 +2817,12 @@ { "comment": "V6; U1 (ignored)", "input": "3,.xn--1-43l.ss", - "output": null + "output": "3,.xn--1-43l.ss" }, { "comment": "V6; U1 (ignored)", "input": "3,.xn--1-43l.xn--zca", - "output": null + "output": "3,.xn--1-43l.xn--zca" }, { "comment": "V6; V7; U1 (ignored)", @@ -2842,22 +2842,22 @@ { "comment": "V6; V7; U1 (ignored)", "input": "3,.xn--ss-k1r094b", - "output": null + "output": "3,.xn--ss-k1r094b" }, { "comment": "V6; V7; U1 (ignored)", "input": "3,.xn--zca344lmif", - "output": null + "output": "3,.xn--zca344lmif" }, { "comment": "V6; V7", "input": "xn--x07h.xn--ss-k1r094b", - "output": null + "output": "xn--x07h.xn--ss-k1r094b" }, { "comment": "V6; V7", "input": "xn--x07h.xn--zca344lmif", - "output": null + "output": "xn--x07h.xn--zca344lmif" }, { "comment": "C2; V6", @@ -2887,12 +2887,12 @@ { "comment": "V6", "input": "xn--n3b956a9zm.xn--1ch912d", - "output": null + "output": "xn--n3b956a9zm.xn--1ch912d" }, { "comment": "C2; V6", "input": "xn--n3b956a9zm.xn--1ug63gz5w", - "output": null + "output": "xn--n3b956a9zm.xn--1ug63gz5w" }, { "comment": "V6; V7; V3 (ignored)", @@ -2902,7 +2902,7 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn--1zf.xn----483d46987byr50b", - "output": null + "output": "xn--1zf.xn----483d46987byr50b" }, { "input": "xn--9ob.xn--4xa", @@ -2919,32 +2919,32 @@ { "comment": "V7", "input": "xn--9ob.xn--4xa380e", - "output": null + "output": "xn--9ob.xn--4xa380e" }, { "comment": "C2; V7", "input": "xn--9ob.xn--4xa380ebol", - "output": null + "output": "xn--9ob.xn--4xa380ebol" }, { "comment": "C2; V7", "input": "xn--9ob.xn--3xa580ebol", - "output": null + "output": "xn--9ob.xn--3xa580ebol" }, { "comment": "V7", "input": "xn--9ob.xn--4xa574u", - "output": null + "output": "xn--9ob.xn--4xa574u" }, { "comment": "C2; V7", "input": "xn--9ob.xn--4xa795lq2l", - "output": null + "output": "xn--9ob.xn--4xa795lq2l" }, { "comment": "C2; V7", "input": "xn--9ob.xn--3xa995lq2l", - "output": null + "output": "xn--9ob.xn--3xa995lq2l" }, { "comment": "C2; V7", @@ -2964,12 +2964,12 @@ { "comment": "V7", "input": "xn--57e237h.xn--5sa98523p", - "output": null + "output": "xn--57e237h.xn--5sa98523p" }, { "comment": "C2; V7", "input": "xn--57e237h.xn--5sa649la993427a", - "output": null + "output": "xn--57e237h.xn--5sa649la993427a" }, { "comment": "C2; V7", @@ -2979,12 +2979,12 @@ { "comment": "V7", "input": "xn--bnd320b.xn--5sa98523p", - "output": null + "output": "xn--bnd320b.xn--5sa98523p" }, { "comment": "C2; V7", "input": "xn--bnd320b.xn--5sa649la993427a", - "output": null + "output": "xn--bnd320b.xn--5sa649la993427a" }, { "comment": "V6; V7", @@ -2999,7 +2999,7 @@ { "comment": "V6; V7", "input": "xn--mi4h.xn--1uf6843smg20c", - "output": null + "output": "xn--mi4h.xn--1uf6843smg20c" }, { "comment": "V7", @@ -3024,12 +3024,12 @@ { "comment": "V7", "input": "xn--ss-7dp66033t.xn--p5d", - "output": null + "output": "xn--ss-7dp66033t.xn--p5d" }, { "comment": "V7", "input": "xn--zca562jc642x.xn--p5d", - "output": null + "output": "xn--zca562jc642x.xn--p5d" }, { "comment": "C1; V7", @@ -3039,12 +3039,12 @@ { "comment": "V7", "input": "xn--b9i.xn--5p9y", - "output": null + "output": "xn--b9i.xn--5p9y" }, { "comment": "C1; V7", "input": "xn--0ugx66b.xn--0ugz2871c", - "output": null + "output": "xn--0ugx66b.xn--0ugz2871c" }, { "comment": "V6; V7", @@ -3059,7 +3059,7 @@ { "comment": "V6; V7", "input": "xn--hdhx157g68o0g.xn--c0e65eu616c34o7a", - "output": null + "output": "xn--hdhx157g68o0g.xn--c0e65eu616c34o7a" }, { "input": "\u00df\uff61\ud800\udef3\u10ac\u0fb8", @@ -3128,12 +3128,12 @@ { "comment": "V7", "input": "ss.xn--lgd10cu829c", - "output": null + "output": "ss.xn--lgd10cu829c" }, { "comment": "V7", "input": "xn--zca.xn--lgd10cu829c", - "output": null + "output": "xn--zca.xn--lgd10cu829c" }, { "comment": "V6; V7", @@ -3148,7 +3148,7 @@ { "comment": "V6; V7", "input": "xn--lqc703ebm93a.xn--9-000p", - "output": null + "output": "xn--lqc703ebm93a.xn--9-000p" }, { "comment": "V6; V7; V3 (ignored)", @@ -3163,7 +3163,7 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn--m8e.xn----mdb555dkk71m", - "output": null + "output": "xn--m8e.xn----mdb555dkk71m" }, { "comment": "V6; V7", @@ -3198,7 +3198,7 @@ { "comment": "V6; A4_2 (ignored)", "input": "xn--hcb613r.xn--7-pgo.", - "output": null + "output": "xn--hcb613r.xn--7-pgo." }, { "comment": "V6; V7", @@ -3213,17 +3213,17 @@ { "comment": "V6; V7", "input": "xn--hcb613r.xn--7-pgoy530h", - "output": null + "output": "xn--hcb613r.xn--7-pgoy530h" }, { "comment": "V6; V7; A4_2 (ignored)", "input": "xn--hcb887c.xn--7-pgo.", - "output": null + "output": "xn--hcb887c.xn--7-pgo." }, { "comment": "V6; V7", "input": "xn--hcb887c.xn--7-pgoy530h", - "output": null + "output": "xn--hcb887c.xn--7-pgoy530h" }, { "comment": "V7; U1 (ignored)", @@ -3238,17 +3238,17 @@ { "comment": "V7; U1 (ignored); A4_2 (ignored)", "input": "xn--6,-7i3c..xn--0f9ao925c", - "output": null + "output": "xn--6,-7i3c..xn--0f9ao925c" }, { "comment": "V7; U1 (ignored)", "input": "xn--6,-7i3cj157d.xn--0f9ao925c", - "output": null + "output": "xn--6,-7i3cj157d.xn--0f9ao925c" }, { "comment": "V7", "input": "xn--woqs083bel0g.xn--0f9ao925c", - "output": null + "output": "xn--woqs083bel0g.xn--0f9ao925c" }, { "comment": "V7; A4_2 (ignored)", @@ -3263,7 +3263,7 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--rx21bhv12i", - "output": null + "output": ".xn--rx21bhv12i" }, { "comment": "V6; V7; V3 (ignored)", @@ -3273,7 +3273,7 @@ { "comment": "V6; V7; V3 (ignored)", "input": "-.xn----pbkx6497q", - "output": null + "output": "-.xn----pbkx6497q" }, { "comment": "V7; V3 (ignored)", @@ -3298,12 +3298,12 @@ { "comment": "V7; V3 (ignored)", "input": "xn--t960e.-5ss", - "output": null + "output": "xn--t960e.-5ss" }, { "comment": "V7; V3 (ignored)", "input": "xn--t960e.xn---5-hia", - "output": null + "output": "xn--t960e.xn---5-hia" }, { "comment": "V7; V3 (ignored)", @@ -3338,22 +3338,22 @@ { "comment": "V6; V7", "input": "xn--0s9c.xn--tljz038l0gz4b", - "output": null + "output": "xn--0s9c.xn--tljz038l0gz4b" }, { "comment": "C2; V7", "input": "xn--1ug9533g.xn--tljz038l0gz4b", - "output": null + "output": "xn--1ug9533g.xn--tljz038l0gz4b" }, { "comment": "V6; V7", "input": "xn--0s9c.xn--9nd3211w0gz4b", - "output": null + "output": "xn--0s9c.xn--9nd3211w0gz4b" }, { "comment": "C2; V7", "input": "xn--1ug9533g.xn--9nd3211w0gz4b", - "output": null + "output": "xn--1ug9533g.xn--9nd3211w0gz4b" }, { "comment": "C2; V7", @@ -3378,17 +3378,17 @@ { "comment": "V7", "input": "xn--ey1p.xn--ss-eq36b", - "output": null + "output": "xn--ey1p.xn--ss-eq36b" }, { "comment": "C2; V7", "input": "xn--ey1p.xn--ss-n1tx0508a", - "output": null + "output": "xn--ey1p.xn--ss-n1tx0508a" }, { "comment": "C2; V7", "input": "xn--ey1p.xn--zca870nz438b", - "output": null + "output": "xn--ey1p.xn--zca870nz438b" }, { "comment": "C1; V6; V7", @@ -3433,17 +3433,17 @@ { "comment": "V6; V7", "input": "xn--zb9h5968x.xn--4xa378i1mfjw7y", - "output": null + "output": "xn--zb9h5968x.xn--4xa378i1mfjw7y" }, { "comment": "C1; V6; V7", "input": "xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y", - "output": null + "output": "xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y" }, { "comment": "C1; V6; V7", "input": "xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y", - "output": null + "output": "xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y" }, { "comment": "C1; V6; V7", @@ -3478,22 +3478,22 @@ { "comment": "V7; A4_2 (ignored)", "input": "4..1.xn--sf51d", - "output": null + "output": "4..1.xn--sf51d" }, { "comment": "C2; V7; A4_2 (ignored)", "input": "4..1.xn--1ug64613i", - "output": null + "output": "4..1.xn--1ug64613i" }, { "comment": "V7", "input": "xn--wsh.xn--tsh07994h", - "output": null + "output": "xn--wsh.xn--tsh07994h" }, { "comment": "C2; V7", "input": "xn--wsh.xn--1ug58o74922a", - "output": null + "output": "xn--wsh.xn--1ug58o74922a" }, { "comment": "V7", @@ -3513,12 +3513,12 @@ { "comment": "V7", "input": "xn--blj6306ey091d.xn--9jb4223l", - "output": null + "output": "xn--blj6306ey091d.xn--9jb4223l" }, { "comment": "V7", "input": "xn--1ugy52cym7p7xu5e.xn--9jb4223l", - "output": null + "output": "xn--1ugy52cym7p7xu5e.xn--9jb4223l" }, { "comment": "V7", @@ -3528,12 +3528,12 @@ { "comment": "V7", "input": "xn--rnd8945ky009c.xn--9jb4223l", - "output": null + "output": "xn--rnd8945ky009c.xn--9jb4223l" }, { "comment": "V7", "input": "xn--rnd479ep20q7x12e.xn--9jb4223l", - "output": null + "output": "xn--rnd479ep20q7x12e.xn--9jb4223l" }, { "comment": "V6; U1 (ignored)", @@ -3548,12 +3548,12 @@ { "comment": "V6; U1 (ignored)", "input": "xn--0s9c.xn--5,-81t", - "output": null + "output": "xn--0s9c.xn--5,-81t" }, { "comment": "V6; V7", "input": "xn--0s9c.xn--8ug8324p", - "output": null + "output": "xn--0s9c.xn--8ug8324p" }, { "comment": "V7; V3 (ignored)", @@ -3563,7 +3563,7 @@ { "comment": "V7; V3 (ignored)", "input": "xn--lmb18944c0g2z.xn----2k81m", - "output": null + "output": "xn--lmb18944c0g2z.xn----2k81m" }, { "comment": "V7", @@ -3573,7 +3573,7 @@ { "comment": "V7", "input": "xn--ie9hi1349bqdlb.xn--oj69a", - "output": null + "output": "xn--ie9hi1349bqdlb.xn--oj69a" }, { "comment": "C1; V6; V7", @@ -3588,22 +3588,22 @@ { "comment": "V6; V7", "input": "xn----9snu5320fi76w.xn--4-ivs", - "output": null + "output": "xn----9snu5320fi76w.xn--4-ivs" }, { "comment": "C1; V6; V7", "input": "xn----9snu5320fi76w.xn--4-sgn589c", - "output": null + "output": "xn----9snu5320fi76w.xn--4-sgn589c" }, { "comment": "V6; V7", "input": "xn----9snu5320fi76w.xn--4-f0g", - "output": null + "output": "xn----9snu5320fi76w.xn--4-f0g" }, { "comment": "C1; V6; V7", "input": "xn----9snu5320fi76w.xn--4-f0g649i", - "output": null + "output": "xn----9snu5320fi76w.xn--4-f0g649i" }, { "input": "\u16ad\uff61\ud834\udf20\u00df\ud81a\udef1", @@ -3684,7 +3684,7 @@ { "comment": "V6", "input": "xn--hdh5636g.xn--ci2d", - "output": null + "output": "xn--hdh5636g.xn--ci2d" }, { "comment": "C2", @@ -3709,22 +3709,22 @@ { "comment": "V6", "input": "xn--gdhz03bxt42d.xn--lrb6479j", - "output": null + "output": "xn--gdhz03bxt42d.xn--lrb6479j" }, { "comment": "C2", "input": "xn--gdhz03bxt42d.xn--lrb506jqr4n", - "output": null + "output": "xn--gdhz03bxt42d.xn--lrb506jqr4n" }, { "comment": "V6; V7", "input": "xn--jnd802gsm17c.xn--lrb6479j", - "output": null + "output": "xn--jnd802gsm17c.xn--lrb6479j" }, { "comment": "C2; V7", "input": "xn--jnd802gsm17c.xn--lrb506jqr4n", - "output": null + "output": "xn--jnd802gsm17c.xn--lrb506jqr4n" }, { "comment": "V6; V7", @@ -3739,7 +3739,7 @@ { "comment": "V6; V7", "input": "xn--u4e.xn--hdhx0084f", - "output": null + "output": "xn--u4e.xn--hdhx0084f" }, { "comment": "V6; V7", @@ -3774,7 +3774,7 @@ { "comment": "V6; V7", "input": "xn--c0e34564d.xn--9ca207st53lg3f", - "output": null + "output": "xn--c0e34564d.xn--9ca207st53lg3f" }, { "comment": "V6; V7", @@ -3809,7 +3809,7 @@ { "comment": "V6", "input": "xn--rlj.xn--vhb294g", - "output": null + "output": "xn--rlj.xn--vhb294g" }, { "comment": "V6", @@ -3819,7 +3819,7 @@ { "comment": "V6; V7", "input": "xn--7nd.xn--vhb294g", - "output": null + "output": "xn--7nd.xn--vhb294g" }, { "comment": "V7", @@ -3854,7 +3854,7 @@ { "comment": "V7", "input": "xn--oub.xn--sljz109bpe25dviva", - "output": null + "output": "xn--oub.xn--sljz109bpe25dviva" }, { "comment": "V7", @@ -3869,7 +3869,7 @@ { "comment": "V7", "input": "xn--oub.xn--8nd9522gpe69cviva", - "output": null + "output": "xn--oub.xn--8nd9522gpe69cviva" }, { "comment": "V6", @@ -3894,7 +3894,7 @@ { "comment": "V6", "input": "xn--gdh1854cn19c.xn--kqi", - "output": null + "output": "xn--gdh1854cn19c.xn--kqi" }, { "comment": "V6; V3 (ignored)", @@ -3904,7 +3904,7 @@ { "comment": "V6; V3 (ignored)", "input": "xn--210d.-", - "output": null + "output": "xn--210d.-" }, { "comment": "C2; V7; V3 (ignored)", @@ -3924,17 +3924,17 @@ { "comment": "C2; V3 (ignored); A4_2 (ignored)", "input": "xn--1-o7j663bdl7m..xn----381i", - "output": null + "output": "xn--1-o7j663bdl7m..xn----381i" }, { "comment": "V7; V3 (ignored)", "input": "xn--h8e863drj7h.xn----381i", - "output": null + "output": "xn--h8e863drj7h.xn----381i" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn--h8e470bl0d838o.xn----381i", - "output": null + "output": "xn--h8e470bl0d838o.xn----381i" }, { "comment": "C2; V7; V3 (ignored)", @@ -3964,17 +3964,17 @@ { "comment": "C2; V3 (ignored)", "input": "1.xn----tgnz80r.xn--kp5b", - "output": null + "output": "1.xn----tgnz80r.xn--kp5b" }, { "comment": "V7; V3 (ignored)", "input": "xn----dcp160o.xn--kp5b", - "output": null + "output": "xn----dcp160o.xn--kp5b" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn----tgnx5rjr6c.xn--kp5b", - "output": null + "output": "xn----tgnx5rjr6c.xn--kp5b" }, { "comment": "C1; V7", @@ -3984,12 +3984,12 @@ { "comment": "V7", "input": "xn--m9j.xn--rtb10784p", - "output": null + "output": "xn--m9j.xn--rtb10784p" }, { "comment": "C1; V7", "input": "xn--m9j.xn--rtb154j9l73w", - "output": null + "output": "xn--m9j.xn--rtb154j9l73w" }, { "comment": "V6", @@ -4014,12 +4014,12 @@ { "comment": "V6", "input": "xn--4xa.xn--3lb1944f", - "output": null + "output": "xn--4xa.xn--3lb1944f" }, { "comment": "V6", "input": "xn--3xa.xn--3lb1944f", - "output": null + "output": "xn--3xa.xn--3lb1944f" }, { "comment": "V6", @@ -4049,17 +4049,17 @@ { "comment": "V6; V7", "input": "xn--xmc83135idcxza.xn--tkjwb", - "output": null + "output": "xn--xmc83135idcxza.xn--tkjwb" }, { "comment": "V6; V7", "input": "xn--xmc83135idcxza.xn--9md086l", - "output": null + "output": "xn--xmc83135idcxza.xn--9md086l" }, { "comment": "V6; V7", "input": "xn--xmc83135idcxza.xn--9md2b", - "output": null + "output": "xn--xmc83135idcxza.xn--9md2b" }, { "comment": "C2; V6; V7; U1 (ignored)", @@ -4074,22 +4074,22 @@ { "comment": "V6; V7; U1 (ignored)", "input": "xn--7,-bid991urn3k.xn--1tb13454l", - "output": null + "output": "xn--7,-bid991urn3k.xn--1tb13454l" }, { "comment": "C2; V6; V7; U1 (ignored)", "input": "xn--7,-bid991urn3k.xn--1tb334j1197q", - "output": null + "output": "xn--7,-bid991urn3k.xn--1tb334j1197q" }, { "comment": "V6; V7", "input": "xn--xcb756i493fwi5o.xn--1tb13454l", - "output": null + "output": "xn--xcb756i493fwi5o.xn--1tb13454l" }, { "comment": "C2; V6; V7", "input": "xn--xcb756i493fwi5o.xn--1tb334j1197q", - "output": null + "output": "xn--xcb756i493fwi5o.xn--1tb334j1197q" }, { "comment": "V7", @@ -4109,7 +4109,7 @@ { "comment": "V7", "input": "xn--hbf.xn--s5a83117e", - "output": null + "output": "xn--hbf.xn--s5a83117e" }, { "comment": "V7", @@ -4119,7 +4119,7 @@ { "comment": "V7", "input": "xn--hbf.xn--d5a86117e", - "output": null + "output": "xn--hbf.xn--d5a86117e" }, { "comment": "V3 (ignored); A4_2 (ignored)", @@ -4149,7 +4149,7 @@ { "comment": "V6", "input": "xn--7m3d291b.xn--8-vws", - "output": null + "output": "xn--7m3d291b.xn--8-vws" }, { "comment": "V6", @@ -4159,7 +4159,7 @@ { "comment": "V6; V7", "input": "xn--7m3d291b.xn--8-s1g", - "output": null + "output": "xn--7m3d291b.xn--8-s1g" }, { "comment": "V6; V7", @@ -4174,7 +4174,7 @@ { "comment": "V6; V7", "input": "xn--zxf.xn--fx7ho0250c", - "output": null + "output": "xn--zxf.xn--fx7ho0250c" }, { "comment": "C1; V7; V3 (ignored)", @@ -4184,12 +4184,12 @@ { "comment": "V7; V3 (ignored); A4_2 (ignored)", "input": "xn----7i12hu122k9ire.", - "output": null + "output": "xn----7i12hu122k9ire." }, { "comment": "C1; V7; V3 (ignored)", "input": "xn----7i12hu122k9ire.xn--0ug", - "output": null + "output": "xn----7i12hu122k9ire.xn--0ug" }, { "comment": "V6; V7", @@ -4209,12 +4209,12 @@ { "comment": "V6; A4_2 (ignored)", "input": "..xn--s96cu30b", - "output": null + "output": "..xn--s96cu30b" }, { "comment": "V6; V7", "input": "xn--y86c.xn--s96cu30b", - "output": null + "output": "xn--y86c.xn--s96cu30b" }, { "comment": "C2; V6", @@ -4224,12 +4224,12 @@ { "comment": "V6; A4_2 (ignored)", "input": "xn--zi9a.", - "output": null + "output": "xn--zi9a." }, { "comment": "C2; V6", "input": "xn--zi9a.xn--1ug", - "output": null + "output": "xn--zi9a.xn--1ug" }, { "comment": "V7; V3 (ignored)", @@ -4239,7 +4239,7 @@ { "comment": "V7; V3 (ignored)", "input": "xn--xm38e.-", - "output": null + "output": "xn--xm38e.-" }, { "comment": "V7", @@ -4294,12 +4294,12 @@ { "comment": "V7", "input": "xn--pgh4639f.xn--ss-ifj426nle504a", - "output": null + "output": "xn--pgh4639f.xn--ss-ifj426nle504a" }, { "comment": "V7", "input": "xn--pgh4639f.xn--zca593eo6oc013y", - "output": null + "output": "xn--pgh4639f.xn--zca593eo6oc013y" }, { "comment": "V7", @@ -4344,7 +4344,7 @@ { "comment": "V6; V7", "input": "xn--xta.xn--e91aw9417e", - "output": null + "output": "xn--xta.xn--e91aw9417e" }, { "comment": "C2; V6; U1 (ignored)", @@ -4359,22 +4359,22 @@ { "comment": "V6; U1 (ignored)", "input": "xn--7,-gh9hg322i.xn--3ed", - "output": null + "output": "xn--7,-gh9hg322i.xn--3ed" }, { "comment": "C2; V6; U1 (ignored)", "input": "xn--7,-n1t0654eqo3o.xn--3ed", - "output": null + "output": "xn--7,-n1t0654eqo3o.xn--3ed" }, { "comment": "V6; V7", "input": "xn--nc9aq743ds0e.xn--3ed", - "output": null + "output": "xn--nc9aq743ds0e.xn--3ed" }, { "comment": "C2; V6; V7", "input": "xn--1ug4874cfd0kbmg.xn--3ed", - "output": null + "output": "xn--1ug4874cfd0kbmg.xn--3ed" }, { "comment": "V6", @@ -4384,7 +4384,7 @@ { "comment": "V6", "input": "xn--tc9a.xn--9jd663b", - "output": null + "output": "xn--tc9a.xn--9jd663b" }, { "comment": "V6", @@ -4399,7 +4399,7 @@ { "comment": "V6", "input": "xn--e1g71d.xn--772h", - "output": null + "output": "xn--e1g71d.xn--772h" }, { "comment": "C1", @@ -4419,7 +4419,7 @@ { "comment": "C1", "input": "xn--0ug.xn--hdh", - "output": null + "output": "xn--0ug.xn--hdh" }, { "comment": "V6; V7; V3 (ignored)", @@ -4434,7 +4434,7 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn----7m53aj640l.xn----8f4br83t", - "output": null + "output": "xn----7m53aj640l.xn----8f4br83t" }, { "comment": "C2; V7; V3 (ignored)", @@ -4444,12 +4444,12 @@ { "comment": "V7; V3 (ignored)", "input": "xn--87e0ol04cdl39e.xn----qinu247r", - "output": null + "output": "xn--87e0ol04cdl39e.xn----qinu247r" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn--87e0ol04cdl39e.xn----ugn5e3763s", - "output": null + "output": "xn--87e0ol04cdl39e.xn----ugn5e3763s" }, { "input": "\ud83a\udd53\uff0e\u0718", @@ -4509,7 +4509,7 @@ { "comment": "V7", "input": "xn--ynd2415j.xn--5-dug9054m", - "output": null + "output": "xn--ynd2415j.xn--5-dug9054m" }, { "comment": "C2; V6; U1 (ignored)", @@ -4534,12 +4534,12 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn----c6jx047j.xn--gff52t", - "output": null + "output": "xn----c6jx047j.xn--gff52t" }, { "comment": "C2; V6; V7", "input": "xn----c6j614b1z4v.xn--gff52t", - "output": null + "output": "xn----c6j614b1z4v.xn--gff52t" }, { "input": "\u2260.\u183f", @@ -4582,7 +4582,7 @@ { "comment": "V7", "input": "xn--td3j.xn--4628b", - "output": null + "output": "xn--td3j.xn--4628b" }, { "input": "xn--skb", @@ -4605,7 +4605,7 @@ { "comment": "V6; V3 (ignored)", "input": "xn--1-rfc312cdp45c.xn----nq0j", - "output": null + "output": "xn--1-rfc312cdp45c.xn----nq0j" }, { "comment": "V7", @@ -4620,7 +4620,7 @@ { "comment": "V7", "input": "xn--ph26c.xn--281b", - "output": null + "output": "xn--ph26c.xn--281b" }, { "comment": "V7", @@ -4630,7 +4630,7 @@ { "comment": "V7", "input": "xn--z7e98100evc01b.xn--czb", - "output": null + "output": "xn--z7e98100evc01b.xn--czb" }, { "comment": "C2; V7", @@ -4645,12 +4645,12 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--6x4u", - "output": null + "output": ".xn--6x4u" }, { "comment": "C2; V7", "input": "xn--1ug.xn--6x4u", - "output": null + "output": "xn--1ug.xn--6x4u" }, { "comment": "C1; V7", @@ -4675,12 +4675,12 @@ { "comment": "V7", "input": "xn--vn7c.xn--hdh501y8wvfs5h", - "output": null + "output": "xn--vn7c.xn--hdh501y8wvfs5h" }, { "comment": "C1; V7", "input": "xn--0ug2139f.xn--hdh501y8wvfs5h", - "output": null + "output": "xn--0ug2139f.xn--hdh501y8wvfs5h" }, { "comment": "V7", @@ -4775,12 +4775,12 @@ { "comment": "V7", "input": "xn--hdh84f.ss", - "output": null + "output": "xn--hdh84f.ss" }, { "comment": "V7", "input": "xn--hdh84f.xn--zca", - "output": null + "output": "xn--hdh84f.xn--zca" }, { "comment": "C1", @@ -4810,7 +4810,7 @@ { "comment": "C1", "input": "xn--0ug.xn--1ch", - "output": null + "output": "xn--0ug.xn--1ch" }, { "comment": "C1; V6", @@ -4820,12 +4820,12 @@ { "comment": "V6", "input": "xn--461dw464a.xn--v8e29loy65a", - "output": null + "output": "xn--461dw464a.xn--v8e29loy65a" }, { "comment": "C1; V6", "input": "xn--461dw464a.xn--v8e29ldzfo952a", - "output": null + "output": "xn--461dw464a.xn--v8e29ldzfo952a" }, { "comment": "C2; V6; V7; V3 (ignored)", @@ -4850,22 +4850,22 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn--6j00chy9a.xn----81n51bt713h", - "output": null + "output": "xn--6j00chy9a.xn----81n51bt713h" }, { "comment": "C2; V6; V7; V3 (ignored)", "input": "xn--1ug15151gkb5a.xn----81n51bt713h", - "output": null + "output": "xn--1ug15151gkb5a.xn----81n51bt713h" }, { "comment": "V6; V7; V3 (ignored)", "input": "xn--6j00chy9a.xn----61n81bt713h", - "output": null + "output": "xn--6j00chy9a.xn----61n81bt713h" }, { "comment": "C2; V6; V7; V3 (ignored)", "input": "xn--1ug15151gkb5a.xn----61n81bt713h", - "output": null + "output": "xn--1ug15151gkb5a.xn----61n81bt713h" }, { "comment": "C2; V6", @@ -4880,12 +4880,12 @@ { "comment": "V6", "input": "xn--kxh.xn--eoc8m432a", - "output": null + "output": "xn--kxh.xn--eoc8m432a" }, { "comment": "C2; V6", "input": "xn--1ug04r.xn--eoc8m432a40i", - "output": null + "output": "xn--1ug04r.xn--eoc8m432a40i" }, { "comment": "V7; U1 (ignored)", @@ -4900,12 +4900,12 @@ { "comment": "V7; U1 (ignored)", "input": "xn--n433d.1,", - "output": null + "output": "xn--n433d.1," }, { "comment": "V7", "input": "xn--n433d.xn--v07h", - "output": null + "output": "xn--n433d.xn--v07h" }, { "comment": "V6", @@ -4915,7 +4915,7 @@ { "comment": "V6", "input": "xn--rbry728b.xn--y88h", - "output": null + "output": "xn--rbry728b.xn--y88h" }, { "comment": "V6; V7", @@ -4930,7 +4930,7 @@ { "comment": "V6; V7", "input": "xn--3-ib31m.xn--4-pql", - "output": null + "output": "xn--3-ib31m.xn--4-pql" }, { "comment": "V7", @@ -4955,7 +4955,7 @@ { "comment": "V7", "input": "xn--hdh8193c.xn--5z40cp629b", - "output": null + "output": "xn--hdh8193c.xn--5z40cp629b" }, { "comment": "C2; V7", @@ -4990,12 +4990,12 @@ { "comment": "V7", "input": "xn--1t56e.xn--1ch153bqvw", - "output": null + "output": "xn--1t56e.xn--1ch153bqvw" }, { "comment": "C2; V7", "input": "xn--1t56e.xn--1ug73gzzpwi3a", - "output": null + "output": "xn--1t56e.xn--1ug73gzzpwi3a" }, { "comment": "C2; V7", @@ -5010,22 +5010,22 @@ { "comment": "V7", "input": "xn--1t56e.xn--2nd141ghl2a", - "output": null + "output": "xn--1t56e.xn--2nd141ghl2a" }, { "comment": "C2; V7", "input": "xn--1t56e.xn--2nd159e9vb743e", - "output": null + "output": "xn--1t56e.xn--2nd159e9vb743e" }, { "comment": "V6", "input": "3.1.xn--110d.j", - "output": null + "output": "3.1.xn--110d.j" }, { "comment": "V7", "input": "xn--tshd3512p.j", - "output": null + "output": "xn--tshd3512p.j" }, { "comment": "V6", @@ -5040,7 +5040,7 @@ { "comment": "V6", "input": "xn--oua.xn--mr9c", - "output": null + "output": "xn--oua.xn--mr9c" }, { "comment": "V6", @@ -5065,7 +5065,7 @@ { "comment": "V6", "input": "xn--gdh2512e.xn--i4c", - "output": null + "output": "xn--gdh2512e.xn--i4c" }, { "comment": "V3 (ignored)", @@ -5095,7 +5095,7 @@ { "comment": "V7; V3 (ignored)", "input": "xn--fc9a.xn----qmg787k869k", - "output": null + "output": "xn--fc9a.xn----qmg787k869k" }, { "comment": "V7", @@ -5120,12 +5120,12 @@ { "comment": "V7", "input": "xn--gdh.xn--4tjx101bsg00ds9pyc", - "output": null + "output": "xn--gdh.xn--4tjx101bsg00ds9pyc" }, { "comment": "V7", "input": "xn--gdh0880o.xn--4tjx101bsg00ds9pyc", - "output": null + "output": "xn--gdh0880o.xn--4tjx101bsg00ds9pyc" }, { "comment": "C2; V6; V7", @@ -5140,12 +5140,12 @@ { "comment": "V6; V7", "input": "xn--8v1d.xn--ye9h41035a2qqs", - "output": null + "output": "xn--8v1d.xn--ye9h41035a2qqs" }, { "comment": "C2; V6; V7", "input": "xn--8v1d.xn--1ug1386plvx1cd8vya", - "output": null + "output": "xn--8v1d.xn--1ug1386plvx1cd8vya" }, { "input": "\u00df\u09c1\u1ded\u3002\u06208\u2085", @@ -5228,22 +5228,22 @@ { "comment": "V6; V3 (ignored)", "input": "-18.xn--rx9c.xn--382h", - "output": null + "output": "-18.xn--rx9c.xn--382h" }, { "comment": "C1; V6; V3 (ignored)", "input": "xn---18-9m0a.xn--rx9c.xn--382h", - "output": null + "output": "xn---18-9m0a.xn--rx9c.xn--382h" }, { "comment": "V6; V7; V3 (ignored)", "input": "xn----ddps939g.xn--382h", - "output": null + "output": "xn----ddps939g.xn--382h" }, { "comment": "C1; V6; V7; V3 (ignored)", "input": "xn----sgn18r3191a.xn--382h", - "output": null + "output": "xn----sgn18r3191a.xn--382h" }, { "comment": "V7", @@ -5263,7 +5263,7 @@ { "comment": "V7", "input": "xn--y86c.xn--t6f5138v", - "output": null + "output": "xn--y86c.xn--t6f5138v" }, { "input": "xn--t6f5138v", @@ -5326,17 +5326,17 @@ { "comment": "V7; V3 (ignored)", "input": "xn--u836e.xn---ss-gl2a", - "output": null + "output": "xn--u836e.xn---ss-gl2a" }, { "comment": "C1; V7; V3 (ignored)", "input": "xn--u836e.xn---ss-cn0at5l", - "output": null + "output": "xn--u836e.xn---ss-cn0at5l" }, { "comment": "C1; V7; V3 (ignored)", "input": "xn--u836e.xn----qfa750ve7b", - "output": null + "output": "xn--u836e.xn----qfa750ve7b" }, { "comment": "C1; V7; V3 (ignored)", @@ -5403,7 +5403,7 @@ { "comment": "C1", "input": "xn--p8e650b.xn--1ch3a7084l", - "output": null + "output": "xn--p8e650b.xn--1ch3a7084l" }, { "comment": "V7", @@ -5418,12 +5418,12 @@ { "comment": "V7", "input": "xn--1fb94204l.xn--dlj", - "output": null + "output": "xn--1fb94204l.xn--dlj" }, { "comment": "V7", "input": "xn--1fb94204l.xn--tnd", - "output": null + "output": "xn--1fb94204l.xn--tnd" }, { "comment": "C1; V7", @@ -5438,12 +5438,12 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--w720c", - "output": null + "output": ".xn--w720c" }, { "comment": "C1; V7", "input": "xn--0ug.xn--w720c", - "output": null + "output": "xn--0ug.xn--w720c" }, { "comment": "C2; V7", @@ -5458,22 +5458,22 @@ { "comment": "V6; V7", "input": "1.xn--t1c6981c.xn--4c9a21133d", - "output": null + "output": "1.xn--t1c6981c.xn--4c9a21133d" }, { "comment": "C2; V6; V7", "input": "1.xn--t1c6981c.xn--1ugz184c9lw7i", - "output": null + "output": "1.xn--t1c6981c.xn--1ugz184c9lw7i" }, { "comment": "V7", "input": "xn--t1c337io97c.xn--4c9a21133d", - "output": null + "output": "xn--t1c337io97c.xn--4c9a21133d" }, { "comment": "C2; V7", "input": "xn--t1c337io97c.xn--1ugz184c9lw7i", - "output": null + "output": "xn--t1c337io97c.xn--1ugz184c9lw7i" }, { "comment": "V6", @@ -5483,7 +5483,7 @@ { "comment": "V6", "input": "xn--9zh3057f.xn--j7e103b", - "output": null + "output": "xn--9zh3057f.xn--j7e103b" }, { "comment": "C2; V3 (ignored)", @@ -5498,7 +5498,7 @@ { "comment": "C2; V3 (ignored)", "input": "-3.xn--fbf739aq5o", - "output": null + "output": "-3.xn--fbf739aq5o" }, { "comment": "C1; C2", @@ -5553,7 +5553,7 @@ { "comment": "C1; C2", "input": "xn--u4e823bq1a.xn--0ugb89o", - "output": null + "output": "xn--u4e823bq1a.xn--0ugb89o" }, { "comment": "C1; C2", @@ -5568,12 +5568,12 @@ { "comment": "V7", "input": "xn--u4e319b.xn--1ch", - "output": null + "output": "xn--u4e319b.xn--1ch" }, { "comment": "C1; C2; V7", "input": "xn--u4e823bcza.xn--0ugb89o", - "output": null + "output": "xn--u4e823bcza.xn--0ugb89o" }, { "comment": "V7", @@ -5598,7 +5598,7 @@ { "comment": "V7", "input": "xn--4fd57150h.xn--hdh", - "output": null + "output": "xn--4fd57150h.xn--hdh" }, { "comment": "V6", @@ -5618,12 +5618,12 @@ { "comment": "V6", "input": "xn--l76a726rt2h.xn--4xa", - "output": null + "output": "xn--l76a726rt2h.xn--4xa" }, { "comment": "V6", "input": "xn--l76a726rt2h.xn--3xa", - "output": null + "output": "xn--l76a726rt2h.xn--3xa" }, { "comment": "C1; V3 (ignored)", @@ -5653,12 +5653,12 @@ { "comment": "C1; V3 (ignored)", "input": "xn----zmb.xn--1--i1t", - "output": null + "output": "xn----zmb.xn--1--i1t" }, { "comment": "C1; V3 (ignored)", "input": "xn----xmb.xn--1--i1t", - "output": null + "output": "xn----xmb.xn--1--i1t" }, { "comment": "C1; V3 (ignored)", @@ -5688,7 +5688,7 @@ { "comment": "V6", "input": "xn----ggf830f.xn--vkj", - "output": null + "output": "xn----ggf830f.xn--vkj" }, { "comment": "V6", @@ -5698,7 +5698,7 @@ { "comment": "V6; V7", "input": "xn----ggf830f.xn--cnd", - "output": null + "output": "xn----ggf830f.xn--cnd" }, { "comment": "C2; V6; V7", @@ -5713,22 +5713,22 @@ { "comment": "V6; A4_2 (ignored)", "input": ".xn--1-1p4r.xn--s7uv61m", - "output": null + "output": ".xn--1-1p4r.xn--s7uv61m" }, { "comment": "C2; V6", "input": "xn--1ug.xn--1-1p4r.xn--s7uv61m", - "output": null + "output": "xn--1ug.xn--1-1p4r.xn--s7uv61m" }, { "comment": "V6; V7; A4_2 (ignored)", "input": ".xn--tsh026uql4bew9p", - "output": null + "output": ".xn--tsh026uql4bew9p" }, { "comment": "C2; V6; V7", "input": "xn--1ug.xn--tsh026uql4bew9p", - "output": null + "output": "xn--1ug.xn--tsh026uql4bew9p" }, { "comment": "V7", @@ -5748,7 +5748,7 @@ { "comment": "V7", "input": "xn--r3i.xn----2wst7439i", - "output": null + "output": "xn--r3i.xn----2wst7439i" }, { "comment": "V7", @@ -5758,7 +5758,7 @@ { "comment": "V7", "input": "xn--r3i.xn----z1g58579u", - "output": null + "output": "xn--r3i.xn----z1g58579u" }, { "comment": "V6", @@ -5773,7 +5773,7 @@ { "comment": "V6", "input": "xn--01h3338f.xn--79g270a", - "output": null + "output": "xn--01h3338f.xn--79g270a" }, { "comment": "V7", @@ -5798,7 +5798,7 @@ { "comment": "V7", "input": "xn--o4c1723h8g85gt4ya.xn--4-dvc", - "output": null + "output": "xn--o4c1723h8g85gt4ya.xn--4-dvc" }, { "comment": "V6; V7", @@ -5808,7 +5808,7 @@ { "comment": "V6; V7", "input": "xn--3j9a.xn--bua0708eqzrd", - "output": null + "output": "xn--3j9a.xn--bua0708eqzrd" }, { "comment": "C2; V7", @@ -5823,12 +5823,12 @@ { "comment": "V7", "input": "xn--g138cxw05a.xn--k0o", - "output": null + "output": "xn--g138cxw05a.xn--k0o" }, { "comment": "C2; V7", "input": "xn--1ug30527h9mxi.xn--k0o", - "output": null + "output": "xn--1ug30527h9mxi.xn--k0o" }, { "comment": "C2; U1 (ignored)", @@ -5848,17 +5848,17 @@ { "comment": "C2; U1 (ignored)", "input": "xn--8,-g9oy26fzu4d.xn--kmb859ja94998b", - "output": null + "output": "xn--8,-g9oy26fzu4d.xn--kmb859ja94998b" }, { "comment": "V7", "input": "xn--c9e433epi4b3j20a.xn--kmb6733w", - "output": null + "output": "xn--c9e433epi4b3j20a.xn--kmb6733w" }, { "comment": "C2; V7", "input": "xn--c9e433epi4b3j20a.xn--kmb859ja94998b", - "output": null + "output": "xn--c9e433epi4b3j20a.xn--kmb859ja94998b" }, { "comment": "C1; V6; V7; V3 (ignored)", @@ -5873,22 +5873,22 @@ { "comment": "V6; V3 (ignored); A4_2 (ignored)", "input": "xn--b7d82w..xn-----pe4u", - "output": null + "output": "xn--b7d82w..xn-----pe4u" }, { "comment": "C1; V6; V3 (ignored); A4_2 (ignored)", "input": "xn--b7d82wo4h..xn-----pe4u", - "output": null + "output": "xn--b7d82wo4h..xn-----pe4u" }, { "comment": "V6; V7; V3 (ignored)", "input": "xn--b7d82w.xn-----c82nz547a", - "output": null + "output": "xn--b7d82w.xn-----c82nz547a" }, { "comment": "C1; V6; V7; V3 (ignored)", "input": "xn--b7d82wo4h.xn-----c82nz547a", - "output": null + "output": "xn--b7d82wo4h.xn-----c82nz547a" }, { "comment": "V6; V3 (ignored)", @@ -5903,12 +5903,12 @@ { "comment": "V6; V3 (ignored)", "input": "xn--792h.xn----bse820x", - "output": null + "output": "xn--792h.xn----bse820x" }, { "comment": "V6; V7; V3 (ignored)", "input": "xn--792h.xn----bse632b", - "output": null + "output": "xn--792h.xn----bse632b" }, { "comment": "C1", @@ -5933,7 +5933,7 @@ { "comment": "C1", "input": "xn--9-mfs8024b.xn--0ug", - "output": null + "output": "xn--9-mfs8024b.xn--0ug" }, { "comment": "C1; V6", @@ -5943,12 +5943,12 @@ { "comment": "V6", "input": "xn--mta176jjjm.c", - "output": null + "output": "xn--mta176jjjm.c" }, { "comment": "C1; V6", "input": "xn--mta176j97cl2q.c", - "output": null + "output": "xn--mta176j97cl2q.c" }, { "comment": "C1; V6", @@ -5958,12 +5958,12 @@ { "comment": "V6; V7", "input": "xn--mta930emri.c", - "output": null + "output": "xn--mta930emri.c" }, { "comment": "C1; V6; V7", "input": "xn--mta930emribme.c", - "output": null + "output": "xn--mta930emribme.c" }, { "comment": "V6; V7", @@ -5988,12 +5988,12 @@ { "comment": "V6", "input": "xn--9ua0567e.7.xn--gdh6767c", - "output": null + "output": "xn--9ua0567e.7.xn--gdh6767c" }, { "comment": "V6; V7", "input": "xn--9ua0567e.xn--7-ngou006d1ttc", - "output": null + "output": "xn--9ua0567e.xn--7-ngou006d1ttc" }, { "input": "xn--2ib43l.xn--te6h", @@ -6020,32 +6020,32 @@ { "comment": "V6; A4_2 (ignored)", "input": ".xn--3ed0b", - "output": null + "output": ".xn--3ed0b" }, { "comment": "C1; V6", "input": "xn--0ug.xn--3ed0b", - "output": null + "output": "xn--0ug.xn--3ed0b" }, { "comment": "V7; A4_2 (ignored)", "input": ".xn--3ed0b20h", - "output": null + "output": ".xn--3ed0b20h" }, { "comment": "C1; V7", "input": "xn--0ug.xn--3ed0b20h", - "output": null + "output": "xn--0ug.xn--3ed0b20h" }, { "comment": "V7; A4_2 (ignored)", "input": ".xn--3ed0by082k", - "output": null + "output": ".xn--3ed0by082k" }, { "comment": "C1; V7", "input": "xn--0ug.xn--3ed0by082k", - "output": null + "output": "xn--0ug.xn--3ed0by082k" }, { "comment": "C2; V7", @@ -6070,12 +6070,12 @@ { "comment": "V7", "input": "xn--hdh84488f.xn--xy7cw2886b", - "output": null + "output": "xn--hdh84488f.xn--xy7cw2886b" }, { "comment": "C2; V7", "input": "xn--hdh84488f.xn--1ug8099fbjp4e", - "output": null + "output": "xn--hdh84488f.xn--1ug8099fbjp4e" }, { "input": "\ua9d0\u04c0\u1baa\u08f6\uff0e\ub235", @@ -6116,7 +6116,7 @@ { "comment": "V7", "input": "xn--d5a07sn4u297k.xn--2e1b", - "output": null + "output": "xn--d5a07sn4u297k.xn--2e1b" }, { "comment": "V6; V7", @@ -6131,7 +6131,7 @@ { "comment": "V6; V7", "input": "xn--3g9a.xn--ud1dz07k", - "output": null + "output": "xn--3g9a.xn--ud1dz07k" }, { "comment": "V7", @@ -6156,7 +6156,7 @@ { "comment": "V7", "input": "xn--3e2d79770c.xn--hdh0088abyy1c", - "output": null + "output": "xn--3e2d79770c.xn--hdh0088abyy1c" }, { "comment": "A4_2 (ignored)", @@ -6191,12 +6191,12 @@ { "comment": "V7", "input": "xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b", - "output": null + "output": "xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b" }, { "comment": "C1; V7", "input": "xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c", - "output": null + "output": "xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c" }, { "comment": "V6", @@ -6216,7 +6216,7 @@ { "comment": "V6", "input": "xn--tlj.xn--43-274o", - "output": null + "output": "xn--tlj.xn--43-274o" }, { "comment": "V6", @@ -6226,7 +6226,7 @@ { "comment": "V6; V7", "input": "xn--9nd.xn--43-274o", - "output": null + "output": "xn--9nd.xn--43-274o" }, { "comment": "V7", @@ -6241,17 +6241,17 @@ { "comment": "V7", "input": "xn--kgd72212e.xn--3j9au7544a", - "output": null + "output": "xn--kgd72212e.xn--3j9au7544a" }, { "comment": "V7", "input": "xn--kgd36f9z57y.xn--3j9au7544a", - "output": null + "output": "xn--kgd36f9z57y.xn--3j9au7544a" }, { "comment": "V7", "input": "xn--kgd7493jee34a.xn--3j9au7544a", - "output": null + "output": "xn--kgd7493jee34a.xn--3j9au7544a" }, { "comment": "C1; V6", @@ -6261,12 +6261,12 @@ { "comment": "V6", "input": "xn--6fb.xn--gmb0524f", - "output": null + "output": "xn--6fb.xn--gmb0524f" }, { "comment": "C1; V6", "input": "xn--6fb.xn--gmb469jjf1h", - "output": null + "output": "xn--6fb.xn--gmb469jjf1h" }, { "comment": "V7", @@ -6286,7 +6286,7 @@ { "comment": "V7", "input": "xn--c8e.xn--bbf9168i", - "output": null + "output": "xn--c8e.xn--bbf9168i" }, { "comment": "V7", @@ -6296,7 +6296,7 @@ { "comment": "V7", "input": "xn--hd7h.xn--46e66060j", - "output": null + "output": "xn--hd7h.xn--46e66060j" }, { "comment": "V7", @@ -6311,7 +6311,7 @@ { "comment": "V7", "input": "xn--4m3dv4354a.xn--gdh", - "output": null + "output": "xn--4m3dv4354a.xn--gdh" }, { "comment": "V6; A4_2 (ignored)", @@ -6326,7 +6326,7 @@ { "comment": "V6; A4_2 (ignored)", "input": ".xn--m0b461k3g2c", - "output": null + "output": ".xn--m0b461k3g2c" }, { "comment": "C2; V7", @@ -6341,12 +6341,12 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--0on3543c5981i.", - "output": null + "output": "xn--0on3543c5981i." }, { "comment": "C2; V7", "input": "xn--0on3543c5981i.xn--1ug", - "output": null + "output": "xn--0on3543c5981i.xn--1ug" }, { "comment": "V7", @@ -6396,17 +6396,17 @@ { "comment": "V7", "input": "xn--y86c.xn--hdh782b", - "output": null + "output": "xn--y86c.xn--hdh782b" }, { "comment": "V7; A4_2 (ignored)", "input": "..xn--bnd622g", - "output": null + "output": "..xn--bnd622g" }, { "comment": "V7", "input": "xn--y86c.xn--bnd622g", - "output": null + "output": "xn--y86c.xn--bnd622g" }, { "comment": "V7", @@ -6441,7 +6441,7 @@ { "comment": "V7", "input": "xn----4wsr321ay823p.xn----tfot873s", - "output": null + "output": "xn----4wsr321ay823p.xn----tfot873s" }, { "comment": "V7", @@ -6456,7 +6456,7 @@ { "comment": "V7", "input": "xn----11g3013fy8x5m.xn----tfot873s", - "output": null + "output": "xn----11g3013fy8x5m.xn----tfot873s" }, { "input": "\u07e5.\u06b5", @@ -6491,12 +6491,12 @@ { "comment": "V6; V3 (ignored)", "input": "xn--bkd.-", - "output": null + "output": "xn--bkd.-" }, { "comment": "C1; V6; V3 (ignored)", "input": "xn--bkd412fca.xn----sgn", - "output": null + "output": "xn--bkd412fca.xn----sgn" }, { "comment": "V6; V7", @@ -6511,12 +6511,12 @@ { "comment": "V6; A4_2 (ignored)", "input": "..xn--87e93m", - "output": null + "output": "..xn--87e93m" }, { "comment": "V6; V7", "input": "xn--y86c.xn--87e93m", - "output": null + "output": "xn--y86c.xn--87e93m" }, { "comment": "C2; V7; V3 (ignored)", @@ -6531,22 +6531,22 @@ { "comment": "V7; V3 (ignored); A4_2 (ignored)", "input": "xn----qml..xn--x50zy803a", - "output": null + "output": "xn----qml..xn--x50zy803a" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn----qml.xn--1ug.xn--x50zy803a", - "output": null + "output": "xn----qml.xn--1ug.xn--x50zy803a" }, { "comment": "V7; V3 (ignored)", "input": "xn----qml1407i.xn--x50zy803a", - "output": null + "output": "xn----qml1407i.xn--x50zy803a" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn----qmlv7tw180a.xn--x50zy803a", - "output": null + "output": "xn----qmlv7tw180a.xn--x50zy803a" }, { "comment": "V7", @@ -6561,7 +6561,7 @@ { "comment": "V7", "input": "xn--t546e.xn--hdh5166o", - "output": null + "output": "xn--t546e.xn--hdh5166o" }, { "input": "\u06b9\uff0e\u1873\u115f", @@ -6582,7 +6582,7 @@ { "comment": "V7", "input": "xn--skb.xn--osd737a", - "output": null + "output": "xn--skb.xn--osd737a" }, { "comment": "V7", @@ -6602,7 +6602,7 @@ { "comment": "V7", "input": "xn--mbm8237g.xn--7-7hf1526p", - "output": null + "output": "xn--mbm8237g.xn--7-7hf1526p" }, { "comment": "C1", @@ -6653,12 +6653,12 @@ { "comment": "C1", "input": "xn--ss-4ep585bkm5p.xn--ifh802b6a", - "output": null + "output": "xn--ss-4ep585bkm5p.xn--ifh802b6a" }, { "comment": "C1", "input": "xn--zca682johfi89m.xn--ifh802b6a", - "output": null + "output": "xn--zca682johfi89m.xn--ifh802b6a" }, { "comment": "C1", @@ -6683,27 +6683,27 @@ { "comment": "V7", "input": "xn--ss-4epx629f.xn--5nd703gyrh", - "output": null + "output": "xn--ss-4epx629f.xn--5nd703gyrh" }, { "comment": "C1; V7", "input": "xn--ss-4ep585bkm5p.xn--5nd703gyrh", - "output": null + "output": "xn--ss-4ep585bkm5p.xn--5nd703gyrh" }, { "comment": "V7", "input": "xn--ss-4epx629f.xn--undv409k", - "output": null + "output": "xn--ss-4epx629f.xn--undv409k" }, { "comment": "C1; V7", "input": "xn--ss-4ep585bkm5p.xn--undv409k", - "output": null + "output": "xn--ss-4ep585bkm5p.xn--undv409k" }, { "comment": "C1; V7", "input": "xn--zca682johfi89m.xn--undv409k", - "output": null + "output": "xn--zca682johfi89m.xn--undv409k" }, { "comment": "C2; V7", @@ -6723,17 +6723,17 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--4xa24344p", - "output": null + "output": ".xn--4xa24344p" }, { "comment": "C2; V7", "input": "xn--1ug.xn--4xa24344p", - "output": null + "output": "xn--1ug.xn--4xa24344p" }, { "comment": "C2; V7", "input": "xn--1ug.xn--3xa44344p", - "output": null + "output": "xn--1ug.xn--3xa44344p" }, { "comment": "V7; V3 (ignored)", @@ -6748,12 +6748,12 @@ { "comment": "V7; V3 (ignored)", "input": "11.xn--uz1d59632bxujd.xn----x310m", - "output": null + "output": "11.xn--uz1d59632bxujd.xn----x310m" }, { "comment": "V7; V3 (ignored)", "input": "xn--3shy698frsu9dt1me.xn----x310m", - "output": null + "output": "xn--3shy698frsu9dt1me.xn----x310m" }, { "comment": "C2; V3 (ignored)", @@ -6773,7 +6773,7 @@ { "comment": "C2; V3 (ignored)", "input": "-.xn--1ug", - "output": null + "output": "-.xn--1ug" }, { "comment": "V7", @@ -6788,7 +6788,7 @@ { "comment": "V7", "input": "xn--d0d41273c887z.xn--8-ob5i", - "output": null + "output": "xn--d0d41273c887z.xn--8-ob5i" }, { "comment": "C2; V3 (ignored)", @@ -6818,27 +6818,27 @@ { "comment": "C2; V3 (ignored)", "input": "xn----zmb048s.xn--rlj2573p", - "output": null + "output": "xn----zmb048s.xn--rlj2573p" }, { "comment": "C2; V3 (ignored)", "input": "xn----xmb348s.xn--rlj2573p", - "output": null + "output": "xn----xmb348s.xn--rlj2573p" }, { "comment": "V7; V3 (ignored)", "input": "xn----zmb.xn--7nd64871a", - "output": null + "output": "xn----zmb.xn--7nd64871a" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn----zmb048s.xn--7nd64871a", - "output": null + "output": "xn----zmb048s.xn--7nd64871a" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn----xmb348s.xn--7nd64871a", - "output": null + "output": "xn----xmb348s.xn--7nd64871a" }, { "input": "\u2260\u3002\ud83d\udfb3\ud835\udff2", @@ -6876,7 +6876,7 @@ { "comment": "V7", "input": "xn--g747d.xn--xl2a", - "output": null + "output": "xn--g747d.xn--xl2a" }, { "comment": "C2; V6", @@ -6901,12 +6901,12 @@ { "comment": "V6", "input": "xn--p0b.xn--e43b", - "output": null + "output": "xn--p0b.xn--e43b" }, { "comment": "C2; V6", "input": "xn--p0b869i.xn--e43b", - "output": null + "output": "xn--p0b869i.xn--e43b" }, { "comment": "V7", @@ -6921,7 +6921,7 @@ { "comment": "V7", "input": "xn--pr3x.xn--rv7w", - "output": null + "output": "xn--pr3x.xn--rv7w" }, { "comment": "V7", @@ -6941,7 +6941,7 @@ { "comment": "V7", "input": "xn--039c42bq865a.xn--4-wvs27840bnrzm", - "output": null + "output": "xn--039c42bq865a.xn--4-wvs27840bnrzm" }, { "comment": "V7", @@ -6951,7 +6951,7 @@ { "comment": "V7", "input": "xn--039c42bq865a.xn--4-t0g49302fnrzm", - "output": null + "output": "xn--039c42bq865a.xn--4-t0g49302fnrzm" }, { "comment": "V6", @@ -6966,7 +6966,7 @@ { "comment": "V6", "input": "5.xn--nlb", - "output": null + "output": "5.xn--nlb" }, { "comment": "C1; V7", @@ -6981,12 +6981,12 @@ { "comment": "V7", "input": "xn--i183d.xn--6g3a", - "output": null + "output": "xn--i183d.xn--6g3a" }, { "comment": "C1; V7", "input": "xn--0ug26167i.xn--6g3a", - "output": null + "output": "xn--0ug26167i.xn--6g3a" }, { "comment": "C1; C2; V7; V3 (ignored)", @@ -7001,22 +7001,22 @@ { "comment": "V7; V3 (ignored); A4_2 (ignored)", "input": ".xn--hh50e.xn----t2c", - "output": null + "output": ".xn--hh50e.xn----t2c" }, { "comment": "C1; C2; V7; V3 (ignored); A4_2 (ignored)", "input": ".xn--1ug05310k.xn----t2c071q", - "output": null + "output": ".xn--1ug05310k.xn----t2c071q" }, { "comment": "V7; V3 (ignored)", "input": "xn--y86c71305c.xn----t2c", - "output": null + "output": "xn--y86c71305c.xn----t2c" }, { "comment": "C1; C2; V7; V3 (ignored)", "input": "xn--1ug1658ftw26f.xn----t2c071q", - "output": null + "output": "xn--1ug1658ftw26f.xn----t2c071q" }, { "comment": "C2", @@ -7041,7 +7041,7 @@ { "comment": "C2", "input": "xn--1ug.j", - "output": null + "output": "xn--1ug.j" }, { "input": "j", @@ -7060,22 +7060,22 @@ { "comment": "V7", "input": "xn--5cb172r175fug38a.xn--mlj", - "output": null + "output": "xn--5cb172r175fug38a.xn--mlj" }, { "comment": "C1; V7", "input": "xn--5cb172r175fug38a.xn--0uga051h", - "output": null + "output": "xn--5cb172r175fug38a.xn--0uga051h" }, { "comment": "V7", "input": "xn--5cb347co96jug15a.xn--2nd", - "output": null + "output": "xn--5cb347co96jug15a.xn--2nd" }, { "comment": "C1; V7", "input": "xn--5cb347co96jug15a.xn--2nd059ea", - "output": null + "output": "xn--5cb347co96jug15a.xn--2nd059ea" }, { "comment": "V7", @@ -7085,7 +7085,7 @@ { "comment": "V7", "input": "xn--k97c.xn--q031e", - "output": null + "output": "xn--k97c.xn--q031e" }, { "comment": "V6; V7", @@ -7120,7 +7120,7 @@ { "comment": "V6; V7", "input": "xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f", - "output": null + "output": "xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f" }, { "comment": "V6; V7", @@ -7135,7 +7135,7 @@ { "comment": "V6; V7", "input": "xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f", - "output": null + "output": "xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f" }, { "comment": "V7", @@ -7150,7 +7150,7 @@ { "comment": "V7", "input": "xn--lqb.xn--jfb1808v", - "output": null + "output": "xn--lqb.xn--jfb1808v" }, { "comment": "V6", @@ -7165,12 +7165,12 @@ { "comment": "V6", "input": "xn--3-yke.xn--8-sl4et308f", - "output": null + "output": "xn--3-yke.xn--8-sl4et308f" }, { "comment": "V6", "input": "xn--3-yke.xn--8-ugnv982dbkwm", - "output": null + "output": "xn--3-yke.xn--8-ugnv982dbkwm" }, { "comment": "V7", @@ -7195,7 +7195,7 @@ { "comment": "V7", "input": "xn--cld333gn31h0158l.xn--3g0d", - "output": null + "output": "xn--cld333gn31h0158l.xn--3g0d" }, { "comment": "C1", @@ -7215,7 +7215,7 @@ { "comment": "C1", "input": "xn--rt6a.xn--0ug", - "output": null + "output": "xn--rt6a.xn--0ug" }, { "comment": "A4_2 (ignored)", @@ -7260,12 +7260,12 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--dj8y.", - "output": null + "output": "xn--dj8y." }, { "comment": "C1; C2; V7", "input": "xn--0ugz7551c.xn--1ug", - "output": null + "output": "xn--0ugz7551c.xn--1ug" }, { "comment": "V6; V7", @@ -7275,7 +7275,7 @@ { "comment": "V6; V7", "input": "xn--wd1d.xn--k946e", - "output": null + "output": "xn--wd1d.xn--k946e" }, { "input": "\u2f86\uff0e\ua848\uff15\u226f\u00df", @@ -7437,12 +7437,12 @@ { "comment": "C1", "input": "xn--0ug262c.xn--4xa", - "output": null + "output": "xn--0ug262c.xn--4xa" }, { "comment": "C1", "input": "xn--0ug262c.xn--3xa", - "output": null + "output": "xn--0ug262c.xn--3xa" }, { "comment": "C1", @@ -7462,22 +7462,22 @@ { "comment": "V7", "input": "xn--ynd.xn--4xa", - "output": null + "output": "xn--ynd.xn--4xa" }, { "comment": "V7", "input": "xn--ynd.xn--3xa", - "output": null + "output": "xn--ynd.xn--3xa" }, { "comment": "C1; V7", "input": "xn--ynd759e.xn--4xa", - "output": null + "output": "xn--ynd759e.xn--4xa" }, { "comment": "C1; V7", "input": "xn--ynd759e.xn--3xa", - "output": null + "output": "xn--ynd759e.xn--3xa" }, { "comment": "C1; C2", @@ -7497,12 +7497,12 @@ { "comment": "V6", "input": "xn--6g3a.xn--0sa8175flwa", - "output": null + "output": "xn--6g3a.xn--0sa8175flwa" }, { "comment": "C1; C2", "input": "xn--1ug0273b.xn--0sa359l6n7g13a", - "output": null + "output": "xn--1ug0273b.xn--0sa359l6n7g13a" }, { "input": "\u6dfd\u3002\u183e", @@ -7534,7 +7534,7 @@ { "comment": "V6; V7", "input": "xn--8di78qvw32y.xn--k80d", - "output": null + "output": "xn--8di78qvw32y.xn--k80d" }, { "comment": "V6; V7", @@ -7544,7 +7544,7 @@ { "comment": "V6; V7", "input": "xn--rnd896i0j14q.xn--k80d", - "output": null + "output": "xn--rnd896i0j14q.xn--k80d" }, { "comment": "V7", @@ -7559,7 +7559,7 @@ { "comment": "V7", "input": "xn--45e.xn--et6h", - "output": null + "output": "xn--45e.xn--et6h" }, { "comment": "C2; V6", @@ -7574,12 +7574,12 @@ { "comment": "V6", "input": "xn--uhb.xn--8tc4527k", - "output": null + "output": "xn--uhb.xn--8tc4527k" }, { "comment": "C2; V6", "input": "xn--uhb882k.xn--8tc4527k", - "output": null + "output": "xn--uhb882k.xn--8tc4527k" }, { "comment": "V6; V7", @@ -7609,12 +7609,12 @@ { "comment": "V6; V7", "input": "xn--ss-jl59biy67d.xn--ss-4d11aw87d", - "output": null + "output": "xn--ss-jl59biy67d.xn--ss-4d11aw87d" }, { "comment": "V6; V7", "input": "xn--zca20040bgrkh.xn--zca3653v86qa", - "output": null + "output": "xn--zca20040bgrkh.xn--zca3653v86qa" }, { "comment": "V6; V7", @@ -7639,7 +7639,7 @@ { "comment": "C1; C2", "input": "xn--1ug.xn--0ug", - "output": null + "output": "xn--1ug.xn--0ug" }, { "comment": "V7; A4_2 (ignored)", @@ -7654,7 +7654,7 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--s136e.", - "output": null + "output": "xn--s136e." }, { "comment": "V6; V7", @@ -7679,12 +7679,12 @@ { "comment": "V6; V7", "input": "xn--ym9av13acp85w.20.xn--d846e", - "output": null + "output": "xn--ym9av13acp85w.20.xn--d846e" }, { "comment": "V6; V7", "input": "xn--ym9av13acp85w.xn--dth22121k", - "output": null + "output": "xn--ym9av13acp85w.xn--dth22121k" }, { "comment": "C1; V7", @@ -7704,17 +7704,17 @@ { "comment": "C1; A4_2 (ignored)", "input": "xn--0ug..", - "output": null + "output": "xn--0ug.." }, { "comment": "V7; A4_2 (ignored)", "input": ".xn--y86c", - "output": null + "output": ".xn--y86c" }, { "comment": "C1; V7", "input": "xn--0ug.xn--y86c", - "output": null + "output": "xn--0ug.xn--y86c" }, { "comment": "C1; V3 (ignored)", @@ -7749,12 +7749,12 @@ { "comment": "C1; V3 (ignored)", "input": "xn---3-p9o.xn--ss---276a", - "output": null + "output": "xn---3-p9o.xn--ss---276a" }, { "comment": "C1; V3 (ignored)", "input": "xn---3-p9o.xn-----fia9303a", - "output": null + "output": "xn---3-p9o.xn-----fia9303a" }, { "comment": "C1; V3 (ignored)", @@ -7779,7 +7779,7 @@ { "comment": "V6; V7", "input": "xn--ibf35138o.xn--fpfz94g", - "output": null + "output": "xn--ibf35138o.xn--fpfz94g" }, { "comment": "V7", @@ -7794,12 +7794,12 @@ { "comment": "V6; V7", "input": "xn--3-rj42h.1.xn--2-13k96240l", - "output": null + "output": "xn--3-rj42h.1.xn--2-13k96240l" }, { "comment": "V7", "input": "xn--3-rj42h.xn--2-13k746cq465x", - "output": null + "output": "xn--3-rj42h.xn--2-13k746cq465x" }, { "comment": "C2; V7", @@ -7829,17 +7829,17 @@ { "comment": "C2; A4_2 (ignored)", "input": "xn--51-l1t..xn--8-ugn00i", - "output": null + "output": "xn--51-l1t..xn--8-ugn00i" }, { "comment": "V7", "input": "xn--5-ecp.xn--8-ogo", - "output": null + "output": "xn--5-ecp.xn--8-ogo" }, { "comment": "C2; V7", "input": "xn--5-tgnz5r.xn--8-ugn00i", - "output": null + "output": "xn--5-tgnz5r.xn--8-ugn00i" }, { "comment": "V7", @@ -7864,12 +7864,12 @@ { "comment": "V7", "input": "xn--nbc229o4y27dgskb.xn--gdh", - "output": null + "output": "xn--nbc229o4y27dgskb.xn--gdh" }, { "comment": "V7", "input": "xn--nbc493aro75ggskb.xn--gdh", - "output": null + "output": "xn--nbc493aro75ggskb.xn--gdh" }, { "input": "\ua860\uff0e\u06f2", @@ -7901,22 +7901,22 @@ { "comment": "V6; U1 (ignored)", "input": "xn--5,-op8g373c.xn--4sf0725i", - "output": null + "output": "xn--5,-op8g373c.xn--4sf0725i" }, { "comment": "C1; V6; U1 (ignored)", "input": "xn--5,-i1tz135dnbqa.xn--4sf36u6u4w", - "output": null + "output": "xn--5,-i1tz135dnbqa.xn--4sf36u6u4w" }, { "comment": "V6; V7", "input": "xn--2q5a751a653w.xn--4sf0725i", - "output": null + "output": "xn--2q5a751a653w.xn--4sf0725i" }, { "comment": "C1; V6; V7", "input": "xn--0ug4208b2vjuk63a.xn--4sf36u6u4w", - "output": null + "output": "xn--0ug4208b2vjuk63a.xn--4sf36u6u4w" }, { "comment": "V7", @@ -7931,7 +7931,7 @@ { "comment": "V7", "input": "xn--b5q.xn--v7e6041kqqd4m251b", - "output": null + "output": "xn--b5q.xn--v7e6041kqqd4m251b" }, { "comment": "C2", @@ -7950,7 +7950,7 @@ { "comment": "C2", "input": "1.xn--27-l1tb", - "output": null + "output": "1.xn--27-l1tb" }, { "comment": "V7; V3 (ignored)", @@ -7965,7 +7965,7 @@ { "comment": "V7; V3 (ignored)", "input": "xn----z8j.xn--1-5671m", - "output": null + "output": "xn----z8j.xn--1-5671m" }, { "comment": "C1; V7", @@ -7985,12 +7985,12 @@ { "comment": "V7", "input": "xn--zed372mdj2do3v4h.xn--e5h11w", - "output": null + "output": "xn--zed372mdj2do3v4h.xn--e5h11w" }, { "comment": "C1; V7", "input": "xn--zed372mdj2do3v4h.xn--0uga678bgyh", - "output": null + "output": "xn--zed372mdj2do3v4h.xn--0uga678bgyh" }, { "comment": "C1; V7", @@ -8000,12 +8000,12 @@ { "comment": "V7", "input": "xn--zed54dz10wo343g.xn--nnd651i", - "output": null + "output": "xn--zed54dz10wo343g.xn--nnd651i" }, { "comment": "C1; V7", "input": "xn--zed54dz10wo343g.xn--nnd089ea464d", - "output": null + "output": "xn--zed54dz10wo343g.xn--nnd089ea464d" }, { "comment": "C2; V6", @@ -8020,12 +8020,12 @@ { "comment": "V6; A4_2 (ignored)", "input": "xn--4-xu7i.", - "output": null + "output": "xn--4-xu7i." }, { "comment": "C2; V6", "input": "xn--4-xu7i.xn--1ug", - "output": null + "output": "xn--4-xu7i.xn--1ug" }, { "comment": "C1; V6; V7", @@ -8060,12 +8060,12 @@ { "comment": "V6; V7", "input": "xn--mlju35u7qx2f.xn--et3bn23n", - "output": null + "output": "xn--mlju35u7qx2f.xn--et3bn23n" }, { "comment": "C1; V6; V7", "input": "xn--mlju35u7qx2f.xn--0ugb6122js83c", - "output": null + "output": "xn--mlju35u7qx2f.xn--0ugb6122js83c" }, { "comment": "C1; V6; V7", @@ -8080,12 +8080,12 @@ { "comment": "V6; V7", "input": "xn--2nd6803c7q37d.xn--et3bn23n", - "output": null + "output": "xn--2nd6803c7q37d.xn--et3bn23n" }, { "comment": "C1; V6; V7", "input": "xn--2nd6803c7q37d.xn--0ugb6122js83c", - "output": null + "output": "xn--2nd6803c7q37d.xn--0ugb6122js83c" }, { "comment": "V7", @@ -8110,7 +8110,7 @@ { "comment": "V7", "input": "xn--5-24jyf768b.xn--lqw213ime95g", - "output": null + "output": "xn--5-24jyf768b.xn--lqw213ime95g" }, { "comment": "V7; V3 (ignored)", @@ -8125,12 +8125,12 @@ { "comment": "V7; V3 (ignored); A4_2 (ignored)", "input": "xn---8-bv5o..7.xn--c35nf1622b", - "output": null + "output": "xn---8-bv5o..7.xn--c35nf1622b" }, { "comment": "V7; V3 (ignored)", "input": "xn----scp6252h.xn--zshy411yzpx2d", - "output": null + "output": "xn----scp6252h.xn--zshy411yzpx2d" }, { "comment": "C1; C2", @@ -8185,7 +8185,7 @@ { "comment": "C1; C2", "input": "xn--0ugc160hb36e.xn--gdh", - "output": null + "output": "xn--0ugc160hb36e.xn--gdh" }, { "comment": "C1; C2", @@ -8200,12 +8200,12 @@ { "comment": "V7", "input": "xn--8md0962c.xn--gdh", - "output": null + "output": "xn--8md0962c.xn--gdh" }, { "comment": "C1; C2; V7", "input": "xn--8md700fea3748f.xn--gdh", - "output": null + "output": "xn--8md700fea3748f.xn--gdh" }, { "comment": "C2; V6; V7", @@ -8220,12 +8220,12 @@ { "comment": "V6; V7", "input": "xn--t8c.xn--iz4a43209d", - "output": null + "output": "xn--t8c.xn--iz4a43209d" }, { "comment": "C2; V6; V7", "input": "xn--t8c059f.xn--iz4a43209d", - "output": null + "output": "xn--t8c059f.xn--iz4a43209d" }, { "comment": "V7; V3 (ignored)", @@ -8235,7 +8235,7 @@ { "comment": "V7; V3 (ignored)", "input": "xn--ep37b.xn----hec165lho83b", - "output": null + "output": "xn--ep37b.xn----hec165lho83b" }, { "comment": "C2; V6; V7", @@ -8270,17 +8270,17 @@ { "comment": "V6; V7", "input": "xn--nu4s.xn--4xa153j7im", - "output": null + "output": "xn--nu4s.xn--4xa153j7im" }, { "comment": "C2; V6; V7", "input": "xn--nu4s.xn--4xa153jk8cs1q", - "output": null + "output": "xn--nu4s.xn--4xa153jk8cs1q" }, { "comment": "C2; V6; V7", "input": "xn--nu4s.xn--3xa353jk8cs1q", - "output": null + "output": "xn--nu4s.xn--3xa353jk8cs1q" }, { "comment": "C2; V6; V7", @@ -8305,17 +8305,17 @@ { "comment": "V6; V7", "input": "xn--nu4s.xn--4xa217dxri", - "output": null + "output": "xn--nu4s.xn--4xa217dxri" }, { "comment": "C2; V6; V7", "input": "xn--nu4s.xn--4xa217dxriome", - "output": null + "output": "xn--nu4s.xn--4xa217dxriome" }, { "comment": "C2; V6; V7", "input": "xn--nu4s.xn--3xa417dxriome", - "output": null + "output": "xn--nu4s.xn--3xa417dxriome" }, { "comment": "C1; V6; V7", @@ -8330,22 +8330,22 @@ { "comment": "V6; A4_2 (ignored)", "input": "1.xn--sv9a..xn--mfc", - "output": null + "output": "1.xn--sv9a..xn--mfc" }, { "comment": "C1; V6; A4_2 (ignored)", "input": "1.xn--0ug7185c..xn--mfc", - "output": null + "output": "1.xn--0ug7185c..xn--mfc" }, { "comment": "V6; V7", "input": "xn--tsh0720cse8b.xn--mfc", - "output": null + "output": "xn--tsh0720cse8b.xn--mfc" }, { "comment": "C1; V6; V7", "input": "xn--0ug78o720myr1c.xn--mfc", - "output": null + "output": "xn--0ug78o720myr1c.xn--mfc" }, { "comment": "C2; V6; V7", @@ -8370,17 +8370,17 @@ { "comment": "V6; V7", "input": "ss.xn--0zf22107b", - "output": null + "output": "ss.xn--0zf22107b" }, { "comment": "C2; V6; V7", "input": "xn--ss-n1t.xn--0zf22107b", - "output": null + "output": "xn--ss-n1t.xn--0zf22107b" }, { "comment": "C2; V6; V7", "input": "xn--zca870n.xn--0zf22107b", - "output": null + "output": "xn--zca870n.xn--0zf22107b" }, { "comment": "V6", @@ -8395,12 +8395,12 @@ { "comment": "V6", "input": "xn--gdhz656g.xn--gdh", - "output": null + "output": "xn--gdhz656g.xn--gdh" }, { "comment": "V6", "input": "xn--0ugy6glz29a.xn--gdh", - "output": null + "output": "xn--0ugy6glz29a.xn--gdh" }, { "comment": "A4_2 (ignored)", @@ -8425,12 +8425,12 @@ { "comment": "V7", "input": "xn--my8h.xn--psd", - "output": null + "output": "xn--my8h.xn--psd" }, { "comment": "V7", "input": "xn--my8h.xn--cl7c", - "output": null + "output": "xn--my8h.xn--cl7c" }, { "comment": "V7", @@ -8445,7 +8445,7 @@ { "comment": "V7", "input": "xn--1zxq3199c.xn--4-678b", - "output": null + "output": "xn--1zxq3199c.xn--4-678b" }, { "comment": "V7; V2 (ignored); V3 (ignored)", @@ -8455,7 +8455,7 @@ { "comment": "V7; V2 (ignored); V3 (ignored)", "input": "xn--2y75e.xn-----1l15eer88n", - "output": null + "output": "xn--2y75e.xn-----1l15eer88n" }, { "comment": "V7", @@ -8465,7 +8465,7 @@ { "comment": "V7", "input": "xn--sz1a.xn----mrd9984r3dl0i", - "output": null + "output": "xn--sz1a.xn----mrd9984r3dl0i" }, { "input": "\u03c2\u10c5\u3002\u075a", @@ -8514,12 +8514,12 @@ { "comment": "V7", "input": "xn--4xa477d.xn--epb", - "output": null + "output": "xn--4xa477d.xn--epb" }, { "comment": "V7", "input": "xn--3xa677d.xn--epb", - "output": null + "output": "xn--3xa677d.xn--epb" }, { "input": "xn--vkb.xn--08e172a", @@ -8560,12 +8560,12 @@ { "comment": "V7", "input": "xn--pt9c.xn--hnd666l", - "output": null + "output": "xn--pt9c.xn--hnd666l" }, { "comment": "V7", "input": "xn--pt9c.xn--hndy", - "output": null + "output": "xn--pt9c.xn--hndy" }, { "comment": "C1; V6; V7", @@ -8580,12 +8580,12 @@ { "comment": "V6; V7", "input": "xn--1fk.xn--vta284a9o563a", - "output": null + "output": "xn--1fk.xn--vta284a9o563a" }, { "comment": "C1; V6; V7", "input": "xn--0uga242k.xn--vta284a9o563a", - "output": null + "output": "xn--0uga242k.xn--vta284a9o563a" }, { "comment": "V7", @@ -8605,7 +8605,7 @@ { "comment": "V7", "input": "xn--3-ews6985n35s3g.xn--7-cve6271r", - "output": null + "output": "xn--3-ews6985n35s3g.xn--7-cve6271r" }, { "comment": "V7", @@ -8615,7 +8615,7 @@ { "comment": "V7", "input": "xn--3-b1g83426a35t0g.xn--7-cve6271r", - "output": null + "output": "xn--3-b1g83426a35t0g.xn--7-cve6271r" }, { "comment": "C1; V7", @@ -8630,22 +8630,22 @@ { "comment": "V7", "input": "xn--eco.1.xn--ms39a", - "output": null + "output": "xn--eco.1.xn--ms39a" }, { "comment": "C1; V7", "input": "xn--0ug491l.xn--1-rgn.xn--ms39a", - "output": null + "output": "xn--0ug491l.xn--1-rgn.xn--ms39a" }, { "comment": "V7", "input": "xn--eco.xn--tsh21126d", - "output": null + "output": "xn--eco.xn--tsh21126d" }, { "comment": "C1; V7", "input": "xn--0ug491l.xn--0ug88oot66q", - "output": null + "output": "xn--0ug491l.xn--0ug88oot66q" }, { "comment": "V6", @@ -8670,12 +8670,12 @@ { "comment": "V6", "input": "xn--1ss-ir6ln166b.xn--weg", - "output": null + "output": "xn--1ss-ir6ln166b.xn--weg" }, { "comment": "V6", "input": "xn--1-qfa2471kdb0d.xn--weg", - "output": null + "output": "xn--1-qfa2471kdb0d.xn--weg" }, { "comment": "V6", @@ -8700,7 +8700,7 @@ { "comment": "V7", "input": "xn--3j78f.xn--mkb20b", - "output": null + "output": "xn--3j78f.xn--mkb20b" }, { "comment": "V7", @@ -8720,7 +8720,7 @@ { "comment": "V7", "input": "xn--dth6033bzbvx.xn--tsh9439b", - "output": null + "output": "xn--dth6033bzbvx.xn--tsh9439b" }, { "input": "\u10b5\u3002\u06f0\u226e\u00df\u0745", @@ -8805,12 +8805,12 @@ { "comment": "V7", "input": "xn--tnd.xn--ss-jbe65aw27i", - "output": null + "output": "xn--tnd.xn--ss-jbe65aw27i" }, { "comment": "V7", "input": "xn--tnd.xn--zca912alh227g", - "output": null + "output": "xn--tnd.xn--zca912alh227g" }, { "input": "xn--ge6h.xn--oc9a", @@ -8857,7 +8857,7 @@ { "comment": "V7", "input": "xn--73g39298c.xn--hdhz171b", - "output": null + "output": "xn--73g39298c.xn--hdhz171b" }, { "comment": "V7", @@ -8872,7 +8872,7 @@ { "comment": "V7", "input": "xn--f3g73398c.xn--hdhz171b", - "output": null + "output": "xn--f3g73398c.xn--hdhz171b" }, { "comment": "C1; V3 (ignored)", @@ -8907,27 +8907,27 @@ { "comment": "C1; V3 (ignored)", "input": "xn--0ug.xn--ss--bi1b", - "output": null + "output": "xn--0ug.xn--ss--bi1b" }, { "comment": "C1; V3 (ignored)", "input": "xn--0ug.xn----pfa2305a", - "output": null + "output": "xn--0ug.xn----pfa2305a" }, { "comment": "V7; V3 (ignored); A4_2 (ignored)", "input": ".xn--ss--4rn", - "output": null + "output": ".xn--ss--4rn" }, { "comment": "C1; V7; V3 (ignored)", "input": "xn--0ug.xn--ss--4rn", - "output": null + "output": "xn--0ug.xn--ss--4rn" }, { "comment": "C1; V7; V3 (ignored)", "input": "xn--0ug.xn----pfa042j", - "output": null + "output": "xn--0ug.xn----pfa042j" }, { "input": "\u9f59--\ud835\udff0.\u00df", @@ -8982,7 +8982,7 @@ { "comment": "V7; V3 (ignored)", "input": "xn----bh61m.xn--gdhz157g0em1d", - "output": null + "output": "xn----bh61m.xn--gdhz157g0em1d" }, { "comment": "C1; C2; V7", @@ -9007,22 +9007,22 @@ { "comment": "V7", "input": "xn--3n36e.xn--gdh992byu01p", - "output": null + "output": "xn--3n36e.xn--gdh992byu01p" }, { "comment": "C1; C2; V7", "input": "xn--0ugc90904y.xn--gdh992byu01p", - "output": null + "output": "xn--0ugc90904y.xn--gdh992byu01p" }, { "comment": "V7", "input": "xn--3n36e.xn--hnd112gpz83n", - "output": null + "output": "xn--3n36e.xn--hnd112gpz83n" }, { "comment": "C1; C2; V7", "input": "xn--0ugc90904y.xn--hnd112gpz83n", - "output": null + "output": "xn--0ugc90904y.xn--hnd112gpz83n" }, { "comment": "V6", @@ -9057,7 +9057,7 @@ { "comment": "V6", "input": "xn--7kj1858k.xn--pi6b", - "output": null + "output": "xn--7kj1858k.xn--pi6b" }, { "comment": "V6", @@ -9072,7 +9072,7 @@ { "comment": "V6; V7", "input": "xn--ond3755u.xn--pi6b", - "output": null + "output": "xn--ond3755u.xn--pi6b" }, { "comment": "C1; V7", @@ -9087,12 +9087,12 @@ { "comment": "V7", "input": "xn--0-z6j.xn--8lh28773l", - "output": null + "output": "xn--0-z6j.xn--8lh28773l" }, { "comment": "C1; V7", "input": "xn--0-z6jy93b.xn--8lh28773l", - "output": null + "output": "xn--0-z6jy93b.xn--8lh28773l" }, { "comment": "C2", @@ -9129,12 +9129,12 @@ { "comment": "C2", "input": "xn--9-i0j5967eg3qz.xn--ss-l1t", - "output": null + "output": "xn--9-i0j5967eg3qz.xn--ss-l1t" }, { "comment": "C2", "input": "xn--9-i0j5967eg3qz.xn--zca770n", - "output": null + "output": "xn--9-i0j5967eg3qz.xn--zca770n" }, { "comment": "C2", @@ -9187,12 +9187,12 @@ { "comment": "V7; V3 (ignored); A4_2 (ignored)", "input": "9.xn----ogo..xn----xj54d1s69k", - "output": null + "output": "9.xn----ogo..xn----xj54d1s69k" }, { "comment": "V7; V3 (ignored)", "input": "xn----ogot9g.xn----n89hl0522az9u2a", - "output": null + "output": "xn----ogot9g.xn----n89hl0522az9u2a" }, { "comment": "C2; V3 (ignored)", @@ -9217,7 +9217,7 @@ { "comment": "C2; V3 (ignored)", "input": "xn----3vs.xn--1ug532c", - "output": null + "output": "xn----3vs.xn--1ug532c" }, { "comment": "C2; V3 (ignored)", @@ -9227,12 +9227,12 @@ { "comment": "V7; V3 (ignored)", "input": "xn----00g.xn--hnd", - "output": null + "output": "xn----00g.xn--hnd" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn----00g.xn--hnd399e", - "output": null + "output": "xn----00g.xn--hnd399e" }, { "comment": "V6; V3 (ignored)", @@ -9242,7 +9242,7 @@ { "comment": "V6; V3 (ignored)", "input": "xn--fze.xn----ly8i", - "output": null + "output": "xn--fze.xn----ly8i" }, { "comment": "V6; V7; V3 (ignored)", @@ -9272,12 +9272,12 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn----pw5e.xn--ss-7jd10716y", - "output": null + "output": "xn----pw5e.xn--ss-7jd10716y" }, { "comment": "V6; V7; V3 (ignored)", "input": "xn----pw5e.xn--zca50wfv060a", - "output": null + "output": "xn----pw5e.xn--zca50wfv060a" }, { "comment": "V6; V7; V3 (ignored)", @@ -9307,7 +9307,7 @@ { "comment": "V6", "input": "xn--3-ksd277tlo7s.xn--8-f0jx021l", - "output": null + "output": "xn--3-ksd277tlo7s.xn--8-f0jx021l" }, { "comment": "C2; V7; V3 (ignored)", @@ -9322,12 +9322,12 @@ { "comment": "V7; V3 (ignored)", "input": "-.xn--nei54421f", - "output": null + "output": "-.xn--nei54421f" }, { "comment": "C2; V7; V3 (ignored)", "input": "-.xn--1ug800aq795s", - "output": null + "output": "-.xn--1ug800aq795s" }, { "comment": "V6; V7", @@ -9342,7 +9342,7 @@ { "comment": "V6; V7", "input": "xn--52-dwx47758j.xn--kd3hk431k", - "output": null + "output": "xn--52-dwx47758j.xn--kd3hk431k" }, { "comment": "V7; V3 (ignored)", @@ -9352,7 +9352,7 @@ { "comment": "V7; V3 (ignored)", "input": "-.xn----ukp70432h", - "output": null + "output": "-.xn----ukp70432h" }, { "comment": "V7", @@ -9397,12 +9397,12 @@ { "comment": "V7", "input": "xn--4xa.xn--dhbip2802atb20c", - "output": null + "output": "xn--4xa.xn--dhbip2802atb20c" }, { "comment": "V7", "input": "xn--3xa.xn--dhbip2802atb20c", - "output": null + "output": "xn--3xa.xn--dhbip2802atb20c" }, { "comment": "V7", @@ -9417,7 +9417,7 @@ { "comment": "V7", "input": "9.xn--dbf91222q", - "output": null + "output": "9.xn--dbf91222q" }, { "comment": "C1; V7", @@ -9442,7 +9442,7 @@ { "comment": "C1; A4_2 (ignored)", "input": ".xn--hva754s.xn--0ug", - "output": null + "output": ".xn--hva754s.xn--0ug" }, { "comment": "C1; V7", @@ -9452,32 +9452,32 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--hva754sy94k.", - "output": null + "output": "xn--hva754sy94k." }, { "comment": "C1; V7", "input": "xn--hva754sy94k.xn--0ug", - "output": null + "output": "xn--hva754sy94k.xn--0ug" }, { "comment": "V7; A4_2 (ignored)", "input": ".xn--hva929d.", - "output": null + "output": ".xn--hva929d." }, { "comment": "C1; V7; A4_2 (ignored)", "input": ".xn--hva929d.xn--0ug", - "output": null + "output": ".xn--hva929d.xn--0ug" }, { "comment": "V7; A4_2 (ignored)", "input": "xn--hva929dl29p.", - "output": null + "output": "xn--hva929dl29p." }, { "comment": "C1; V7", "input": "xn--hva929dl29p.xn--0ug", - "output": null + "output": "xn--hva929dl29p.xn--0ug" }, { "comment": "A4_2 (ignored)", @@ -9497,7 +9497,7 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--hva929d.", - "output": null + "output": "xn--hva929d." }, { "input": "xn--hzb.xn--ukj4430l", @@ -9514,7 +9514,7 @@ { "comment": "V7", "input": "xn--hzb.xn--bnd2938u", - "output": null + "output": "xn--hzb.xn--bnd2938u" }, { "comment": "C1; C2; V7", @@ -9529,12 +9529,12 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--2-me5ay1273i", - "output": null + "output": ".xn--2-me5ay1273i" }, { "comment": "C1; C2; V7", "input": "xn--0ugb.xn--2-me5ay1273i", - "output": null + "output": "xn--0ugb.xn--2-me5ay1273i" }, { "comment": "V7; V3 (ignored)", @@ -9544,7 +9544,7 @@ { "comment": "V7; V3 (ignored)", "input": "xn----rq4re4997d.xn--l707b", - "output": null + "output": "xn----rq4re4997d.xn--l707b" }, { "comment": "C1; V7", @@ -9559,17 +9559,17 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--z272f.xn--etl.xn--1-smc.", - "output": null + "output": "xn--z272f.xn--etl.xn--1-smc." }, { "comment": "V7", "input": "xn--etlt457ccrq7h.xn--jgb476m", - "output": null + "output": "xn--etlt457ccrq7h.xn--jgb476m" }, { "comment": "C1; V7", "input": "xn--0ug754gxl4ldlt0k.xn--jgb476m", - "output": null + "output": "xn--0ug754gxl4ldlt0k.xn--jgb476m" }, { "comment": "V7", @@ -9589,7 +9589,7 @@ { "comment": "V7", "input": "xn--0tb8725k.xn--tu8d.xn--7kj73887a", - "output": null + "output": "xn--0tb8725k.xn--tu8d.xn--7kj73887a" }, { "comment": "V7", @@ -9599,17 +9599,17 @@ { "comment": "V7", "input": "xn--0tb8725k.xn--7kj9008dt18a7py9c", - "output": null + "output": "xn--0tb8725k.xn--7kj9008dt18a7py9c" }, { "comment": "V7", "input": "xn--0tb8725k.xn--tu8d.xn--ond97931d", - "output": null + "output": "xn--0tb8725k.xn--tu8d.xn--ond97931d" }, { "comment": "V7", "input": "xn--0tb8725k.xn--ond3562jt18a7py9c", - "output": null + "output": "xn--0tb8725k.xn--ond3562jt18a7py9c" }, { "comment": "V6; V7", @@ -9629,7 +9629,7 @@ { "comment": "V6; V7", "input": "xn--vfh16m67gx1162b.xn--ro1d", - "output": null + "output": "xn--vfh16m67gx1162b.xn--ro1d" }, { "comment": "V6; V7", @@ -9639,7 +9639,7 @@ { "comment": "V6; V7", "input": "xn--9nd623g4zc5z060c.xn--ro1d", - "output": null + "output": "xn--9nd623g4zc5z060c.xn--ro1d" }, { "comment": "V3 (ignored)", @@ -9674,7 +9674,7 @@ { "comment": "V7; V3 (ignored)", "input": "xn--qutw175s.xn----mimu6tf67j", - "output": null + "output": "xn--qutw175s.xn----mimu6tf67j" }, { "comment": "C2", @@ -9701,17 +9701,17 @@ { "comment": "C2", "input": "xn--1ug592ykp6b.xn----mck373i", - "output": null + "output": "xn--1ug592ykp6b.xn----mck373i" }, { "comment": "V7", "input": "xn--p9ut19m.xn----k1g451d", - "output": null + "output": "xn--p9ut19m.xn----k1g451d" }, { "comment": "C2; V7", "input": "xn--1ug592ykp6b.xn----k1g451d", - "output": null + "output": "xn--1ug592ykp6b.xn----k1g451d" }, { "comment": "C1; V7", @@ -9748,17 +9748,17 @@ { "comment": "C1", "input": "xn--0ug2473c.16.xn--3-nyc0117m", - "output": null + "output": "xn--0ug2473c.16.xn--3-nyc0117m" }, { "comment": "V7", "input": "xn--9r8a.xn--3-nyc678tu07m", - "output": null + "output": "xn--9r8a.xn--3-nyc678tu07m" }, { "comment": "C1; V7", "input": "xn--0ug2473c.xn--3-nyc678tu07m", - "output": null + "output": "xn--0ug2473c.xn--3-nyc678tu07m" }, { "comment": "C2", @@ -9783,7 +9783,7 @@ { "comment": "C2", "input": "xn--1-5bt6845n.xn--1ug", - "output": null + "output": "xn--1-5bt6845n.xn--1ug" }, { "comment": "V7", @@ -9803,7 +9803,7 @@ { "comment": "V7", "input": "f.xn--45hz6953f", - "output": null + "output": "f.xn--45hz6953f" }, { "comment": "V7", @@ -9828,7 +9828,7 @@ { "comment": "V6; V7", "input": "xn--9ic246gs21p.xn--2-nws2918ndrjr", - "output": null + "output": "xn--9ic246gs21p.xn--2-nws2918ndrjr" }, { "comment": "V6; V7", @@ -9838,7 +9838,7 @@ { "comment": "V6; V7", "input": "xn--9ic246gs21p.xn--2-k1g43076adrwq", - "output": null + "output": "xn--9ic246gs21p.xn--2-k1g43076adrwq" }, { "comment": "C1; V7", @@ -9853,22 +9853,22 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--1-yi00h..xn--4grs325b", - "output": null + "output": "xn--1-yi00h..xn--4grs325b" }, { "comment": "C1; V7; A4_2 (ignored)", "input": "xn--1-rgna61159u..xn--4grs325b", - "output": null + "output": "xn--1-rgna61159u..xn--4grs325b" }, { "comment": "V7", "input": "xn--tsh11906f.xn--4grs325b", - "output": null + "output": "xn--tsh11906f.xn--4grs325b" }, { "comment": "C1; V7", "input": "xn--0uga855aez302a.xn--4grs325b", - "output": null + "output": "xn--0uga855aez302a.xn--4grs325b" }, { "comment": "V7", @@ -9878,7 +9878,7 @@ { "comment": "V7", "input": "xn--27e.xn--7cy81125a0yq4a", - "output": null + "output": "xn--27e.xn--7cy81125a0yq4a" }, { "comment": "C1; V7", @@ -9908,17 +9908,17 @@ { "comment": "C1", "input": "xn--0uga.1.xn--9-ogo", - "output": null + "output": "xn--0uga.1.xn--9-ogo" }, { "comment": "V7; A4_2 (ignored)", "input": ".xn--9-ogo37g", - "output": null + "output": ".xn--9-ogo37g" }, { "comment": "C1; V7", "input": "xn--0uga.xn--9-ogo37g", - "output": null + "output": "xn--0uga.xn--9-ogo37g" }, { "comment": "V6; V3 (ignored)", @@ -9933,7 +9933,7 @@ { "comment": "V6; V3 (ignored)", "input": "xn--w0g.xn----bd0j", - "output": null + "output": "xn--w0g.xn----bd0j" }, { "comment": "C2; V6; V7", @@ -9948,12 +9948,12 @@ { "comment": "V6; V7", "input": "xn----gyg3618i.xn--jc9ao4185a", - "output": null + "output": "xn----gyg3618i.xn--jc9ao4185a" }, { "comment": "C2; V6; V7", "input": "xn----gyg250jio7k.xn--1ug8774cri56d", - "output": null + "output": "xn----gyg250jio7k.xn--1ug8774cri56d" }, { "comment": "V6", @@ -9963,7 +9963,7 @@ { "comment": "V6", "input": "xn--xytw701b.xn--yc9c", - "output": null + "output": "xn--xytw701b.xn--yc9c" }, { "comment": "V7", @@ -9998,7 +9998,7 @@ { "comment": "V7", "input": "xn--mlj0486jgl2j.xn--hbf6853f", - "output": null + "output": "xn--mlj0486jgl2j.xn--hbf6853f" }, { "comment": "V7", @@ -10013,7 +10013,7 @@ { "comment": "V7", "input": "xn--2nd8876sgl2j.xn--hbf6853f", - "output": null + "output": "xn--2nd8876sgl2j.xn--hbf6853f" }, { "comment": "C2; V7", @@ -10043,12 +10043,12 @@ { "comment": "C2; A4_2 (ignored)", "input": "xn--ss-f4j585j.b.", - "output": null + "output": "xn--ss-f4j585j.b." }, { "comment": "C2; A4_2 (ignored)", "input": "xn--zca679eh2l.b.", - "output": null + "output": "xn--zca679eh2l.b." }, { "comment": "C2; V7", @@ -10068,17 +10068,17 @@ { "comment": "V7", "input": "xn--ss-f4j.xn--tsh", - "output": null + "output": "xn--ss-f4j.xn--tsh" }, { "comment": "C2; V7", "input": "xn--ss-f4j585j.xn--tsh", - "output": null + "output": "xn--ss-f4j585j.xn--tsh" }, { "comment": "C2; V7", "input": "xn--zca679eh2l.xn--tsh", - "output": null + "output": "xn--zca679eh2l.xn--tsh" }, { "comment": "A4_2 (ignored)", @@ -10163,17 +10163,17 @@ { "comment": "C1; A4_2 (ignored)", "input": "xn--8-sgn10i.", - "output": null + "output": "xn--8-sgn10i." }, { "comment": "V6; V7", "input": "xn--8-ngo.xn--z3e", - "output": null + "output": "xn--8-ngo.xn--z3e" }, { "comment": "C1; V6; V7", "input": "xn--8-sgn10i.xn--z3e", - "output": null + "output": "xn--8-sgn10i.xn--z3e" }, { "comment": "V7", @@ -10208,7 +10208,7 @@ { "comment": "V7", "input": "xn--fbf851c.xn--ko1u.xn--rkj", - "output": null + "output": "xn--fbf851c.xn--ko1u.xn--rkj" }, { "comment": "V7", @@ -10223,17 +10223,17 @@ { "comment": "V7", "input": "xn--fbf851cq98poxw1a.xn--rkj", - "output": null + "output": "xn--fbf851cq98poxw1a.xn--rkj" }, { "comment": "V7", "input": "xn--fbf851c.xn--ko1u.xn--7md", - "output": null + "output": "xn--fbf851c.xn--ko1u.xn--7md" }, { "comment": "V7", "input": "xn--fbf851cq98poxw1a.xn--7md", - "output": null + "output": "xn--fbf851cq98poxw1a.xn--7md" }, { "comment": "V6; V3 (ignored)", @@ -10248,7 +10248,7 @@ { "comment": "V6; V3 (ignored)", "input": "xn--vfd.xn----fhd", - "output": null + "output": "xn--vfd.xn----fhd" }, { "comment": "V7", @@ -10273,12 +10273,12 @@ { "comment": "V7", "input": "xn--tbg.xn--11-5o7k.1.xn--k469f", - "output": null + "output": "xn--tbg.xn--11-5o7k.1.xn--k469f" }, { "comment": "V7", "input": "xn--tbg.xn--tsht7586kyts9l", - "output": null + "output": "xn--tbg.xn--tsht7586kyts9l" }, { "comment": "V7", @@ -10293,12 +10293,12 @@ { "comment": "V7", "input": "1.xn--7bi44996f.xn--9-o706d", - "output": null + "output": "1.xn--7bi44996f.xn--9-o706d" }, { "comment": "V7", "input": "xn--tsh24g49550b.xn--9-o706d", - "output": null + "output": "xn--tsh24g49550b.xn--9-o706d" }, { "comment": "V6", @@ -10323,12 +10323,12 @@ { "comment": "V6", "input": "xn--4xa.xn--0f9ars", - "output": null + "output": "xn--4xa.xn--0f9ars" }, { "comment": "V6", "input": "xn--3xa.xn--0f9ars", - "output": null + "output": "xn--3xa.xn--0f9ars" }, { "comment": "V6", @@ -10401,7 +10401,7 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--1-3xm292b6044r..xn--9-6jd87310jtcqs", - "output": null + "output": "xn--1-3xm292b6044r..xn--9-6jd87310jtcqs" }, { "comment": "V7", @@ -10416,7 +10416,7 @@ { "comment": "V7", "input": "xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs", - "output": null + "output": "xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs" }, { "comment": "A4_2 (ignored)", @@ -10458,17 +10458,17 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn----s2c.xn--ss-066q", - "output": null + "output": "xn----s2c.xn--ss-066q" }, { "comment": "C1; V6; V7; V3 (ignored)", "input": "xn----s2c071q.xn--ss-066q", - "output": null + "output": "xn----s2c071q.xn--ss-066q" }, { "comment": "C1; V6; V7; V3 (ignored)", "input": "xn----s2c071q.xn--zca7848m", - "output": null + "output": "xn----s2c071q.xn--zca7848m" }, { "comment": "V6; V7; V3 (ignored)", @@ -10483,12 +10483,12 @@ { "comment": "V6; V7; V3 (ignored); A4_2 (ignored)", "input": "xn----b5h1837n2ok9f.xn----mkm.", - "output": null + "output": "xn----b5h1837n2ok9f.xn----mkm." }, { "comment": "V6; V7; V3 (ignored)", "input": "xn----b5h1837n2ok9f.xn----mkmw278h", - "output": null + "output": "xn----b5h1837n2ok9f.xn----mkmw278h" }, { "comment": "V7", @@ -10503,12 +10503,12 @@ { "comment": "V7; A4_2 (ignored)", "input": "..xn--cof61594i", - "output": null + "output": "..xn--cof61594i" }, { "comment": "V7", "input": "xn--y86c.xn--cof61594i", - "output": null + "output": "xn--y86c.xn--cof61594i" }, { "comment": "V6; V7; V3 (ignored)", @@ -10518,7 +10518,7 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn--jk3d.xn----iz68g", - "output": null + "output": "xn--jk3d.xn----iz68g" }, { "comment": "V7", @@ -10533,7 +10533,7 @@ { "comment": "V7", "input": "xn--2856e.xn--6o3a", - "output": null + "output": "xn--2856e.xn--6o3a" }, { "comment": "C1; V7", @@ -10553,12 +10553,12 @@ { "comment": "V7", "input": "xn--4kj.xn--p01x", - "output": null + "output": "xn--4kj.xn--p01x" }, { "comment": "C1; V7", "input": "xn--4kj.xn--0ug56448b", - "output": null + "output": "xn--4kj.xn--0ug56448b" }, { "comment": "C1; V7", @@ -10568,12 +10568,12 @@ { "comment": "V7", "input": "xn--lnd.xn--p01x", - "output": null + "output": "xn--lnd.xn--p01x" }, { "comment": "C1; V7", "input": "xn--lnd.xn--0ug56448b", - "output": null + "output": "xn--lnd.xn--0ug56448b" }, { "input": "\ud835\udfdb\uff0e\uf9f8", @@ -10609,17 +10609,17 @@ { "comment": "C2; V3 (ignored)", "input": "xn----ugn.xn--mlj8559d", - "output": null + "output": "xn----ugn.xn--mlj8559d" }, { "comment": "V7; V3 (ignored)", "input": "-.xn--2nd2315j", - "output": null + "output": "-.xn--2nd2315j" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn----ugn.xn--2nd2315j", - "output": null + "output": "xn----ugn.xn--2nd2315j" }, { "comment": "C2; V6", @@ -10649,12 +10649,12 @@ { "comment": "V6", "input": "xn--ss-ubc826a.xn--xmc", - "output": null + "output": "xn--ss-ubc826a.xn--xmc" }, { "comment": "C2; V6", "input": "xn--ss-ubc826ab34b.xn--xmc", - "output": null + "output": "xn--ss-ubc826ab34b.xn--xmc" }, { "comment": "C2; V6", @@ -10669,12 +10669,12 @@ { "comment": "C2; V6", "input": "xn--zca39lk1di19a.xn--xmc", - "output": null + "output": "xn--zca39lk1di19a.xn--xmc" }, { "comment": "C2; V6", "input": "xn--zca19ln1di19a.xn--xmc", - "output": null + "output": "xn--zca19ln1di19a.xn--xmc" }, { "comment": "C2; V6", @@ -10739,7 +10739,7 @@ { "comment": "C2", "input": "xn--1ch.xn--1ug", - "output": null + "output": "xn--1ch.xn--1ug" }, { "comment": "V7", @@ -10774,7 +10774,7 @@ { "comment": "V7", "input": "xn--4xa502av8297a.xn--4xa6055k", - "output": null + "output": "xn--4xa502av8297a.xn--4xa6055k" }, { "comment": "V7", @@ -10784,12 +10784,12 @@ { "comment": "V7", "input": "xn--4xa502av8297a.xn--3xa8055k", - "output": null + "output": "xn--4xa502av8297a.xn--3xa8055k" }, { "comment": "V7", "input": "xn--3xa702av8297a.xn--3xa8055k", - "output": null + "output": "xn--3xa702av8297a.xn--3xa8055k" }, { "comment": "V7", @@ -10839,7 +10839,7 @@ { "comment": "V7", "input": "xn--s264a.xn--pw2b", - "output": null + "output": "xn--s264a.xn--pw2b" }, { "comment": "V7", @@ -10854,7 +10854,7 @@ { "comment": "V7", "input": "xn--57e0440k.xn--k86h", - "output": null + "output": "xn--57e0440k.xn--k86h" }, { "comment": "V7", @@ -10869,7 +10869,7 @@ { "comment": "V7", "input": "xn--j890g.xn--w7e", - "output": null + "output": "xn--j890g.xn--w7e" }, { "comment": "C2", @@ -10884,12 +10884,12 @@ { "comment": "V6", "input": "xn--b6s0078f.xn--0ic", - "output": null + "output": "xn--b6s0078f.xn--0ic" }, { "comment": "C2", "input": "xn--b6s0078f.xn--0ic557h", - "output": null + "output": "xn--b6s0078f.xn--0ic557h" }, { "comment": "C1; V7", @@ -10899,12 +10899,12 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--q823a", - "output": null + "output": ".xn--q823a" }, { "comment": "C1; V7", "input": "xn--0ug.xn--q823a", - "output": null + "output": "xn--0ug.xn--q823a" }, { "comment": "V7", @@ -10924,7 +10924,7 @@ { "comment": "V7", "input": "xn--ukju77frl47r.xn--yl0d", - "output": null + "output": "xn--ukju77frl47r.xn--yl0d" }, { "comment": "V7", @@ -10934,7 +10934,7 @@ { "comment": "V7", "input": "xn--bnd074zr557n.xn--yl0d", - "output": null + "output": "xn--bnd074zr557n.xn--yl0d" }, { "comment": "V7; V3 (ignored)", @@ -10954,7 +10954,7 @@ { "comment": "V7; V3 (ignored)", "input": "-.xn--y86c", - "output": null + "output": "-.xn--y86c" }, { "comment": "C2", @@ -10974,7 +10974,7 @@ { "comment": "C2", "input": "xn--1ug.f", - "output": null + "output": "xn--1ug.f" }, { "input": "f", @@ -11024,12 +11024,12 @@ { "comment": "C2", "input": "xn--1ug914h.ss", - "output": null + "output": "xn--1ug914h.ss" }, { "comment": "C2", "input": "xn--1ug914h.xn--zca", - "output": null + "output": "xn--1ug914h.xn--zca" }, { "comment": "C2", @@ -11059,12 +11059,12 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--h327f", - "output": null + "output": ".xn--h327f" }, { "comment": "C2; V7", "input": "xn--1ug.xn--h327f", - "output": null + "output": "xn--1ug.xn--h327f" }, { "comment": "V7", @@ -11089,12 +11089,12 @@ { "comment": "V7", "input": "xn--h79w4z99a.xn--6-tfo", - "output": null + "output": "xn--h79w4z99a.xn--6-tfo" }, { "comment": "V7", "input": "xn--98e.xn--om9c", - "output": null + "output": "xn--98e.xn--om9c" }, { "comment": "V6; V7", @@ -11109,12 +11109,12 @@ { "comment": "V6; A4_2 (ignored)", "input": "xn--2-2zf840fk16m.xn--sob093b2m7s.", - "output": null + "output": "xn--2-2zf840fk16m.xn--sob093b2m7s." }, { "comment": "V6; V7", "input": "xn--2-2zf840fk16m.xn--sob093bj62sz9d", - "output": null + "output": "xn--2-2zf840fk16m.xn--sob093bj62sz9d" }, { "comment": "V7", @@ -11139,7 +11139,7 @@ { "comment": "V7", "input": "xn--gm57d.xn----tfo4949b3664m", - "output": null + "output": "xn--gm57d.xn----tfo4949b3664m" }, { "input": "\ud835\udfce\u3002\u752f", @@ -11170,7 +11170,7 @@ { "comment": "V6; V3 (ignored)", "input": "xn----ef8c.xn--2v9a", - "output": null + "output": "xn----ef8c.xn--2v9a" }, { "comment": "V3 (ignored)", @@ -11210,7 +11210,7 @@ { "comment": "V7", "input": "xn--jnd1986v.xn--gdh", - "output": null + "output": "xn--jnd1986v.xn--gdh" }, { "comment": "C1", @@ -11235,7 +11235,7 @@ { "comment": "C1", "input": "xn--gky8837e.xn--0ug", - "output": null + "output": "xn--gky8837e.xn--0ug" }, { "comment": "C1", @@ -11245,7 +11245,7 @@ { "comment": "C1", "input": "xn--0ug.xn--0ug", - "output": null + "output": "xn--0ug.xn--0ug" }, { "input": "xn--157b.xn--gnb", @@ -11282,7 +11282,7 @@ { "comment": "V6; V7", "input": "xn--flj.xn--qdb0605f14ycrms3c", - "output": null + "output": "xn--flj.xn--qdb0605f14ycrms3c" }, { "comment": "V6; V7", @@ -11297,7 +11297,7 @@ { "comment": "V6; V7", "input": "xn--vnd.xn--qdb0605f14ycrms3c", - "output": null + "output": "xn--vnd.xn--qdb0605f14ycrms3c" }, { "comment": "V6; V7", @@ -11312,12 +11312,12 @@ { "comment": "V6; A4_2 (ignored)", "input": "1.xn--8j4a..xn--8zb", - "output": null + "output": "1.xn--8j4a..xn--8zb" }, { "comment": "V6; V7", "input": "xn--tsh4490bfe8c.xn--8zb", - "output": null + "output": "xn--tsh4490bfe8c.xn--8zb" }, { "comment": "C1; V6", @@ -11332,27 +11332,27 @@ { "comment": "V6", "input": "xn--uof548an0j.xn--o4c", - "output": null + "output": "xn--uof548an0j.xn--o4c" }, { "comment": "C1; V6", "input": "xn--uof63xk4bf3s.xn--o4c732g", - "output": null + "output": "xn--uof63xk4bf3s.xn--o4c732g" }, { "comment": "V7", "input": "xn--co6h.xn--1-kwssa", - "output": null + "output": "xn--co6h.xn--1-kwssa" }, { "comment": "V7", "input": "xn--co6h.xn--1-h1g429s", - "output": null + "output": "xn--co6h.xn--1-h1g429s" }, { "comment": "V7", "input": "xn--co6h.xn--1-h1gs", - "output": null + "output": "xn--co6h.xn--1-h1gs" }, { "comment": "V6; V7", @@ -11367,12 +11367,12 @@ { "comment": "V6; V7; A4_2 (ignored)", "input": "xn--l98a.xn--14-jsj57880f.", - "output": null + "output": "xn--l98a.xn--14-jsj57880f." }, { "comment": "V6; V7", "input": "xn--l98a.xn--dgd218hhp28d", - "output": null + "output": "xn--l98a.xn--dgd218hhp28d" }, { "comment": "C2", @@ -11395,7 +11395,7 @@ { "comment": "C2", "input": "xn--84-s850a.xn--1uga573cfq1w", - "output": null + "output": "xn--84-s850a.xn--1uga573cfq1w" }, { "input": "\u226e\ud835\udfd5\uff0e\u8b16\u00df\u226f", @@ -11482,22 +11482,22 @@ { "comment": "V7; A4_2 (ignored)", "input": "xn--1-ex54e..c", - "output": null + "output": "xn--1-ex54e..c" }, { "comment": "C1; V7; A4_2 (ignored)", "input": "xn--1-ex54e..xn--2-rgn", - "output": null + "output": "xn--1-ex54e..xn--2-rgn" }, { "comment": "V7", "input": "xn--tsh94183d.c", - "output": null + "output": "xn--tsh94183d.c" }, { "comment": "C1; V7", "input": "xn--tsh94183d.xn--2-rgn", - "output": null + "output": "xn--tsh94183d.xn--2-rgn" }, { "comment": "C1; C2", @@ -11532,12 +11532,12 @@ { "comment": "C1; C2", "input": "xn--0ugb.xn--ss-bh7o", - "output": null + "output": "xn--0ugb.xn--ss-bh7o" }, { "comment": "C1; C2", "input": "xn--0ugb.xn--zca0732l", - "output": null + "output": "xn--0ugb.xn--zca0732l" }, { "comment": "C1; C2", @@ -11588,17 +11588,17 @@ { "comment": "C1; A4_2 (ignored)", "input": ".xn--0ug287dj0o.xn--gd9a", - "output": null + "output": ".xn--0ug287dj0o.xn--gd9a" }, { "comment": "V7", "input": "xn--qekw60dns9k.xn--gd9a", - "output": null + "output": "xn--qekw60dns9k.xn--gd9a" }, { "comment": "C1; V7", "input": "xn--0ug287dj0or48o.xn--gd9a", - "output": null + "output": "xn--0ug287dj0or48o.xn--gd9a" }, { "input": "xn--qekw60d.xn--gd9a", @@ -11621,22 +11621,22 @@ { "comment": "V7", "input": "1.xn--4x6j.xn--jof45148n", - "output": null + "output": "1.xn--4x6j.xn--jof45148n" }, { "comment": "C1; V7", "input": "xn--1-rgn.xn--4x6j.xn--jof45148n", - "output": null + "output": "xn--1-rgn.xn--4x6j.xn--jof45148n" }, { "comment": "V7", "input": "xn--tshw462r.xn--jof45148n", - "output": null + "output": "xn--tshw462r.xn--jof45148n" }, { "comment": "C1; V7", "input": "xn--0ug88o7471d.xn--jof45148n", - "output": null + "output": "xn--0ug88o7471d.xn--jof45148n" }, { "comment": "V7; A4_2 (ignored)", @@ -11656,17 +11656,17 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--9-ecp936non25a", - "output": null + "output": ".xn--9-ecp936non25a" }, { "comment": "V7; A4_2 (ignored)", "input": "xn--3f1h.xn--91-030c1650n.", - "output": null + "output": "xn--3f1h.xn--91-030c1650n." }, { "comment": "V7", "input": "xn--3f1h.xn--9-ecp936non25a", - "output": null + "output": "xn--3f1h.xn--9-ecp936non25a" }, { "input": "xn--8c1a.xn--2ib8jn539l", @@ -11703,7 +11703,7 @@ { "comment": "V6; V3 (ignored)", "input": "-0.xn--r4e872ah77nghm", - "output": null + "output": "-0.xn--r4e872ah77nghm" }, { "comment": "V6", @@ -11728,7 +11728,7 @@ { "comment": "V6", "input": "xn--1od555l3a.xn--9ic", - "output": null + "output": "xn--1od555l3a.xn--9ic" }, { "comment": "V6", @@ -11743,12 +11743,12 @@ { "comment": "V6; V7", "input": "xn--tndt4hvw.xn--9ic", - "output": null + "output": "xn--tndt4hvw.xn--9ic" }, { "comment": "V6; V7", "input": "xn--1od7wz74eeb.xn--9ic", - "output": null + "output": "xn--1od7wz74eeb.xn--9ic" }, { "comment": "V6", @@ -11758,7 +11758,7 @@ { "comment": "V6; V7", "input": "xn--3nd0etsm92g.xn--9ic", - "output": null + "output": "xn--3nd0etsm92g.xn--9ic" }, { "comment": "V6", @@ -11768,12 +11768,12 @@ { "comment": "V7", "input": "xn--l96h.xn--o8e4044k", - "output": null + "output": "xn--l96h.xn--o8e4044k" }, { "comment": "V7", "input": "xn--l96h.xn--03e93aq365d", - "output": null + "output": "xn--l96h.xn--03e93aq365d" }, { "comment": "V6; V3 (ignored)", @@ -11793,7 +11793,7 @@ { "comment": "V6; V3 (ignored)", "input": "xn--3-sl4eu679e.xn----xn4e", - "output": null + "output": "xn--3-sl4eu679e.xn----xn4e" }, { "comment": "V6; V7", @@ -11808,7 +11808,7 @@ { "comment": "V6; V7", "input": "xn--lrd.xn--s8c05302k", - "output": null + "output": "xn--lrd.xn--s8c05302k" }, { "comment": "V7", @@ -11828,7 +11828,7 @@ { "comment": "V7", "input": "xn--xkjw3965g.xn--ne6h", - "output": null + "output": "xn--xkjw3965g.xn--ne6h" }, { "comment": "V7", @@ -11838,7 +11838,7 @@ { "comment": "V7", "input": "xn--end82983m.xn--ne6h", - "output": null + "output": "xn--end82983m.xn--ne6h" }, { "comment": "V7", @@ -11863,7 +11863,7 @@ { "comment": "V7", "input": "xn--mi60a.xn--6-sl4es8023c", - "output": null + "output": "xn--mi60a.xn--6-sl4es8023c" }, { "comment": "V7", @@ -11883,17 +11883,17 @@ { "comment": "V7", "input": "xn--qlj1559dr224h.xn--skj", - "output": null + "output": "xn--qlj1559dr224h.xn--skj" }, { "comment": "V7", "input": "xn--6nd5215jr2u0h.xn--skj", - "output": null + "output": "xn--6nd5215jr2u0h.xn--skj" }, { "comment": "V7", "input": "xn--6nd5215jr2u0h.xn--8md", - "output": null + "output": "xn--6nd5215jr2u0h.xn--8md" }, { "comment": "V7", @@ -11918,12 +11918,12 @@ { "comment": "V7", "input": "xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d", - "output": null + "output": "xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d" }, { "comment": "V7", "input": "xn--4-w93ej7463a9io5a.xn--3xa51142bk3f0d", - "output": null + "output": "xn--4-w93ej7463a9io5a.xn--3xa51142bk3f0d" }, { "comment": "V7", @@ -11948,7 +11948,7 @@ { "comment": "V7", "input": "xn--t92s.xn--znb.xn--5-y88f", - "output": null + "output": "xn--t92s.xn--znb.xn--5-y88f" }, { "comment": "C2; V6", @@ -11963,12 +11963,12 @@ { "comment": "V6", "input": "xn--m4e.xn--2-ku7i", - "output": null + "output": "xn--m4e.xn--2-ku7i" }, { "comment": "C2; V6", "input": "xn--m4e.xn--2-tgnv469h", - "output": null + "output": "xn--m4e.xn--2-tgnv469h" }, { "comment": "V6", @@ -11993,12 +11993,12 @@ { "comment": "V6", "input": "xn--2v9a.xn--ss-q40dp97m", - "output": null + "output": "xn--2v9a.xn--ss-q40dp97m" }, { "comment": "V6", "input": "xn--2v9a.xn--zca7637b14za", - "output": null + "output": "xn--2v9a.xn--zca7637b14za" }, { "comment": "C1; V7", @@ -12023,17 +12023,17 @@ { "comment": "V7", "input": "xn--4xa2260lk3b8z15g.xn--tw9ct349a", - "output": null + "output": "xn--4xa2260lk3b8z15g.xn--tw9ct349a" }, { "comment": "C1; V7", "input": "xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf", - "output": null + "output": "xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf" }, { "comment": "C1; V7", "input": "xn--3xa4260lk3b8z15g.xn--0ug4653g2xzf", - "output": null + "output": "xn--3xa4260lk3b8z15g.xn--0ug4653g2xzf" }, { "comment": "C1; V7", @@ -12058,12 +12058,12 @@ { "comment": "V7", "input": "xn--2-4jtr4282f.xn--m78h", - "output": null + "output": "xn--2-4jtr4282f.xn--m78h" }, { "comment": "C2; V7", "input": "xn--2-4jtr4282f.xn--1ugz946p", - "output": null + "output": "xn--2-4jtr4282f.xn--1ugz946p" }, { "comment": "V6", @@ -12073,7 +12073,7 @@ { "comment": "V6", "input": "xn--n82h.xn--63iw010f", - "output": null + "output": "xn--n82h.xn--63iw010f" }, { "comment": "C1; V6; V3 (ignored); U1 (ignored)", @@ -12088,22 +12088,22 @@ { "comment": "V6; V3 (ignored); U1 (ignored)", "input": "xn---3,-3eu.xn--9h2d", - "output": null + "output": "xn---3,-3eu.xn--9h2d" }, { "comment": "C1; V6; V3 (ignored); U1 (ignored)", "input": "xn---3,-3eu051c.xn--9h2d", - "output": null + "output": "xn---3,-3eu051c.xn--9h2d" }, { "comment": "V6; V7; V3 (ignored)", "input": "xn----pck1820x.xn--9h2d", - "output": null + "output": "xn----pck1820x.xn--9h2d" }, { "comment": "C1; V6; V7; V3 (ignored)", "input": "xn----pck312bx563c.xn--9h2d", - "output": null + "output": "xn----pck312bx563c.xn--9h2d" }, { "comment": "V3 (ignored); A4_2 (ignored)", @@ -12123,7 +12123,7 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn--z3e.xn----938f", - "output": null + "output": "xn--z3e.xn----938f" }, { "comment": "C1; V7", @@ -12138,22 +12138,22 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn--wz1d.1.xn----rg03o", - "output": null + "output": "xn--wz1d.1.xn----rg03o" }, { "comment": "C1; V7; V3 (ignored)", "input": "xn--0ugy057g.1.xn----rg03o", - "output": null + "output": "xn--0ugy057g.1.xn----rg03o" }, { "comment": "V6; V7", "input": "xn--wz1d.xn----dcp29674o", - "output": null + "output": "xn--wz1d.xn----dcp29674o" }, { "comment": "C1; V7", "input": "xn--0ugy057g.xn----dcp29674o", - "output": null + "output": "xn--0ugy057g.xn----dcp29674o" }, { "comment": "A4_2 (ignored)", @@ -12181,7 +12181,7 @@ { "comment": "V6; V3 (ignored)", "input": "xn----ukg9938i.xn----4u5m", - "output": null + "output": "xn----ukg9938i.xn----4u5m" }, { "comment": "C1; V7; V3 (ignored)", @@ -12206,12 +12206,12 @@ { "comment": "V7; V3 (ignored)", "input": "xn----9mo67451g.xn----qj7b", - "output": null + "output": "xn----9mo67451g.xn----qj7b" }, { "comment": "C1; V7; V3 (ignored)", "input": "xn----sgn90kn5663a.xn----qj7b", - "output": null + "output": "xn----sgn90kn5663a.xn----qj7b" }, { "comment": "V6; V7; V3 (ignored)", @@ -12221,7 +12221,7 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn----qi38c.xn----jxc827k", - "output": null + "output": "xn----qi38c.xn----jxc827k" }, { "comment": "V7; A4_2 (ignored)", @@ -12231,7 +12231,7 @@ { "comment": "V7; A4_2 (ignored)", "input": ".xn--mgb1a7bt462h.xn--17e10qe61f9r71s", - "output": null + "output": ".xn--mgb1a7bt462h.xn--17e10qe61f9r71s" }, { "comment": "V3 (ignored)", @@ -12276,12 +12276,12 @@ { "comment": "V6; V7", "input": "xn----9tg11172akr8b.ss", - "output": null + "output": "xn----9tg11172akr8b.ss" }, { "comment": "V6; V7", "input": "xn----9tg11172akr8b.xn--zca", - "output": null + "output": "xn----9tg11172akr8b.xn--zca" }, { "comment": "V6; V7", @@ -12321,12 +12321,12 @@ { "comment": "V6; V7; V3 (ignored)", "input": "xn----jmf.xn--5-ufo50192e", - "output": null + "output": "xn----jmf.xn--5-ufo50192e" }, { "comment": "C1; C2; V6; V7", "input": "xn----jmf215lda.xn--5-ufo50192e", - "output": null + "output": "xn----jmf215lda.xn--5-ufo50192e" }, { "comment": "V6; V7", @@ -12336,7 +12336,7 @@ { "comment": "V6; V7", "input": "xn--gc5a.xn--ybc83044ppga", - "output": null + "output": "xn--gc5a.xn--ybc83044ppga" }, { "input": "xn--8gb2338k.xn--lhb0154f", @@ -12393,17 +12393,17 @@ { "comment": "V7", "input": "xn--6-8cb306hms1a.xn--ss-2vq", - "output": null + "output": "xn--6-8cb306hms1a.xn--ss-2vq" }, { "comment": "V7", "input": "xn--6-8cb555h2b.xn--ss-2vq", - "output": null + "output": "xn--6-8cb555h2b.xn--ss-2vq" }, { "comment": "V7", "input": "xn--6-8cb555h2b.xn--zca894k", - "output": null + "output": "xn--6-8cb555h2b.xn--zca894k" }, { "comment": "V7", @@ -12428,7 +12428,7 @@ { "comment": "V7", "input": "xn--eo08b.xn--hdh3385g", - "output": null + "output": "xn--eo08b.xn--hdh3385g" }, { "comment": "V6; V7; A4_2 (ignored)", @@ -12443,17 +12443,17 @@ { "comment": "V6; V7; A4_2 (ignored)", "input": "xn--619ep9154c.", - "output": null + "output": "xn--619ep9154c." }, { "comment": "V6; V7", "input": "xn--619ep9154c.xn--psd", - "output": null + "output": "xn--619ep9154c.xn--psd" }, { "comment": "V6; V7", "input": "xn--619ep9154c.xn--cl7c", - "output": null + "output": "xn--619ep9154c.xn--cl7c" }, { "comment": "V7", @@ -12468,7 +12468,7 @@ { "comment": "V7", "input": "xn--vi56e.xn--2-w91i", - "output": null + "output": "xn--vi56e.xn--2-w91i" }, { "comment": "C2; V7", @@ -12493,17 +12493,17 @@ { "comment": "V7", "input": "xn--7pj.ss", - "output": null + "output": "xn--7pj.ss" }, { "comment": "C2; V7", "input": "xn--7pj.xn--ss-n1t", - "output": null + "output": "xn--7pj.xn--ss-n1t" }, { "comment": "C2; V7", "input": "xn--7pj.xn--zca870n", - "output": null + "output": "xn--7pj.xn--zca870n" }, { "comment": "C1", @@ -12523,7 +12523,7 @@ { "comment": "C1", "input": "xn--7zv.xn--0ug", - "output": null + "output": "xn--7zv.xn--0ug" }, { "input": "xn--iwb.ss", @@ -12550,12 +12550,12 @@ { "comment": "V7; V3 (ignored); A4_2 (ignored)", "input": "xn----n50a258u.xn---1-up07j.", - "output": null + "output": "xn----n50a258u.xn---1-up07j." }, { "comment": "V7; V3 (ignored)", "input": "xn----n50a258u.xn----ecp33805f", - "output": null + "output": "xn----n50a258u.xn----ecp33805f" }, { "comment": "C2; V7", @@ -12570,12 +12570,12 @@ { "comment": "V7", "input": "xn--ebf031cf7196a.xn--587c", - "output": null + "output": "xn--ebf031cf7196a.xn--587c" }, { "comment": "C2; V7", "input": "xn--ebf031cf7196a.xn--1ug9540g", - "output": null + "output": "xn--ebf031cf7196a.xn--1ug9540g" }, { "comment": "V3 (ignored)", @@ -12605,7 +12605,7 @@ { "comment": "V6; V7", "input": "xn--sn3d59267c.xn--4hb", - "output": null + "output": "xn--sn3d59267c.xn--4hb" }, { "comment": "C1; V6; V7", @@ -12615,12 +12615,12 @@ { "comment": "V6; V7", "input": "xn--ie8c.xn--2g51a", - "output": null + "output": "xn--ie8c.xn--2g51a" }, { "comment": "C1; V6; V7", "input": "xn--ie8c.xn--0ug03366c", - "output": null + "output": "xn--ie8c.xn--0ug03366c" }, { "comment": "C2; V7; V3 (ignored)", @@ -12645,12 +12645,12 @@ { "comment": "V7; V3 (ignored)", "input": "xn--gdh.xn----cr99a1w710b", - "output": null + "output": "xn--gdh.xn----cr99a1w710b" }, { "comment": "C2; V7; V3 (ignored)", "input": "xn--1ug95g.xn----cr99a1w710b", - "output": null + "output": "xn--1ug95g.xn----cr99a1w710b" }, { "comment": "C2; V7", @@ -12665,22 +12665,22 @@ { "comment": "V7", "input": "xn--2u2a.xn--5-uws5848bpf44e", - "output": null + "output": "xn--2u2a.xn--5-uws5848bpf44e" }, { "comment": "C2; V7", "input": "xn--1uga7691f.xn--5-uws5848bpf44e", - "output": null + "output": "xn--1uga7691f.xn--5-uws5848bpf44e" }, { "comment": "V7", "input": "xn--2u2a.xn--5-r1g7167ipfw8d", - "output": null + "output": "xn--2u2a.xn--5-r1g7167ipfw8d" }, { "comment": "C2; V7", "input": "xn--1uga7691f.xn--5-r1g7167ipfw8d", - "output": null + "output": "xn--1uga7691f.xn--5-r1g7167ipfw8d" }, { "input": "xn--ix9c26l.xn--q0s", @@ -12703,12 +12703,12 @@ { "comment": "V6; V7", "input": "xn--0m9as84e2e21c.c", - "output": null + "output": "xn--0m9as84e2e21c.c" }, { "comment": "C2; V6; V7", "input": "xn--1ug1435cfkyaoi04d.c", - "output": null + "output": "xn--1ug1435cfkyaoi04d.c" }, { "input": "\ud802\udec0\uff0e\u0689\ud804\udf00", @@ -12735,7 +12735,7 @@ { "comment": "V6", "input": "xn--1chy468a.xn--2ed", - "output": null + "output": "xn--1chy468a.xn--2ed" }, { "comment": "C2", @@ -12755,7 +12755,7 @@ { "comment": "C2", "input": "xn--r97c.xn--1ug", - "output": null + "output": "xn--r97c.xn--1ug" }, { "comment": "V6", @@ -12765,7 +12765,7 @@ { "comment": "V6", "input": "xn--2g1d14o.xn--jti", - "output": null + "output": "xn--2g1d14o.xn--jti" }, { "comment": "C1; V6; V7", @@ -12785,12 +12785,12 @@ { "comment": "V6; V7", "input": "xn--1mnx647cg3x1b.xn--4-zfb5123a", - "output": null + "output": "xn--1mnx647cg3x1b.xn--4-zfb5123a" }, { "comment": "C1; V6; V7", "input": "xn--1mnx647cg3x1b.xn--4-zfb502tlsl", - "output": null + "output": "xn--1mnx647cg3x1b.xn--4-zfb502tlsl" }, { "comment": "C1; V6; V7", @@ -12800,11 +12800,11 @@ { "comment": "V6; V7", "input": "xn--1mnx647cg3x1b.xn--4-zfb324h", - "output": null + "output": "xn--1mnx647cg3x1b.xn--4-zfb324h" }, { "comment": "C1; V6; V7", "input": "xn--1mnx647cg3x1b.xn--4-zfb324h32o", - "output": null + "output": "xn--1mnx647cg3x1b.xn--4-zfb324h32o" } ] diff --git a/test/fixtures/wpt/url/resources/setters_tests.json b/test/fixtures/wpt/url/resources/setters_tests.json index fb86654df2196b..0a151f91862a90 100644 --- a/test/fixtures/wpt/url/resources/setters_tests.json +++ b/test/fixtures/wpt/url/resources/setters_tests.json @@ -1137,9 +1137,9 @@ "href": "https://example.com/", "new_value": "xn--", "expected": { - "href": "https://example.com/", - "host": "example.com", - "hostname": "example.com" + "href": "https://xn--/", + "host": "xn--", + "hostname": "xn--" } }, { @@ -1611,9 +1611,9 @@ "href": "https://example.com/", "new_value": "xn--", "expected": { - "href": "https://example.com/", - "host": "example.com", - "hostname": "example.com" + "href": "https://xn--/", + "host": "xn--", + "hostname": "xn--" } }, { diff --git a/test/fixtures/wpt/url/resources/toascii.json b/test/fixtures/wpt/url/resources/toascii.json index 588ef150f9ce6a..14a48d0ad13fec 100644 --- a/test/fixtures/wpt/url/resources/toascii.json +++ b/test/fixtures/wpt/url/resources/toascii.json @@ -55,11 +55,11 @@ { "comment": "Invalid Punycode", "input": "xn--a", - "output": null + "output": "xn--a" }, { "input": "xn--a.xn--zca", - "output": null + "output": "xn--a.xn--zca" }, { "input": "xn--a.ß", @@ -67,7 +67,7 @@ }, { "input": "xn--ls8h=", - "output": null + "output": "xn--ls8h=" }, { "comment": "Invalid Punycode (contains non-ASCII character)", @@ -99,7 +99,7 @@ }, { "input": "xn--1ug.example", - "output": null + "output": "xn--1ug.example" }, { "comment": "CheckBidi is true", @@ -108,7 +108,7 @@ }, { "input": "xn--a-yoc", - "output": null + "output": "xn--a-yoc" }, { "comment": "processing_option is Nontransitional_Processing", @@ -127,7 +127,7 @@ { "comment": "U+FFFD character encoded in Punycode", "input": "xn--zn7c.com", - "output": null + "output": "xn--zn7c.com" }, { "comment": "Label longer than 63 code points", @@ -369,7 +369,7 @@ }, { "input": "xn--0.com", - "output": null + "output": "xn--0.com" }, { "input": "foo\u0300.bar.com", diff --git a/test/fixtures/wpt/url/resources/urltestdata.json b/test/fixtures/wpt/url/resources/urltestdata.json index e19ca3195700e3..c8d6ffe22bffe2 100644 --- a/test/fixtures/wpt/url/resources/urltestdata.json +++ b/test/fixtures/wpt/url/resources/urltestdata.json @@ -4001,33 +4001,93 @@ { "input": "http://a.b.c.xn--pokxncvks", "base": null, - "failure": true + "href": "http://a.b.c.xn--pokxncvks/", + "origin": "http://a.b.c.xn--pokxncvks", + "protocol": "http:", + "username": "", + "password": "", + "host": "a.b.c.xn--pokxncvks", + "hostname": "a.b.c.xn--pokxncvks", + "port": "", + "pathname": "/", + "search": "", + "hash": "" }, { "input": "http://10.0.0.xn--pokxncvks", "base": null, - "failure": true + "href": "http://10.0.0.xn--pokxncvks/", + "origin": "http://10.0.0.xn--pokxncvks", + "protocol": "http:", + "username": "", + "password": "", + "host": "10.0.0.xn--pokxncvks", + "hostname": "10.0.0.xn--pokxncvks", + "port": "", + "pathname": "/", + "search": "", + "hash": "" }, "IDNA labels should be matched case-insensitively", { "input": "http://a.b.c.XN--pokxncvks", "base": null, - "failure": true + "href": "http://a.b.c.xn--pokxncvks/", + "origin": "http://a.b.c.xn--pokxncvks", + "protocol": "http:", + "username": "", + "password": "", + "host": "a.b.c.xn--pokxncvks", + "hostname": "a.b.c.xn--pokxncvks", + "port": "", + "pathname": "/", + "search": "", + "hash": "" }, { "input": "http://a.b.c.Xn--pokxncvks", "base": null, - "failure": true + "href": "http://a.b.c.xn--pokxncvks/", + "origin": "http://a.b.c.xn--pokxncvks", + "protocol": "http:", + "username": "", + "password": "", + "host": "a.b.c.xn--pokxncvks", + "hostname": "a.b.c.xn--pokxncvks", + "port": "", + "pathname": "/", + "search": "", + "hash": "" }, { "input": "http://10.0.0.XN--pokxncvks", "base": null, - "failure": true + "href": "http://10.0.0.xn--pokxncvks/", + "origin": "http://10.0.0.xn--pokxncvks", + "protocol": "http:", + "username": "", + "password": "", + "host": "10.0.0.xn--pokxncvks", + "hostname": "10.0.0.xn--pokxncvks", + "port": "", + "pathname": "/", + "search": "", + "hash": "" }, { "input": "http://10.0.0.xN--pokxncvks", "base": null, - "failure": true + "href": "http://10.0.0.xn--pokxncvks/", + "origin": "http://10.0.0.xn--pokxncvks", + "protocol": "http:", + "username": "", + "password": "", + "host": "10.0.0.xn--pokxncvks", + "hostname": "10.0.0.xn--pokxncvks", + "port": "", + "pathname": "/", + "search": "", + "hash": "" }, "Test name prepping, fullwidth input should be converted to ASCII and NOT IDN-ized. This is 'Go' in fullwidth UTF-8/UTF-16.", { @@ -8752,7 +8812,16 @@ { "input": "file://xn--/p", "base": null, - "failure": true + "href": "file://xn--/p", + "protocol": "file:", + "username": "", + "password": "", + "host": "xn--", + "hostname": "xn--", + "port": "", + "pathname": "/p", + "search": "", + "hash": "" }, "https://bugzilla.mozilla.org/show_bug.cgi?id=1647058", { @@ -9498,7 +9567,17 @@ { "input": "https://xn--/", "base": null, - "failure": true + "href": "https://xn--/", + "origin": "https://xn--", + "protocol": "https:", + "username": "", + "password": "", + "host": "xn--", + "hostname": "xn--", + "port": "", + "pathname": "/", + "search": "", + "hash": "" }, "Non-special schemes that some implementations might incorrectly treat as special", { diff --git a/test/fixtures/wpt/versions.json b/test/fixtures/wpt/versions.json index ab815fdc217f26..ef4ac92ba8b375 100644 --- a/test/fixtures/wpt/versions.json +++ b/test/fixtures/wpt/versions.json @@ -72,7 +72,7 @@ "path": "streams" }, "url": { - "commit": "d4598eba0959249d8715818a402b432c513f9492", + "commit": "b63305b743ed9ce2725d4ae09c5c8f0c40d8e6e1", "path": "url" }, "urlpattern": {