pcre2 2.0.2 → 2.0.3
raw patch · 37 files changed
+8325/−7797 lines, 37 files
Files
- ChangeLog.md +5/−0
- README.md +1/−1
- pcre2.cabal +1/−1
- src/c/config.h +6/−3
- src/c/pcre2.h +7/−5
- src/c/pcre2/src/pcre2_compile.c +24/−10
- src/c/pcre2/src/pcre2_dfa_match.c +44/−25
- src/c/pcre2/src/pcre2_error.c +2/−1
- src/c/pcre2/src/pcre2_jit_compile.c +30/−21
- src/c/pcre2/src/pcre2_jit_simd_inc.h +6/−15
- src/c/pcre2/src/pcre2_jit_test.c +2/−0
- src/c/pcre2/src/pcre2_match.c +46/−27
- src/c/pcre2/src/pcre2_tables.c +181/−166
- src/c/pcre2/src/pcre2_ucd.c +4593/−4507
- src/c/pcre2/src/pcre2_ucp.h +7/−1
- src/c/pcre2/src/pcre2demo.c +9/−6
- src/c/pcre2/src/pcre2grep.c +44/−13
- src/c/pcre2/src/pcre2posix.c +1/−0
- src/c/pcre2/src/pcre2test.c +32/−29
- src/c/pcre2/src/sljit/sljitConfigInternal.h +12/−0
- src/c/pcre2/src/sljit/sljitLir.c +14/−11
- src/c/pcre2/src/sljit/sljitLir.h +37/−39
- src/c/pcre2/src/sljit/sljitNativeARM_32.c +16/−7
- src/c/pcre2/src/sljit/sljitNativeARM_64.c +15/−6
- src/c/pcre2/src/sljit/sljitNativeARM_T2_32.c +15/−6
- src/c/pcre2/src/sljit/sljitNativeMIPS_32.c +1/−1
- src/c/pcre2/src/sljit/sljitNativeMIPS_64.c +1/−1
- src/c/pcre2/src/sljit/sljitNativeMIPS_common.c +10/−6
- src/c/pcre2/src/sljit/sljitNativePPC_32.c +16/−10
- src/c/pcre2/src/sljit/sljitNativePPC_64.c +22/−10
- src/c/pcre2/src/sljit/sljitNativePPC_common.c +66/−27
- src/c/pcre2/src/sljit/sljitNativeS390X.c +2975/−2754
- src/c/pcre2/src/sljit/sljitNativeSPARC_32.c +3/−0
- src/c/pcre2/src/sljit/sljitNativeSPARC_common.c +11/−7
- src/c/pcre2/src/sljit/sljitNativeX86_common.c +0/−2
- src/hs/Text/Regex/Pcre2/Internal.hs +65/−70
- src/hs/Text/Regex/Pcre2/TH.hs +5/−9
ChangeLog.md view
@@ -1,5 +1,10 @@ # Changelog and Acknowledgements +## 2.0.3+* Updated PCRE2 to 10.39 (no API changes). The C sources are now drawn from+ https://github.com/PhilipHazel/pcre2.git, which fixes+ [#10](https://github.com/sjshuck/hs-pcre2/issues/10).+ ## 2.0.2 * Fixed a minor issue where the caret indicating pattern location of a `Pcre2CompileException` was misplaced if the pattern contained a newline.
README.md view
@@ -63,7 +63,7 @@ speedup over `pcre-light`, and 20× over `regex-pcre`, for longer captures. * Few dependencies.-* Bundled, statically-linked UTF-16 build of up-to-date PCRE2 (version 10.37),+* Bundled, statically-linked UTF-16 build of up-to-date PCRE2 (version 10.39), with a complete, exposed Haskell binding. ## Wishlist
pcre2.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: pcre2-version: 2.0.2+version: 2.0.3 synopsis: Regular expressions via the PCRE2 C library (included) description: Please see the README on GitHub at <https://github.com/sjshuck/hs-pcre2> category: Text
src/c/config.h view
@@ -103,6 +103,9 @@ /* Define to 1 if you have the <readline/readline.h> header file. */ /* #undef HAVE_READLINE_READLINE_H */ +/* Define to 1 if you have the `realpath' function. */+/* #undef HAVE_REALPATH */+ /* Define to 1 if you have the `secure_getenv' function. */ /* #undef HAVE_SECURE_GETENV */ @@ -230,7 +233,7 @@ #define PACKAGE_NAME "PCRE2" /* Define to the full name and version of this package. */-#define PACKAGE_STRING "PCRE2 10.37"+#define PACKAGE_STRING "PCRE2 10.39" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "pcre2"@@ -239,7 +242,7 @@ #define PACKAGE_URL "" /* Define to the version of this package. */-#define PACKAGE_VERSION "10.37"+#define PACKAGE_VERSION "10.39" /* The value of PARENS_NEST_LIMIT specifies the maximum depth of nested parentheses (of any kind) in a pattern. This limits the amount of system@@ -432,7 +435,7 @@ #endif /* Version number of package */-#define VERSION "10.37"+#define VERSION "10.39" /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */
src/c/pcre2.h view
@@ -5,7 +5,7 @@ /* This is the public header file for the PCRE library, second API, to be #included by applications that call PCRE2 functions. - Copyright (c) 2016-2020 University of Cambridge+ Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without@@ -42,9 +42,9 @@ /* The current PCRE version information. */ #define PCRE2_MAJOR 10-#define PCRE2_MINOR 37+#define PCRE2_MINOR 39 #define PCRE2_PRERELEASE -#define PCRE2_DATE 2021-05-26+#define PCRE2_DATE 2021-10-29 /* When an application links to a PCRE DLL in Windows, the symbols that are imported have to be identified as such. When building PCRE2, the appropriate@@ -84,8 +84,8 @@ /* Have to include limits.h, stdlib.h, and inttypes.h to ensure that size_t and uint8_t, UCHAR_MAX, etc are defined. Some systems that do have inttypes.h do not have stdint.h, which is why we use inttypes.h, which according to the C-standard is a superset of stdint.h. If none of these headers are available,-the relevant values must be provided by some other means. */+standard is a superset of stdint.h. If inttypes.h is not available the build+will break and the relevant values must be provided by some other means. */ #include <limits.h> #include <stdlib.h>@@ -152,6 +152,7 @@ #define PCRE2_EXTRA_MATCH_LINE 0x00000008u /* C */ #define PCRE2_EXTRA_ESCAPED_CR_IS_LF 0x00000010u /* C */ #define PCRE2_EXTRA_ALT_BSUX 0x00000020u /* C */+#define PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK 0x00000040u /* C */ /* These are for pcre2_jit_compile(). */ @@ -311,6 +312,7 @@ #define PCRE2_ERROR_SCRIPT_RUN_NOT_AVAILABLE 196 #define PCRE2_ERROR_TOO_MANY_CAPTURES 197 #define PCRE2_ERROR_CONDITION_ATOMIC_ASSERTION_EXPECTED 198+#define PCRE2_ERROR_BACKSLASH_K_IN_LOOKAROUND 199 /* "Expected" matching error codes: no match and partial match. */
src/c/pcre2/src/pcre2_compile.c view
@@ -7,7 +7,7 @@ Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge- New API code Copyright (c) 2016-2020 University of Cambridge+ New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without@@ -137,7 +137,7 @@ static int check_lookbehinds(uint32_t *, uint32_t **, parsed_recurse_check *,- compile_block *);+ compile_block *, int *); /*************************************************@@ -782,12 +782,15 @@ #define PUBLIC_COMPILE_EXTRA_OPTIONS \ (PUBLIC_LITERAL_COMPILE_EXTRA_OPTIONS| \ PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES|PCRE2_EXTRA_BAD_ESCAPE_IS_LITERAL| \- PCRE2_EXTRA_ESCAPED_CR_IS_LF|PCRE2_EXTRA_ALT_BSUX)+ PCRE2_EXTRA_ESCAPED_CR_IS_LF|PCRE2_EXTRA_ALT_BSUX| \+ PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK) /* Compile time error code numbers. They are given names so that they can more easily be tracked. When a new number is added, the tables called eint1 and eint2 in pcre2posix.c may need to be updated, and a new error text must be-added to compile_error_texts in pcre2_error.c. */+added to compile_error_texts in pcre2_error.c. Also, the error codes in+pcre2.h.in must be updated - their values are exactly 100 greater than these+values. */ enum { ERR0 = COMPILE_ERROR_BASE, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10,@@ -799,7 +802,7 @@ ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69, ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79, ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERR88, ERR89, ERR90,- ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98 };+ ERR91, ERR92, ERR93, ERR94, ERR95, ERR96, ERR97, ERR98, ERR99 }; /* This is a table of start-of-pattern options such as (*UTF) and settings such as (*LIMIT_MATCH=nnnn) and (*CRLF). For completeness and backward@@ -7799,6 +7802,16 @@ } #endif + /* \K is forbidden in lookarounds since 10.38 because that's what Perl has+ done. However, there's an option, in case anyone was relying on it. */++ if (cb->assert_depth > 0 && meta_arg == ESC_K &&+ (cb->cx->extra_options & PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK) == 0)+ {+ *errorcodeptr = ERR99;+ return 0;+ }+ /* For the rest (including \X when Unicode is supported - if not it's faulted at parse time), the OP value is the escape value when PCRE2_UCP is not set; if it is set, these escapes do not show up here because they are@@ -9148,7 +9161,7 @@ case META_LOOKAHEAD: case META_LOOKAHEADNOT: case META_LOOKAHEAD_NA:- *errcodeptr = check_lookbehinds(pptr + 1, &pptr, recurses, cb);+ *errcodeptr = check_lookbehinds(pptr + 1, &pptr, recurses, cb, lcptr); if (*errcodeptr != 0) return -1; /* Ignore any qualifiers that follow a lookahead assertion. */@@ -9488,16 +9501,16 @@ retptr if not NULL, return the ket pointer here recurses chain of recurse_check to catch mutual recursion cb points to the compile block+ lcptr points to loop counter Returns: 0 on success, or an errorcode (cb->erroroffset will be set) */ static int check_lookbehinds(uint32_t *pptr, uint32_t **retptr,- parsed_recurse_check *recurses, compile_block *cb)+ parsed_recurse_check *recurses, compile_block *cb, int *lcptr) { int errorcode = 0;-int loopcount = 0; int nestlevel = 0; cb->erroroffset = PCRE2_UNSET;@@ -9623,7 +9636,7 @@ case META_LOOKBEHIND: case META_LOOKBEHINDNOT: case META_LOOKBEHIND_NA:- if (!set_lookbehind_lengths(&pptr, &errorcode, &loopcount, recurses, cb))+ if (!set_lookbehind_lengths(&pptr, &errorcode, lcptr, recurses, cb)) return errorcode; break; }@@ -10078,7 +10091,8 @@ if (has_lookbehind) {- errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb);+ int loopcount = 0;+ errorcode = check_lookbehinds(cb.parsed_pattern, NULL, NULL, &cb, &loopcount); if (errorcode != 0) goto HAD_CB_ERROR; }
src/c/pcre2/src/pcre2_dfa_match.c view
@@ -7,7 +7,7 @@ Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge- New API code Copyright (c) 2016-2020 University of Cambridge+ New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without@@ -3256,8 +3256,8 @@ BOOL has_req_cu = FALSE; #if PCRE2_CODE_UNIT_WIDTH == 8-BOOL memchr_not_found_first_cu = FALSE;-BOOL memchr_not_found_first_cu2 = FALSE;+PCRE2_SPTR memchr_found_first_cu = NULL;+PCRE2_SPTR memchr_found_first_cu2 = NULL; #endif PCRE2_UCHAR first_cu = 0;@@ -3648,13 +3648,7 @@ } } - /* Not anchored. Advance to a unique first code unit if there is one. In- 8-bit mode, the use of memchr() gives a big speed up, even though we have- to call it twice in caseless mode, in order to find the earliest occurrence- of the character in either of its cases. If a call to memchr() that- searches the rest of the subject fails to find one case, remember that in- order not to keep on repeating the search. This can make a huge difference- when the strings are very long and only one case is present. */+ /* Not anchored. Advance to a unique first code unit if there is one. */ else {@@ -3662,43 +3656,68 @@ { if (first_cu != first_cu2) /* Caseless */ {+ /* In 16-bit and 32_bit modes we have to do our own search, so can+ look for both cases at once. */+ #if PCRE2_CODE_UNIT_WIDTH != 8 PCRE2_UCHAR smc; while (start_match < end_subject && (smc = UCHAR21TEST(start_match)) != first_cu &&- smc != first_cu2)+ smc != first_cu2) start_match++;+#else+ /* In 8-bit mode, the use of memchr() gives a big speed up, even+ though we have to call it twice in order to find the earliest+ occurrence of the code unit in either of its cases. Caching is used+ to remember the positions of previously found code units. This can+ make a huge difference when the strings are very long and only one+ case is actually present. */ -#else /* 8-bit code units */ PCRE2_SPTR pp1 = NULL; PCRE2_SPTR pp2 = NULL;- PCRE2_SIZE cu2size = end_subject - start_match;+ PCRE2_SIZE searchlength = end_subject - start_match; - if (!memchr_not_found_first_cu)+ /* If we haven't got a previously found position for first_cu, or if+ the current starting position is later, we need to do a search. If+ the code unit is not found, set it to the end. */++ if (memchr_found_first_cu == NULL ||+ start_match > memchr_found_first_cu) {- pp1 = memchr(start_match, first_cu, end_subject - start_match);- if (pp1 == NULL) memchr_not_found_first_cu = TRUE;- else cu2size = pp1 - start_match;+ pp1 = memchr(start_match, first_cu, searchlength);+ memchr_found_first_cu = (pp1 == NULL)? end_subject : pp1; } - /* If pp1 is not NULL, we have arranged to search only as far as pp1,- to see if the other case is earlier, so we can set "not found" only- when both searches have returned NULL. */+ /* If the start is before a previously found position, use the+ previous position, or NULL if a previous search failed. */ - if (!memchr_not_found_first_cu2)+ else pp1 = (memchr_found_first_cu == end_subject)? NULL :+ memchr_found_first_cu;++ /* Do the same thing for the other case. */++ if (memchr_found_first_cu2 == NULL ||+ start_match > memchr_found_first_cu2) {- pp2 = memchr(start_match, first_cu2, cu2size);- memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL);+ pp2 = memchr(start_match, first_cu2, searchlength);+ memchr_found_first_cu2 = (pp2 == NULL)? end_subject : pp2; } + else pp2 = (memchr_found_first_cu2 == end_subject)? NULL :+ memchr_found_first_cu2;++ /* Set the start to the end of the subject if neither case was found.+ Otherwise, use the earlier found point. */+ if (pp1 == NULL) start_match = (pp2 == NULL)? end_subject : pp2; else start_match = (pp2 == NULL || pp1 < pp2)? pp1 : pp2;-#endif++#endif /* 8-bit handling */ } - /* The caseful case */+ /* The caseful case is much simpler. */ else {
src/c/pcre2/src/pcre2_error.c view
@@ -7,7 +7,7 @@ Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge- New API code Copyright (c) 2016-2019 University of Cambridge+ New API code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without@@ -186,6 +186,7 @@ "script runs require Unicode support, which this version of PCRE2 does not have\0" "too many capturing groups (maximum 65535)\0" "atomic assertion expected after (?( or (?(?C)\0"+ "\\K is not allowed in lookarounds (but see PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK)\0" ; /* Match-time and UTF error texts are in the same format. */
src/c/pcre2/src/pcre2_jit_compile.c view
@@ -1236,24 +1236,28 @@ return: current number of iterators enhanced with fast fail */-static int detect_early_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start, sljit_s32 depth, int start)+static int detect_early_fail(compiler_common *common, PCRE2_SPTR cc, int *private_data_start,+ sljit_s32 depth, int start, BOOL fast_forward_allowed) { PCRE2_SPTR begin = cc; PCRE2_SPTR next_alt; PCRE2_SPTR end; PCRE2_SPTR accelerated_start;+BOOL prev_fast_forward_allowed; int result = 0; int count;-BOOL fast_forward_allowed = TRUE; SLJIT_ASSERT(*cc == OP_ONCE || *cc == OP_BRA || *cc == OP_CBRA); SLJIT_ASSERT(*cc != OP_CBRA || common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] != 0); SLJIT_ASSERT(start < EARLY_FAIL_ENHANCE_MAX); +next_alt = cc + GET(cc, 1);+if (*next_alt == OP_ALT)+ fast_forward_allowed = FALSE;+ do { count = start;- next_alt = cc + GET(cc, 1); cc += 1 + LINK_SIZE + ((*cc == OP_CBRA) ? IMM2_SIZE : 0); while (TRUE)@@ -1476,6 +1480,7 @@ case OP_CBRA: end = cc + GET(cc, 1); + prev_fast_forward_allowed = fast_forward_allowed; fast_forward_allowed = FALSE; if (depth >= 4) break;@@ -1484,7 +1489,7 @@ if (*end != OP_KET || (*cc == OP_CBRA && common->optimized_cbracket[GET2(cc, 1 + LINK_SIZE)] == 0)) break; - count = detect_early_fail(common, cc, private_data_start, depth + 1, count);+ count = detect_early_fail(common, cc, private_data_start, depth + 1, count, prev_fast_forward_allowed); if (PRIVATE_DATA(cc) != 0) common->private_data_ptrs[begin - common->start] = 1;@@ -1510,7 +1515,7 @@ { count++; - if (fast_forward_allowed && *next_alt == OP_KET)+ if (fast_forward_allowed) { common->fast_forward_bc_ptr = accelerated_start; common->private_data_ptrs[(accelerated_start + 1) - common->start] = ((*private_data_start) << 3) | type_skip;@@ -1560,8 +1565,8 @@ else if (result < count) result = count; - fast_forward_allowed = FALSE; cc = next_alt;+ next_alt = cc + GET(cc, 1); } while (*cc == OP_ALT); @@ -4197,9 +4202,6 @@ and it is destroyed. Does not modify STR_PTR for invalid character sequences. */ DEFINE_COMPILER; -SLJIT_UNUSED_ARG(backtracks);-SLJIT_UNUSED_ARG(must_be_valid);- #if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32 struct sljit_jump *jump; #endif@@ -4273,6 +4275,10 @@ } #endif /* PCRE2_CODE_UNIT_WIDTH == [8|16|32] */ #endif /* SUPPORT_UNICODE */++SLJIT_UNUSED_ARG(backtracks);+SLJIT_UNUSED_ARG(must_be_valid);+ OP2(SLJIT_SUB, STR_PTR, 0, STR_PTR, 0, SLJIT_IMM, IN_UCHARS(1)); } @@ -8135,7 +8141,7 @@ } else OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);- add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));+ add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); if (!common->endonly) compile_simple_assertion_matchingpath(common, OP_EODN, cc, backtracks);@@ -8155,7 +8161,7 @@ } else OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTEOL);- add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));+ add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); check_partial(common, FALSE); jump[0] = JUMP(SLJIT_JUMP); JUMPHERE(jump[1]);@@ -8195,14 +8201,14 @@ OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, begin)); add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0)); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(TMP2), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);- add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));+ add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); } else { OP1(SLJIT_MOV, TMP1, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, begin)); add_jump(compiler, backtracks, CMP(SLJIT_GREATER, STR_PTR, 0, TMP1, 0)); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL);- add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));+ add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); } return cc; @@ -8221,7 +8227,7 @@ jump[1] = CMP(SLJIT_GREATER, STR_PTR, 0, TMP2, 0); OP2(SLJIT_AND32 | SLJIT_SET_Z, SLJIT_UNUSED, 0, SLJIT_MEM1(ARGUMENTS), SLJIT_OFFSETOF(jit_arguments, options), SLJIT_IMM, PCRE2_NOTBOL); }- add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO32));+ add_jump(compiler, backtracks, JUMP(SLJIT_NOT_ZERO)); jump[0] = JUMP(SLJIT_JUMP); JUMPHERE(jump[1]); @@ -9575,11 +9581,11 @@ /* Check return value. */ OP2(SLJIT_SUB32 | SLJIT_SET_Z | SLJIT_SET_SIG_GREATER, SLJIT_UNUSED, 0, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0);-add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER32));+add_jump(compiler, &backtrack->topbacktracks, JUMP(SLJIT_SIG_GREATER)); if (common->abort_label == NULL)- add_jump(compiler, &common->abort, JUMP(SLJIT_NOT_EQUAL32) /* SIG_LESS */);+ add_jump(compiler, &common->abort, JUMP(SLJIT_NOT_EQUAL) /* SIG_LESS */); else- JUMPTO(SLJIT_NOT_EQUAL32 /* SIG_LESS */, common->abort_label);+ JUMPTO(SLJIT_NOT_EQUAL /* SIG_LESS */, common->abort_label); return cc + callout_length; } @@ -11226,7 +11232,7 @@ early_fail_ptr >>= 3; /* During recursion, these optimizations are disabled. */-if (common->early_fail_start_ptr == 0)+if (common->early_fail_start_ptr == 0 && common->fast_forward_bc_ptr == NULL) { early_fail_ptr = 0; early_fail_type = type_skip;@@ -13657,7 +13663,7 @@ private_data_size = common->cbra_ptr + (re->top_bracket + 1) * sizeof(sljit_sw); if ((re->overall_options & PCRE2_ANCHORED) == 0 && (re->overall_options & PCRE2_NO_START_OPTIMIZE) == 0 && !common->has_skip_in_assert_back)- detect_early_fail(common, common->start, &private_data_size, 0, 0);+ detect_early_fail(common, common->start, &private_data_size, 0, 0, TRUE); set_private_data_ptrs(common, &private_data_size, ccend); @@ -14126,6 +14132,10 @@ pcre2_jit_compile(pcre2_code *code, uint32_t options) { pcre2_real_code *re = (pcre2_real_code *)code;+#ifdef SUPPORT_JIT+executable_functions *functions;+static int executable_allocator_is_working = 0;+#endif if (code == NULL) return PCRE2_ERROR_NULL;@@ -14160,8 +14170,7 @@ */ #ifdef SUPPORT_JIT-executable_functions *functions = (executable_functions *)re->executable_jit;-static int executable_allocator_is_working = 0;+functions = (executable_functions *)re->executable_jit; #endif if ((options & PCRE2_JIT_INVALID_UTF) != 0)
src/c/pcre2/src/pcre2_jit_simd_inc.h view
@@ -1356,8 +1356,6 @@ sljit_emit_op_custom(compiler, instruction, 6); } -/* TODO: use sljit_set_current_flags */- /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data_ind); instruction[1] = 7;@@ -1403,7 +1401,8 @@ sljit_emit_op_custom(compiler, instruction, 6); } -/* TODO: use sljit_set_current_flags */+sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW);+JUMPTO(SLJIT_OVERFLOW, start); /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data_ind);@@ -1411,8 +1410,6 @@ instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); sljit_emit_op_custom(compiler, instruction, 6); -CMPTO(SLJIT_GREATER_EQUAL, TMP1, 0, SLJIT_IMM, 16, start);- OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP1, 0); JUMPHERE(quit);@@ -1549,8 +1546,6 @@ sljit_emit_op_custom(compiler, instruction, 6); } -/* TODO: use sljit_set_current_flags */- /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp3_reg_ind << 4) | data_ind); instruction[1] = 7;@@ -1594,7 +1589,8 @@ sljit_emit_op_custom(compiler, instruction, 6); } -/* TODO: use sljit_set_current_flags */+sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW);+JUMPTO(SLJIT_OVERFLOW, start); /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp3_reg_ind << 4) | data_ind);@@ -1602,8 +1598,6 @@ instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); sljit_emit_op_custom(compiler, instruction, 6); -CMPTO(SLJIT_GREATER_EQUAL, TMP3, 0, SLJIT_IMM, 16, start);- OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP3, 0); JUMPHERE(quit);@@ -1778,8 +1772,6 @@ instruction[2] = (sljit_u16)((0xe << 8) | 0x81); sljit_emit_op_custom(compiler, instruction, 6); -/* TODO: use sljit_set_current_flags */- /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp1_reg_ind << 4) | data1_ind); instruction[1] = 7;@@ -1819,15 +1811,14 @@ instruction[2] = (sljit_u16)((0xe << 8) | 0x81); sljit_emit_op_custom(compiler, instruction, 6); -/* TODO: use sljit_set_current_flags */+sljit_set_current_flags(compiler, SLJIT_SET_OVERFLOW);+JUMPTO(SLJIT_OVERFLOW, start); /* VLGVB */ instruction[0] = (sljit_u16)(0xe700 | (tmp2_reg_ind << 4) | data1_ind); instruction[1] = 7; instruction[2] = (sljit_u16)((0x4 << 8) | 0x21); sljit_emit_op_custom(compiler, instruction, 6);--CMPTO(SLJIT_GREATER_EQUAL, TMP2, 0, SLJIT_IMM, 16, start); OP2(SLJIT_ADD, STR_PTR, 0, STR_PTR, 0, TMP2, 0);
src/c/pcre2/src/pcre2_jit_test.c view
@@ -351,6 +351,8 @@ { MU, A, 0, 0, ".[ab]*a", "xxa" }, { MU, A, 0, 0, ".[ab]?.", "xx" }, { MU, A, 0, 0, "_[ab]+_*a", "_aa" },+ { MU, A, 0, 0, "#(A+)#\\d+", "#A#A#0" },+ { MU, A, 0, 0, "(?P<size>\\d+)m|M", "4M" }, /* Bracket repeats with limit. */ { MU, A, 0, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
src/c/pcre2/src/pcre2_match.c view
@@ -7,7 +7,7 @@ Written by Philip Hazel Original API code Copyright (c) 1997-2012 University of Cambridge- New API code Copyright (c) 2015-2020 University of Cambridge+ New API code Copyright (c) 2015-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without@@ -6117,8 +6117,8 @@ BOOL startline; #if PCRE2_CODE_UNIT_WIDTH == 8-BOOL memchr_not_found_first_cu;-BOOL memchr_not_found_first_cu2;+PCRE2_SPTR memchr_found_first_cu;+PCRE2_SPTR memchr_found_first_cu2; #endif PCRE2_UCHAR first_cu = 0;@@ -6712,8 +6712,8 @@ mb->hitend = FALSE; #if PCRE2_CODE_UNIT_WIDTH == 8-memchr_not_found_first_cu = FALSE;-memchr_not_found_first_cu2 = FALSE;+memchr_found_first_cu = NULL;+memchr_found_first_cu2 = NULL; #endif for(;;)@@ -6782,13 +6782,7 @@ } } - /* Not anchored. Advance to a unique first code unit if there is one. In- 8-bit mode, the use of memchr() gives a big speed up, even though we have- to call it twice in caseless mode, in order to find the earliest occurrence- of the character in either of its cases. If a call to memchr() that- searches the rest of the subject fails to find one case, remember that in- order not to keep on repeating the search. This can make a huge difference- when the strings are very long and only one case is present. */+ /* Not anchored. Advance to a unique first code unit if there is one. */ else {@@ -6796,43 +6790,68 @@ { if (first_cu != first_cu2) /* Caseless */ {+ /* In 16-bit and 32_bit modes we have to do our own search, so can+ look for both cases at once. */+ #if PCRE2_CODE_UNIT_WIDTH != 8 PCRE2_UCHAR smc; while (start_match < end_subject && (smc = UCHAR21TEST(start_match)) != first_cu &&- smc != first_cu2)+ smc != first_cu2) start_match++;+#else+ /* In 8-bit mode, the use of memchr() gives a big speed up, even+ though we have to call it twice in order to find the earliest+ occurrence of the code unit in either of its cases. Caching is used+ to remember the positions of previously found code units. This can+ make a huge difference when the strings are very long and only one+ case is actually present. */ -#else /* 8-bit code units */ PCRE2_SPTR pp1 = NULL; PCRE2_SPTR pp2 = NULL;- PCRE2_SIZE cu2size = end_subject - start_match;+ PCRE2_SIZE searchlength = end_subject - start_match; - if (!memchr_not_found_first_cu)+ /* If we haven't got a previously found position for first_cu, or if+ the current starting position is later, we need to do a search. If+ the code unit is not found, set it to the end. */++ if (memchr_found_first_cu == NULL ||+ start_match > memchr_found_first_cu) {- pp1 = memchr(start_match, first_cu, end_subject - start_match);- if (pp1 == NULL) memchr_not_found_first_cu = TRUE;- else cu2size = pp1 - start_match;+ pp1 = memchr(start_match, first_cu, searchlength);+ memchr_found_first_cu = (pp1 == NULL)? end_subject : pp1; } - /* If pp1 is not NULL, we have arranged to search only as far as pp1,- to see if the other case is earlier, so we can set "not found" only- when both searches have returned NULL. */+ /* If the start is before a previously found position, use the+ previous position, or NULL if a previous search failed. */ - if (!memchr_not_found_first_cu2)+ else pp1 = (memchr_found_first_cu == end_subject)? NULL :+ memchr_found_first_cu;++ /* Do the same thing for the other case. */++ if (memchr_found_first_cu2 == NULL ||+ start_match > memchr_found_first_cu2) {- pp2 = memchr(start_match, first_cu2, cu2size);- memchr_not_found_first_cu2 = (pp2 == NULL && pp1 == NULL);+ pp2 = memchr(start_match, first_cu2, searchlength);+ memchr_found_first_cu2 = (pp2 == NULL)? end_subject : pp2; } + else pp2 = (memchr_found_first_cu2 == end_subject)? NULL :+ memchr_found_first_cu2;++ /* Set the start to the end of the subject if neither case was found.+ Otherwise, use the earlier found point. */+ if (pp1 == NULL) start_match = (pp2 == NULL)? end_subject : pp2; else start_match = (pp2 == NULL || pp1 < pp2)? pp1 : pp2;-#endif++#endif /* 8-bit handling */ } - /* The caseful case */+ /* The caseful case is much simpler. */ else {
src/c/pcre2/src/pcre2_tables.c view
@@ -273,6 +273,7 @@ #define STRING_Cs0 STR_C STR_s "\0" #define STRING_Cuneiform0 STR_C STR_u STR_n STR_e STR_i STR_f STR_o STR_r STR_m "\0" #define STRING_Cypriot0 STR_C STR_y STR_p STR_r STR_i STR_o STR_t "\0"+#define STRING_Cypro_Minoan0 STR_C STR_y STR_p STR_r STR_o STR_UNDERSCORE STR_M STR_i STR_n STR_o STR_a STR_n "\0" #define STRING_Cyrillic0 STR_C STR_y STR_r STR_i STR_l STR_l STR_i STR_c "\0" #define STRING_Deseret0 STR_D STR_e STR_s STR_e STR_r STR_e STR_t "\0" #define STRING_Devanagari0 STR_D STR_e STR_v STR_a STR_n STR_a STR_g STR_a STR_r STR_i "\0"@@ -371,6 +372,7 @@ #define STRING_Old_Sogdian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_g STR_d STR_i STR_a STR_n "\0" #define STRING_Old_South_Arabian0 STR_O STR_l STR_d STR_UNDERSCORE STR_S STR_o STR_u STR_t STR_h STR_UNDERSCORE STR_A STR_r STR_a STR_b STR_i STR_a STR_n "\0" #define STRING_Old_Turkic0 STR_O STR_l STR_d STR_UNDERSCORE STR_T STR_u STR_r STR_k STR_i STR_c "\0"+#define STRING_Old_Uyghur0 STR_O STR_l STR_d STR_UNDERSCORE STR_U STR_y STR_g STR_h STR_u STR_r "\0" #define STRING_Oriya0 STR_O STR_r STR_i STR_y STR_a "\0" #define STRING_Osage0 STR_O STR_s STR_a STR_g STR_e "\0" #define STRING_Osmanya0 STR_O STR_s STR_m STR_a STR_n STR_y STR_a "\0"@@ -415,6 +417,7 @@ #define STRING_Tai_Viet0 STR_T STR_a STR_i STR_UNDERSCORE STR_V STR_i STR_e STR_t "\0" #define STRING_Takri0 STR_T STR_a STR_k STR_r STR_i "\0" #define STRING_Tamil0 STR_T STR_a STR_m STR_i STR_l "\0"+#define STRING_Tangsa0 STR_T STR_a STR_n STR_g STR_s STR_a "\0" #define STRING_Tangut0 STR_T STR_a STR_n STR_g STR_u STR_t "\0" #define STRING_Telugu0 STR_T STR_e STR_l STR_u STR_g STR_u "\0" #define STRING_Thaana0 STR_T STR_h STR_a STR_a STR_n STR_a "\0"@@ -422,9 +425,11 @@ #define STRING_Tibetan0 STR_T STR_i STR_b STR_e STR_t STR_a STR_n "\0" #define STRING_Tifinagh0 STR_T STR_i STR_f STR_i STR_n STR_a STR_g STR_h "\0" #define STRING_Tirhuta0 STR_T STR_i STR_r STR_h STR_u STR_t STR_a "\0"+#define STRING_Toto0 STR_T STR_o STR_t STR_o "\0" #define STRING_Ugaritic0 STR_U STR_g STR_a STR_r STR_i STR_t STR_i STR_c "\0" #define STRING_Unknown0 STR_U STR_n STR_k STR_n STR_o STR_w STR_n "\0" #define STRING_Vai0 STR_V STR_a STR_i "\0"+#define STRING_Vithkuqi0 STR_V STR_i STR_t STR_h STR_k STR_u STR_q STR_i "\0" #define STRING_Wancho0 STR_W STR_a STR_n STR_c STR_h STR_o "\0" #define STRING_Warang_Citi0 STR_W STR_a STR_r STR_a STR_n STR_g STR_UNDERSCORE STR_C STR_i STR_t STR_i "\0" #define STRING_Xan0 STR_X STR_a STR_n "\0"@@ -476,6 +481,7 @@ STRING_Cs0 STRING_Cuneiform0 STRING_Cypriot0+ STRING_Cypro_Minoan0 STRING_Cyrillic0 STRING_Deseret0 STRING_Devanagari0@@ -574,6 +580,7 @@ STRING_Old_Sogdian0 STRING_Old_South_Arabian0 STRING_Old_Turkic0+ STRING_Old_Uyghur0 STRING_Oriya0 STRING_Osage0 STRING_Osmanya0@@ -618,6 +625,7 @@ STRING_Tai_Viet0 STRING_Takri0 STRING_Tamil0+ STRING_Tangsa0 STRING_Tangut0 STRING_Telugu0 STRING_Thaana0@@ -625,9 +633,11 @@ STRING_Tibetan0 STRING_Tifinagh0 STRING_Tirhuta0+ STRING_Toto0 STRING_Ugaritic0 STRING_Unknown0 STRING_Vai0+ STRING_Vithkuqi0 STRING_Wancho0 STRING_Warang_Citi0 STRING_Xan0@@ -679,172 +689,177 @@ { 255, PT_PC, ucp_Cs }, { 258, PT_SC, ucp_Cuneiform }, { 268, PT_SC, ucp_Cypriot },- { 276, PT_SC, ucp_Cyrillic },- { 285, PT_SC, ucp_Deseret },- { 293, PT_SC, ucp_Devanagari },- { 304, PT_SC, ucp_Dives_Akuru },- { 316, PT_SC, ucp_Dogra },- { 322, PT_SC, ucp_Duployan },- { 331, PT_SC, ucp_Egyptian_Hieroglyphs },- { 352, PT_SC, ucp_Elbasan },- { 360, PT_SC, ucp_Elymaic },- { 368, PT_SC, ucp_Ethiopic },- { 377, PT_SC, ucp_Georgian },- { 386, PT_SC, ucp_Glagolitic },- { 397, PT_SC, ucp_Gothic },- { 404, PT_SC, ucp_Grantha },- { 412, PT_SC, ucp_Greek },- { 418, PT_SC, ucp_Gujarati },- { 427, PT_SC, ucp_Gunjala_Gondi },- { 441, PT_SC, ucp_Gurmukhi },- { 450, PT_SC, ucp_Han },- { 454, PT_SC, ucp_Hangul },- { 461, PT_SC, ucp_Hanifi_Rohingya },- { 477, PT_SC, ucp_Hanunoo },- { 485, PT_SC, ucp_Hatran },- { 492, PT_SC, ucp_Hebrew },- { 499, PT_SC, ucp_Hiragana },- { 508, PT_SC, ucp_Imperial_Aramaic },- { 525, PT_SC, ucp_Inherited },- { 535, PT_SC, ucp_Inscriptional_Pahlavi },- { 557, PT_SC, ucp_Inscriptional_Parthian },- { 580, PT_SC, ucp_Javanese },- { 589, PT_SC, ucp_Kaithi },- { 596, PT_SC, ucp_Kannada },- { 604, PT_SC, ucp_Katakana },- { 613, PT_SC, ucp_Kayah_Li },- { 622, PT_SC, ucp_Kharoshthi },- { 633, PT_SC, ucp_Khitan_Small_Script },- { 653, PT_SC, ucp_Khmer },- { 659, PT_SC, ucp_Khojki },- { 666, PT_SC, ucp_Khudawadi },- { 676, PT_GC, ucp_L },- { 678, PT_LAMP, 0 },- { 681, PT_SC, ucp_Lao },- { 685, PT_SC, ucp_Latin },- { 691, PT_SC, ucp_Lepcha },- { 698, PT_SC, ucp_Limbu },- { 704, PT_SC, ucp_Linear_A },- { 713, PT_SC, ucp_Linear_B },- { 722, PT_SC, ucp_Lisu },- { 727, PT_PC, ucp_Ll },- { 730, PT_PC, ucp_Lm },- { 733, PT_PC, ucp_Lo },- { 736, PT_PC, ucp_Lt },- { 739, PT_PC, ucp_Lu },- { 742, PT_SC, ucp_Lycian },- { 749, PT_SC, ucp_Lydian },- { 756, PT_GC, ucp_M },- { 758, PT_SC, ucp_Mahajani },- { 767, PT_SC, ucp_Makasar },- { 775, PT_SC, ucp_Malayalam },- { 785, PT_SC, ucp_Mandaic },- { 793, PT_SC, ucp_Manichaean },- { 804, PT_SC, ucp_Marchen },- { 812, PT_SC, ucp_Masaram_Gondi },- { 826, PT_PC, ucp_Mc },- { 829, PT_PC, ucp_Me },- { 832, PT_SC, ucp_Medefaidrin },- { 844, PT_SC, ucp_Meetei_Mayek },- { 857, PT_SC, ucp_Mende_Kikakui },- { 871, PT_SC, ucp_Meroitic_Cursive },- { 888, PT_SC, ucp_Meroitic_Hieroglyphs },- { 909, PT_SC, ucp_Miao },- { 914, PT_PC, ucp_Mn },- { 917, PT_SC, ucp_Modi },- { 922, PT_SC, ucp_Mongolian },- { 932, PT_SC, ucp_Mro },- { 936, PT_SC, ucp_Multani },- { 944, PT_SC, ucp_Myanmar },- { 952, PT_GC, ucp_N },- { 954, PT_SC, ucp_Nabataean },- { 964, PT_SC, ucp_Nandinagari },- { 976, PT_PC, ucp_Nd },- { 979, PT_SC, ucp_New_Tai_Lue },- { 991, PT_SC, ucp_Newa },- { 996, PT_SC, ucp_Nko },- { 1000, PT_PC, ucp_Nl },- { 1003, PT_PC, ucp_No },- { 1006, PT_SC, ucp_Nushu },- { 1012, PT_SC, ucp_Nyiakeng_Puachue_Hmong },- { 1035, PT_SC, ucp_Ogham },- { 1041, PT_SC, ucp_Ol_Chiki },- { 1050, PT_SC, ucp_Old_Hungarian },- { 1064, PT_SC, ucp_Old_Italic },- { 1075, PT_SC, ucp_Old_North_Arabian },- { 1093, PT_SC, ucp_Old_Permic },- { 1104, PT_SC, ucp_Old_Persian },- { 1116, PT_SC, ucp_Old_Sogdian },- { 1128, PT_SC, ucp_Old_South_Arabian },- { 1146, PT_SC, ucp_Old_Turkic },- { 1157, PT_SC, ucp_Oriya },- { 1163, PT_SC, ucp_Osage },- { 1169, PT_SC, ucp_Osmanya },- { 1177, PT_GC, ucp_P },- { 1179, PT_SC, ucp_Pahawh_Hmong },- { 1192, PT_SC, ucp_Palmyrene },- { 1202, PT_SC, ucp_Pau_Cin_Hau },- { 1214, PT_PC, ucp_Pc },- { 1217, PT_PC, ucp_Pd },- { 1220, PT_PC, ucp_Pe },- { 1223, PT_PC, ucp_Pf },- { 1226, PT_SC, ucp_Phags_Pa },- { 1235, PT_SC, ucp_Phoenician },- { 1246, PT_PC, ucp_Pi },- { 1249, PT_PC, ucp_Po },- { 1252, PT_PC, ucp_Ps },- { 1255, PT_SC, ucp_Psalter_Pahlavi },- { 1271, PT_SC, ucp_Rejang },- { 1278, PT_SC, ucp_Runic },- { 1284, PT_GC, ucp_S },- { 1286, PT_SC, ucp_Samaritan },- { 1296, PT_SC, ucp_Saurashtra },- { 1307, PT_PC, ucp_Sc },- { 1310, PT_SC, ucp_Sharada },- { 1318, PT_SC, ucp_Shavian },- { 1326, PT_SC, ucp_Siddham },- { 1334, PT_SC, ucp_SignWriting },- { 1346, PT_SC, ucp_Sinhala },- { 1354, PT_PC, ucp_Sk },- { 1357, PT_PC, ucp_Sm },- { 1360, PT_PC, ucp_So },- { 1363, PT_SC, ucp_Sogdian },- { 1371, PT_SC, ucp_Sora_Sompeng },- { 1384, PT_SC, ucp_Soyombo },- { 1392, PT_SC, ucp_Sundanese },- { 1402, PT_SC, ucp_Syloti_Nagri },- { 1415, PT_SC, ucp_Syriac },- { 1422, PT_SC, ucp_Tagalog },- { 1430, PT_SC, ucp_Tagbanwa },- { 1439, PT_SC, ucp_Tai_Le },- { 1446, PT_SC, ucp_Tai_Tham },- { 1455, PT_SC, ucp_Tai_Viet },- { 1464, PT_SC, ucp_Takri },- { 1470, PT_SC, ucp_Tamil },- { 1476, PT_SC, ucp_Tangut },- { 1483, PT_SC, ucp_Telugu },- { 1490, PT_SC, ucp_Thaana },- { 1497, PT_SC, ucp_Thai },- { 1502, PT_SC, ucp_Tibetan },- { 1510, PT_SC, ucp_Tifinagh },- { 1519, PT_SC, ucp_Tirhuta },- { 1527, PT_SC, ucp_Ugaritic },- { 1536, PT_SC, ucp_Unknown },- { 1544, PT_SC, ucp_Vai },- { 1548, PT_SC, ucp_Wancho },- { 1555, PT_SC, ucp_Warang_Citi },- { 1567, PT_ALNUM, 0 },- { 1571, PT_PXSPACE, 0 },- { 1575, PT_SPACE, 0 },- { 1579, PT_UCNC, 0 },- { 1583, PT_WORD, 0 },- { 1587, PT_SC, ucp_Yezidi },- { 1594, PT_SC, ucp_Yi },- { 1597, PT_GC, ucp_Z },- { 1599, PT_SC, ucp_Zanabazar_Square },- { 1616, PT_PC, ucp_Zl },- { 1619, PT_PC, ucp_Zp },- { 1622, PT_PC, ucp_Zs }+ { 276, PT_SC, ucp_Cypro_Minoan },+ { 289, PT_SC, ucp_Cyrillic },+ { 298, PT_SC, ucp_Deseret },+ { 306, PT_SC, ucp_Devanagari },+ { 317, PT_SC, ucp_Dives_Akuru },+ { 329, PT_SC, ucp_Dogra },+ { 335, PT_SC, ucp_Duployan },+ { 344, PT_SC, ucp_Egyptian_Hieroglyphs },+ { 365, PT_SC, ucp_Elbasan },+ { 373, PT_SC, ucp_Elymaic },+ { 381, PT_SC, ucp_Ethiopic },+ { 390, PT_SC, ucp_Georgian },+ { 399, PT_SC, ucp_Glagolitic },+ { 410, PT_SC, ucp_Gothic },+ { 417, PT_SC, ucp_Grantha },+ { 425, PT_SC, ucp_Greek },+ { 431, PT_SC, ucp_Gujarati },+ { 440, PT_SC, ucp_Gunjala_Gondi },+ { 454, PT_SC, ucp_Gurmukhi },+ { 463, PT_SC, ucp_Han },+ { 467, PT_SC, ucp_Hangul },+ { 474, PT_SC, ucp_Hanifi_Rohingya },+ { 490, PT_SC, ucp_Hanunoo },+ { 498, PT_SC, ucp_Hatran },+ { 505, PT_SC, ucp_Hebrew },+ { 512, PT_SC, ucp_Hiragana },+ { 521, PT_SC, ucp_Imperial_Aramaic },+ { 538, PT_SC, ucp_Inherited },+ { 548, PT_SC, ucp_Inscriptional_Pahlavi },+ { 570, PT_SC, ucp_Inscriptional_Parthian },+ { 593, PT_SC, ucp_Javanese },+ { 602, PT_SC, ucp_Kaithi },+ { 609, PT_SC, ucp_Kannada },+ { 617, PT_SC, ucp_Katakana },+ { 626, PT_SC, ucp_Kayah_Li },+ { 635, PT_SC, ucp_Kharoshthi },+ { 646, PT_SC, ucp_Khitan_Small_Script },+ { 666, PT_SC, ucp_Khmer },+ { 672, PT_SC, ucp_Khojki },+ { 679, PT_SC, ucp_Khudawadi },+ { 689, PT_GC, ucp_L },+ { 691, PT_LAMP, 0 },+ { 694, PT_SC, ucp_Lao },+ { 698, PT_SC, ucp_Latin },+ { 704, PT_SC, ucp_Lepcha },+ { 711, PT_SC, ucp_Limbu },+ { 717, PT_SC, ucp_Linear_A },+ { 726, PT_SC, ucp_Linear_B },+ { 735, PT_SC, ucp_Lisu },+ { 740, PT_PC, ucp_Ll },+ { 743, PT_PC, ucp_Lm },+ { 746, PT_PC, ucp_Lo },+ { 749, PT_PC, ucp_Lt },+ { 752, PT_PC, ucp_Lu },+ { 755, PT_SC, ucp_Lycian },+ { 762, PT_SC, ucp_Lydian },+ { 769, PT_GC, ucp_M },+ { 771, PT_SC, ucp_Mahajani },+ { 780, PT_SC, ucp_Makasar },+ { 788, PT_SC, ucp_Malayalam },+ { 798, PT_SC, ucp_Mandaic },+ { 806, PT_SC, ucp_Manichaean },+ { 817, PT_SC, ucp_Marchen },+ { 825, PT_SC, ucp_Masaram_Gondi },+ { 839, PT_PC, ucp_Mc },+ { 842, PT_PC, ucp_Me },+ { 845, PT_SC, ucp_Medefaidrin },+ { 857, PT_SC, ucp_Meetei_Mayek },+ { 870, PT_SC, ucp_Mende_Kikakui },+ { 884, PT_SC, ucp_Meroitic_Cursive },+ { 901, PT_SC, ucp_Meroitic_Hieroglyphs },+ { 922, PT_SC, ucp_Miao },+ { 927, PT_PC, ucp_Mn },+ { 930, PT_SC, ucp_Modi },+ { 935, PT_SC, ucp_Mongolian },+ { 945, PT_SC, ucp_Mro },+ { 949, PT_SC, ucp_Multani },+ { 957, PT_SC, ucp_Myanmar },+ { 965, PT_GC, ucp_N },+ { 967, PT_SC, ucp_Nabataean },+ { 977, PT_SC, ucp_Nandinagari },+ { 989, PT_PC, ucp_Nd },+ { 992, PT_SC, ucp_New_Tai_Lue },+ { 1004, PT_SC, ucp_Newa },+ { 1009, PT_SC, ucp_Nko },+ { 1013, PT_PC, ucp_Nl },+ { 1016, PT_PC, ucp_No },+ { 1019, PT_SC, ucp_Nushu },+ { 1025, PT_SC, ucp_Nyiakeng_Puachue_Hmong },+ { 1048, PT_SC, ucp_Ogham },+ { 1054, PT_SC, ucp_Ol_Chiki },+ { 1063, PT_SC, ucp_Old_Hungarian },+ { 1077, PT_SC, ucp_Old_Italic },+ { 1088, PT_SC, ucp_Old_North_Arabian },+ { 1106, PT_SC, ucp_Old_Permic },+ { 1117, PT_SC, ucp_Old_Persian },+ { 1129, PT_SC, ucp_Old_Sogdian },+ { 1141, PT_SC, ucp_Old_South_Arabian },+ { 1159, PT_SC, ucp_Old_Turkic },+ { 1170, PT_SC, ucp_Old_Uyghur },+ { 1181, PT_SC, ucp_Oriya },+ { 1187, PT_SC, ucp_Osage },+ { 1193, PT_SC, ucp_Osmanya },+ { 1201, PT_GC, ucp_P },+ { 1203, PT_SC, ucp_Pahawh_Hmong },+ { 1216, PT_SC, ucp_Palmyrene },+ { 1226, PT_SC, ucp_Pau_Cin_Hau },+ { 1238, PT_PC, ucp_Pc },+ { 1241, PT_PC, ucp_Pd },+ { 1244, PT_PC, ucp_Pe },+ { 1247, PT_PC, ucp_Pf },+ { 1250, PT_SC, ucp_Phags_Pa },+ { 1259, PT_SC, ucp_Phoenician },+ { 1270, PT_PC, ucp_Pi },+ { 1273, PT_PC, ucp_Po },+ { 1276, PT_PC, ucp_Ps },+ { 1279, PT_SC, ucp_Psalter_Pahlavi },+ { 1295, PT_SC, ucp_Rejang },+ { 1302, PT_SC, ucp_Runic },+ { 1308, PT_GC, ucp_S },+ { 1310, PT_SC, ucp_Samaritan },+ { 1320, PT_SC, ucp_Saurashtra },+ { 1331, PT_PC, ucp_Sc },+ { 1334, PT_SC, ucp_Sharada },+ { 1342, PT_SC, ucp_Shavian },+ { 1350, PT_SC, ucp_Siddham },+ { 1358, PT_SC, ucp_SignWriting },+ { 1370, PT_SC, ucp_Sinhala },+ { 1378, PT_PC, ucp_Sk },+ { 1381, PT_PC, ucp_Sm },+ { 1384, PT_PC, ucp_So },+ { 1387, PT_SC, ucp_Sogdian },+ { 1395, PT_SC, ucp_Sora_Sompeng },+ { 1408, PT_SC, ucp_Soyombo },+ { 1416, PT_SC, ucp_Sundanese },+ { 1426, PT_SC, ucp_Syloti_Nagri },+ { 1439, PT_SC, ucp_Syriac },+ { 1446, PT_SC, ucp_Tagalog },+ { 1454, PT_SC, ucp_Tagbanwa },+ { 1463, PT_SC, ucp_Tai_Le },+ { 1470, PT_SC, ucp_Tai_Tham },+ { 1479, PT_SC, ucp_Tai_Viet },+ { 1488, PT_SC, ucp_Takri },+ { 1494, PT_SC, ucp_Tamil },+ { 1500, PT_SC, ucp_Tangsa },+ { 1507, PT_SC, ucp_Tangut },+ { 1514, PT_SC, ucp_Telugu },+ { 1521, PT_SC, ucp_Thaana },+ { 1528, PT_SC, ucp_Thai },+ { 1533, PT_SC, ucp_Tibetan },+ { 1541, PT_SC, ucp_Tifinagh },+ { 1550, PT_SC, ucp_Tirhuta },+ { 1558, PT_SC, ucp_Toto },+ { 1563, PT_SC, ucp_Ugaritic },+ { 1572, PT_SC, ucp_Unknown },+ { 1580, PT_SC, ucp_Vai },+ { 1584, PT_SC, ucp_Vithkuqi },+ { 1593, PT_SC, ucp_Wancho },+ { 1600, PT_SC, ucp_Warang_Citi },+ { 1612, PT_ALNUM, 0 },+ { 1616, PT_PXSPACE, 0 },+ { 1620, PT_SPACE, 0 },+ { 1624, PT_UCNC, 0 },+ { 1628, PT_WORD, 0 },+ { 1632, PT_SC, ucp_Yezidi },+ { 1639, PT_SC, ucp_Yi },+ { 1642, PT_GC, ucp_Z },+ { 1644, PT_SC, ucp_Zanabazar_Square },+ { 1661, PT_PC, ucp_Zl },+ { 1664, PT_PC, ucp_Zp },+ { 1667, PT_PC, ucp_Zs } }; const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
src/c/pcre2/src/pcre2_ucd.c view
@@ -20,4513 +20,4599 @@ /* Unicode character database. */ /* This file was autogenerated by the MultiStage2.py script. */-/* Total size: 101044 bytes, block size: 128. */--/* The tables herein are needed only when UCP support is built,-and in PCRE2 that happens automatically with UTF support.-This module should not be referenced otherwise, so-it should not matter whether it is compiled or not. However-a comment was received about space saving - maybe the guy linked-all the modules rather than using a library - so we include a-condition to cut out the tables when not needed. But don't leave-a totally empty module because some compilers barf at that.-Instead, just supply some small dummy tables. */--#ifndef SUPPORT_UNICODE-const ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0,0,0 }};-const uint16_t PRIV(ucd_stage1)[] = {0};-const uint16_t PRIV(ucd_stage2)[] = {0};-const uint32_t PRIV(ucd_caseless_sets)[] = {0};-#else--const char *PRIV(unicode_version) = "13.0.0";--/* If the 32-bit library is run in non-32-bit mode, character values-greater than 0x10ffff may be encountered. For these we set up a-special record. */--#if PCRE2_CODE_UNIT_WIDTH == 32-const ucd_record PRIV(dummy_ucd_record)[] = {{- ucp_Unknown, /* script */- ucp_Cn, /* type unassigned */- ucp_gbOther, /* grapheme break property */- 0, /* case set */- 0, /* other case */- ucp_Unknown, /* script extension */- 0, /* dummy filler */- }};-#endif--/* When recompiling tables with a new Unicode version, please check the-types in this structure definition from pcre2_internal.h (the actual-field names will be different):--typedef struct {-uint8_t property_0;-uint8_t property_1;-uint8_t property_2;-uint8_t property_3;-pcre_int32 property_4;-pcre_int16 property_5;-uint16_t property_6;-} ucd_record;-*/--/* This table contains lists of characters that are caseless sets of-more than one character. Each list is terminated by NOTACHAR. */--const uint32_t PRIV(ucd_caseless_sets)[] = {- NOTACHAR,- 0x0053, 0x0073, 0x017f, NOTACHAR,- 0x01c4, 0x01c5, 0x01c6, NOTACHAR,- 0x01c7, 0x01c8, 0x01c9, NOTACHAR,- 0x01ca, 0x01cb, 0x01cc, NOTACHAR,- 0x01f1, 0x01f2, 0x01f3, NOTACHAR,- 0x0345, 0x0399, 0x03b9, 0x1fbe, NOTACHAR,- 0x00b5, 0x039c, 0x03bc, NOTACHAR,- 0x03a3, 0x03c2, 0x03c3, NOTACHAR,- 0x0392, 0x03b2, 0x03d0, NOTACHAR,- 0x0398, 0x03b8, 0x03d1, 0x03f4, NOTACHAR,- 0x03a6, 0x03c6, 0x03d5, NOTACHAR,- 0x03a0, 0x03c0, 0x03d6, NOTACHAR,- 0x039a, 0x03ba, 0x03f0, NOTACHAR,- 0x03a1, 0x03c1, 0x03f1, NOTACHAR,- 0x0395, 0x03b5, 0x03f5, NOTACHAR,- 0x0412, 0x0432, 0x1c80, NOTACHAR,- 0x0414, 0x0434, 0x1c81, NOTACHAR,- 0x041e, 0x043e, 0x1c82, NOTACHAR,- 0x0421, 0x0441, 0x1c83, NOTACHAR,- 0x0422, 0x0442, 0x1c84, 0x1c85, NOTACHAR,- 0x042a, 0x044a, 0x1c86, NOTACHAR,- 0x0462, 0x0463, 0x1c87, NOTACHAR,- 0x1e60, 0x1e61, 0x1e9b, NOTACHAR,- 0x03a9, 0x03c9, 0x2126, NOTACHAR,- 0x004b, 0x006b, 0x212a, NOTACHAR,- 0x00c5, 0x00e5, 0x212b, NOTACHAR,- 0x1c88, 0xa64a, 0xa64b, NOTACHAR,-};--/* When #included in pcre2test, we don't need the table of digit-sets, nor the the large main UCD tables. */--#ifndef PCRE2_PCRE2TEST--/* This table lists the code points for the '9' characters in each-set of decimal digits. It is used to ensure that all the digits in-a script run come from the same set. */--const uint32_t PRIV(ucd_digit_sets)[] = {- 65, /* Number of subsequent values */- 0x00039, 0x00669, 0x006f9, 0x007c9, 0x0096f, 0x009ef, 0x00a6f, 0x00aef,- 0x00b6f, 0x00bef, 0x00c6f, 0x00cef, 0x00d6f, 0x00def, 0x00e59, 0x00ed9,- 0x00f29, 0x01049, 0x01099, 0x017e9, 0x01819, 0x0194f, 0x019d9, 0x01a89,- 0x01a99, 0x01b59, 0x01bb9, 0x01c49, 0x01c59, 0x0a629, 0x0a8d9, 0x0a909,- 0x0a9d9, 0x0a9f9, 0x0aa59, 0x0abf9, 0x0ff19, 0x104a9, 0x10d39, 0x1106f,- 0x110f9, 0x1113f, 0x111d9, 0x112f9, 0x11459, 0x114d9, 0x11659, 0x116c9,- 0x11739, 0x118e9, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59,- 0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9, 0x1e959,- 0x1fbf9,-};--/* This vector is a list of lists of scripts for the Script Extension-property. Each sublist is zero-terminated. */--const uint8_t PRIV(ucd_script_sets)[] = {- /* 0 */ 0,- /* 1 */ 1, 11, 0,- /* 4 */ 1, 144, 0,- /* 7 */ 1, 50, 0,- /* 10 */ 1, 56, 0,- /* 13 */ 3, 15, 0,- /* 16 */ 4, 23, 0,- /* 19 */ 6, 84, 0,- /* 22 */ 12, 36, 0,- /* 25 */ 13, 18, 0,- /* 28 */ 13, 34, 0,- /* 31 */ 13, 118, 0,- /* 34 */ 13, 50, 0,- /* 37 */ 15, 107, 0,- /* 40 */ 15, 150, 0,- /* 43 */ 15, 100, 0,- /* 46 */ 15, 54, 0,- /* 49 */ 17, 34, 0,- /* 52 */ 107, 54, 0,- /* 55 */ 21, 108, 0,- /* 58 */ 22, 129, 0,- /* 61 */ 23, 34, 0,- /* 64 */ 27, 30, 0,- /* 67 */ 29, 150, 0,- /* 70 */ 34, 38, 0,- /* 73 */ 38, 65, 0,- /* 76 */ 1, 50, 56, 0,- /* 80 */ 1, 56, 156, 0,- /* 84 */ 3, 96, 49, 0,- /* 88 */ 96, 39, 53, 0,- /* 92 */ 12, 110, 36, 0,- /* 96 */ 15, 107, 29, 0,- /* 100 */ 15, 107, 34, 0,- /* 104 */ 23, 27, 30, 0,- /* 108 */ 69, 34, 39, 0,- /* 112 */ 3, 15, 107, 29, 0,- /* 117 */ 7, 25, 52, 51, 0,- /* 122 */ 15, 142, 85, 111, 0,- /* 127 */ 1, 144, 50, 56, 156, 0,- /* 133 */ 4, 24, 23, 27, 30, 0,- /* 139 */ 4, 24, 23, 27, 30, 61, 0,- /* 146 */ 15, 29, 37, 44, 54, 55, 0,- /* 153 */ 132, 1, 95, 112, 121, 144, 148, 50, 0,- /* 162 */ 3, 15, 107, 29, 150, 44, 55, 124, 0,- /* 171 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0,- /* 183 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0,- /* 196 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0,- /* 210 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 150, 109, 102, 124, 0,- /* 224 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 150, 109, 102, 124, 0,- /* 239 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0,- /* 260 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 35, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0,- /* 282 */-};--/* These are the main two-stage UCD tables. The fields in each record are:-script (8 bits), character type (8 bits), grapheme break property (8 bits),-offset to multichar other cases or zero (8 bits), offset to other case-or zero (32 bits, signed), script extension (16 bits, signed), and a dummy-16-bit field to make the whole thing a multiple of 4 bytes. */--const ucd_record PRIV(ucd_records)[] = { /* 11700 bytes, record size 12 */- { 10, 0, 2, 0, 0, 10, 256, }, /* 0 */- { 10, 0, 2, 0, 0, 10, 0, }, /* 1 */- { 10, 0, 1, 0, 0, 10, 0, }, /* 2 */- { 10, 0, 0, 0, 0, 10, 0, }, /* 3 */- { 10, 29, 12, 0, 0, 10, 0, }, /* 4 */- { 10, 21, 12, 0, 0, 10, 0, }, /* 5 */- { 10, 23, 12, 0, 0, 10, 0, }, /* 6 */- { 10, 22, 12, 0, 0, 10, 0, }, /* 7 */- { 10, 18, 12, 0, 0, 10, 0, }, /* 8 */- { 10, 25, 12, 0, 0, 10, 0, }, /* 9 */- { 10, 17, 12, 0, 0, 10, 0, }, /* 10 */- { 10, 13, 12, 0, 0, 10, 0, }, /* 11 */- { 34, 9, 12, 0, 32, 34, 0, }, /* 12 */- { 34, 9, 12, 100, 32, 34, 0, }, /* 13 */- { 34, 9, 12, 1, 32, 34, 0, }, /* 14 */- { 10, 24, 12, 0, 0, 10, 0, }, /* 15 */- { 10, 16, 12, 0, 0, 10, 0, }, /* 16 */- { 34, 5, 12, 0, -32, 34, 0, }, /* 17 */- { 34, 5, 12, 100, -32, 34, 0, }, /* 18 */- { 34, 5, 12, 1, -32, 34, 0, }, /* 19 */- { 10, 26, 12, 0, 0, 10, 0, }, /* 20 */- { 10, 26, 14, 0, 0, 10, 0, }, /* 21 */- { 34, 7, 12, 0, 0, 34, 0, }, /* 22 */- { 10, 20, 12, 0, 0, 10, 0, }, /* 23 */- { 10, 1, 2, 0, 0, 10, 0, }, /* 24 */- { 10, 15, 12, 0, 0, 10, 0, }, /* 25 */- { 10, 5, 12, 26, 775, 10, 0, }, /* 26 */- { 10, 19, 12, 0, 0, 10, 0, }, /* 27 */- { 34, 9, 12, 104, 32, 34, 0, }, /* 28 */- { 34, 5, 12, 0, 7615, 34, 0, }, /* 29 */- { 34, 5, 12, 104, -32, 34, 0, }, /* 30 */- { 34, 5, 12, 0, 121, 34, 0, }, /* 31 */- { 34, 9, 12, 0, 1, 34, 0, }, /* 32 */- { 34, 5, 12, 0, -1, 34, 0, }, /* 33 */- { 34, 9, 12, 0, 0, 34, 0, }, /* 34 */- { 34, 5, 12, 0, 0, 34, 0, }, /* 35 */- { 34, 9, 12, 0, -121, 34, 0, }, /* 36 */- { 34, 5, 12, 1, -268, 34, 0, }, /* 37 */- { 34, 5, 12, 0, 195, 34, 0, }, /* 38 */- { 34, 9, 12, 0, 210, 34, 0, }, /* 39 */- { 34, 9, 12, 0, 206, 34, 0, }, /* 40 */- { 34, 9, 12, 0, 205, 34, 0, }, /* 41 */- { 34, 9, 12, 0, 79, 34, 0, }, /* 42 */- { 34, 9, 12, 0, 202, 34, 0, }, /* 43 */- { 34, 9, 12, 0, 203, 34, 0, }, /* 44 */- { 34, 9, 12, 0, 207, 34, 0, }, /* 45 */- { 34, 5, 12, 0, 97, 34, 0, }, /* 46 */- { 34, 9, 12, 0, 211, 34, 0, }, /* 47 */- { 34, 9, 12, 0, 209, 34, 0, }, /* 48 */- { 34, 5, 12, 0, 163, 34, 0, }, /* 49 */- { 34, 9, 12, 0, 213, 34, 0, }, /* 50 */- { 34, 5, 12, 0, 130, 34, 0, }, /* 51 */- { 34, 9, 12, 0, 214, 34, 0, }, /* 52 */- { 34, 9, 12, 0, 218, 34, 0, }, /* 53 */- { 34, 9, 12, 0, 217, 34, 0, }, /* 54 */- { 34, 9, 12, 0, 219, 34, 0, }, /* 55 */- { 34, 5, 12, 0, 56, 34, 0, }, /* 56 */- { 34, 9, 12, 5, 2, 34, 0, }, /* 57 */- { 34, 8, 12, 5, 1, 34, 0, }, /* 58 */- { 34, 5, 12, 5, -2, 34, 0, }, /* 59 */- { 34, 9, 12, 9, 2, 34, 0, }, /* 60 */- { 34, 8, 12, 9, 1, 34, 0, }, /* 61 */- { 34, 5, 12, 9, -2, 34, 0, }, /* 62 */- { 34, 9, 12, 13, 2, 34, 0, }, /* 63 */- { 34, 8, 12, 13, 1, 34, 0, }, /* 64 */- { 34, 5, 12, 13, -2, 34, 0, }, /* 65 */- { 34, 5, 12, 0, -79, 34, 0, }, /* 66 */- { 34, 9, 12, 17, 2, 34, 0, }, /* 67 */- { 34, 8, 12, 17, 1, 34, 0, }, /* 68 */- { 34, 5, 12, 17, -2, 34, 0, }, /* 69 */- { 34, 9, 12, 0, -97, 34, 0, }, /* 70 */- { 34, 9, 12, 0, -56, 34, 0, }, /* 71 */- { 34, 9, 12, 0, -130, 34, 0, }, /* 72 */- { 34, 9, 12, 0, 10795, 34, 0, }, /* 73 */- { 34, 9, 12, 0, -163, 34, 0, }, /* 74 */- { 34, 9, 12, 0, 10792, 34, 0, }, /* 75 */- { 34, 5, 12, 0, 10815, 34, 0, }, /* 76 */- { 34, 9, 12, 0, -195, 34, 0, }, /* 77 */- { 34, 9, 12, 0, 69, 34, 0, }, /* 78 */- { 34, 9, 12, 0, 71, 34, 0, }, /* 79 */- { 34, 5, 12, 0, 10783, 34, 0, }, /* 80 */- { 34, 5, 12, 0, 10780, 34, 0, }, /* 81 */- { 34, 5, 12, 0, 10782, 34, 0, }, /* 82 */- { 34, 5, 12, 0, -210, 34, 0, }, /* 83 */- { 34, 5, 12, 0, -206, 34, 0, }, /* 84 */- { 34, 5, 12, 0, -205, 34, 0, }, /* 85 */- { 34, 5, 12, 0, -202, 34, 0, }, /* 86 */- { 34, 5, 12, 0, -203, 34, 0, }, /* 87 */- { 34, 5, 12, 0, 42319, 34, 0, }, /* 88 */- { 34, 5, 12, 0, 42315, 34, 0, }, /* 89 */- { 34, 5, 12, 0, -207, 34, 0, }, /* 90 */- { 34, 5, 12, 0, 42280, 34, 0, }, /* 91 */- { 34, 5, 12, 0, 42308, 34, 0, }, /* 92 */- { 34, 5, 12, 0, -209, 34, 0, }, /* 93 */- { 34, 5, 12, 0, -211, 34, 0, }, /* 94 */- { 34, 5, 12, 0, 10743, 34, 0, }, /* 95 */- { 34, 5, 12, 0, 42305, 34, 0, }, /* 96 */- { 34, 5, 12, 0, 10749, 34, 0, }, /* 97 */- { 34, 5, 12, 0, -213, 34, 0, }, /* 98 */- { 34, 5, 12, 0, -214, 34, 0, }, /* 99 */- { 34, 5, 12, 0, 10727, 34, 0, }, /* 100 */- { 34, 5, 12, 0, -218, 34, 0, }, /* 101 */- { 34, 5, 12, 0, 42307, 34, 0, }, /* 102 */- { 34, 5, 12, 0, 42282, 34, 0, }, /* 103 */- { 34, 5, 12, 0, -69, 34, 0, }, /* 104 */- { 34, 5, 12, 0, -217, 34, 0, }, /* 105 */- { 34, 5, 12, 0, -71, 34, 0, }, /* 106 */- { 34, 5, 12, 0, -219, 34, 0, }, /* 107 */- { 34, 5, 12, 0, 42261, 34, 0, }, /* 108 */- { 34, 5, 12, 0, 42258, 34, 0, }, /* 109 */- { 34, 6, 12, 0, 0, 34, 0, }, /* 110 */- { 10, 6, 12, 0, 0, 10, 0, }, /* 111 */- { 4, 24, 12, 0, 0, 4, 0, }, /* 112 */- { 28, 12, 3, 0, 0, 28, 0, }, /* 113 */- { 28, 12, 3, 0, 0, 20, 0, }, /* 114 */- { 28, 12, 3, 21, 116, 20, 0, }, /* 115 */- { 28, 12, 3, 0, 0, 34, 0, }, /* 116 */- { 20, 9, 12, 0, 1, 20, 0, }, /* 117 */- { 20, 5, 12, 0, -1, 20, 0, }, /* 118 */- { 20, 24, 12, 0, 0, 20, 0, }, /* 119 */- { 0, 2, 12, 0, 0, 0, 0, }, /* 120 */- { 20, 6, 12, 0, 0, 20, 0, }, /* 121 */- { 20, 5, 12, 0, 130, 20, 0, }, /* 122 */- { 20, 9, 12, 0, 116, 20, 0, }, /* 123 */- { 20, 9, 12, 0, 38, 20, 0, }, /* 124 */- { 20, 9, 12, 0, 37, 20, 0, }, /* 125 */- { 20, 9, 12, 0, 64, 20, 0, }, /* 126 */- { 20, 9, 12, 0, 63, 20, 0, }, /* 127 */- { 20, 5, 12, 0, 0, 20, 0, }, /* 128 */- { 20, 9, 12, 0, 32, 20, 0, }, /* 129 */- { 20, 9, 12, 34, 32, 20, 0, }, /* 130 */- { 20, 9, 12, 59, 32, 20, 0, }, /* 131 */- { 20, 9, 12, 38, 32, 20, 0, }, /* 132 */- { 20, 9, 12, 21, 32, 20, 0, }, /* 133 */- { 20, 9, 12, 51, 32, 20, 0, }, /* 134 */- { 20, 9, 12, 26, 32, 20, 0, }, /* 135 */- { 20, 9, 12, 47, 32, 20, 0, }, /* 136 */- { 20, 9, 12, 55, 32, 20, 0, }, /* 137 */- { 20, 9, 12, 30, 32, 20, 0, }, /* 138 */- { 20, 9, 12, 43, 32, 20, 0, }, /* 139 */- { 20, 9, 12, 96, 32, 20, 0, }, /* 140 */- { 20, 5, 12, 0, -38, 20, 0, }, /* 141 */- { 20, 5, 12, 0, -37, 20, 0, }, /* 142 */- { 20, 5, 12, 0, -32, 20, 0, }, /* 143 */- { 20, 5, 12, 34, -32, 20, 0, }, /* 144 */- { 20, 5, 12, 59, -32, 20, 0, }, /* 145 */- { 20, 5, 12, 38, -32, 20, 0, }, /* 146 */- { 20, 5, 12, 21, -116, 20, 0, }, /* 147 */- { 20, 5, 12, 51, -32, 20, 0, }, /* 148 */- { 20, 5, 12, 26, -775, 20, 0, }, /* 149 */- { 20, 5, 12, 47, -32, 20, 0, }, /* 150 */- { 20, 5, 12, 55, -32, 20, 0, }, /* 151 */- { 20, 5, 12, 30, 1, 20, 0, }, /* 152 */- { 20, 5, 12, 30, -32, 20, 0, }, /* 153 */- { 20, 5, 12, 43, -32, 20, 0, }, /* 154 */- { 20, 5, 12, 96, -32, 20, 0, }, /* 155 */- { 20, 5, 12, 0, -64, 20, 0, }, /* 156 */- { 20, 5, 12, 0, -63, 20, 0, }, /* 157 */- { 20, 9, 12, 0, 8, 20, 0, }, /* 158 */- { 20, 5, 12, 34, -30, 20, 0, }, /* 159 */- { 20, 5, 12, 38, -25, 20, 0, }, /* 160 */- { 20, 9, 12, 0, 0, 20, 0, }, /* 161 */- { 20, 5, 12, 43, -15, 20, 0, }, /* 162 */- { 20, 5, 12, 47, -22, 20, 0, }, /* 163 */- { 20, 5, 12, 0, -8, 20, 0, }, /* 164 */- { 11, 9, 12, 0, 1, 11, 0, }, /* 165 */- { 11, 5, 12, 0, -1, 11, 0, }, /* 166 */- { 20, 5, 12, 51, -54, 20, 0, }, /* 167 */- { 20, 5, 12, 55, -48, 20, 0, }, /* 168 */- { 20, 5, 12, 0, 7, 20, 0, }, /* 169 */- { 20, 5, 12, 0, -116, 20, 0, }, /* 170 */- { 20, 9, 12, 38, -60, 20, 0, }, /* 171 */- { 20, 5, 12, 59, -64, 20, 0, }, /* 172 */- { 20, 25, 12, 0, 0, 20, 0, }, /* 173 */- { 20, 9, 12, 0, -7, 20, 0, }, /* 174 */- { 20, 9, 12, 0, -130, 20, 0, }, /* 175 */- { 13, 9, 12, 0, 80, 13, 0, }, /* 176 */- { 13, 9, 12, 0, 32, 13, 0, }, /* 177 */- { 13, 9, 12, 63, 32, 13, 0, }, /* 178 */- { 13, 9, 12, 67, 32, 13, 0, }, /* 179 */- { 13, 9, 12, 71, 32, 13, 0, }, /* 180 */- { 13, 9, 12, 75, 32, 13, 0, }, /* 181 */- { 13, 9, 12, 79, 32, 13, 0, }, /* 182 */- { 13, 9, 12, 84, 32, 13, 0, }, /* 183 */- { 13, 5, 12, 0, -32, 13, 0, }, /* 184 */- { 13, 5, 12, 63, -32, 13, 0, }, /* 185 */- { 13, 5, 12, 67, -32, 13, 0, }, /* 186 */- { 13, 5, 12, 71, -32, 13, 0, }, /* 187 */- { 13, 5, 12, 75, -32, 13, 0, }, /* 188 */- { 13, 5, 12, 79, -32, 13, 0, }, /* 189 */- { 13, 5, 12, 84, -32, 13, 0, }, /* 190 */- { 13, 5, 12, 0, -80, 13, 0, }, /* 191 */- { 13, 9, 12, 0, 1, 13, 0, }, /* 192 */- { 13, 5, 12, 0, -1, 13, 0, }, /* 193 */- { 13, 9, 12, 88, 1, 13, 0, }, /* 194 */- { 13, 5, 12, 88, -1, 13, 0, }, /* 195 */- { 13, 26, 12, 0, 0, 13, 0, }, /* 196 */- { 13, 12, 3, 0, 0, -31, 0, }, /* 197 */- { 13, 12, 3, 0, 0, -25, 0, }, /* 198 */- { 28, 12, 3, 0, 0, -28, 0, }, /* 199 */- { 13, 11, 3, 0, 0, 13, 0, }, /* 200 */- { 13, 9, 12, 0, 15, 13, 0, }, /* 201 */- { 13, 5, 12, 0, -15, 13, 0, }, /* 202 */- { 2, 9, 12, 0, 48, 2, 0, }, /* 203 */- { 2, 6, 12, 0, 0, 2, 0, }, /* 204 */- { 2, 21, 12, 0, 0, 2, 0, }, /* 205 */- { 2, 5, 12, 0, 0, 2, 0, }, /* 206 */- { 2, 5, 12, 0, -48, 2, 0, }, /* 207 */- { 2, 17, 12, 0, 0, 2, 0, }, /* 208 */- { 2, 26, 12, 0, 0, 2, 0, }, /* 209 */- { 2, 23, 12, 0, 0, 2, 0, }, /* 210 */- { 26, 12, 3, 0, 0, 26, 0, }, /* 211 */- { 26, 17, 12, 0, 0, 26, 0, }, /* 212 */- { 26, 21, 12, 0, 0, 26, 0, }, /* 213 */- { 26, 7, 12, 0, 0, 26, 0, }, /* 214 */- { 1, 1, 4, 0, 0, 1, 0, }, /* 215 */- { 10, 1, 4, 0, 0, 10, 0, }, /* 216 */- { 1, 25, 12, 0, 0, 1, 0, }, /* 217 */- { 1, 21, 12, 0, 0, 1, 0, }, /* 218 */- { 1, 23, 12, 0, 0, 1, 0, }, /* 219 */- { 10, 21, 12, 0, 0, -127, 0, }, /* 220 */- { 1, 26, 12, 0, 0, 1, 0, }, /* 221 */- { 1, 12, 3, 0, 0, 1, 0, }, /* 222 */- { 1, 1, 2, 0, 0, -76, 0, }, /* 223 */- { 1, 7, 12, 0, 0, 1, 0, }, /* 224 */- { 10, 6, 12, 0, 0, -153, 0, }, /* 225 */- { 28, 12, 3, 0, 0, -7, 0, }, /* 226 */- { 1, 13, 12, 0, 0, -80, 0, }, /* 227 */- { 1, 21, 12, 0, 0, -4, 0, }, /* 228 */- { 1, 6, 12, 0, 0, 1, 0, }, /* 229 */- { 1, 13, 12, 0, 0, 1, 0, }, /* 230 */- { 50, 21, 12, 0, 0, 50, 0, }, /* 231 */- { 50, 1, 4, 0, 0, 50, 0, }, /* 232 */- { 50, 7, 12, 0, 0, 50, 0, }, /* 233 */- { 50, 12, 3, 0, 0, 50, 0, }, /* 234 */- { 56, 7, 12, 0, 0, 56, 0, }, /* 235 */- { 56, 12, 3, 0, 0, 56, 0, }, /* 236 */- { 64, 13, 12, 0, 0, 64, 0, }, /* 237 */- { 64, 7, 12, 0, 0, 64, 0, }, /* 238 */- { 64, 12, 3, 0, 0, 64, 0, }, /* 239 */- { 64, 6, 12, 0, 0, 64, 0, }, /* 240 */- { 64, 26, 12, 0, 0, 64, 0, }, /* 241 */- { 64, 21, 12, 0, 0, 64, 0, }, /* 242 */- { 64, 23, 12, 0, 0, 64, 0, }, /* 243 */- { 90, 7, 12, 0, 0, 90, 0, }, /* 244 */- { 90, 12, 3, 0, 0, 90, 0, }, /* 245 */- { 90, 6, 12, 0, 0, 90, 0, }, /* 246 */- { 90, 21, 12, 0, 0, 90, 0, }, /* 247 */- { 95, 7, 12, 0, 0, 95, 0, }, /* 248 */- { 95, 12, 3, 0, 0, 95, 0, }, /* 249 */- { 95, 21, 12, 0, 0, 95, 0, }, /* 250 */- { 15, 12, 3, 0, 0, 15, 0, }, /* 251 */- { 15, 10, 5, 0, 0, 15, 0, }, /* 252 */- { 15, 7, 12, 0, 0, 15, 0, }, /* 253 */- { 28, 12, 3, 0, 0, -196, 0, }, /* 254 */- { 28, 12, 3, 0, 0, -183, 0, }, /* 255 */- { 10, 21, 12, 0, 0, -239, 0, }, /* 256 */- { 10, 21, 12, 0, 0, -260, 0, }, /* 257 */- { 15, 13, 12, 0, 0, -122, 0, }, /* 258 */- { 15, 21, 12, 0, 0, 15, 0, }, /* 259 */- { 15, 6, 12, 0, 0, 15, 0, }, /* 260 */- { 3, 7, 12, 0, 0, 3, 0, }, /* 261 */- { 3, 12, 3, 0, 0, 3, 0, }, /* 262 */- { 3, 10, 5, 0, 0, 3, 0, }, /* 263 */- { 3, 10, 3, 0, 0, 3, 0, }, /* 264 */- { 3, 13, 12, 0, 0, -84, 0, }, /* 265 */- { 3, 23, 12, 0, 0, 3, 0, }, /* 266 */- { 3, 15, 12, 0, 0, 3, 0, }, /* 267 */- { 3, 26, 12, 0, 0, 3, 0, }, /* 268 */- { 3, 21, 12, 0, 0, 3, 0, }, /* 269 */- { 22, 12, 3, 0, 0, 22, 0, }, /* 270 */- { 22, 10, 5, 0, 0, 22, 0, }, /* 271 */- { 22, 7, 12, 0, 0, 22, 0, }, /* 272 */- { 22, 13, 12, 0, 0, -58, 0, }, /* 273 */- { 22, 21, 12, 0, 0, 22, 0, }, /* 274 */- { 21, 12, 3, 0, 0, 21, 0, }, /* 275 */- { 21, 10, 5, 0, 0, 21, 0, }, /* 276 */- { 21, 7, 12, 0, 0, 21, 0, }, /* 277 */- { 21, 13, 12, 0, 0, -55, 0, }, /* 278 */- { 21, 21, 12, 0, 0, 21, 0, }, /* 279 */- { 21, 23, 12, 0, 0, 21, 0, }, /* 280 */- { 44, 12, 3, 0, 0, 44, 0, }, /* 281 */- { 44, 10, 5, 0, 0, 44, 0, }, /* 282 */- { 44, 7, 12, 0, 0, 44, 0, }, /* 283 */- { 44, 10, 3, 0, 0, 44, 0, }, /* 284 */- { 44, 13, 12, 0, 0, 44, 0, }, /* 285 */- { 44, 26, 12, 0, 0, 44, 0, }, /* 286 */- { 44, 15, 12, 0, 0, 44, 0, }, /* 287 */- { 54, 12, 3, 0, 0, 54, 0, }, /* 288 */- { 54, 7, 12, 0, 0, 54, 0, }, /* 289 */- { 54, 10, 3, 0, 0, 54, 0, }, /* 290 */- { 54, 10, 5, 0, 0, 54, 0, }, /* 291 */- { 54, 13, 12, 0, 0, -52, 0, }, /* 292 */- { 54, 15, 12, 0, 0, -52, 0, }, /* 293 */- { 54, 26, 12, 0, 0, -52, 0, }, /* 294 */- { 54, 26, 12, 0, 0, 54, 0, }, /* 295 */- { 54, 23, 12, 0, 0, 54, 0, }, /* 296 */- { 55, 12, 3, 0, 0, 55, 0, }, /* 297 */- { 55, 10, 5, 0, 0, 55, 0, }, /* 298 */- { 55, 7, 12, 0, 0, 55, 0, }, /* 299 */- { 55, 13, 12, 0, 0, 55, 0, }, /* 300 */- { 55, 21, 12, 0, 0, 55, 0, }, /* 301 */- { 55, 15, 12, 0, 0, 55, 0, }, /* 302 */- { 55, 26, 12, 0, 0, 55, 0, }, /* 303 */- { 29, 7, 12, 0, 0, 29, 0, }, /* 304 */- { 29, 12, 3, 0, 0, 29, 0, }, /* 305 */- { 29, 10, 5, 0, 0, 29, 0, }, /* 306 */- { 29, 21, 12, 0, 0, 29, 0, }, /* 307 */- { 29, 10, 3, 0, 0, 29, 0, }, /* 308 */- { 29, 13, 12, 0, 0, -67, 0, }, /* 309 */- { 37, 12, 3, 0, 0, 37, 0, }, /* 310 */- { 37, 10, 5, 0, 0, 37, 0, }, /* 311 */- { 37, 7, 12, 0, 0, 37, 0, }, /* 312 */- { 37, 10, 3, 0, 0, 37, 0, }, /* 313 */- { 37, 7, 4, 0, 0, 37, 0, }, /* 314 */- { 37, 26, 12, 0, 0, 37, 0, }, /* 315 */- { 37, 15, 12, 0, 0, 37, 0, }, /* 316 */- { 37, 13, 12, 0, 0, 37, 0, }, /* 317 */- { 48, 12, 3, 0, 0, 48, 0, }, /* 318 */- { 48, 10, 5, 0, 0, 48, 0, }, /* 319 */- { 48, 7, 12, 0, 0, 48, 0, }, /* 320 */- { 48, 10, 3, 0, 0, 48, 0, }, /* 321 */- { 48, 13, 12, 0, 0, 48, 0, }, /* 322 */- { 48, 21, 12, 0, 0, 48, 0, }, /* 323 */- { 57, 7, 12, 0, 0, 57, 0, }, /* 324 */- { 57, 12, 3, 0, 0, 57, 0, }, /* 325 */- { 57, 7, 5, 0, 0, 57, 0, }, /* 326 */- { 57, 6, 12, 0, 0, 57, 0, }, /* 327 */- { 57, 21, 12, 0, 0, 57, 0, }, /* 328 */- { 57, 13, 12, 0, 0, 57, 0, }, /* 329 */- { 33, 7, 12, 0, 0, 33, 0, }, /* 330 */- { 33, 12, 3, 0, 0, 33, 0, }, /* 331 */- { 33, 7, 5, 0, 0, 33, 0, }, /* 332 */- { 33, 6, 12, 0, 0, 33, 0, }, /* 333 */- { 33, 13, 12, 0, 0, 33, 0, }, /* 334 */- { 58, 7, 12, 0, 0, 58, 0, }, /* 335 */- { 58, 26, 12, 0, 0, 58, 0, }, /* 336 */- { 58, 21, 12, 0, 0, 58, 0, }, /* 337 */- { 58, 12, 3, 0, 0, 58, 0, }, /* 338 */- { 58, 13, 12, 0, 0, 58, 0, }, /* 339 */- { 58, 15, 12, 0, 0, 58, 0, }, /* 340 */- { 58, 22, 12, 0, 0, 58, 0, }, /* 341 */- { 58, 18, 12, 0, 0, 58, 0, }, /* 342 */- { 58, 10, 5, 0, 0, 58, 0, }, /* 343 */- { 39, 7, 12, 0, 0, 39, 0, }, /* 344 */- { 39, 10, 12, 0, 0, 39, 0, }, /* 345 */- { 39, 12, 3, 0, 0, 39, 0, }, /* 346 */- { 39, 10, 5, 0, 0, 39, 0, }, /* 347 */- { 39, 13, 12, 0, 0, -88, 0, }, /* 348 */- { 39, 21, 12, 0, 0, 39, 0, }, /* 349 */- { 39, 13, 12, 0, 0, 39, 0, }, /* 350 */- { 39, 26, 12, 0, 0, 39, 0, }, /* 351 */- { 17, 9, 12, 0, 7264, 17, 0, }, /* 352 */- { 17, 5, 12, 0, 3008, 17, 0, }, /* 353 */- { 10, 21, 12, 0, 0, -49, 0, }, /* 354 */- { 17, 6, 12, 0, 0, 17, 0, }, /* 355 */- { 24, 7, 6, 0, 0, 24, 0, }, /* 356 */- { 24, 7, 7, 0, 0, 24, 0, }, /* 357 */- { 24, 7, 8, 0, 0, 24, 0, }, /* 358 */- { 16, 7, 12, 0, 0, 16, 0, }, /* 359 */- { 16, 12, 3, 0, 0, 16, 0, }, /* 360 */- { 16, 21, 12, 0, 0, 16, 0, }, /* 361 */- { 16, 15, 12, 0, 0, 16, 0, }, /* 362 */- { 16, 26, 12, 0, 0, 16, 0, }, /* 363 */- { 9, 9, 12, 0, 38864, 9, 0, }, /* 364 */- { 9, 9, 12, 0, 8, 9, 0, }, /* 365 */- { 9, 5, 12, 0, -8, 9, 0, }, /* 366 */- { 8, 17, 12, 0, 0, 8, 0, }, /* 367 */- { 8, 7, 12, 0, 0, 8, 0, }, /* 368 */- { 8, 26, 12, 0, 0, 8, 0, }, /* 369 */- { 8, 21, 12, 0, 0, 8, 0, }, /* 370 */- { 41, 29, 12, 0, 0, 41, 0, }, /* 371 */- { 41, 7, 12, 0, 0, 41, 0, }, /* 372 */- { 41, 22, 12, 0, 0, 41, 0, }, /* 373 */- { 41, 18, 12, 0, 0, 41, 0, }, /* 374 */- { 46, 7, 12, 0, 0, 46, 0, }, /* 375 */- { 46, 14, 12, 0, 0, 46, 0, }, /* 376 */- { 51, 7, 12, 0, 0, 51, 0, }, /* 377 */- { 51, 12, 3, 0, 0, 51, 0, }, /* 378 */- { 25, 7, 12, 0, 0, 25, 0, }, /* 379 */- { 25, 12, 3, 0, 0, 25, 0, }, /* 380 */- { 10, 21, 12, 0, 0, -117, 0, }, /* 381 */- { 7, 7, 12, 0, 0, 7, 0, }, /* 382 */- { 7, 12, 3, 0, 0, 7, 0, }, /* 383 */- { 52, 7, 12, 0, 0, 52, 0, }, /* 384 */- { 52, 12, 3, 0, 0, 52, 0, }, /* 385 */- { 32, 7, 12, 0, 0, 32, 0, }, /* 386 */- { 32, 12, 3, 0, 0, 32, 0, }, /* 387 */- { 32, 10, 5, 0, 0, 32, 0, }, /* 388 */- { 32, 21, 12, 0, 0, 32, 0, }, /* 389 */- { 32, 6, 12, 0, 0, 32, 0, }, /* 390 */- { 32, 23, 12, 0, 0, 32, 0, }, /* 391 */- { 32, 13, 12, 0, 0, 32, 0, }, /* 392 */- { 32, 15, 12, 0, 0, 32, 0, }, /* 393 */- { 38, 21, 12, 0, 0, 38, 0, }, /* 394 */- { 10, 21, 12, 0, 0, -73, 0, }, /* 395 */- { 38, 17, 12, 0, 0, 38, 0, }, /* 396 */- { 38, 12, 3, 0, 0, 38, 0, }, /* 397 */- { 38, 1, 2, 0, 0, 38, 0, }, /* 398 */- { 38, 13, 12, 0, 0, 38, 0, }, /* 399 */- { 38, 7, 12, 0, 0, 38, 0, }, /* 400 */- { 38, 6, 12, 0, 0, 38, 0, }, /* 401 */- { 35, 7, 12, 0, 0, 35, 0, }, /* 402 */- { 35, 12, 3, 0, 0, 35, 0, }, /* 403 */- { 35, 10, 5, 0, 0, 35, 0, }, /* 404 */- { 35, 26, 12, 0, 0, 35, 0, }, /* 405 */- { 35, 21, 12, 0, 0, 35, 0, }, /* 406 */- { 35, 13, 12, 0, 0, 35, 0, }, /* 407 */- { 53, 7, 12, 0, 0, 53, 0, }, /* 408 */- { 40, 7, 12, 0, 0, 40, 0, }, /* 409 */- { 40, 13, 12, 0, 0, 40, 0, }, /* 410 */- { 40, 15, 12, 0, 0, 40, 0, }, /* 411 */- { 40, 26, 12, 0, 0, 40, 0, }, /* 412 */- { 32, 26, 12, 0, 0, 32, 0, }, /* 413 */- { 6, 7, 12, 0, 0, 6, 0, }, /* 414 */- { 6, 12, 3, 0, 0, 6, 0, }, /* 415 */- { 6, 10, 5, 0, 0, 6, 0, }, /* 416 */- { 6, 21, 12, 0, 0, 6, 0, }, /* 417 */- { 91, 7, 12, 0, 0, 91, 0, }, /* 418 */- { 91, 10, 5, 0, 0, 91, 0, }, /* 419 */- { 91, 12, 3, 0, 0, 91, 0, }, /* 420 */- { 91, 10, 12, 0, 0, 91, 0, }, /* 421 */- { 91, 13, 12, 0, 0, 91, 0, }, /* 422 */- { 91, 21, 12, 0, 0, 91, 0, }, /* 423 */- { 91, 6, 12, 0, 0, 91, 0, }, /* 424 */- { 28, 11, 3, 0, 0, 28, 0, }, /* 425 */- { 62, 12, 3, 0, 0, 62, 0, }, /* 426 */- { 62, 10, 5, 0, 0, 62, 0, }, /* 427 */- { 62, 7, 12, 0, 0, 62, 0, }, /* 428 */- { 62, 10, 3, 0, 0, 62, 0, }, /* 429 */- { 62, 13, 12, 0, 0, 62, 0, }, /* 430 */- { 62, 21, 12, 0, 0, 62, 0, }, /* 431 */- { 62, 26, 12, 0, 0, 62, 0, }, /* 432 */- { 76, 12, 3, 0, 0, 76, 0, }, /* 433 */- { 76, 10, 5, 0, 0, 76, 0, }, /* 434 */- { 76, 7, 12, 0, 0, 76, 0, }, /* 435 */- { 76, 13, 12, 0, 0, 76, 0, }, /* 436 */- { 93, 7, 12, 0, 0, 93, 0, }, /* 437 */- { 93, 12, 3, 0, 0, 93, 0, }, /* 438 */- { 93, 10, 5, 0, 0, 93, 0, }, /* 439 */- { 93, 21, 12, 0, 0, 93, 0, }, /* 440 */- { 70, 7, 12, 0, 0, 70, 0, }, /* 441 */- { 70, 10, 5, 0, 0, 70, 0, }, /* 442 */- { 70, 12, 3, 0, 0, 70, 0, }, /* 443 */- { 70, 21, 12, 0, 0, 70, 0, }, /* 444 */- { 70, 13, 12, 0, 0, 70, 0, }, /* 445 */- { 73, 13, 12, 0, 0, 73, 0, }, /* 446 */- { 73, 7, 12, 0, 0, 73, 0, }, /* 447 */- { 73, 6, 12, 0, 0, 73, 0, }, /* 448 */- { 73, 21, 12, 0, 0, 73, 0, }, /* 449 */- { 13, 5, 12, 63, -6222, 13, 0, }, /* 450 */- { 13, 5, 12, 67, -6221, 13, 0, }, /* 451 */- { 13, 5, 12, 71, -6212, 13, 0, }, /* 452 */- { 13, 5, 12, 75, -6210, 13, 0, }, /* 453 */- { 13, 5, 12, 79, -6210, 13, 0, }, /* 454 */- { 13, 5, 12, 79, -6211, 13, 0, }, /* 455 */- { 13, 5, 12, 84, -6204, 13, 0, }, /* 456 */- { 13, 5, 12, 88, -6180, 13, 0, }, /* 457 */- { 13, 5, 12, 108, 35267, 13, 0, }, /* 458 */- { 17, 9, 12, 0, -3008, 17, 0, }, /* 459 */- { 76, 21, 12, 0, 0, 76, 0, }, /* 460 */- { 28, 12, 3, 0, 0, -112, 0, }, /* 461 */- { 28, 12, 3, 0, 0, 15, 0, }, /* 462 */- { 10, 21, 12, 0, 0, -37, 0, }, /* 463 */- { 28, 12, 3, 0, 0, -13, 0, }, /* 464 */- { 28, 12, 3, 0, 0, -43, 0, }, /* 465 */- { 28, 12, 3, 0, 0, -146, 0, }, /* 466 */- { 10, 10, 5, 0, 0, -13, 0, }, /* 467 */- { 10, 7, 12, 0, 0, -40, 0, }, /* 468 */- { 10, 7, 12, 0, 0, -13, 0, }, /* 469 */- { 10, 7, 12, 0, 0, 15, 0, }, /* 470 */- { 10, 7, 12, 0, 0, -162, 0, }, /* 471 */- { 10, 7, 12, 0, 0, -37, 0, }, /* 472 */- { 28, 12, 3, 0, 0, -96, 0, }, /* 473 */- { 10, 10, 5, 0, 0, 3, 0, }, /* 474 */- { 28, 12, 3, 0, 0, -37, 0, }, /* 475 */- { 10, 7, 12, 0, 0, 150, 0, }, /* 476 */- { 13, 5, 12, 0, 0, 13, 0, }, /* 477 */- { 13, 6, 12, 0, 0, 13, 0, }, /* 478 */- { 34, 5, 12, 0, 35332, 34, 0, }, /* 479 */- { 34, 5, 12, 0, 3814, 34, 0, }, /* 480 */- { 34, 5, 12, 0, 35384, 34, 0, }, /* 481 */- { 28, 12, 3, 0, 0, -34, 0, }, /* 482 */- { 34, 9, 12, 92, 1, 34, 0, }, /* 483 */- { 34, 5, 12, 92, -1, 34, 0, }, /* 484 */- { 34, 5, 12, 92, -58, 34, 0, }, /* 485 */- { 34, 9, 12, 0, -7615, 34, 0, }, /* 486 */- { 20, 5, 12, 0, 8, 20, 0, }, /* 487 */- { 20, 9, 12, 0, -8, 20, 0, }, /* 488 */- { 20, 5, 12, 0, 74, 20, 0, }, /* 489 */- { 20, 5, 12, 0, 86, 20, 0, }, /* 490 */- { 20, 5, 12, 0, 100, 20, 0, }, /* 491 */- { 20, 5, 12, 0, 128, 20, 0, }, /* 492 */- { 20, 5, 12, 0, 112, 20, 0, }, /* 493 */- { 20, 5, 12, 0, 126, 20, 0, }, /* 494 */- { 20, 8, 12, 0, -8, 20, 0, }, /* 495 */- { 20, 5, 12, 0, 9, 20, 0, }, /* 496 */- { 20, 9, 12, 0, -74, 20, 0, }, /* 497 */- { 20, 8, 12, 0, -9, 20, 0, }, /* 498 */- { 20, 5, 12, 21, -7173, 20, 0, }, /* 499 */- { 20, 9, 12, 0, -86, 20, 0, }, /* 500 */- { 20, 9, 12, 0, -100, 20, 0, }, /* 501 */- { 20, 9, 12, 0, -112, 20, 0, }, /* 502 */- { 20, 9, 12, 0, -128, 20, 0, }, /* 503 */- { 20, 9, 12, 0, -126, 20, 0, }, /* 504 */- { 28, 1, 3, 0, 0, 28, 0, }, /* 505 */- { 28, 1, 13, 0, 0, 28, 0, }, /* 506 */- { 10, 27, 2, 0, 0, 10, 0, }, /* 507 */- { 10, 28, 2, 0, 0, 10, 0, }, /* 508 */- { 10, 29, 12, 0, 0, -70, 0, }, /* 509 */- { 10, 21, 14, 0, 0, 10, 0, }, /* 510 */- { 0, 2, 2, 0, 0, 0, 0, }, /* 511 */- { 28, 12, 3, 0, 0, -100, 0, }, /* 512 */- { 10, 9, 12, 0, 0, 10, 0, }, /* 513 */- { 10, 5, 12, 0, 0, 10, 0, }, /* 514 */- { 20, 9, 12, 96, -7517, 20, 0, }, /* 515 */- { 34, 9, 12, 100, -8383, 34, 0, }, /* 516 */- { 34, 9, 12, 104, -8262, 34, 0, }, /* 517 */- { 34, 9, 12, 0, 28, 34, 0, }, /* 518 */- { 10, 7, 12, 0, 0, 10, 0, }, /* 519 */- { 10, 5, 14, 0, 0, 10, 0, }, /* 520 */- { 34, 5, 12, 0, -28, 34, 0, }, /* 521 */- { 34, 14, 12, 0, 16, 34, 0, }, /* 522 */- { 34, 14, 12, 0, -16, 34, 0, }, /* 523 */- { 34, 14, 12, 0, 0, 34, 0, }, /* 524 */- { 10, 25, 14, 0, 0, 10, 0, }, /* 525 */- { 10, 26, 12, 0, 26, 10, 0, }, /* 526 */- { 10, 26, 14, 0, 26, 10, 0, }, /* 527 */- { 10, 26, 12, 0, -26, 10, 0, }, /* 528 */- { 5, 26, 12, 0, 0, 5, 0, }, /* 529 */- { 18, 9, 12, 0, 48, 18, 0, }, /* 530 */- { 18, 5, 12, 0, -48, 18, 0, }, /* 531 */- { 34, 9, 12, 0, -10743, 34, 0, }, /* 532 */- { 34, 9, 12, 0, -3814, 34, 0, }, /* 533 */- { 34, 9, 12, 0, -10727, 34, 0, }, /* 534 */- { 34, 5, 12, 0, -10795, 34, 0, }, /* 535 */- { 34, 5, 12, 0, -10792, 34, 0, }, /* 536 */- { 34, 9, 12, 0, -10780, 34, 0, }, /* 537 */- { 34, 9, 12, 0, -10749, 34, 0, }, /* 538 */- { 34, 9, 12, 0, -10783, 34, 0, }, /* 539 */- { 34, 9, 12, 0, -10782, 34, 0, }, /* 540 */- { 34, 9, 12, 0, -10815, 34, 0, }, /* 541 */- { 11, 5, 12, 0, 0, 11, 0, }, /* 542 */- { 11, 26, 12, 0, 0, 11, 0, }, /* 543 */- { 11, 12, 3, 0, 0, 11, 0, }, /* 544 */- { 11, 21, 12, 0, 0, 11, 0, }, /* 545 */- { 11, 15, 12, 0, 0, 11, 0, }, /* 546 */- { 17, 5, 12, 0, -7264, 17, 0, }, /* 547 */- { 59, 7, 12, 0, 0, 59, 0, }, /* 548 */- { 59, 6, 12, 0, 0, 59, 0, }, /* 549 */- { 59, 21, 12, 0, 0, 59, 0, }, /* 550 */- { 59, 12, 3, 0, 0, 59, 0, }, /* 551 */- { 13, 12, 3, 0, 0, 13, 0, }, /* 552 */- { 10, 21, 12, 0, 0, -25, 0, }, /* 553 */- { 23, 26, 12, 0, 0, 23, 0, }, /* 554 */- { 10, 21, 12, 0, 0, -139, 0, }, /* 555 */- { 10, 21, 12, 0, 0, -133, 0, }, /* 556 */- { 23, 6, 12, 0, 0, 23, 0, }, /* 557 */- { 10, 7, 12, 0, 0, 23, 0, }, /* 558 */- { 23, 14, 12, 0, 0, 23, 0, }, /* 559 */- { 10, 22, 12, 0, 0, -139, 0, }, /* 560 */- { 10, 18, 12, 0, 0, -139, 0, }, /* 561 */- { 10, 26, 12, 0, 0, -133, 0, }, /* 562 */- { 10, 17, 12, 0, 0, -133, 0, }, /* 563 */- { 10, 22, 12, 0, 0, -133, 0, }, /* 564 */- { 10, 18, 12, 0, 0, -133, 0, }, /* 565 */- { 28, 12, 3, 0, 0, -16, 0, }, /* 566 */- { 24, 10, 3, 0, 0, 24, 0, }, /* 567 */- { 10, 17, 14, 0, 0, -133, 0, }, /* 568 */- { 10, 6, 12, 0, 0, -64, 0, }, /* 569 */- { 10, 7, 12, 0, 0, -104, 0, }, /* 570 */- { 10, 21, 14, 0, 0, -104, 0, }, /* 571 */- { 10, 26, 12, 0, 0, 23, 0, }, /* 572 */- { 27, 7, 12, 0, 0, 27, 0, }, /* 573 */- { 28, 12, 3, 0, 0, -64, 0, }, /* 574 */- { 10, 24, 12, 0, 0, -64, 0, }, /* 575 */- { 27, 6, 12, 0, 0, 27, 0, }, /* 576 */- { 10, 17, 12, 0, 0, -64, 0, }, /* 577 */- { 30, 7, 12, 0, 0, 30, 0, }, /* 578 */- { 30, 6, 12, 0, 0, 30, 0, }, /* 579 */- { 4, 7, 12, 0, 0, 4, 0, }, /* 580 */- { 24, 7, 12, 0, 0, 24, 0, }, /* 581 */- { 10, 15, 12, 0, 0, 23, 0, }, /* 582 */- { 24, 26, 12, 0, 0, 24, 0, }, /* 583 */- { 10, 26, 14, 0, 0, 23, 0, }, /* 584 */- { 30, 26, 12, 0, 0, 30, 0, }, /* 585 */- { 23, 7, 12, 0, 0, 23, 0, }, /* 586 */- { 61, 7, 12, 0, 0, 61, 0, }, /* 587 */- { 61, 6, 12, 0, 0, 61, 0, }, /* 588 */- { 61, 26, 12, 0, 0, 61, 0, }, /* 589 */- { 86, 7, 12, 0, 0, 86, 0, }, /* 590 */- { 86, 6, 12, 0, 0, 86, 0, }, /* 591 */- { 86, 21, 12, 0, 0, 86, 0, }, /* 592 */- { 77, 7, 12, 0, 0, 77, 0, }, /* 593 */- { 77, 6, 12, 0, 0, 77, 0, }, /* 594 */- { 77, 21, 12, 0, 0, 77, 0, }, /* 595 */- { 77, 13, 12, 0, 0, 77, 0, }, /* 596 */- { 13, 9, 12, 108, 1, 13, 0, }, /* 597 */- { 13, 5, 12, 108, -35267, 13, 0, }, /* 598 */- { 13, 7, 12, 0, 0, 13, 0, }, /* 599 */- { 13, 21, 12, 0, 0, 13, 0, }, /* 600 */- { 79, 7, 12, 0, 0, 79, 0, }, /* 601 */- { 79, 14, 12, 0, 0, 79, 0, }, /* 602 */- { 79, 12, 3, 0, 0, 79, 0, }, /* 603 */- { 79, 21, 12, 0, 0, 79, 0, }, /* 604 */- { 10, 24, 12, 0, 0, -61, 0, }, /* 605 */- { 34, 9, 12, 0, -35332, 34, 0, }, /* 606 */- { 34, 9, 12, 0, -42280, 34, 0, }, /* 607 */- { 34, 5, 12, 0, 48, 34, 0, }, /* 608 */- { 34, 9, 12, 0, -42308, 34, 0, }, /* 609 */- { 34, 9, 12, 0, -42319, 34, 0, }, /* 610 */- { 34, 9, 12, 0, -42315, 34, 0, }, /* 611 */- { 34, 9, 12, 0, -42305, 34, 0, }, /* 612 */- { 34, 9, 12, 0, -42258, 34, 0, }, /* 613 */- { 34, 9, 12, 0, -42282, 34, 0, }, /* 614 */- { 34, 9, 12, 0, -42261, 34, 0, }, /* 615 */- { 34, 9, 12, 0, 928, 34, 0, }, /* 616 */- { 34, 9, 12, 0, -48, 34, 0, }, /* 617 */- { 34, 9, 12, 0, -42307, 34, 0, }, /* 618 */- { 34, 9, 12, 0, -35384, 34, 0, }, /* 619 */- { 49, 7, 12, 0, 0, 49, 0, }, /* 620 */- { 49, 12, 3, 0, 0, 49, 0, }, /* 621 */- { 49, 10, 5, 0, 0, 49, 0, }, /* 622 */- { 49, 26, 12, 0, 0, 49, 0, }, /* 623 */- { 10, 15, 12, 0, 0, -224, 0, }, /* 624 */- { 10, 15, 12, 0, 0, -210, 0, }, /* 625 */- { 10, 26, 12, 0, 0, -171, 0, }, /* 626 */- { 10, 23, 12, 0, 0, -171, 0, }, /* 627 */- { 65, 7, 12, 0, 0, 65, 0, }, /* 628 */- { 65, 21, 12, 0, 0, 65, 0, }, /* 629 */- { 75, 10, 5, 0, 0, 75, 0, }, /* 630 */- { 75, 7, 12, 0, 0, 75, 0, }, /* 631 */- { 75, 12, 3, 0, 0, 75, 0, }, /* 632 */- { 75, 21, 12, 0, 0, 75, 0, }, /* 633 */- { 75, 13, 12, 0, 0, 75, 0, }, /* 634 */- { 15, 12, 3, 0, 0, -13, 0, }, /* 635 */- { 15, 7, 12, 0, 0, -46, 0, }, /* 636 */- { 69, 13, 12, 0, 0, 69, 0, }, /* 637 */- { 69, 7, 12, 0, 0, 69, 0, }, /* 638 */- { 69, 12, 3, 0, 0, 69, 0, }, /* 639 */- { 10, 21, 12, 0, 0, -108, 0, }, /* 640 */- { 69, 21, 12, 0, 0, 69, 0, }, /* 641 */- { 74, 7, 12, 0, 0, 74, 0, }, /* 642 */- { 74, 12, 3, 0, 0, 74, 0, }, /* 643 */- { 74, 10, 5, 0, 0, 74, 0, }, /* 644 */- { 74, 21, 12, 0, 0, 74, 0, }, /* 645 */- { 84, 12, 3, 0, 0, 84, 0, }, /* 646 */- { 84, 10, 5, 0, 0, 84, 0, }, /* 647 */- { 84, 7, 12, 0, 0, 84, 0, }, /* 648 */- { 84, 21, 12, 0, 0, 84, 0, }, /* 649 */- { 10, 6, 12, 0, 0, -19, 0, }, /* 650 */- { 84, 13, 12, 0, 0, 84, 0, }, /* 651 */- { 39, 6, 12, 0, 0, 39, 0, }, /* 652 */- { 68, 7, 12, 0, 0, 68, 0, }, /* 653 */- { 68, 12, 3, 0, 0, 68, 0, }, /* 654 */- { 68, 10, 5, 0, 0, 68, 0, }, /* 655 */- { 68, 13, 12, 0, 0, 68, 0, }, /* 656 */- { 68, 21, 12, 0, 0, 68, 0, }, /* 657 */- { 92, 7, 12, 0, 0, 92, 0, }, /* 658 */- { 92, 12, 3, 0, 0, 92, 0, }, /* 659 */- { 92, 6, 12, 0, 0, 92, 0, }, /* 660 */- { 92, 21, 12, 0, 0, 92, 0, }, /* 661 */- { 87, 7, 12, 0, 0, 87, 0, }, /* 662 */- { 87, 10, 5, 0, 0, 87, 0, }, /* 663 */- { 87, 12, 3, 0, 0, 87, 0, }, /* 664 */- { 87, 21, 12, 0, 0, 87, 0, }, /* 665 */- { 87, 6, 12, 0, 0, 87, 0, }, /* 666 */- { 34, 5, 12, 0, -928, 34, 0, }, /* 667 */- { 9, 5, 12, 0, -38864, 9, 0, }, /* 668 */- { 87, 13, 12, 0, 0, 87, 0, }, /* 669 */- { 24, 7, 9, 0, 0, 24, 0, }, /* 670 */- { 24, 7, 10, 0, 0, 24, 0, }, /* 671 */- { 0, 4, 12, 0, 0, 0, 0, }, /* 672 */- { 0, 3, 12, 0, 0, 0, 0, }, /* 673 */- { 26, 25, 12, 0, 0, 26, 0, }, /* 674 */- { 1, 24, 12, 0, 0, 1, 0, }, /* 675 */- { 1, 7, 12, 0, 0, -10, 0, }, /* 676 */- { 1, 26, 12, 0, 0, -10, 0, }, /* 677 */- { 10, 6, 3, 0, 0, -64, 0, }, /* 678 */- { 36, 7, 12, 0, 0, 36, 0, }, /* 679 */- { 10, 21, 12, 0, 0, -22, 0, }, /* 680 */- { 10, 15, 12, 0, 0, -92, 0, }, /* 681 */- { 10, 26, 12, 0, 0, -22, 0, }, /* 682 */- { 20, 14, 12, 0, 0, 20, 0, }, /* 683 */- { 20, 15, 12, 0, 0, 20, 0, }, /* 684 */- { 20, 26, 12, 0, 0, 20, 0, }, /* 685 */- { 71, 7, 12, 0, 0, 71, 0, }, /* 686 */- { 67, 7, 12, 0, 0, 67, 0, }, /* 687 */- { 28, 12, 3, 0, 0, -1, 0, }, /* 688 */- { 10, 15, 12, 0, 0, -1, 0, }, /* 689 */- { 42, 7, 12, 0, 0, 42, 0, }, /* 690 */- { 42, 15, 12, 0, 0, 42, 0, }, /* 691 */- { 19, 7, 12, 0, 0, 19, 0, }, /* 692 */- { 19, 14, 12, 0, 0, 19, 0, }, /* 693 */- { 118, 7, 12, 0, 0, 118, 0, }, /* 694 */- { 118, 12, 3, 0, 0, 118, 0, }, /* 695 */- { 60, 7, 12, 0, 0, 60, 0, }, /* 696 */- { 60, 21, 12, 0, 0, 60, 0, }, /* 697 */- { 43, 7, 12, 0, 0, 43, 0, }, /* 698 */- { 43, 21, 12, 0, 0, 43, 0, }, /* 699 */- { 43, 14, 12, 0, 0, 43, 0, }, /* 700 */- { 14, 9, 12, 0, 40, 14, 0, }, /* 701 */- { 14, 5, 12, 0, -40, 14, 0, }, /* 702 */- { 47, 7, 12, 0, 0, 47, 0, }, /* 703 */- { 45, 7, 12, 0, 0, 45, 0, }, /* 704 */- { 45, 13, 12, 0, 0, 45, 0, }, /* 705 */- { 136, 9, 12, 0, 40, 136, 0, }, /* 706 */- { 136, 5, 12, 0, -40, 136, 0, }, /* 707 */- { 106, 7, 12, 0, 0, 106, 0, }, /* 708 */- { 104, 7, 12, 0, 0, 104, 0, }, /* 709 */- { 104, 21, 12, 0, 0, 104, 0, }, /* 710 */- { 110, 7, 12, 0, 0, 110, 0, }, /* 711 */- { 12, 7, 12, 0, 0, 12, 0, }, /* 712 */- { 81, 7, 12, 0, 0, 81, 0, }, /* 713 */- { 81, 21, 12, 0, 0, 81, 0, }, /* 714 */- { 81, 15, 12, 0, 0, 81, 0, }, /* 715 */- { 120, 7, 12, 0, 0, 120, 0, }, /* 716 */- { 120, 26, 12, 0, 0, 120, 0, }, /* 717 */- { 120, 15, 12, 0, 0, 120, 0, }, /* 718 */- { 116, 7, 12, 0, 0, 116, 0, }, /* 719 */- { 116, 15, 12, 0, 0, 116, 0, }, /* 720 */- { 128, 7, 12, 0, 0, 128, 0, }, /* 721 */- { 128, 15, 12, 0, 0, 128, 0, }, /* 722 */- { 66, 7, 12, 0, 0, 66, 0, }, /* 723 */- { 66, 15, 12, 0, 0, 66, 0, }, /* 724 */- { 66, 21, 12, 0, 0, 66, 0, }, /* 725 */- { 72, 7, 12, 0, 0, 72, 0, }, /* 726 */- { 72, 21, 12, 0, 0, 72, 0, }, /* 727 */- { 98, 7, 12, 0, 0, 98, 0, }, /* 728 */- { 97, 7, 12, 0, 0, 97, 0, }, /* 729 */- { 97, 15, 12, 0, 0, 97, 0, }, /* 730 */- { 31, 7, 12, 0, 0, 31, 0, }, /* 731 */- { 31, 12, 3, 0, 0, 31, 0, }, /* 732 */- { 31, 15, 12, 0, 0, 31, 0, }, /* 733 */- { 31, 21, 12, 0, 0, 31, 0, }, /* 734 */- { 88, 7, 12, 0, 0, 88, 0, }, /* 735 */- { 88, 15, 12, 0, 0, 88, 0, }, /* 736 */- { 88, 21, 12, 0, 0, 88, 0, }, /* 737 */- { 117, 7, 12, 0, 0, 117, 0, }, /* 738 */- { 117, 15, 12, 0, 0, 117, 0, }, /* 739 */- { 112, 7, 12, 0, 0, 112, 0, }, /* 740 */- { 112, 26, 12, 0, 0, 112, 0, }, /* 741 */- { 112, 12, 3, 0, 0, 112, 0, }, /* 742 */- { 112, 15, 12, 0, 0, 112, 0, }, /* 743 */- { 112, 21, 12, 0, 0, 112, 0, }, /* 744 */- { 78, 7, 12, 0, 0, 78, 0, }, /* 745 */- { 78, 21, 12, 0, 0, 78, 0, }, /* 746 */- { 83, 7, 12, 0, 0, 83, 0, }, /* 747 */- { 83, 15, 12, 0, 0, 83, 0, }, /* 748 */- { 82, 7, 12, 0, 0, 82, 0, }, /* 749 */- { 82, 15, 12, 0, 0, 82, 0, }, /* 750 */- { 121, 7, 12, 0, 0, 121, 0, }, /* 751 */- { 121, 21, 12, 0, 0, 121, 0, }, /* 752 */- { 121, 15, 12, 0, 0, 121, 0, }, /* 753 */- { 89, 7, 12, 0, 0, 89, 0, }, /* 754 */- { 130, 9, 12, 0, 64, 130, 0, }, /* 755 */- { 130, 5, 12, 0, -64, 130, 0, }, /* 756 */- { 130, 15, 12, 0, 0, 130, 0, }, /* 757 */- { 144, 7, 12, 0, 0, 144, 0, }, /* 758 */- { 144, 12, 3, 0, 0, 144, 0, }, /* 759 */- { 144, 13, 12, 0, 0, 144, 0, }, /* 760 */- { 1, 15, 12, 0, 0, 1, 0, }, /* 761 */- { 156, 7, 12, 0, 0, 156, 0, }, /* 762 */- { 156, 12, 3, 0, 0, 156, 0, }, /* 763 */- { 156, 17, 12, 0, 0, 156, 0, }, /* 764 */- { 147, 7, 12, 0, 0, 147, 0, }, /* 765 */- { 147, 15, 12, 0, 0, 147, 0, }, /* 766 */- { 148, 7, 12, 0, 0, 148, 0, }, /* 767 */- { 148, 12, 3, 0, 0, 148, 0, }, /* 768 */- { 148, 15, 12, 0, 0, 148, 0, }, /* 769 */- { 148, 21, 12, 0, 0, 148, 0, }, /* 770 */- { 153, 7, 12, 0, 0, 153, 0, }, /* 771 */- { 153, 15, 12, 0, 0, 153, 0, }, /* 772 */- { 149, 7, 12, 0, 0, 149, 0, }, /* 773 */- { 94, 10, 5, 0, 0, 94, 0, }, /* 774 */- { 94, 12, 3, 0, 0, 94, 0, }, /* 775 */- { 94, 7, 12, 0, 0, 94, 0, }, /* 776 */- { 94, 21, 12, 0, 0, 94, 0, }, /* 777 */- { 94, 15, 12, 0, 0, 94, 0, }, /* 778 */- { 94, 13, 12, 0, 0, 94, 0, }, /* 779 */- { 85, 12, 3, 0, 0, 85, 0, }, /* 780 */- { 85, 10, 5, 0, 0, 85, 0, }, /* 781 */- { 85, 7, 12, 0, 0, 85, 0, }, /* 782 */- { 85, 21, 12, 0, 0, 85, 0, }, /* 783 */- { 85, 1, 4, 0, 0, 85, 0, }, /* 784 */- { 101, 7, 12, 0, 0, 101, 0, }, /* 785 */- { 101, 13, 12, 0, 0, 101, 0, }, /* 786 */- { 96, 12, 3, 0, 0, 96, 0, }, /* 787 */- { 96, 7, 12, 0, 0, 96, 0, }, /* 788 */- { 96, 10, 5, 0, 0, 96, 0, }, /* 789 */- { 96, 13, 12, 0, 0, 96, 0, }, /* 790 */- { 96, 21, 12, 0, 0, 96, 0, }, /* 791 */- { 111, 7, 12, 0, 0, 111, 0, }, /* 792 */- { 111, 12, 3, 0, 0, 111, 0, }, /* 793 */- { 111, 21, 12, 0, 0, 111, 0, }, /* 794 */- { 100, 12, 3, 0, 0, 100, 0, }, /* 795 */- { 100, 10, 5, 0, 0, 100, 0, }, /* 796 */- { 100, 7, 12, 0, 0, 100, 0, }, /* 797 */- { 100, 7, 4, 0, 0, 100, 0, }, /* 798 */- { 100, 21, 12, 0, 0, 100, 0, }, /* 799 */- { 100, 13, 12, 0, 0, 100, 0, }, /* 800 */- { 48, 15, 12, 0, 0, 48, 0, }, /* 801 */- { 108, 7, 12, 0, 0, 108, 0, }, /* 802 */- { 108, 10, 5, 0, 0, 108, 0, }, /* 803 */- { 108, 12, 3, 0, 0, 108, 0, }, /* 804 */- { 108, 21, 12, 0, 0, 108, 0, }, /* 805 */- { 129, 7, 12, 0, 0, 129, 0, }, /* 806 */- { 129, 21, 12, 0, 0, 129, 0, }, /* 807 */- { 109, 7, 12, 0, 0, 109, 0, }, /* 808 */- { 109, 12, 3, 0, 0, 109, 0, }, /* 809 */- { 109, 10, 5, 0, 0, 109, 0, }, /* 810 */- { 109, 13, 12, 0, 0, 109, 0, }, /* 811 */- { 107, 12, 3, 0, 0, 107, 0, }, /* 812 */- { 107, 12, 3, 0, 0, -52, 0, }, /* 813 */- { 107, 10, 5, 0, 0, 107, 0, }, /* 814 */- { 107, 10, 5, 0, 0, -52, 0, }, /* 815 */- { 107, 7, 12, 0, 0, 107, 0, }, /* 816 */- { 28, 12, 3, 0, 0, -52, 0, }, /* 817 */- { 107, 10, 3, 0, 0, 107, 0, }, /* 818 */- { 135, 7, 12, 0, 0, 135, 0, }, /* 819 */- { 135, 10, 5, 0, 0, 135, 0, }, /* 820 */- { 135, 12, 3, 0, 0, 135, 0, }, /* 821 */- { 135, 21, 12, 0, 0, 135, 0, }, /* 822 */- { 135, 13, 12, 0, 0, 135, 0, }, /* 823 */- { 124, 7, 12, 0, 0, 124, 0, }, /* 824 */- { 124, 10, 3, 0, 0, 124, 0, }, /* 825 */- { 124, 10, 5, 0, 0, 124, 0, }, /* 826 */- { 124, 12, 3, 0, 0, 124, 0, }, /* 827 */- { 124, 21, 12, 0, 0, 124, 0, }, /* 828 */- { 124, 13, 12, 0, 0, 124, 0, }, /* 829 */- { 123, 7, 12, 0, 0, 123, 0, }, /* 830 */- { 123, 10, 3, 0, 0, 123, 0, }, /* 831 */- { 123, 10, 5, 0, 0, 123, 0, }, /* 832 */- { 123, 12, 3, 0, 0, 123, 0, }, /* 833 */- { 123, 21, 12, 0, 0, 123, 0, }, /* 834 */- { 114, 7, 12, 0, 0, 114, 0, }, /* 835 */- { 114, 10, 5, 0, 0, 114, 0, }, /* 836 */- { 114, 12, 3, 0, 0, 114, 0, }, /* 837 */- { 114, 21, 12, 0, 0, 114, 0, }, /* 838 */- { 114, 13, 12, 0, 0, 114, 0, }, /* 839 */- { 102, 7, 12, 0, 0, 102, 0, }, /* 840 */- { 102, 12, 3, 0, 0, 102, 0, }, /* 841 */- { 102, 10, 5, 0, 0, 102, 0, }, /* 842 */- { 102, 13, 12, 0, 0, 102, 0, }, /* 843 */- { 126, 7, 12, 0, 0, 126, 0, }, /* 844 */- { 126, 12, 3, 0, 0, 126, 0, }, /* 845 */- { 126, 10, 5, 0, 0, 126, 0, }, /* 846 */- { 126, 13, 12, 0, 0, 126, 0, }, /* 847 */- { 126, 15, 12, 0, 0, 126, 0, }, /* 848 */- { 126, 21, 12, 0, 0, 126, 0, }, /* 849 */- { 126, 26, 12, 0, 0, 126, 0, }, /* 850 */- { 142, 7, 12, 0, 0, 142, 0, }, /* 851 */- { 142, 10, 5, 0, 0, 142, 0, }, /* 852 */- { 142, 12, 3, 0, 0, 142, 0, }, /* 853 */- { 142, 21, 12, 0, 0, 142, 0, }, /* 854 */- { 125, 9, 12, 0, 32, 125, 0, }, /* 855 */- { 125, 5, 12, 0, -32, 125, 0, }, /* 856 */- { 125, 13, 12, 0, 0, 125, 0, }, /* 857 */- { 125, 15, 12, 0, 0, 125, 0, }, /* 858 */- { 125, 7, 12, 0, 0, 125, 0, }, /* 859 */- { 154, 7, 12, 0, 0, 154, 0, }, /* 860 */- { 154, 10, 3, 0, 0, 154, 0, }, /* 861 */- { 154, 10, 5, 0, 0, 154, 0, }, /* 862 */- { 154, 12, 3, 0, 0, 154, 0, }, /* 863 */- { 154, 7, 4, 0, 0, 154, 0, }, /* 864 */- { 154, 21, 12, 0, 0, 154, 0, }, /* 865 */- { 154, 13, 12, 0, 0, 154, 0, }, /* 866 */- { 150, 7, 12, 0, 0, 150, 0, }, /* 867 */- { 150, 10, 5, 0, 0, 150, 0, }, /* 868 */- { 150, 12, 3, 0, 0, 150, 0, }, /* 869 */- { 150, 21, 12, 0, 0, 150, 0, }, /* 870 */- { 141, 7, 12, 0, 0, 141, 0, }, /* 871 */- { 141, 12, 3, 0, 0, 141, 0, }, /* 872 */- { 141, 10, 5, 0, 0, 141, 0, }, /* 873 */- { 141, 7, 4, 0, 0, 141, 0, }, /* 874 */- { 141, 21, 12, 0, 0, 141, 0, }, /* 875 */- { 140, 7, 12, 0, 0, 140, 0, }, /* 876 */- { 140, 12, 3, 0, 0, 140, 0, }, /* 877 */- { 140, 10, 5, 0, 0, 140, 0, }, /* 878 */- { 140, 7, 4, 0, 0, 140, 0, }, /* 879 */- { 140, 21, 12, 0, 0, 140, 0, }, /* 880 */- { 122, 7, 12, 0, 0, 122, 0, }, /* 881 */- { 133, 7, 12, 0, 0, 133, 0, }, /* 882 */- { 133, 10, 5, 0, 0, 133, 0, }, /* 883 */- { 133, 12, 3, 0, 0, 133, 0, }, /* 884 */- { 133, 21, 12, 0, 0, 133, 0, }, /* 885 */- { 133, 13, 12, 0, 0, 133, 0, }, /* 886 */- { 133, 15, 12, 0, 0, 133, 0, }, /* 887 */- { 134, 21, 12, 0, 0, 134, 0, }, /* 888 */- { 134, 7, 12, 0, 0, 134, 0, }, /* 889 */- { 134, 12, 3, 0, 0, 134, 0, }, /* 890 */- { 134, 10, 5, 0, 0, 134, 0, }, /* 891 */- { 138, 7, 12, 0, 0, 138, 0, }, /* 892 */- { 138, 12, 3, 0, 0, 138, 0, }, /* 893 */- { 138, 7, 4, 0, 0, 138, 0, }, /* 894 */- { 138, 13, 12, 0, 0, 138, 0, }, /* 895 */- { 143, 7, 12, 0, 0, 143, 0, }, /* 896 */- { 143, 10, 5, 0, 0, 143, 0, }, /* 897 */- { 143, 12, 3, 0, 0, 143, 0, }, /* 898 */- { 143, 13, 12, 0, 0, 143, 0, }, /* 899 */- { 145, 7, 12, 0, 0, 145, 0, }, /* 900 */- { 145, 12, 3, 0, 0, 145, 0, }, /* 901 */- { 145, 10, 5, 0, 0, 145, 0, }, /* 902 */- { 145, 21, 12, 0, 0, 145, 0, }, /* 903 */- { 54, 15, 12, 0, 0, 54, 0, }, /* 904 */- { 54, 21, 12, 0, 0, 54, 0, }, /* 905 */- { 63, 7, 12, 0, 0, 63, 0, }, /* 906 */- { 63, 14, 12, 0, 0, 63, 0, }, /* 907 */- { 63, 21, 12, 0, 0, 63, 0, }, /* 908 */- { 80, 7, 12, 0, 0, 80, 0, }, /* 909 */- { 80, 1, 2, 0, 0, 80, 0, }, /* 910 */- { 127, 7, 12, 0, 0, 127, 0, }, /* 911 */- { 115, 7, 12, 0, 0, 115, 0, }, /* 912 */- { 115, 13, 12, 0, 0, 115, 0, }, /* 913 */- { 115, 21, 12, 0, 0, 115, 0, }, /* 914 */- { 103, 7, 12, 0, 0, 103, 0, }, /* 915 */- { 103, 12, 3, 0, 0, 103, 0, }, /* 916 */- { 103, 21, 12, 0, 0, 103, 0, }, /* 917 */- { 119, 7, 12, 0, 0, 119, 0, }, /* 918 */- { 119, 12, 3, 0, 0, 119, 0, }, /* 919 */- { 119, 21, 12, 0, 0, 119, 0, }, /* 920 */- { 119, 26, 12, 0, 0, 119, 0, }, /* 921 */- { 119, 6, 12, 0, 0, 119, 0, }, /* 922 */- { 119, 13, 12, 0, 0, 119, 0, }, /* 923 */- { 119, 15, 12, 0, 0, 119, 0, }, /* 924 */- { 146, 9, 12, 0, 32, 146, 0, }, /* 925 */- { 146, 5, 12, 0, -32, 146, 0, }, /* 926 */- { 146, 15, 12, 0, 0, 146, 0, }, /* 927 */- { 146, 21, 12, 0, 0, 146, 0, }, /* 928 */- { 99, 7, 12, 0, 0, 99, 0, }, /* 929 */- { 99, 12, 3, 0, 0, 99, 0, }, /* 930 */- { 99, 10, 5, 0, 0, 99, 0, }, /* 931 */- { 99, 6, 12, 0, 0, 99, 0, }, /* 932 */- { 137, 6, 12, 0, 0, 137, 0, }, /* 933 */- { 139, 6, 12, 0, 0, 139, 0, }, /* 934 */- { 155, 12, 3, 0, 0, 155, 0, }, /* 935 */- { 23, 10, 5, 0, 0, 23, 0, }, /* 936 */- { 137, 7, 12, 0, 0, 137, 0, }, /* 937 */- { 155, 7, 12, 0, 0, 155, 0, }, /* 938 */- { 139, 7, 12, 0, 0, 139, 0, }, /* 939 */- { 105, 7, 12, 0, 0, 105, 0, }, /* 940 */- { 105, 26, 12, 0, 0, 105, 0, }, /* 941 */- { 105, 12, 3, 0, 0, 105, 0, }, /* 942 */- { 105, 21, 12, 0, 0, 105, 0, }, /* 943 */- { 10, 1, 2, 0, 0, 105, 0, }, /* 944 */- { 10, 10, 3, 0, 0, 10, 0, }, /* 945 */- { 10, 10, 5, 0, 0, 10, 0, }, /* 946 */- { 20, 12, 3, 0, 0, 20, 0, }, /* 947 */- { 131, 26, 12, 0, 0, 131, 0, }, /* 948 */- { 131, 12, 3, 0, 0, 131, 0, }, /* 949 */- { 131, 21, 12, 0, 0, 131, 0, }, /* 950 */- { 18, 12, 3, 0, 0, 18, 0, }, /* 951 */- { 151, 7, 12, 0, 0, 151, 0, }, /* 952 */- { 151, 12, 3, 0, 0, 151, 0, }, /* 953 */- { 151, 6, 12, 0, 0, 151, 0, }, /* 954 */- { 151, 13, 12, 0, 0, 151, 0, }, /* 955 */- { 151, 26, 12, 0, 0, 151, 0, }, /* 956 */- { 152, 7, 12, 0, 0, 152, 0, }, /* 957 */- { 152, 12, 3, 0, 0, 152, 0, }, /* 958 */- { 152, 13, 12, 0, 0, 152, 0, }, /* 959 */- { 152, 23, 12, 0, 0, 152, 0, }, /* 960 */- { 113, 7, 12, 0, 0, 113, 0, }, /* 961 */- { 113, 15, 12, 0, 0, 113, 0, }, /* 962 */- { 113, 12, 3, 0, 0, 113, 0, }, /* 963 */- { 132, 9, 12, 0, 34, 132, 0, }, /* 964 */- { 132, 5, 12, 0, -34, 132, 0, }, /* 965 */- { 132, 12, 3, 0, 0, 132, 0, }, /* 966 */- { 132, 6, 12, 0, 0, 132, 0, }, /* 967 */- { 132, 13, 12, 0, 0, 132, 0, }, /* 968 */- { 132, 21, 12, 0, 0, 132, 0, }, /* 969 */- { 0, 2, 14, 0, 0, 0, 0, }, /* 970 */- { 10, 26, 11, 0, 0, 10, 0, }, /* 971 */- { 27, 26, 12, 0, 0, 27, 0, }, /* 972 */- { 10, 24, 3, 0, 0, 10, 0, }, /* 973 */- { 10, 1, 3, 0, 0, 10, 0, }, /* 974 */-};--const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* U+0000 */- 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* U+0800 */- 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 41, 42, 43, 44, 45, /* U+1000 */- 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, /* U+1800 */- 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, /* U+2000 */- 77, 77, 78, 79, 66, 66, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, /* U+2800 */- 90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 98, 98, 98, 98, 98, 98, /* U+3000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+3800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+4000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 98, 98, 98, 98, /* U+4800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+5000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+5800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+6000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+6800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+7000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+7800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+9000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,100, /* U+9800 */-101,102,102,102,102,102,102,102,102,103,104,104,105,106,107,108, /* U+A000 */-109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,117, /* U+A800 */-118,119,120,121,122,123,117,118,119,120,121,122,123,117,118,119, /* U+B000 */-120,121,122,123,117,118,119,120,121,122,123,117,118,119,120,121, /* U+B800 */-122,123,117,118,119,120,121,122,123,117,118,119,120,121,122,123, /* U+C000 */-117,118,119,120,121,122,123,117,118,119,120,121,122,123,117,118, /* U+C800 */-119,120,121,122,123,117,118,119,120,121,122,123,117,118,119,124, /* U+D000 */-125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+D800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+E000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+E800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F000 */-126,126, 98, 98,127,128,129,130,131,131,132,133,134,135,136,137, /* U+F800 */-138,139,140,141,142,143,144,145,146,147,148,142,149,149,150,142, /* U+10000 */-151,152,153,154,155,156,157,158,159,160,161,142,162,163,164,165, /* U+10800 */-166,167,168,169,170,171,172,142,173,174,142,175,176,177,178,142, /* U+11000 */-179,180,181,182,183,184,142,142,185,186,187,188,142,189,142,190, /* U+11800 */-191,191,191,191,191,191,191,192,193,191,194,142,142,142,142,142, /* U+12000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+12800 */-195,195,195,195,195,195,195,195,196,142,142,142,142,142,142,142, /* U+13000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+13800 */-142,142,142,142,142,142,142,142,197,197,197,197,198,142,142,142, /* U+14000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+14800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+15800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+16000 */-199,199,199,199,200,201,202,203,142,142,142,142,204,205,206,207, /* U+16800 */-208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, /* U+17000 */-208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,208, /* U+17800 */-208,208,208,208,208,208,208,208,208,208,208,208,208,208,208,209, /* U+18000 */-208,208,208,208,208,208,210,210,210,211,212,142,142,142,142,142, /* U+18800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+19800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1A800 */-213,214,215,216,216,217,142,142,142,142,142,142,142,142,142,142, /* U+1B000 */-142,142,142,142,142,142,142,142,218,219,142,142,142,142,142,142, /* U+1B800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+1C800 */- 71,220,221,222,223,224,225,142,226,227,228,229,230,231,232,233, /* U+1D000 */-234,234,234,234,235,236,142,142,142,142,142,142,142,142,142,142, /* U+1D800 */-237,142,238,142,142,239,142,142,142,142,142,142,142,142,142,142, /* U+1E000 */-240,241,242,142,142,142,142,142,243,244,245,142,246,247,142,142, /* U+1E800 */-248,249,250,251,252,253,254,255,254,254,256,254,257,258,259,260, /* U+1F000 */-261,262,263,264,265,266, 71,267,253,253,253,253,253,253,253,268, /* U+1F800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+22000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+22800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+23000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+23800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+24000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+24800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+25000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+25800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+26000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+26800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+27000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+27800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,269, 98, 98, /* U+2A000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2A800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,270, 98, /* U+2B000 */-271, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2C000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,272, 98, 98, /* U+2C800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2E000 */- 98, 98, 98, 98, 98, 98, 98,273,142,142,142,142,142,142,142,142, /* U+2E800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+2F000 */- 98, 98, 98, 98,274,142,142,142,142,142,142,142,142,142,142,142, /* U+2F800 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30000 */- 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30800 */- 98, 98, 98, 98, 98, 98,275,142,142,142,142,142,142,142,142,142, /* U+31000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+31800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+32800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+33000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+33800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+34000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+34800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+35000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+35800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+36000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+36800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+37000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+37800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+38000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+38800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+39000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+39800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3A000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3A800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3B000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3B800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3C000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3C800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3D000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3D800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3E000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3E800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3F000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+3F800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+40000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+40800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+41000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+41800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+42000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+42800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+43000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+43800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+44000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+44800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+45000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+45800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+46000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+46800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+47000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+47800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+48000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+48800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+49000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+49800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4A000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4A800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4B000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4B800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4C000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4C800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4D000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4D800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4E000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4E800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4F000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+4F800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+50000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+50800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+51000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+51800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+52000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+52800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+53000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+53800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+54000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+54800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+55000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+55800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+56000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+56800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+57000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+57800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+58000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+58800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+59000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+59800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5A000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5A800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5B000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5B800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5C000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5C800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5D000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5D800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5E000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5E800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5F000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+5F800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+60000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+60800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+61000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+61800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+62000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+62800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+63000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+63800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+64000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+64800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+65000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+65800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+66000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+66800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+67000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+67800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+68000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+68800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+69000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+69800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6A000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6A800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6B000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6B800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6C000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6C800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6D000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6D800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6E000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6E800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6F000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+6F800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+70000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+70800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+71000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+71800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+72000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+72800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+73000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+73800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+74000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+74800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+75000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+75800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+76000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+76800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+77000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+77800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+78000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+78800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+79000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+79800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7A000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7A800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7B000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7B800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7C000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7C800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7D000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7D800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7E000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7E800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7F000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+7F800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+80000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+80800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+81000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+81800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+82000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+82800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+83000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+83800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+84000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+84800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+85000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+85800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+86000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+86800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+87000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+87800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+88000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+88800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+89000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+89800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8A000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8A800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8B000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8B800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8C000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8C800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8D000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8D800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8E000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8E800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8F000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+8F800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+90000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+90800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+91000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+91800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+92000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+92800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+93000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+93800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+94000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+94800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+95000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+95800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+96000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+96800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+97000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+97800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+98000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+98800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+99000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+99800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9A000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9A800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9B000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9B800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9C000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9C800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9D000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9D800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9E000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9E800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9F000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+9F800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A0000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A0800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A1000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A1800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A2000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A2800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A3000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A3800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A4000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A4800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A5000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A5800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A6000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A6800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A7000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A7800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A8000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A8800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A9000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+A9800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AA000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AA800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AB000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AB800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AC000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AC800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AD000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AD800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AE000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AE800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AF000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+AF800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B0000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B0800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B1000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B1800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B2000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B2800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B3000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B3800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B4000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B4800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B5000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B5800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B6000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B6800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B7000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B7800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B8000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B8800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B9000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+B9800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BA000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BA800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BB000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BB800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BC000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BC800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BD000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BD800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BE000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BE800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BF000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+BF800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C0000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C0800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C1000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C1800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C2000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C2800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C3000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C3800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C4000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C4800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C5000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C5800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C6000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C6800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C7000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C7800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C8000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C8800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C9000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+C9800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CA000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CA800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CB000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CB800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CC000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CC800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CD000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CD800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CE000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CE800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CF000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+CF800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D0000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D0800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D1000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D1800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D2000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D2800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D3000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D3800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D4000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D4800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D5000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D5800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D6000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D6800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D7000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D7800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D8000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D8800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D9000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+D9800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DA000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DA800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DB000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DB800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DC000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DC800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DD000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DD800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DE800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+DF800 */-276,277,278,279,277,277,277,277,277,277,277,277,277,277,277,277, /* U+E0000 */-277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277, /* U+E0800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E1800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E2800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E3000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E3800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E4000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E4800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E5000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E5800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E6000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E6800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E7000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E7800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E8000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E8800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E9000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+E9800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EA000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EA800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EB000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EB800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EC000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EC800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+ED000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+ED800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EE000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EE800 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EF000 */-142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, /* U+EF800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F0000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F0800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F1000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F1800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F2000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F2800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F3000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F3800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F4000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F4800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F5000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F5800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F6000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F6800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F7000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F7800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F8000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F8800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F9000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+F9800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FA000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FA800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FB000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FB800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FC000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FC800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FD000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FD800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FE800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+FF000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,280, /* U+FF800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+100800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+101800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+102000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+102800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+103000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+103800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+104000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+104800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+105000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+105800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+106000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+106800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+107000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+107800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+108000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+108800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+109000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+109800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10A000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10A800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10B000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10B800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10C000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10C800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10D000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10D800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10E800 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,126, /* U+10F000 */-126,126,126,126,126,126,126,126,126,126,126,126,126,126,126,280, /* U+10F800 */-};--const uint16_t PRIV(ucd_stage2)[] = { /* 71936 bytes, block = 128 */-/* block 0 */- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1,- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,- 4, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5,- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5,- 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12,- 12, 12, 12, 14, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16,- 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 17, 17, 17, 17,- 17, 17, 17, 19, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 1,--/* block 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,- 4, 5, 6, 6, 6, 6, 20, 5, 15, 21, 22, 23, 9, 24, 21, 15,- 20, 9, 25, 25, 15, 26, 5, 5, 15, 25, 22, 27, 25, 25, 25, 5,- 12, 12, 12, 12, 12, 28, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,- 12, 12, 12, 12, 12, 12, 12, 9, 12, 12, 12, 12, 12, 12, 12, 29,- 17, 17, 17, 17, 17, 30, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,- 17, 17, 17, 17, 17, 17, 17, 9, 17, 17, 17, 17, 17, 17, 17, 31,--/* block 2 */- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 34, 35, 32, 33, 32, 33, 32, 33, 35, 32, 33, 32, 33, 32, 33, 32,- 33, 32, 33, 32, 33, 32, 33, 32, 33, 35, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 36, 32, 33, 32, 33, 32, 33, 37,--/* block 3 */- 38, 39, 32, 33, 32, 33, 40, 32, 33, 41, 41, 32, 33, 35, 42, 43,- 44, 32, 33, 41, 45, 46, 47, 48, 32, 33, 49, 35, 47, 50, 51, 52,- 32, 33, 32, 33, 32, 33, 53, 32, 33, 53, 35, 35, 32, 33, 53, 32,- 33, 54, 54, 32, 33, 32, 33, 55, 32, 33, 35, 22, 32, 33, 35, 56,- 22, 22, 22, 22, 57, 58, 59, 60, 61, 62, 63, 64, 65, 32, 33, 32,- 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 66, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 35, 67, 68, 69, 32, 33, 70, 71, 32, 33, 32, 33, 32, 33, 32, 33,--/* block 4 */- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 72, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 35, 35, 35, 35, 35, 35, 73, 32, 33, 74, 75, 76,- 76, 32, 33, 77, 78, 79, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 80, 81, 82, 83, 84, 35, 85, 85, 35, 86, 35, 87, 88, 35, 35, 35,- 85, 89, 35, 90, 35, 91, 92, 35, 93, 94, 92, 95, 96, 35, 35, 94,- 35, 97, 98, 35, 35, 99, 35, 35, 35, 35, 35, 35, 35,100, 35, 35,--/* block 5 */-101, 35,102,101, 35, 35, 35,103,101,104,105,105,106, 35, 35, 35,- 35, 35,107, 35, 22, 35, 35, 35, 35, 35, 35, 35, 35,108,109, 35,- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,-110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,-111,111, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111,111,-111,111, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,-110,110,110,110,110, 15, 15, 15, 15, 15,112,112,111, 15,111, 15,- 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,--/* block 6 */-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,114,113,113,115,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,116,116,116,116,116,116,116,116,116,116,116,116,116,-117,118,117,118,111,119,117,118,120,120,121,122,122,122, 5,123,--/* block 7 */-120,120,120,120,119, 15,124, 5,125,125,125,120,126,120,127,127,-128,129,130,129,129,131,129,129,132,133,134,129,135,129,129,129,-136,137,120,138,129,129,139,129,129,140,129,129,141,142,142,142,-128,143,144,143,143,145,143,143,146,147,148,143,149,143,143,143,-150,151,152,153,143,143,154,143,143,155,143,143,156,157,157,158,-159,160,161,161,161,162,163,164,117,118,117,118,117,118,117,118,-117,118,165,166,165,166,165,166,165,166,165,166,165,166,165,166,-167,168,169,170,171,172,173,117,118,174,117,118,128,175,175,175,--/* block 8 */-176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,-177,177,178,177,179,177,177,177,177,177,177,177,177,177,180,177,-177,181,182,177,177,177,177,177,177,177,183,177,177,177,177,177,-184,184,185,184,186,184,184,184,184,184,184,184,184,184,187,184,-184,188,189,184,184,184,184,184,184,184,190,184,184,184,184,184,-191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,-192,193,194,195,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,--/* block 9 */-192,193,196,197,198,199,199,198,200,200,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-201,192,193,192,193,192,193,192,193,192,193,192,193,192,193,202,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,--/* block 10 */-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-120,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,-203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,-203,203,203,203,203,203,203,120,120,204,205,205,205,205,205,205,-206,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,-207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,--/* block 11 */-207,207,207,207,207,207,207,206,206,205,208,120,120,209,209,210,-120,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,-211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,-211,211,211,211,211,211,211,211,211,211,211,211,211,211,212,211,-213,211,211,213,211,211,213,211,120,120,120,120,120,120,120,120,-214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,-214,214,214,214,214,214,214,214,214,214,214,120,120,120,120,214,-214,214,214,213,213,120,120,120,120,120,120,120,120,120,120,120,--/* block 12 */-215,215,215,215,215,216,217,217,217,218,218,219,220,218,221,221,-222,222,222,222,222,222,222,222,222,222,222,220,223,120,218,220,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-225,224,224,224,224,224,224,224,224,224,224,226,226,226,226,226,-226,226,226,226,226,226,222,222,222,222,222,222,222,222,222,222,-227,227,227,227,227,227,227,227,227,227,218,218,218,218,224,224,-226,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,--/* block 13 */-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,228,224,222,222,222,222,222,222,222,216,221,222,-222,222,222,222,222,229,229,222,222,221,222,222,222,222,224,224,-230,230,230,230,230,230,230,230,230,230,224,224,224,221,221,224,--/* block 14 */-231,231,231,231,231,231,231,231,231,231,231,231,231,231,120,232,-233,234,233,233,233,233,233,233,233,233,233,233,233,233,233,233,-233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,233,-234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,-234,234,234,234,234,234,234,234,234,234,234,120,120,233,233,233,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,--/* block 15 */-235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,-235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,-235,235,235,235,235,235,236,236,236,236,236,236,236,236,236,236,-236,235,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-237,237,237,237,237,237,237,237,237,237,238,238,238,238,238,238,-238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,238,-238,238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,-239,239,239,239,240,240,241,242,242,242,240,120,120,239,243,243,--/* block 16 */-244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,244,-244,244,244,244,244,244,245,245,245,245,246,245,245,245,245,245,-245,245,245,245,246,245,245,245,246,245,245,245,245,245,120,120,-247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,120,-248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,-248,248,248,248,248,248,248,248,248,249,249,249,120,120,250,120,-233,233,233,233,233,233,233,233,233,233,233,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 17 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,120,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,120,120,120,120,120,120,120,120,-120,120,120,222,222,222,222,222,222,222,222,222,222,222,222,222,-222,222,216,222,222,222,222,222,222,222,222,222,222,222,222,222,-222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,--/* block 18 */-251,251,251,252,253,253,253,253,253,253,253,253,253,253,253,253,-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,-253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,-253,253,253,253,253,253,253,253,253,253,251,252,251,253,252,252,-252,251,251,251,251,251,251,251,251,252,252,252,252,251,252,252,-253,254,255,113,113,251,251,251,253,253,253,253,253,253,253,253,-253,253,251,251,256,257,258,258,258,258,258,258,258,258,258,258,-259,260,253,253,253,253,253,253,253,253,253,253,253,253,253,253,--/* block 19 */-261,262,263,263,120,261,261,261,261,261,261,261,261,120,120,261,-261,120,120,261,261,261,261,261,261,261,261,261,261,261,261,261,-261,261,261,261,261,261,261,261,261,120,261,261,261,261,261,261,-261,120,261,120,120,120,261,261,261,261,120,120,262,261,264,263,-263,262,262,262,262,120,120,263,263,120,120,263,263,262,261,120,-120,120,120,120,120,120,120,264,120,120,120,120,261,261,120,261,-261,261,262,262,120,120,265,265,265,265,265,265,265,265,265,265,-261,261,266,266,267,267,267,267,267,267,268,266,261,269,262,120,--/* block 20 */-120,270,270,271,120,272,272,272,272,272,272,120,120,120,120,272,-272,120,120,272,272,272,272,272,272,272,272,272,272,272,272,272,-272,272,272,272,272,272,272,272,272,120,272,272,272,272,272,272,-272,120,272,272,120,272,272,120,272,272,120,120,270,120,271,271,-271,270,270,120,120,120,120,270,270,120,120,270,270,270,120,120,-120,270,120,120,120,120,120,120,120,272,272,272,272,120,272,120,-120,120,120,120,120,120,273,273,273,273,273,273,273,273,273,273,-270,270,272,272,272,270,274,120,120,120,120,120,120,120,120,120,--/* block 21 */-120,275,275,276,120,277,277,277,277,277,277,277,277,277,120,277,-277,277,120,277,277,277,277,277,277,277,277,277,277,277,277,277,-277,277,277,277,277,277,277,277,277,120,277,277,277,277,277,277,-277,120,277,277,120,277,277,277,277,277,120,120,275,277,276,276,-276,275,275,275,275,275,120,275,275,276,120,276,276,275,120,120,-277,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-277,277,275,275,120,120,278,278,278,278,278,278,278,278,278,278,-279,280,120,120,120,120,120,120,120,277,275,275,275,275,275,275,--/* block 22 */-120,281,282,282,120,283,283,283,283,283,283,283,283,120,120,283,-283,120,120,283,283,283,283,283,283,283,283,283,283,283,283,283,-283,283,283,283,283,283,283,283,283,120,283,283,283,283,283,283,-283,120,283,283,120,283,283,283,283,283,120,120,281,283,284,281,-282,281,281,281,281,120,120,282,282,120,120,282,282,281,120,120,-120,120,120,120,120,281,281,284,120,120,120,120,283,283,120,283,-283,283,281,281,120,120,285,285,285,285,285,285,285,285,285,285,-286,283,287,287,287,287,287,287,120,120,120,120,120,120,120,120,--/* block 23 */-120,120,288,289,120,289,289,289,289,289,289,120,120,120,289,289,-289,120,289,289,289,289,120,120,120,289,289,120,289,120,289,289,-120,120,120,289,289,120,120,120,289,289,289,120,120,120,289,289,-289,289,289,289,289,289,289,289,289,289,120,120,120,120,290,291,-288,291,291,120,120,120,291,291,291,120,291,291,291,288,120,120,-289,120,120,120,120,120,120,290,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,292,292,292,292,292,292,292,292,292,292,-293,293,293,294,295,295,295,295,295,296,295,120,120,120,120,120,--/* block 24 */-297,298,298,298,297,299,299,299,299,299,299,299,299,120,299,299,-299,120,299,299,299,299,299,299,299,299,299,299,299,299,299,299,-299,299,299,299,299,299,299,299,299,120,299,299,299,299,299,299,-299,299,299,299,299,299,299,299,299,299,120,120,120,299,297,297,-297,298,298,298,298,120,297,297,297,120,297,297,297,297,120,120,-120,120,120,120,120,297,297,120,299,299,299,120,120,120,120,120,-299,299,297,297,120,120,300,300,300,300,300,300,300,300,300,300,-120,120,120,120,120,120,120,301,302,302,302,302,302,302,302,303,--/* block 25 */-304,305,306,306,307,304,304,304,304,304,304,304,304,120,304,304,-304,120,304,304,304,304,304,304,304,304,304,304,304,304,304,304,-304,304,304,304,304,304,304,304,304,120,304,304,304,304,304,304,-304,304,304,304,120,304,304,304,304,304,120,120,305,304,306,305,-306,306,308,306,306,120,305,306,306,120,306,306,305,305,120,120,-120,120,120,120,120,308,308,120,120,120,120,120,120,120,304,120,-304,304,305,305,120,120,309,309,309,309,309,309,309,309,309,309,-120,304,304,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 26 */-310,310,311,311,312,312,312,312,312,312,312,312,312,120,312,312,-312,120,312,312,312,312,312,312,312,312,312,312,312,312,312,312,-312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,312,-312,312,312,312,312,312,312,312,312,312,312,310,310,312,313,311,-311,310,310,310,310,120,311,311,311,120,311,311,311,310,314,315,-120,120,120,120,312,312,312,313,316,316,316,316,316,316,316,312,-312,312,310,310,120,120,317,317,317,317,317,317,317,317,317,317,-316,316,316,316,316,316,316,316,316,315,312,312,312,312,312,312,--/* block 27 */-120,318,319,319,120,320,320,320,320,320,320,320,320,320,320,320,-320,320,320,320,320,320,320,120,120,120,320,320,320,320,320,320,-320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,320,-320,320,120,320,320,320,320,320,320,320,320,320,120,320,120,120,-320,320,320,320,320,320,320,120,120,120,318,120,120,120,120,321,-319,319,318,318,318,120,318,120,319,319,319,319,319,319,319,321,-120,120,120,120,120,120,322,322,322,322,322,322,322,322,322,322,-120,120,319,319,323,120,120,120,120,120,120,120,120,120,120,120,--/* block 28 */-120,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,-324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,324,-324,325,324,326,325,325,325,325,325,325,325,120,120,120,120, 6,-324,324,324,324,324,324,327,325,325,325,325,325,325,325,325,328,-329,329,329,329,329,329,329,329,329,329,328,328,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 29 */-120,330,330,120,330,120,330,330,330,330,330,120,330,330,330,330,-330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,-330,330,330,330,120,330,120,330,330,330,330,330,330,330,330,330,-330,331,330,332,331,331,331,331,331,331,331,331,331,330,120,120,-330,330,330,330,330,120,333,120,331,331,331,331,331,331,120,120,-334,334,334,334,334,334,334,334,334,334,120,120,330,330,330,330,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 30 */-335,336,336,336,337,337,337,337,337,337,337,337,337,337,337,337,-337,337,337,336,337,336,336,336,338,338,336,336,336,336,336,336,-339,339,339,339,339,339,339,339,339,339,340,340,340,340,340,340,-340,340,340,340,336,338,336,338,336,338,341,342,341,342,343,343,-335,335,335,335,335,335,335,335,120,335,335,335,335,335,335,335,-335,335,335,335,335,335,335,335,335,335,335,335,335,335,335,335,-335,335,335,335,335,335,335,335,335,335,335,335,335,120,120,120,-120,338,338,338,338,338,338,338,338,338,338,338,338,338,338,343,--/* block 31 */-338,338,338,338,338,337,338,338,335,335,335,335,335,338,338,338,-338,338,338,338,338,338,338,338,120,338,338,338,338,338,338,338,-338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,338,-338,338,338,338,338,338,338,338,338,338,338,338,338,120,336,336,-336,336,336,336,336,336,338,336,336,336,336,336,336,120,336,336,-337,337,337,337,337, 20, 20, 20, 20,337,337,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 32 */-344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,-344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,-344,344,344,344,344,344,344,344,344,344,344,345,345,346,346,346,-346,347,346,346,346,346,346,346,345,346,346,347,347,346,346,344,-348,348,348,348,348,348,348,348,348,348,349,349,349,349,349,349,-344,344,344,344,344,344,347,347,346,346,344,344,344,344,346,346,-346,344,345,345,345,344,344,345,345,345,345,345,345,345,344,344,-344,346,346,346,346,344,344,344,344,344,344,344,344,344,344,344,--/* block 33 */-344,344,346,345,347,346,346,345,345,345,345,345,345,346,344,345,-350,350,350,350,350,350,350,350,350,350,345,345,345,346,351,351,-352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,-352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,352,-352,352,352,352,352,352,120,352,120,120,120,120,120,352,120,120,-353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,-353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,353,-353,353,353,353,353,353,353,353,353,353,353,354,355,353,353,353,--/* block 34 */-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,-357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,-357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,--/* block 35 */-357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,-357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,-357,357,357,357,357,357,357,357,358,358,358,358,358,358,358,358,-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,--/* block 36 */-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,120,359,359,359,359,120,120,-359,359,359,359,359,359,359,120,359,120,359,359,359,359,120,120,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,--/* block 37 */-359,359,359,359,359,359,359,359,359,120,359,359,359,359,120,120,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,120,-359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,--/* block 38 */-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,120,359,359,359,359,120,120,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,359,359,359,359,120,120,360,360,360,-361,361,361,361,361,361,361,361,361,362,362,362,362,362,362,362,-362,362,362,362,362,362,362,362,362,362,362,362,362,120,120,120,--/* block 39 */-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-363,363,363,363,363,363,363,363,363,363,120,120,120,120,120,120,-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,-364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,364,-365,365,365,365,365,365,120,120,366,366,366,366,366,366,120,120,--/* block 40 */-367,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,--/* block 41 */-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,--/* block 42 */-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,369,370,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,--/* block 43 */-371,372,372,372,372,372,372,372,372,372,372,372,372,372,372,372,-372,372,372,372,372,372,372,372,372,372,372,373,374,120,120,120,-375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,-375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,-375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,-375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,375,-375,375,375,375,375,375,375,375,375,375,375, 5, 5, 5,376,376,-376,375,375,375,375,375,375,375,375,120,120,120,120,120,120,120,--/* block 44 */-377,377,377,377,377,377,377,377,377,377,377,377,377,120,377,377,-377,377,378,378,378,120,120,120,120,120,120,120,120,120,120,120,-379,379,379,379,379,379,379,379,379,379,379,379,379,379,379,379,-379,379,380,380,380,381,381,120,120,120,120,120,120,120,120,120,-382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,-382,382,383,383,120,120,120,120,120,120,120,120,120,120,120,120,-384,384,384,384,384,384,384,384,384,384,384,384,384,120,384,384,-384,120,385,385,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 45 */-386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,-386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,-386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,-386,386,386,386,387,387,388,387,387,387,387,387,387,387,388,388,-388,388,388,388,388,388,387,388,388,387,387,387,387,387,387,387,-387,387,387,387,389,389,389,390,389,389,389,391,386,387,120,120,-392,392,392,392,392,392,392,392,392,392,120,120,120,120,120,120,-393,393,393,393,393,393,393,393,393,393,120,120,120,120,120,120,--/* block 46 */-394,394,395,395,394,395,396,394,394,394,394,397,397,397,398,120,-399,399,399,399,399,399,399,399,399,399,120,120,120,120,120,120,-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,-400,400,400,401,400,400,400,400,400,400,400,400,400,400,400,400,-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,-400,400,400,400,400,400,400,400,400,120,120,120,120,120,120,120,--/* block 47 */-400,400,400,400,400,397,397,400,400,400,400,400,400,400,400,400,-400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,400,-400,400,400,400,400,400,400,400,400,397,400,120,120,120,120,120,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,368,-368,368,368,368,368,368,120,120,120,120,120,120,120,120,120,120,--/* block 48 */-402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,-402,402,402,402,402,402,402,402,402,402,402,402,402,402,402,120,-403,403,403,404,404,404,404,403,403,404,404,404,120,120,120,120,-404,404,403,404,404,404,404,404,404,403,403,403,120,120,120,120,-405,120,120,120,406,406,407,407,407,407,407,407,407,407,407,407,-408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,408,-408,408,408,408,408,408,408,408,408,408,408,408,408,408,120,120,-408,408,408,408,408,120,120,120,120,120,120,120,120,120,120,120,--/* block 49 */-409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,-409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,-409,409,409,409,409,409,409,409,409,409,409,409,120,120,120,120,-409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,409,-409,409,409,409,409,409,409,409,409,409,120,120,120,120,120,120,-410,410,410,410,410,410,410,410,410,410,411,120,120,120,412,412,-413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,-413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,--/* block 50 */-414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,414,-414,414,414,414,414,414,414,415,415,416,416,415,120,120,417,417,-418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,-418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,-418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,-418,418,418,418,418,419,420,419,420,420,420,420,420,420,420,120,-420,421,420,421,421,420,420,420,420,420,420,420,420,419,419,419,-419,419,419,420,420,420,420,420,420,420,420,420,420,120,120,420,--/* block 51 */-422,422,422,422,422,422,422,422,422,422,120,120,120,120,120,120,-422,422,422,422,422,422,422,422,422,422,120,120,120,120,120,120,-423,423,423,423,423,423,423,424,423,423,423,423,423,423,120,120,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,425,113,-113,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 52 */-426,426,426,426,427,428,428,428,428,428,428,428,428,428,428,428,-428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,-428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,428,-428,428,428,428,426,429,426,426,426,426,426,427,426,427,427,427,-427,427,426,427,427,428,428,428,428,428,428,428,120,120,120,120,-430,430,430,430,430,430,430,430,430,430,431,431,431,431,431,431,-431,432,432,432,432,432,432,432,432,432,432,426,426,426,426,426,-426,426,426,426,432,432,432,432,432,432,432,432,432,120,120,120,--/* block 53 */-433,433,434,435,435,435,435,435,435,435,435,435,435,435,435,435,-435,435,435,435,435,435,435,435,435,435,435,435,435,435,435,435,-435,434,433,433,433,433,434,434,433,433,434,433,433,433,435,435,-436,436,436,436,436,436,436,436,436,436,435,435,435,435,435,435,-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,-437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,437,-437,437,437,437,437,437,438,439,438,438,439,439,439,438,439,438,-438,438,439,439,120,120,120,120,120,120,120,120,440,440,440,440,--/* block 54 */-441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,-441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,-441,441,441,441,442,442,442,442,442,442,442,442,443,443,443,443,-443,443,443,443,442,442,443,443,120,120,120,444,444,444,444,444,-445,445,445,445,445,445,445,445,445,445,120,120,120,441,441,441,-446,446,446,446,446,446,446,446,446,446,447,447,447,447,447,447,-447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,447,-447,447,447,447,447,447,447,447,448,448,448,448,448,448,449,449,--/* block 55 */-450,451,452,453,454,455,456,457,458,120,120,120,120,120,120,120,-459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,-459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,459,-459,459,459,459,459,459,459,459,459,459,459,120,120,459,459,459,-460,460,460,460,460,460,460,460,120,120,120,120,120,120,120,120,-461,462,461,463,462,464,464,465,464,465,466,462,465,465,462,462,-465,467,462,462,462,462,462,462,462,468,469,470,470,464,470,470,-470,470,471,472,473,469,469,474,475,475,476,120,120,120,120,120,--/* block 56 */- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,- 35, 35, 35, 35, 35, 35,128,128,128,128,128,477,110,110,110,110,-110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,-110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,-110,110,110,110,110,110,110,110,110,110,110,110,110,121,121,121,-121,121,110,110,110,110,121,121,121,121,121, 35, 35, 35, 35, 35,- 35, 35, 35, 35, 35, 35, 35, 35,478,479, 35, 35, 35,480, 35, 35,--/* block 57 */- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,481, 35,- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,110,110,110,110,110,-110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,-110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,121,-114,114,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,482,113,120,113,113,113,113,113,--/* block 58 */- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,-483,484, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,--/* block 59 */- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,485, 35, 35,486, 35,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,--/* block 60 */-487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488,-487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120,-487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488,-487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488,-487,487,487,487,487,487,120,120,488,488,488,488,488,488,120,120,-128,487,128,487,128,487,128,487,120,488,120,488,120,488,120,488,-487,487,487,487,487,487,487,487,488,488,488,488,488,488,488,488,-489,489,490,490,490,490,491,491,492,492,493,493,494,494,120,120,--/* block 61 */-487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495,-487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495,-487,487,487,487,487,487,487,487,495,495,495,495,495,495,495,495,-487,487,128,496,128,120,128,128,488,488,497,497,498,119,499,119,-119,119,128,496,128,120,128,128,500,500,500,500,498,119,119,119,-487,487,128,128,120,120,128,128,488,488,501,501,120,119,119,119,-487,487,128,128,128,169,128,128,488,488,502,502,174,119,119,119,-120,120,128,496,128,120,128,128,503,503,504,504,498,119,119,120,--/* block 62 */- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,505,506, 24, 24,- 10, 10, 10, 10, 10, 10, 5, 5, 23, 27, 7, 23, 23, 27, 7, 23,- 5, 5, 5, 5, 5, 5, 5, 5,507,508, 24, 24, 24, 24, 24,509,- 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,510, 5, 5, 16,- 16, 5, 5, 5, 9, 7, 8, 5, 5,510, 5, 5, 5, 5, 5, 5,- 5, 5, 9, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4,- 24, 24, 24, 24, 24,511, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,- 25,110,120,120, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,110,--/* block 63 */- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,120,-110,110,110,110,110,110,110,110,110,110,110,110,110,120,120,120,- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-113,113,113,113,113,113,113,113,113,113,113,113,113,425,425,425,-425,113,425,425,425,113,113,113,113,113,113,113,113,113,113,113,-512,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 64 */- 20, 20,513, 20, 20, 20, 20,513, 20, 20,514,513,513,513,514,514,-513,513,513,514, 20,513, 20, 20, 9,513,513,513,513,513, 20, 20,- 20, 20, 21, 20,513, 20,515, 20,513, 20,516,517,513,513, 20,514,-513,513,518,513,514,519,519,519,519,520, 20, 20,514,514,513,513,- 9, 9, 9, 9, 9,513,514,514,514,514, 20, 9, 20, 20,521, 20,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,-522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,522,-523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,523,--/* block 65 */-524,524,524, 32, 33,524,524,524,524, 25, 20, 20,120,120,120,120,- 9, 9, 9, 9,525, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20,- 9, 20, 20, 9, 20, 20, 9, 20, 20, 21, 21, 20, 20, 20, 9, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9,- 20, 20, 9, 20, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,--/* block 66 */- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,--/* block 67 */- 20, 20, 20, 20, 20, 20, 20, 20, 7, 8, 7, 8, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20, 20,- 9, 9, 20, 20, 20, 20, 20, 20, 21, 7, 8, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 20, 20, 20,--/* block 68 */- 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9, 9,- 9, 9, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 20, 20, 20, 20, 21, 21, 21, 20, 20, 20, 20, 20,--/* block 69 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,--/* block 70 */- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20,526,526,526,526,526,526,526,526,526,526,-526,526,527,526,526,526,526,526,526,526,526,526,526,526,526,526,-528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,-528,528,528,528,528,528,528,528,528,528, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,--/* block 71 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,--/* block 72 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 21, 9, 20, 20, 20, 20, 20, 20, 20, 20,- 21, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,525,525,525,525, 9,--/* block 73 */- 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,525,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,--/* block 74 */- 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,--/* block 75 */- 21, 21, 21, 21, 21, 21, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 20, 21, 20, 21, 20, 20, 20, 20, 20, 20, 21, 20, 20,- 20, 21, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 21, 20, 20, 21, 20, 20, 20, 20, 21, 20, 21, 20,- 20, 20, 20, 21, 21, 21, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 21, 21, 21, 21, 21, 7, 8, 7, 8, 7, 8, 7, 8,- 7, 8, 7, 8, 7, 8, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,--/* block 76 */- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25, 20, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,- 9, 9, 9, 9, 9, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,--/* block 77 */-529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,-529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,-529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,-529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,-529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,-529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,-529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,-529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,529,--/* block 78 */- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9,525,525, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,--/* block 79 */- 9, 9, 9, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7,- 8, 7, 8, 7, 8, 7, 8, 7, 8, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, 7, 8, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, 9, 9,--/* block 80 */- 20, 20, 20, 20, 20, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,- 9, 9, 9, 9, 9, 20, 20, 9, 9, 9, 9, 9, 9, 20, 20, 20,- 21, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,--/* block 81 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20,120, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,--/* block 82 */-530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,-530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,-530,530,530,530,530,530,530,530,530,530,530,530,530,530,530,120,-531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,-531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,-531,531,531,531,531,531,531,531,531,531,531,531,531,531,531,120,- 32, 33,532,533,534,535,536, 32, 33, 32, 33, 32, 33,537,538,539,-540, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,110,110,541,541,--/* block 83 */-165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,-165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,-165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,-165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,-165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,-165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,-165,166,165,166,542,543,543,543,543,543,543,165,166,165,166,544,-544,544,165,166,120,120,120,120,120,545,545,545,545,546,545,545,--/* block 84 */-547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,-547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,547,-547,547,547,547,547,547,120,547,120,120,120,120,120,547,120,120,-548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,-548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,-548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,548,-548,548,548,548,548,548,548,548,120,120,120,120,120,120,120,549,-550,120,120,120,120,120,120,120,120,120,120,120,120,120,120,551,--/* block 85 */-359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,-359,359,359,359,359,359,359,120,120,120,120,120,120,120,120,120,-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,-552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,--/* block 86 */- 5, 5, 23, 27, 23, 27, 5, 5, 5, 23, 27, 5, 23, 27, 5, 5,- 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 23, 27, 5, 5,- 23, 27, 7, 8, 7, 8, 7, 8, 7, 8, 5, 5, 5, 5, 5,111,- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 5, 5, 5, 5,- 10, 5, 7,553, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,- 20, 20, 5,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 87 */-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,120,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 88 */-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,--/* block 89 */-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,554,-554,554,554,554,554,554,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,--/* block 90 */- 4,555,555,556, 20,557,558,559,560,561,560,561,560,561,560,561,-560,561, 20,562,560,561,560,561,560,561,560,561,563,564,565,565,- 20,559,559,559,559,559,559,559,559,559,566,566,566,566,567,567,-568,569,569,569,569,569, 20,562,559,559,559,557,570,571,572,572,-120,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,--/* block 91 */-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,120,120,574,574,575,575,576,576,573,-577,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,-578,578,578,578,578,578,578,578,578,578,578,555,569,579,579,578,--/* block 92 */-120,120,120,120,120,580,580,580,580,580,580,580,580,580,580,580,-580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,-580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,-120,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,--/* block 93 */-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120,-572,572,582,582,582,582,572,572,572,572,572,572,572,572,572,572,-580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,-580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,580,-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,-572,572,572,572,120,120,120,120,120,120,120,120,120,120,120,120,-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,--/* block 94 */-583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,-583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,120,-582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572,-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,-572,572,572,572,572,572,572,572, 25, 25, 25, 25, 25, 25, 25, 25,- 20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,-583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,-583,583,583,583,583,583,583,583,583,583,583,583,583,583,583, 20,--/* block 95 */-582,582,582,582,582,582,582,582,582,582,572,572,572,572,572,572,-572,572,572,572,572,572,572,584,572,584,572,572,572,572,572,572,-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,-572, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,-572,572,572,572,572,572,572,572,572,572,572,572, 20, 20, 20, 20,-585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,-585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,-585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,572,--/* block 96 */-585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,-585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,-585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,-585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,-585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,-585,585,585,585,585,585,585,585,572,572,572,572,572,572,572,572,-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,-572, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,572,572,572,572,572,--/* block 97 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,572,-572,572,572,572,572,572,572,572,572,572,572,572,572,572,572, 20,--/* block 98 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,--/* block 99 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,--/* block 100 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,120,--/* block 101 */-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,588,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,--/* block 102 */-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,-587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,--/* block 103 */-587,587,587,587,587,587,587,587,587,587,587,587,587,120,120,120,-589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,-589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,-589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,589,-589,589,589,589,589,589,589,120,120,120,120,120,120,120,120,120,-590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,-590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,-590,590,590,590,590,590,590,590,591,591,591,591,591,591,592,592,--/* block 104 */-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,--/* block 105 */-593,593,593,593,593,593,593,593,593,593,593,593,594,595,595,595,-593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,593,-596,596,596,596,596,596,596,596,596,596,593,593,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-192,193,192,193,192,193,192,193,192,193,597,598,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,192,193,599,198,-200,200,200,600,552,552,552,552,552,552,552,552,552,552,600,478,--/* block 106 */-192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,-192,193,192,193,192,193,192,193,192,193,192,193,478,478,552,552,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,602,602,602,602,602,602,602,602,602,602,-603,603,604,604,604,604,604,604,120,120,120,120,120,120,120,120,--/* block 107 */-605,605,605,605,605,605,605,605, 15, 15, 15, 15, 15, 15, 15, 15,- 15, 15, 15, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111,- 15, 15, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,-110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,606, 32, 33,--/* block 108 */- 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,607, 35, 22,- 32, 33, 32, 33,608, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,- 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,609,610,611,612,609, 35,-613,614,615,616, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,-120,120, 32, 33,617,618,619, 32, 33, 32, 33,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120, 32, 33, 22,110,110, 35, 22, 22, 22, 22, 22,--/* block 109 */-620,620,621,620,620,620,621,620,620,620,620,621,620,620,620,620,-620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,620,-620,620,620,622,622,621,621,622,623,623,623,623,621,120,120,120,-624,624,624,625,625,625,626,626,627,626,120,120,120,120,120,120,-628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,-628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,-628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,628,-628,628,628,628,629,629,629,629,120,120,120,120,120,120,120,120,--/* block 110 */-630,630,631,631,631,631,631,631,631,631,631,631,631,631,631,631,-631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,-631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,631,-631,631,631,631,630,630,630,630,630,630,630,630,630,630,630,630,-630,630,630,630,632,632,120,120,120,120,120,120,120,120,633,633,-634,634,634,634,634,634,634,634,634,634,120,120,120,120,120,120,-251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,251,-251,635,253,636,253,253,253,253,259,259,259,253,259,253,253,251,--/* block 111 */-637,637,637,637,637,637,637,637,637,637,638,638,638,638,638,638,-638,638,638,638,638,638,638,638,638,638,638,638,638,638,638,638,-638,638,638,638,638,638,639,639,639,639,639,639,639,639,640,641,-642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,642,-642,642,642,642,642,642,642,643,643,643,643,643,643,643,643,643,-643,643,644,644,120,120,120,120,120,120,120,120,120,120,120,645,-356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,356,-356,356,356,356,356,356,356,356,356,356,356,356,356,120,120,120,--/* block 112 */-646,646,646,647,648,648,648,648,648,648,648,648,648,648,648,648,-648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,-648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,648,-648,648,648,646,647,647,646,646,646,646,647,647,646,646,647,647,-647,649,649,649,649,649,649,649,649,649,649,649,649,649,120,650,-651,651,651,651,651,651,651,651,651,651,120,120,120,120,649,649,-344,344,344,344,344,346,652,344,344,344,344,344,344,344,344,344,-350,350,350,350,350,350,350,350,350,350,344,344,344,344,344,120,--/* block 113 */-653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,-653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,-653,653,653,653,653,653,653,653,653,654,654,654,654,654,654,655,-655,654,654,655,655,654,654,120,120,120,120,120,120,120,120,120,-653,653,653,654,653,653,653,653,653,653,653,653,654,655,120,120,-656,656,656,656,656,656,656,656,656,656,120,120,657,657,657,657,-344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,344,-652,344,344,344,344,344,344,351,351,351,344,345,346,345,344,344,--/* block 114 */-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,-658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,-659,658,659,659,659,658,658,659,659,658,658,658,658,658,659,659,-658,659,658,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,658,658,660,661,661,-662,662,662,662,662,662,662,662,662,662,662,663,664,664,663,663,-665,665,662,666,666,663,664,120,120,120,120,120,120,120,120,120,--/* block 115 */-120,359,359,359,359,359,359,120,120,359,359,359,359,359,359,120,-120,359,359,359,359,359,359,120,120,120,120,120,120,120,120,120,-359,359,359,359,359,359,359,120,359,359,359,359,359,359,359,120,- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,- 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,- 35, 35, 35,667, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110,- 35, 35, 35, 35, 35,128, 35, 35, 35,110, 15, 15,120,120,120,120,-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,--/* block 116 */-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,-668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,668,-662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,-662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,662,-662,662,662,663,663,664,663,663,664,663,663,665,663,664,120,120,-669,669,669,669,669,669,669,669,669,669,120,120,120,120,120,120,--/* block 117 */-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,--/* block 118 */-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,--/* block 119 */-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,--/* block 120 */-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,--/* block 121 */-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,--/* block 122 */-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,--/* block 123 */-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-670,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,670,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,670,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,--/* block 124 */-671,671,671,671,671,671,671,671,670,671,671,671,671,671,671,671,-671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,671,-671,671,671,671,120,120,120,120,120,120,120,120,120,120,120,120,-357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,357,-357,357,357,357,357,357,357,120,120,120,120,358,358,358,358,358,-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,-358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,-358,358,358,358,358,358,358,358,358,358,358,358,120,120,120,120,--/* block 125 */-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,-672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,672,--/* block 126 */-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,--/* block 127 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,--/* block 128 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 129 */- 35, 35, 35, 35, 35, 35, 35,120,120,120,120,120,120,120,120,120,-120,120,120,206,206,206,206,206,120,120,120,120,120,214,211,214,-214,214,214,214,214,214,214,214,214,674,214,214,214,214,214,214,-214,214,214,214,214,214,214,120,214,214,214,214,214,120,214,120,-214,214,120,214,214,120,214,214,214,214,214,214,214,214,214,214,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,--/* block 130 */-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,675,675,675,675,675,675,675,675,675,675,675,675,675,675,-675,675,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,--/* block 131 */-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,--/* block 132 */-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224, 8, 7,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,--/* block 133 */-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-120,120,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-224,224,676,224,224,224,224,224,224,224,224,224,219,677,120,120,--/* block 134 */-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,- 5, 5, 5, 5, 5, 5, 5, 7, 8, 5,120,120,120,120,120,120,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,552,552,- 5, 10, 10, 16, 16, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7,- 8, 7, 8, 7, 8,556,556, 7, 8, 5, 5, 5, 5, 16, 16, 16,- 5, 5, 5,120, 5, 5, 5, 5, 10, 7, 8, 7, 8, 7, 8, 5,- 5, 5, 9, 10, 9, 9, 9,120, 5, 6, 5, 5,120,120,120,120,-224,224,224,224,224,120,224,224,224,224,224,224,224,224,224,224,--/* block 135 */-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,120,120, 24,--/* block 136 */-120, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5,- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5,- 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,- 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16,- 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,- 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 7,- 8,555,560,561,555,555,578,578,578,578,578,578,578,578,578,578,-569,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,--/* block 137 */-578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,-578,578,578,578,578,578,578,578,578,578,578,578,578,578,678,678,-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,-581,581,581,581,581,581,581,581,581,581,581,581,581,581,581,120,-120,120,581,581,581,581,581,581,120,120,581,581,581,581,581,581,-120,120,581,581,581,581,581,581,120,120,581,581,581,120,120,120,- 6, 6, 9, 15, 20, 6, 6,120, 20, 9, 9, 9, 9, 20, 20,120,-511,511,511,511,511,511,511,511,511, 24, 24, 24, 20, 20,120,120,--/* block 138 */-679,679,679,679,679,679,679,679,679,679,679,679,120,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,120,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,120,679,679,120,679,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,120,120,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 139 */-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,679,-679,679,679,679,679,679,679,679,679,679,679,120,120,120,120,120,--/* block 140 */-680,680,680,120,120,120,120,681,681,681,681,681,681,681,681,681,-681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,-681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,681,-681,681,681,681,120,120,120,682,682,682,682,682,682,682,682,682,-683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,-683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,-683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,683,-683,683,683,683,683,684,684,684,684,685,685,685,685,685,685,685,--/* block 141 */-685,685,685,685,685,685,685,685,685,685,684,684,685,685,685,120,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,-685,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,120,120,--/* block 142 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 143 */-686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,686,-686,686,686,686,686,686,686,686,686,686,686,686,686,120,120,120,-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,-687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,687,-687,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-688,689,689,689,689,689,689,689,689,689,689,689,689,689,689,689,-689,689,689,689,689,689,689,689,689,689,689,689,120,120,120,120,--/* block 144 */-690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,-690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,-691,691,691,691,120,120,120,120,120,120,120,120,120,690,690,690,-692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,-692,693,692,692,692,692,692,692,692,692,693,120,120,120,120,120,-694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,-694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,-694,694,694,694,694,694,695,695,695,695,695,120,120,120,120,120,--/* block 145 */-696,696,696,696,696,696,696,696,696,696,696,696,696,696,696,696,-696,696,696,696,696,696,696,696,696,696,696,696,696,696,120,697,-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,-698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,698,-698,698,698,698,120,120,120,120,698,698,698,698,698,698,698,698,-699,700,700,700,700,700,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 146 */-701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,-701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,-701,701,701,701,701,701,701,701,702,702,702,702,702,702,702,702,-702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,-702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,702,-703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,-703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,-703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,--/* block 147 */-704,704,704,704,704,704,704,704,704,704,704,704,704,704,704,704,-704,704,704,704,704,704,704,704,704,704,704,704,704,704,120,120,-705,705,705,705,705,705,705,705,705,705,120,120,120,120,120,120,-706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,-706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,706,-706,706,706,706,120,120,120,120,707,707,707,707,707,707,707,707,-707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,707,-707,707,707,707,707,707,707,707,707,707,707,707,120,120,120,120,--/* block 148 */-708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,-708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,-708,708,708,708,708,708,708,708,120,120,120,120,120,120,120,120,-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,-709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,-709,709,709,709,120,120,120,120,120,120,120,120,120,120,120,710,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 149 */-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,--/* block 150 */-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,711,120,120,120,120,120,120,120,120,120,-711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,-711,711,711,711,711,711,120,120,120,120,120,120,120,120,120,120,-711,711,711,711,711,711,711,711,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 151 */-712,712,712,712,712,712,120,120,712,120,712,712,712,712,712,712,-712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,-712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,712,-712,712,712,712,712,712,120,712,712,120,120,120,712,120,120,712,-713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,-713,713,713,713,713,713,120,714,715,715,715,715,715,715,715,715,-716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,-716,716,716,716,716,716,716,717,717,718,718,718,718,718,718,718,--/* block 152 */-719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,-719,719,719,719,719,719,719,719,719,719,719,719,719,719,719,120,-120,120,120,120,120,120,120,720,720,720,720,720,720,720,720,720,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,-721,721,721,120,721,721,120,120,120,120,120,722,722,722,722,722,--/* block 153 */-723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,723,-723,723,723,723,723,723,724,724,724,724,724,724,120,120,120,725,-726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,726,-726,726,726,726,726,726,726,726,726,726,120,120,120,120,120,727,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 154 */-728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,-728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,-729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,729,-729,729,729,729,729,729,729,729,120,120,120,120,730,730,729,729,-730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,-120,120,730,730,730,730,730,730,730,730,730,730,730,730,730,730,-730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,-730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,--/* block 155 */-731,732,732,732,120,732,732,120,120,120,120,120,732,732,732,732,-731,731,731,731,120,731,731,731,120,731,731,731,731,731,731,731,-731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,731,-731,731,731,731,731,731,120,120,732,732,732,120,120,120,120,732,-733,733,733,733,733,733,733,733,733,120,120,120,120,120,120,120,-734,734,734,734,734,734,734,734,734,120,120,120,120,120,120,120,-735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,-735,735,735,735,735,735,735,735,735,735,735,735,735,736,736,737,--/* block 156 */-738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,-738,738,738,738,738,738,738,738,738,738,738,738,738,739,739,739,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-740,740,740,740,740,740,740,740,741,740,740,740,740,740,740,740,-740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,-740,740,740,740,740,742,742,120,120,120,120,743,743,743,743,743,-744,744,744,744,744,744,744,120,120,120,120,120,120,120,120,120,--/* block 157 */-745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,-745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,-745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,745,-745,745,745,745,745,745,120,120,120,746,746,746,746,746,746,746,-747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,-747,747,747,747,747,747,120,120,748,748,748,748,748,748,748,748,-749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,-749,749,749,120,120,120,120,120,750,750,750,750,750,750,750,750,--/* block 158 */-751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,751,-751,751,120,120,120,120,120,120,120,752,752,752,752,120,120,120,-120,120,120,120,120,120,120,120,120,753,753,753,753,753,753,753,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 159 */-754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,-754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,-754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,-754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,754,-754,754,754,754,754,754,754,754,754,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 160 */-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,755,755,-755,755,755,120,120,120,120,120,120,120,120,120,120,120,120,120,-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,-756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,756,-756,756,756,120,120,120,120,120,120,120,757,757,757,757,757,757,--/* block 161 */-758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,-758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,758,-758,758,758,758,759,759,759,759,120,120,120,120,120,120,120,120,-760,760,760,760,760,760,760,760,760,760,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 162 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-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,761,761,761,761,761,120,--/* block 163 */-762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,-762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,762,-762,762,762,762,762,762,762,762,762,762,120,763,763,764,120,120,-762,762,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 164 */-765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,-765,765,765,765,765,765,765,765,765,765,765,765,765,766,766,766,-766,766,766,766,766,766,766,765,120,120,120,120,120,120,120,120,-767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,767,-767,767,767,767,767,767,768,768,768,768,768,768,768,768,768,768,-768,769,769,769,769,770,770,770,770,770,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 165 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,-771,771,771,771,771,772,772,772,772,772,772,772,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,773,-773,773,773,773,773,773,773,120,120,120,120,120,120,120,120,120,--/* block 166 */-774,775,774,776,776,776,776,776,776,776,776,776,776,776,776,776,-776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,-776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,776,-776,776,776,776,776,776,776,776,775,775,775,775,775,775,775,775,-775,775,775,775,775,775,775,777,777,777,777,777,777,777,120,120,-120,120,778,778,778,778,778,778,778,778,778,778,778,778,778,778,-778,778,778,778,778,778,779,779,779,779,779,779,779,779,779,779,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,775,--/* block 167 */-780,780,781,782,782,782,782,782,782,782,782,782,782,782,782,782,-782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,-782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,782,-781,781,781,780,780,780,780,781,781,780,780,783,783,784,783,783,-783,783,120,120,120,120,120,120,120,120,120,120,120,784,120,120,-785,785,785,785,785,785,785,785,785,785,785,785,785,785,785,785,-785,785,785,785,785,785,785,785,785,120,120,120,120,120,120,120,-786,786,786,786,786,786,786,786,786,786,120,120,120,120,120,120,--/* block 168 */-787,787,787,788,788,788,788,788,788,788,788,788,788,788,788,788,-788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,788,-788,788,788,788,788,788,788,787,787,787,787,787,789,787,787,787,-787,787,787,787,787,120,790,790,790,790,790,790,790,790,790,790,-791,791,791,791,788,789,789,788,120,120,120,120,120,120,120,120,-792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,-792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,792,-792,792,792,793,794,794,792,120,120,120,120,120,120,120,120,120,--/* block 169 */-795,795,796,797,797,797,797,797,797,797,797,797,797,797,797,797,-797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,-797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,797,-797,797,797,796,796,796,795,795,795,795,795,795,795,795,795,796,-796,797,798,798,797,799,799,799,799,795,795,795,795,799,796,795,-800,800,800,800,800,800,800,800,800,800,797,799,797,799,799,799,-120,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,-801,801,801,801,801,120,120,120,120,120,120,120,120,120,120,120,--/* block 170 */-802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,802,-802,802,120,802,802,802,802,802,802,802,802,802,802,802,802,802,-802,802,802,802,802,802,802,802,802,802,802,802,803,803,803,804,-804,804,803,803,804,803,804,804,805,805,805,805,805,805,804,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 171 */-806,806,806,806,806,806,806,120,806,120,806,806,806,806,120,806,-806,806,806,806,806,806,806,806,806,806,806,806,806,806,120,806,-806,806,806,806,806,806,806,806,806,807,120,120,120,120,120,120,-808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,-808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,-808,808,808,808,808,808,808,808,808,808,808,808,808,808,808,809,-810,810,810,809,809,809,809,809,809,809,809,120,120,120,120,120,-811,811,811,811,811,811,811,811,811,811,120,120,120,120,120,120,--/* block 172 */-812,813,814,815,120,816,816,816,816,816,816,816,816,120,120,816,-816,120,120,816,816,816,816,816,816,816,816,816,816,816,816,816,-816,816,816,816,816,816,816,816,816,120,816,816,816,816,816,816,-816,120,816,816,120,816,816,816,816,816,120,817,813,816,818,814,-812,814,814,814,814,120,120,814,814,120,120,814,814,814,120,120,-816,120,120,120,120,120,120,818,120,120,120,120,120,816,816,816,-816,816,814,814,120,120,812,812,812,812,812,812,812,120,120,120,-812,812,812,812,812,120,120,120,120,120,120,120,120,120,120,120,--/* block 173 */-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,-819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,819,-819,819,819,819,819,820,820,820,821,821,821,821,821,821,821,821,-820,820,821,821,821,820,821,819,819,819,819,822,822,822,822,822,-823,823,823,823,823,823,823,823,823,823,822,822,120,822,821,819,-819,819,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 174 */-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,-824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,824,-825,826,826,827,827,827,827,827,827,826,827,826,826,825,826,827,-827,826,827,827,824,824,828,824,120,120,120,120,120,120,120,120,-829,829,829,829,829,829,829,829,829,829,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 175 */-830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,-830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,-830,830,830,830,830,830,830,830,830,830,830,830,830,830,830,831,-832,832,833,833,833,833,120,120,832,832,832,832,833,833,832,833,-833,834,834,834,834,834,834,834,834,834,834,834,834,834,834,834,-834,834,834,834,834,834,834,834,830,830,830,830,833,833,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 176 */-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,-835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,835,-836,836,836,837,837,837,837,837,837,837,837,836,836,837,836,837,-837,838,838,838,835,120,120,120,120,120,120,120,120,120,120,120,-839,839,839,839,839,839,839,839,839,839,120,120,120,120,120,120,-394,394,394,394,394,394,394,394,394,394,394,394,394,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 177 */-840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,-840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,840,-840,840,840,840,840,840,840,840,840,840,840,841,842,841,842,842,-841,841,841,841,841,841,842,841,840,120,120,120,120,120,120,120,-843,843,843,843,843,843,843,843,843,843,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 178 */-844,844,844,844,844,844,844,844,844,844,844,844,844,844,844,844,-844,844,844,844,844,844,844,844,844,844,844,120,120,845,845,845,-846,846,845,845,845,845,846,845,845,845,845,845,120,120,120,120,-847,847,847,847,847,847,847,847,847,847,848,848,849,849,849,850,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 179 */-851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,-851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,851,-851,851,851,851,851,851,851,851,851,851,851,851,852,852,852,853,-853,853,853,853,853,853,853,853,852,853,853,854,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 180 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,-855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,855,-856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,-856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,856,-857,857,857,857,857,857,857,857,857,857,858,858,858,858,858,858,-858,858,858,120,120,120,120,120,120,120,120,120,120,120,120,859,--/* block 181 */-860,860,860,860,860,860,860,120,120,860,120,120,860,860,860,860,-860,860,860,860,120,860,860,120,860,860,860,860,860,860,860,860,-860,860,860,860,860,860,860,860,860,860,860,860,860,860,860,860,-861,862,862,862,862,862,120,862,862,120,120,863,863,862,863,864,-862,864,862,863,865,865,865,120,120,120,120,120,120,120,120,120,-866,866,866,866,866,866,866,866,866,866,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 182 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-867,867,867,867,867,867,867,867,120,120,867,867,867,867,867,867,-867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,-867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,867,-867,868,868,868,869,869,869,869,120,120,869,869,868,868,868,868,-869,867,870,867,868,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 183 */-871,872,872,872,872,872,872,872,872,872,872,871,871,871,871,871,-871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,-871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,-871,871,871,872,872,872,872,872,872,873,874,872,872,872,872,875,-875,875,875,875,875,875,875,872,120,120,120,120,120,120,120,120,-876,877,877,877,877,877,877,878,878,877,877,877,876,876,876,876,-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,-876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,876,--/* block 184 */-876,876,876,876,879,879,879,879,879,879,877,877,877,877,877,877,-877,877,877,877,877,877,877,878,877,877,880,880,880,876,880,880,-880,880,880,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,-881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,-881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,881,-881,881,881,881,881,881,881,881,881,120,120,120,120,120,120,120,--/* block 185 */-882,882,882,882,882,882,882,882,882,120,882,882,882,882,882,882,-882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,-882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,883,-884,884,884,884,884,884,884,120,884,884,884,884,884,884,883,884,-882,885,885,885,885,885,120,120,120,120,120,120,120,120,120,120,-886,886,886,886,886,886,886,886,886,886,887,887,887,887,887,887,-887,887,887,887,887,887,887,887,887,887,887,887,887,120,120,120,-888,888,889,889,889,889,889,889,889,889,889,889,889,889,889,889,--/* block 186 */-889,889,889,889,889,889,889,889,889,889,889,889,889,889,889,889,-120,120,890,890,890,890,890,890,890,890,890,890,890,890,890,890,-890,890,890,890,890,890,890,890,120,891,890,890,890,890,890,890,-890,891,890,890,891,890,890,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 187 */-892,892,892,892,892,892,892,120,892,892,120,892,892,892,892,892,-892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,-892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,892,-892,893,893,893,893,893,893,120,120,120,893,120,893,893,120,893,-893,893,893,893,893,893,894,893,120,120,120,120,120,120,120,120,-895,895,895,895,895,895,895,895,895,895,120,120,120,120,120,120,-896,896,896,896,896,896,120,896,896,120,896,896,896,896,896,896,-896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,--/* block 188 */-896,896,896,896,896,896,896,896,896,896,897,897,897,897,897,120,-898,898,120,897,897,898,897,898,896,120,120,120,120,120,120,120,-899,899,899,899,899,899,899,899,899,899,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 189 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-900,900,900,900,900,900,900,900,900,900,900,900,900,900,900,900,-900,900,900,901,901,902,902,903,903,120,120,120,120,120,120,120,--/* block 190 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-590,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,-293,293,904,293,904,295,295,295,295,295,295,295,295,296,296,296,-296,295,295,295,295,295,295,295,295,295,295,295,295,295,295,295,-295,295,120,120,120,120,120,120,120,120,120,120,120,120,120,905,--/* block 191 */-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,--/* block 192 */-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 193 */-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,-907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,120,-908,908,908,908,908,120,120,120,120,120,120,120,120,120,120,120,--/* block 194 */-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,906,-906,906,906,906,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 195 */-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,--/* block 196 */-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,-909,909,909,909,909,909,909,909,909,909,909,909,909,909,909,120,-910,910,910,910,910,910,910,910,910,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 197 */-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,--/* block 198 */-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,-911,911,911,911,911,911,911,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 199 */-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,--/* block 200 */-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,601,-601,601,601,601,601,601,601,601,601,120,120,120,120,120,120,120,-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,-912,912,912,912,912,912,912,912,912,912,912,912,912,912,912,120,-913,913,913,913,913,913,913,913,913,913,120,120,120,120,914,914,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 201 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,-915,915,915,915,915,915,915,915,915,915,915,915,915,915,120,120,-916,916,916,916,916,917,120,120,120,120,120,120,120,120,120,120,--/* block 202 */-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,-919,919,919,919,919,919,919,920,920,920,920,920,921,921,921,921,-922,922,922,922,920,921,120,120,120,120,120,120,120,120,120,120,-923,923,923,923,923,923,923,923,923,923,120,924,924,924,924,924,-924,924,120,918,918,918,918,918,918,918,918,918,918,918,918,918,-918,918,918,918,918,918,918,918,120,120,120,120,120,918,918,918,--/* block 203 */-918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,918,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 204 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,-925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,925,-926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,-926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,--/* block 205 */-927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,927,-927,927,927,927,927,927,927,928,928,928,928,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 206 */-929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,-929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,-929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,-929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,-929,929,929,929,929,929,929,929,929,929,929,120,120,120,120,930,-929,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,-931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,-931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,931,--/* block 207 */-931,931,931,931,931,931,931,931,120,120,120,120,120,120,120,930,-930,930,930,932,932,932,932,932,932,932,932,932,932,932,932,932,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-933,934, 5,111,935,120,120,120,120,120,120,120,120,120,120,120,-936,936,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 208 */-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,--/* block 209 */-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,-937,937,937,937,937,937,937,937,120,120,120,120,120,120,120,120,--/* block 210 */-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,--/* block 211 */-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,938,-938,938,938,938,938,938,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 212 */-937,937,937,937,937,937,937,937,937,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 213 */-578,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,--/* block 214 */-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,--/* block 215 */-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,-573,573,573,573,573,573,573,573,573,573,573,573,573,573,573,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-573,573,573,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,578,578,578,578,120,120,120,120,120,120,120,120,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,--/* block 216 */-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,--/* block 217 */-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,939,-939,939,939,939,939,939,939,939,939,939,939,939,120,120,120,120,--/* block 218 */-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,-940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,940,-940,940,940,940,940,940,940,940,940,940,940,120,120,120,120,120,-940,940,940,940,940,940,940,940,940,940,940,940,940,120,120,120,--/* block 219 */-940,940,940,940,940,940,940,940,940,120,120,120,120,120,120,120,-940,940,940,940,940,940,940,940,940,940,120,120,941,942,942,943,-944,944,944,944,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 220 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120,--/* block 221 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20,945,946,113,113,113, 20, 20, 20,946,945,945,-945,945,945, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113,--/* block 222 */-113,113,113, 20, 20,113,113,113,113,113,113,113, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,113,113,113, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 223 */-685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,-685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,-685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,-685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,-685,685,947,947,947,685,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 224 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 225 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,-582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,582,-582,582, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120,--/* block 226 */-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514,-514,514,514,514,514,120,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,--/* block 227 */-513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,513,120,513,513,-120,120,513,120,120,513,513,120,120,513,513,513,513,120,513,513,-513,513,513,513,513,513,514,514,514,514,120,514,120,514,514,514,-514,514,514,514,120,514,514,514,514,514,514,514,514,514,514,514,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,--/* block 228 */-514,514,514,514,513,513,120,513,513,513,513,120,120,513,513,513,-513,513,513,513,513,120,513,513,513,513,513,513,513,120,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,513,513,120,513,513,513,513,120,-513,513,513,513,513,120,513,120,120,120,513,513,513,513,513,513,-513,120,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,--/* block 229 */-513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,--/* block 230 */-514,514,514,514,514,514,514,514,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,--/* block 231 */-513,513,513,513,513,513,513,513,513,513,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,120,120,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513, 9,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514, 9,514,514,514,514,-514,514,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513, 9,514,514,514,514,--/* block 232 */-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514, 9,514,514,514,514,514,514,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513, 9,514,514,514,514,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514, 9,-514,514,514,514,514,514,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513, 9,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,--/* block 233 */-514,514,514,514,514,514,514,514,514, 9,514,514,514,514,514,514,-513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,513,-513,513,513,513,513,513,513,513,513, 9,514,514,514,514,514,514,-514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,514,-514,514,514, 9,514,514,514,514,514,514,513,514,120,120, 11, 11,- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,--/* block 234 */-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,-948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,--/* block 235 */-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,-949,949,949,949,949,949,949,948,948,948,948,949,949,949,949,949,-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,-949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,-949,949,949,949,949,949,949,949,949,949,949,949,949,948,948,948,-948,948,948,948,948,949,948,948,948,948,948,948,948,948,948,948,--/* block 236 */-948,948,948,948,949,948,948,950,950,950,950,950,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,949,949,949,949,949,-120,949,949,949,949,949,949,949,949,949,949,949,949,949,949,949,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 237 */-951,951,951,951,951,951,951,120,951,951,951,951,951,951,951,951,-951,951,951,951,951,951,951,951,951,120,120,951,951,951,951,951,-951,951,120,951,951,120,951,951,951,951,951,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 238 */-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,-952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,952,-952,952,952,952,952,952,952,952,952,952,952,952,952,120,120,120,-953,953,953,953,953,953,953,954,954,954,954,954,954,954,120,120,-955,955,955,955,955,955,955,955,955,955,120,120,120,120,952,956,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 239 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,-957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,-957,957,957,957,957,957,957,957,957,957,957,957,958,958,958,958,-959,959,959,959,959,959,959,959,959,959,120,120,120,120,120,960,--/* block 240 */-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,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,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,--/* block 241 */-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,961,961,961,961,961,961,961,961,961,961,961,961,961,-961,961,961,961,961,120,120,962,962,962,962,962,962,962,962,962,-963,963,963,963,963,963,963,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 242 */-964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,-964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,964,-964,964,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,966,966,966,966,966,966,966,967,120,120,120,120,-968,968,968,968,968,968,968,968,968,968,120,120,120,120,969,969,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 243 */-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,--/* block 244 */- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25,- 6, 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 245 */-120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25,- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 246 */-224,224,224,224,120,224,224,224,224,224,224,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,224,-120,224,224,120,224,120,120,224,120,224,224,224,224,224,224,224,-224,224,224,120,224,224,224,224,120,224,120,224,120,120,120,120,-120,120,224,120,120,120,120,224,120,224,120,224,120,224,224,224,-120,224,224,120,224,120,120,224,120,224,120,224,120,224,120,224,-120,224,224,120,224,120,120,224,224,224,224,120,224,224,224,224,-224,224,224,120,224,224,224,224,120,224,224,224,224,120,224,120,--/* block 247 */-224,224,224,224,224,224,224,224,224,224,120,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,120,120,120,120,-120,224,224,224,120,224,224,224,224,224,120,224,224,224,224,224,-224,224,224,224,224,224,224,224,224,224,224,224,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-217,217,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 248 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,--/* block 249 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,-970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,-970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,-970, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,--/* block 250 */- 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 21, 21, 21,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21,- 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21,--/* block 251 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20,- 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,971,971,971,971,971,971,971,971,971,971,-971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,971,--/* block 252 */-972, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,- 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,970,970,970,970,- 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,-584,584,970,970,970,970,970,970,970,970,970,970,970,970,970,970,- 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,--/* block 253 */-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,--/* block 254 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,--/* block 255 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,973,973,973,973,973,--/* block 256 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20,- 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,--/* block 257 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,--/* block 258 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,--/* block 259 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20,970,970,970,970,970,970,970,970,970,970,970,970,--/* block 260 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 21, 21, 21, 21,970,970,970,970,970,970,970,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,--/* block 261 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,970,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,--/* block 262 */- 20, 20, 20, 20, 20, 20, 20, 20,970,970,970,970,970,970,970,970,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,970,970,- 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,--/* block 263 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21,970, 21, 21, 21, 21, 21, 21,--/* block 264 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,--/* block 265 */- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,- 21, 21, 21, 21, 21,970,970,970, 21, 21, 21,970,970,970,970,970,--/* block 266 */- 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,- 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,- 21, 21, 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,- 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,- 21, 21, 21,970,970,970,970,970,970,970,970,970,970,970,970,970,- 21, 21, 21, 21, 21, 21, 21,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,--/* block 267 */- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,- 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,- 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,120,120,120,120,120,120,--/* block 268 */-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,970,-970,970,970,970,970,970,970,970,970,970,970,970,970,970,120,120,--/* block 269 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 270 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,120,120,120,120,120,120,120,120,120,120,120,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,--/* block 271 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,--/* block 272 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,--/* block 273 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 274 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 275 */-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,-586,586,586,586,586,586,586,586,586,586,586,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,-120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,--/* block 276 */-511, 24,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,-974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,974,--/* block 277 */-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,--/* block 278 */-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,--/* block 279 */-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,-511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,511,--/* block 280 */-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,-673,673,673,673,673,673,673,673,673,673,673,673,673,673,120,120,+/* Total size: 102844 bytes, block size: 128. */++/* The tables herein are needed only when UCP support is built,+and in PCRE2 that happens automatically with UTF support.+This module should not be referenced otherwise, so+it should not matter whether it is compiled or not. However+a comment was received about space saving - maybe the guy linked+all the modules rather than using a library - so we include a+condition to cut out the tables when not needed. But don't leave+a totally empty module because some compilers barf at that.+Instead, just supply some small dummy tables. */++#ifndef SUPPORT_UNICODE+const ucd_record PRIV(ucd_records)[] = {{0,0,0,0,0,0,0 }};+const uint16_t PRIV(ucd_stage1)[] = {0};+const uint16_t PRIV(ucd_stage2)[] = {0};+const uint32_t PRIV(ucd_caseless_sets)[] = {0};+#else++const char *PRIV(unicode_version) = "14.0.0";++/* If the 32-bit library is run in non-32-bit mode, character values+greater than 0x10ffff may be encountered. For these we set up a+special record. */++#if PCRE2_CODE_UNIT_WIDTH == 32+const ucd_record PRIV(dummy_ucd_record)[] = {{+ ucp_Unknown, /* script */+ ucp_Cn, /* type unassigned */+ ucp_gbOther, /* grapheme break property */+ 0, /* case set */+ 0, /* other case */+ ucp_Unknown, /* script extension */+ 0, /* dummy filler */+ }};+#endif++/* When recompiling tables with a new Unicode version, please check the+types in this structure definition from pcre2_internal.h (the actual+field names will be different):++typedef struct {+uint8_t property_0;+uint8_t property_1;+uint8_t property_2;+uint8_t property_3;+pcre_int32 property_4;+pcre_int16 property_5;+uint16_t property_6;+} ucd_record;+*/++/* This table contains lists of characters that are caseless sets of+more than one character. Each list is terminated by NOTACHAR. */++const uint32_t PRIV(ucd_caseless_sets)[] = {+ NOTACHAR,+ 0x0053, 0x0073, 0x017f, NOTACHAR,+ 0x01c4, 0x01c5, 0x01c6, NOTACHAR,+ 0x01c7, 0x01c8, 0x01c9, NOTACHAR,+ 0x01ca, 0x01cb, 0x01cc, NOTACHAR,+ 0x01f1, 0x01f2, 0x01f3, NOTACHAR,+ 0x0345, 0x0399, 0x03b9, 0x1fbe, NOTACHAR,+ 0x00b5, 0x039c, 0x03bc, NOTACHAR,+ 0x03a3, 0x03c2, 0x03c3, NOTACHAR,+ 0x0392, 0x03b2, 0x03d0, NOTACHAR,+ 0x0398, 0x03b8, 0x03d1, 0x03f4, NOTACHAR,+ 0x03a6, 0x03c6, 0x03d5, NOTACHAR,+ 0x03a0, 0x03c0, 0x03d6, NOTACHAR,+ 0x039a, 0x03ba, 0x03f0, NOTACHAR,+ 0x03a1, 0x03c1, 0x03f1, NOTACHAR,+ 0x0395, 0x03b5, 0x03f5, NOTACHAR,+ 0x0412, 0x0432, 0x1c80, NOTACHAR,+ 0x0414, 0x0434, 0x1c81, NOTACHAR,+ 0x041e, 0x043e, 0x1c82, NOTACHAR,+ 0x0421, 0x0441, 0x1c83, NOTACHAR,+ 0x0422, 0x0442, 0x1c84, 0x1c85, NOTACHAR,+ 0x042a, 0x044a, 0x1c86, NOTACHAR,+ 0x0462, 0x0463, 0x1c87, NOTACHAR,+ 0x1e60, 0x1e61, 0x1e9b, NOTACHAR,+ 0x03a9, 0x03c9, 0x2126, NOTACHAR,+ 0x004b, 0x006b, 0x212a, NOTACHAR,+ 0x00c5, 0x00e5, 0x212b, NOTACHAR,+ 0x1c88, 0xa64a, 0xa64b, NOTACHAR,+};++/* When #included in pcre2test, we don't need the table of digit+sets, nor the the large main UCD tables. */++#ifndef PCRE2_PCRE2TEST++/* This table lists the code points for the '9' characters in each+set of decimal digits. It is used to ensure that all the digits in+a script run come from the same set. */++const uint32_t PRIV(ucd_digit_sets)[] = {+ 66, /* Number of subsequent values */+ 0x00039, 0x00669, 0x006f9, 0x007c9, 0x0096f, 0x009ef, 0x00a6f, 0x00aef,+ 0x00b6f, 0x00bef, 0x00c6f, 0x00cef, 0x00d6f, 0x00def, 0x00e59, 0x00ed9,+ 0x00f29, 0x01049, 0x01099, 0x017e9, 0x01819, 0x0194f, 0x019d9, 0x01a89,+ 0x01a99, 0x01b59, 0x01bb9, 0x01c49, 0x01c59, 0x0a629, 0x0a8d9, 0x0a909,+ 0x0a9d9, 0x0a9f9, 0x0aa59, 0x0abf9, 0x0ff19, 0x104a9, 0x10d39, 0x1106f,+ 0x110f9, 0x1113f, 0x111d9, 0x112f9, 0x11459, 0x114d9, 0x11659, 0x116c9,+ 0x11739, 0x118e9, 0x11959, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16ac9,+ 0x16b59, 0x1d7d7, 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e149, 0x1e2f9,+ 0x1e959, 0x1fbf9,+};++/* This vector is a list of lists of scripts for the Script Extension+property. Each sublist is zero-terminated. */++const uint8_t PRIV(ucd_script_sets)[] = {+ /* 0 */ 0,+ /* 1 */ 1, 11, 0,+ /* 4 */ 1, 144, 0,+ /* 7 */ 1, 64, 0,+ /* 10 */ 1, 50, 0,+ /* 13 */ 1, 56, 0,+ /* 16 */ 3, 15, 0,+ /* 19 */ 4, 23, 0,+ /* 22 */ 6, 84, 0,+ /* 25 */ 12, 36, 0,+ /* 28 */ 13, 18, 0,+ /* 31 */ 13, 34, 0,+ /* 34 */ 13, 118, 0,+ /* 37 */ 13, 50, 0,+ /* 40 */ 15, 107, 0,+ /* 43 */ 15, 150, 0,+ /* 46 */ 15, 100, 0,+ /* 49 */ 15, 54, 0,+ /* 52 */ 17, 34, 0,+ /* 55 */ 107, 54, 0,+ /* 58 */ 21, 108, 0,+ /* 61 */ 22, 129, 0,+ /* 64 */ 23, 34, 0,+ /* 67 */ 27, 30, 0,+ /* 70 */ 29, 150, 0,+ /* 73 */ 34, 38, 0,+ /* 76 */ 112, 158, 0,+ /* 79 */ 38, 65, 0,+ /* 82 */ 1, 50, 56, 0,+ /* 86 */ 1, 56, 156, 0,+ /* 90 */ 3, 96, 49, 0,+ /* 94 */ 96, 39, 53, 0,+ /* 98 */ 157, 12, 36, 0,+ /* 102 */ 12, 110, 36, 0,+ /* 106 */ 15, 107, 29, 0,+ /* 110 */ 15, 107, 34, 0,+ /* 114 */ 23, 27, 30, 0,+ /* 118 */ 69, 34, 39, 0,+ /* 122 */ 3, 15, 107, 29, 0,+ /* 127 */ 7, 25, 52, 51, 0,+ /* 132 */ 15, 142, 85, 111, 0,+ /* 137 */ 4, 24, 23, 27, 30, 0,+ /* 143 */ 1, 64, 144, 50, 56, 156, 0,+ /* 150 */ 4, 24, 23, 27, 30, 61, 0,+ /* 157 */ 15, 29, 37, 44, 54, 55, 0,+ /* 164 */ 132, 1, 64, 144, 50, 56, 156, 0,+ /* 172 */ 3, 15, 107, 29, 150, 44, 55, 124, 0,+ /* 181 */ 132, 1, 95, 112, 158, 121, 144, 148, 50, 0,+ /* 191 */ 15, 142, 21, 22, 108, 85, 111, 114, 109, 102, 124, 0,+ /* 203 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 54, 55, 124, 0,+ /* 216 */ 3, 15, 107, 21, 22, 29, 34, 37, 44, 100, 54, 55, 124, 0,+ /* 230 */ 15, 142, 21, 22, 108, 29, 85, 111, 114, 150, 109, 102, 124, 0,+ /* 244 */ 15, 142, 21, 22, 108, 29, 85, 111, 37, 114, 150, 109, 102, 124, 0,+ /* 259 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0,+ /* 280 */ 3, 15, 142, 143, 138, 107, 21, 22, 29, 35, 111, 37, 150, 44, 109, 48, 49, 102, 54, 55, 124, 0,+ /* 302 */+};++/* These are the main two-stage UCD tables. The fields in each record are:+script (8 bits), character type (8 bits), grapheme break property (8 bits),+offset to multichar other cases or zero (8 bits), offset to other case+or zero (32 bits, signed), script extension (16 bits, signed), and a dummy+16-bit field to make the whole thing a multiple of 4 bytes. */++const ucd_record PRIV(ucd_records)[] = { /* 11964 bytes, record size 12 */+ { 10, 0, 2, 0, 0, 10, 256, }, /* 0 */+ { 10, 0, 2, 0, 0, 10, 0, }, /* 1 */+ { 10, 0, 1, 0, 0, 10, 0, }, /* 2 */+ { 10, 0, 0, 0, 0, 10, 0, }, /* 3 */+ { 10, 29, 12, 0, 0, 10, 0, }, /* 4 */+ { 10, 21, 12, 0, 0, 10, 0, }, /* 5 */+ { 10, 23, 12, 0, 0, 10, 0, }, /* 6 */+ { 10, 22, 12, 0, 0, 10, 0, }, /* 7 */+ { 10, 18, 12, 0, 0, 10, 0, }, /* 8 */+ { 10, 25, 12, 0, 0, 10, 0, }, /* 9 */+ { 10, 17, 12, 0, 0, 10, 0, }, /* 10 */+ { 10, 13, 12, 0, 0, 10, 0, }, /* 11 */+ { 34, 9, 12, 0, 32, 34, 0, }, /* 12 */+ { 34, 9, 12, 100, 32, 34, 0, }, /* 13 */+ { 34, 9, 12, 1, 32, 34, 0, }, /* 14 */+ { 10, 24, 12, 0, 0, 10, 0, }, /* 15 */+ { 10, 16, 12, 0, 0, 10, 0, }, /* 16 */+ { 34, 5, 12, 0, -32, 34, 0, }, /* 17 */+ { 34, 5, 12, 100, -32, 34, 0, }, /* 18 */+ { 34, 5, 12, 1, -32, 34, 0, }, /* 19 */+ { 10, 26, 12, 0, 0, 10, 0, }, /* 20 */+ { 10, 26, 14, 0, 0, 10, 0, }, /* 21 */+ { 34, 7, 12, 0, 0, 34, 0, }, /* 22 */+ { 10, 20, 12, 0, 0, 10, 0, }, /* 23 */+ { 10, 1, 2, 0, 0, 10, 0, }, /* 24 */+ { 10, 15, 12, 0, 0, 10, 0, }, /* 25 */+ { 10, 5, 12, 26, 775, 10, 0, }, /* 26 */+ { 10, 19, 12, 0, 0, 10, 0, }, /* 27 */+ { 34, 9, 12, 104, 32, 34, 0, }, /* 28 */+ { 34, 5, 12, 0, 7615, 34, 0, }, /* 29 */+ { 34, 5, 12, 104, -32, 34, 0, }, /* 30 */+ { 34, 5, 12, 0, 121, 34, 0, }, /* 31 */+ { 34, 9, 12, 0, 1, 34, 0, }, /* 32 */+ { 34, 5, 12, 0, -1, 34, 0, }, /* 33 */+ { 34, 9, 12, 0, 0, 34, 0, }, /* 34 */+ { 34, 5, 12, 0, 0, 34, 0, }, /* 35 */+ { 34, 9, 12, 0, -121, 34, 0, }, /* 36 */+ { 34, 5, 12, 1, -268, 34, 0, }, /* 37 */+ { 34, 5, 12, 0, 195, 34, 0, }, /* 38 */+ { 34, 9, 12, 0, 210, 34, 0, }, /* 39 */+ { 34, 9, 12, 0, 206, 34, 0, }, /* 40 */+ { 34, 9, 12, 0, 205, 34, 0, }, /* 41 */+ { 34, 9, 12, 0, 79, 34, 0, }, /* 42 */+ { 34, 9, 12, 0, 202, 34, 0, }, /* 43 */+ { 34, 9, 12, 0, 203, 34, 0, }, /* 44 */+ { 34, 9, 12, 0, 207, 34, 0, }, /* 45 */+ { 34, 5, 12, 0, 97, 34, 0, }, /* 46 */+ { 34, 9, 12, 0, 211, 34, 0, }, /* 47 */+ { 34, 9, 12, 0, 209, 34, 0, }, /* 48 */+ { 34, 5, 12, 0, 163, 34, 0, }, /* 49 */+ { 34, 9, 12, 0, 213, 34, 0, }, /* 50 */+ { 34, 5, 12, 0, 130, 34, 0, }, /* 51 */+ { 34, 9, 12, 0, 214, 34, 0, }, /* 52 */+ { 34, 9, 12, 0, 218, 34, 0, }, /* 53 */+ { 34, 9, 12, 0, 217, 34, 0, }, /* 54 */+ { 34, 9, 12, 0, 219, 34, 0, }, /* 55 */+ { 34, 5, 12, 0, 56, 34, 0, }, /* 56 */+ { 34, 9, 12, 5, 2, 34, 0, }, /* 57 */+ { 34, 8, 12, 5, 1, 34, 0, }, /* 58 */+ { 34, 5, 12, 5, -2, 34, 0, }, /* 59 */+ { 34, 9, 12, 9, 2, 34, 0, }, /* 60 */+ { 34, 8, 12, 9, 1, 34, 0, }, /* 61 */+ { 34, 5, 12, 9, -2, 34, 0, }, /* 62 */+ { 34, 9, 12, 13, 2, 34, 0, }, /* 63 */+ { 34, 8, 12, 13, 1, 34, 0, }, /* 64 */+ { 34, 5, 12, 13, -2, 34, 0, }, /* 65 */+ { 34, 5, 12, 0, -79, 34, 0, }, /* 66 */+ { 34, 9, 12, 17, 2, 34, 0, }, /* 67 */+ { 34, 8, 12, 17, 1, 34, 0, }, /* 68 */+ { 34, 5, 12, 17, -2, 34, 0, }, /* 69 */+ { 34, 9, 12, 0, -97, 34, 0, }, /* 70 */+ { 34, 9, 12, 0, -56, 34, 0, }, /* 71 */+ { 34, 9, 12, 0, -130, 34, 0, }, /* 72 */+ { 34, 9, 12, 0, 10795, 34, 0, }, /* 73 */+ { 34, 9, 12, 0, -163, 34, 0, }, /* 74 */+ { 34, 9, 12, 0, 10792, 34, 0, }, /* 75 */+ { 34, 5, 12, 0, 10815, 34, 0, }, /* 76 */+ { 34, 9, 12, 0, -195, 34, 0, }, /* 77 */+ { 34, 9, 12, 0, 69, 34, 0, }, /* 78 */+ { 34, 9, 12, 0, 71, 34, 0, }, /* 79 */+ { 34, 5, 12, 0, 10783, 34, 0, }, /* 80 */+ { 34, 5, 12, 0, 10780, 34, 0, }, /* 81 */+ { 34, 5, 12, 0, 10782, 34, 0, }, /* 82 */+ { 34, 5, 12, 0, -210, 34, 0, }, /* 83 */+ { 34, 5, 12, 0, -206, 34, 0, }, /* 84 */+ { 34, 5, 12, 0, -205, 34, 0, }, /* 85 */+ { 34, 5, 12, 0, -202, 34, 0, }, /* 86 */+ { 34, 5, 12, 0, -203, 34, 0, }, /* 87 */+ { 34, 5, 12, 0, 42319, 34, 0, }, /* 88 */+ { 34, 5, 12, 0, 42315, 34, 0, }, /* 89 */+ { 34, 5, 12, 0, -207, 34, 0, }, /* 90 */+ { 34, 5, 12, 0, 42280, 34, 0, }, /* 91 */+ { 34, 5, 12, 0, 42308, 34, 0, }, /* 92 */+ { 34, 5, 12, 0, -209, 34, 0, }, /* 93 */+ { 34, 5, 12, 0, -211, 34, 0, }, /* 94 */+ { 34, 5, 12, 0, 10743, 34, 0, }, /* 95 */+ { 34, 5, 12, 0, 42305, 34, 0, }, /* 96 */+ { 34, 5, 12, 0, 10749, 34, 0, }, /* 97 */+ { 34, 5, 12, 0, -213, 34, 0, }, /* 98 */+ { 34, 5, 12, 0, -214, 34, 0, }, /* 99 */+ { 34, 5, 12, 0, 10727, 34, 0, }, /* 100 */+ { 34, 5, 12, 0, -218, 34, 0, }, /* 101 */+ { 34, 5, 12, 0, 42307, 34, 0, }, /* 102 */+ { 34, 5, 12, 0, 42282, 34, 0, }, /* 103 */+ { 34, 5, 12, 0, -69, 34, 0, }, /* 104 */+ { 34, 5, 12, 0, -217, 34, 0, }, /* 105 */+ { 34, 5, 12, 0, -71, 34, 0, }, /* 106 */+ { 34, 5, 12, 0, -219, 34, 0, }, /* 107 */+ { 34, 5, 12, 0, 42261, 34, 0, }, /* 108 */+ { 34, 5, 12, 0, 42258, 34, 0, }, /* 109 */+ { 34, 6, 12, 0, 0, 34, 0, }, /* 110 */+ { 10, 6, 12, 0, 0, 10, 0, }, /* 111 */+ { 4, 24, 12, 0, 0, 4, 0, }, /* 112 */+ { 28, 12, 3, 0, 0, 28, 0, }, /* 113 */+ { 28, 12, 3, 0, 0, 20, 0, }, /* 114 */+ { 28, 12, 3, 21, 116, 20, 0, }, /* 115 */+ { 28, 12, 3, 0, 0, 34, 0, }, /* 116 */+ { 20, 9, 12, 0, 1, 20, 0, }, /* 117 */+ { 20, 5, 12, 0, -1, 20, 0, }, /* 118 */+ { 20, 24, 12, 0, 0, 20, 0, }, /* 119 */+ { 0, 2, 12, 0, 0, 0, 0, }, /* 120 */+ { 20, 6, 12, 0, 0, 20, 0, }, /* 121 */+ { 20, 5, 12, 0, 130, 20, 0, }, /* 122 */+ { 20, 9, 12, 0, 116, 20, 0, }, /* 123 */+ { 20, 9, 12, 0, 38, 20, 0, }, /* 124 */+ { 20, 9, 12, 0, 37, 20, 0, }, /* 125 */+ { 20, 9, 12, 0, 64, 20, 0, }, /* 126 */+ { 20, 9, 12, 0, 63, 20, 0, }, /* 127 */+ { 20, 5, 12, 0, 0, 20, 0, }, /* 128 */+ { 20, 9, 12, 0, 32, 20, 0, }, /* 129 */+ { 20, 9, 12, 34, 32, 20, 0, }, /* 130 */+ { 20, 9, 12, 59, 32, 20, 0, }, /* 131 */+ { 20, 9, 12, 38, 32, 20, 0, }, /* 132 */+ { 20, 9, 12, 21, 32, 20, 0, }, /* 133 */+ { 20, 9, 12, 51, 32, 20, 0, }, /* 134 */+ { 20, 9, 12, 26, 32, 20, 0, }, /* 135 */+ { 20, 9, 12, 47, 32, 20, 0, }, /* 136 */+ { 20, 9, 12, 55, 32, 20, 0, }, /* 137 */+ { 20, 9, 12, 30, 32, 20, 0, }, /* 138 */+ { 20, 9, 12, 43, 32, 20, 0, }, /* 139 */+ { 20, 9, 12, 96, 32, 20, 0, }, /* 140 */+ { 20, 5, 12, 0, -38, 20, 0, }, /* 141 */+ { 20, 5, 12, 0, -37, 20, 0, }, /* 142 */+ { 20, 5, 12, 0, -32, 20, 0, }, /* 143 */+ { 20, 5, 12, 34, -32, 20, 0, }, /* 144 */+ { 20, 5, 12, 59, -32, 20, 0, }, /* 145 */+ { 20, 5, 12, 38, -32, 20, 0, }, /* 146 */+ { 20, 5, 12, 21, -116, 20, 0, }, /* 147 */+ { 20, 5, 12, 51, -32, 20, 0, }, /* 148 */+ { 20, 5, 12, 26, -775, 20, 0, }, /* 149 */+ { 20, 5, 12, 47, -32, 20, 0, }, /* 150 */+ { 20, 5, 12, 55, -32, 20, 0, }, /* 151 */+ { 20, 5, 12, 30, 1, 20, 0, }, /* 152 */+ { 20, 5, 12, 30, -32, 20, 0, }, /* 153 */+ { 20, 5, 12, 43, -32, 20, 0, }, /* 154 */+ { 20, 5, 12, 96, -32, 20, 0, }, /* 155 */+ { 20, 5, 12, 0, -64, 20, 0, }, /* 156 */+ { 20, 5, 12, 0, -63, 20, 0, }, /* 157 */+ { 20, 9, 12, 0, 8, 20, 0, }, /* 158 */+ { 20, 5, 12, 34, -30, 20, 0, }, /* 159 */+ { 20, 5, 12, 38, -25, 20, 0, }, /* 160 */+ { 20, 9, 12, 0, 0, 20, 0, }, /* 161 */+ { 20, 5, 12, 43, -15, 20, 0, }, /* 162 */+ { 20, 5, 12, 47, -22, 20, 0, }, /* 163 */+ { 20, 5, 12, 0, -8, 20, 0, }, /* 164 */+ { 11, 9, 12, 0, 1, 11, 0, }, /* 165 */+ { 11, 5, 12, 0, -1, 11, 0, }, /* 166 */+ { 20, 5, 12, 51, -54, 20, 0, }, /* 167 */+ { 20, 5, 12, 55, -48, 20, 0, }, /* 168 */+ { 20, 5, 12, 0, 7, 20, 0, }, /* 169 */+ { 20, 5, 12, 0, -116, 20, 0, }, /* 170 */+ { 20, 9, 12, 38, -60, 20, 0, }, /* 171 */+ { 20, 5, 12, 59, -64, 20, 0, }, /* 172 */+ { 20, 25, 12, 0, 0, 20, 0, }, /* 173 */+ { 20, 9, 12, 0, -7, 20, 0, }, /* 174 */+ { 20, 9, 12, 0, -130, 20, 0, }, /* 175 */+ { 13, 9, 12, 0, 80, 13, 0, }, /* 176 */+ { 13, 9, 12, 0, 32, 13, 0, }, /* 177 */+ { 13, 9, 12, 63, 32, 13, 0, }, /* 178 */+ { 13, 9, 12, 67, 32, 13, 0, }, /* 179 */+ { 13, 9, 12, 71, 32, 13, 0, }, /* 180 */+ { 13, 9, 12, 75, 32, 13, 0, }, /* 181 */+ { 13, 9, 12, 79, 32, 13, 0, }, /* 182 */+ { 13, 9, 12, 84, 32, 13, 0, }, /* 183 */+ { 13, 5, 12, 0, -32, 13, 0, }, /* 184 */+ { 13, 5, 12, 63, -32, 13, 0, }, /* 185 */+ { 13, 5, 12, 67, -32, 13, 0, }, /* 186 */+ { 13, 5, 12, 71, -32, 13, 0, }, /* 187 */+ { 13, 5, 12, 75, -32, 13, 0, }, /* 188 */+ { 13, 5, 12, 79, -32, 13, 0, }, /* 189 */+ { 13, 5, 12, 84, -32, 13, 0, }, /* 190 */+ { 13, 5, 12, 0, -80, 13, 0, }, /* 191 */+ { 13, 9, 12, 0, 1, 13, 0, }, /* 192 */+ { 13, 5, 12, 0, -1, 13, 0, }, /* 193 */+ { 13, 9, 12, 88, 1, 13, 0, }, /* 194 */+ { 13, 5, 12, 88, -1, 13, 0, }, /* 195 */+ { 13, 26, 12, 0, 0, 13, 0, }, /* 196 */+ { 13, 12, 3, 0, 0, -34, 0, }, /* 197 */+ { 13, 12, 3, 0, 0, -28, 0, }, /* 198 */+ { 28, 12, 3, 0, 0, -31, 0, }, /* 199 */+ { 13, 11, 3, 0, 0, 13, 0, }, /* 200 */+ { 13, 9, 12, 0, 15, 13, 0, }, /* 201 */+ { 13, 5, 12, 0, -15, 13, 0, }, /* 202 */+ { 2, 9, 12, 0, 48, 2, 0, }, /* 203 */+ { 2, 6, 12, 0, 0, 2, 0, }, /* 204 */+ { 2, 21, 12, 0, 0, 2, 0, }, /* 205 */+ { 2, 5, 12, 0, 0, 2, 0, }, /* 206 */+ { 2, 5, 12, 0, -48, 2, 0, }, /* 207 */+ { 2, 17, 12, 0, 0, 2, 0, }, /* 208 */+ { 2, 26, 12, 0, 0, 2, 0, }, /* 209 */+ { 2, 23, 12, 0, 0, 2, 0, }, /* 210 */+ { 26, 12, 3, 0, 0, 26, 0, }, /* 211 */+ { 26, 17, 12, 0, 0, 26, 0, }, /* 212 */+ { 26, 21, 12, 0, 0, 26, 0, }, /* 213 */+ { 26, 7, 12, 0, 0, 26, 0, }, /* 214 */+ { 1, 1, 4, 0, 0, 1, 0, }, /* 215 */+ { 10, 1, 4, 0, 0, 10, 0, }, /* 216 */+ { 1, 25, 12, 0, 0, 1, 0, }, /* 217 */+ { 1, 21, 12, 0, 0, 1, 0, }, /* 218 */+ { 1, 23, 12, 0, 0, 1, 0, }, /* 219 */+ { 10, 21, 12, 0, 0, -143, 0, }, /* 220 */+ { 1, 26, 12, 0, 0, 1, 0, }, /* 221 */+ { 1, 12, 3, 0, 0, 1, 0, }, /* 222 */+ { 1, 1, 2, 0, 0, -82, 0, }, /* 223 */+ { 10, 21, 12, 0, 0, -164, 0, }, /* 224 */+ { 1, 7, 12, 0, 0, 1, 0, }, /* 225 */+ { 10, 6, 12, 0, 0, -181, 0, }, /* 226 */+ { 28, 12, 3, 0, 0, -10, 0, }, /* 227 */+ { 1, 13, 12, 0, 0, -86, 0, }, /* 228 */+ { 1, 21, 12, 0, 0, -4, 0, }, /* 229 */+ { 1, 6, 12, 0, 0, 1, 0, }, /* 230 */+ { 1, 13, 12, 0, 0, 1, 0, }, /* 231 */+ { 50, 21, 12, 0, 0, 50, 0, }, /* 232 */+ { 50, 1, 4, 0, 0, 50, 0, }, /* 233 */+ { 50, 7, 12, 0, 0, 50, 0, }, /* 234 */+ { 50, 12, 3, 0, 0, 50, 0, }, /* 235 */+ { 56, 7, 12, 0, 0, 56, 0, }, /* 236 */+ { 56, 12, 3, 0, 0, 56, 0, }, /* 237 */+ { 64, 13, 12, 0, 0, 64, 0, }, /* 238 */+ { 64, 7, 12, 0, 0, 64, 0, }, /* 239 */+ { 64, 12, 3, 0, 0, 64, 0, }, /* 240 */+ { 64, 6, 12, 0, 0, 64, 0, }, /* 241 */+ { 64, 26, 12, 0, 0, 64, 0, }, /* 242 */+ { 64, 21, 12, 0, 0, 64, 0, }, /* 243 */+ { 64, 23, 12, 0, 0, 64, 0, }, /* 244 */+ { 90, 7, 12, 0, 0, 90, 0, }, /* 245 */+ { 90, 12, 3, 0, 0, 90, 0, }, /* 246 */+ { 90, 6, 12, 0, 0, 90, 0, }, /* 247 */+ { 90, 21, 12, 0, 0, 90, 0, }, /* 248 */+ { 95, 7, 12, 0, 0, 95, 0, }, /* 249 */+ { 95, 12, 3, 0, 0, 95, 0, }, /* 250 */+ { 95, 21, 12, 0, 0, 95, 0, }, /* 251 */+ { 1, 24, 12, 0, 0, 1, 0, }, /* 252 */+ { 15, 12, 3, 0, 0, 15, 0, }, /* 253 */+ { 15, 10, 5, 0, 0, 15, 0, }, /* 254 */+ { 15, 7, 12, 0, 0, 15, 0, }, /* 255 */+ { 28, 12, 3, 0, 0, -216, 0, }, /* 256 */+ { 28, 12, 3, 0, 0, -203, 0, }, /* 257 */+ { 10, 21, 12, 0, 0, -259, 0, }, /* 258 */+ { 10, 21, 12, 0, 0, -280, 0, }, /* 259 */+ { 15, 13, 12, 0, 0, -132, 0, }, /* 260 */+ { 15, 21, 12, 0, 0, 15, 0, }, /* 261 */+ { 15, 6, 12, 0, 0, 15, 0, }, /* 262 */+ { 3, 7, 12, 0, 0, 3, 0, }, /* 263 */+ { 3, 12, 3, 0, 0, 3, 0, }, /* 264 */+ { 3, 10, 5, 0, 0, 3, 0, }, /* 265 */+ { 3, 10, 3, 0, 0, 3, 0, }, /* 266 */+ { 3, 13, 12, 0, 0, -90, 0, }, /* 267 */+ { 3, 23, 12, 0, 0, 3, 0, }, /* 268 */+ { 3, 15, 12, 0, 0, 3, 0, }, /* 269 */+ { 3, 26, 12, 0, 0, 3, 0, }, /* 270 */+ { 3, 21, 12, 0, 0, 3, 0, }, /* 271 */+ { 22, 12, 3, 0, 0, 22, 0, }, /* 272 */+ { 22, 10, 5, 0, 0, 22, 0, }, /* 273 */+ { 22, 7, 12, 0, 0, 22, 0, }, /* 274 */+ { 22, 13, 12, 0, 0, -61, 0, }, /* 275 */+ { 22, 21, 12, 0, 0, 22, 0, }, /* 276 */+ { 21, 12, 3, 0, 0, 21, 0, }, /* 277 */+ { 21, 10, 5, 0, 0, 21, 0, }, /* 278 */+ { 21, 7, 12, 0, 0, 21, 0, }, /* 279 */+ { 21, 13, 12, 0, 0, -58, 0, }, /* 280 */+ { 21, 21, 12, 0, 0, 21, 0, }, /* 281 */+ { 21, 23, 12, 0, 0, 21, 0, }, /* 282 */+ { 44, 12, 3, 0, 0, 44, 0, }, /* 283 */+ { 44, 10, 5, 0, 0, 44, 0, }, /* 284 */+ { 44, 7, 12, 0, 0, 44, 0, }, /* 285 */+ { 44, 10, 3, 0, 0, 44, 0, }, /* 286 */+ { 44, 13, 12, 0, 0, 44, 0, }, /* 287 */+ { 44, 26, 12, 0, 0, 44, 0, }, /* 288 */+ { 44, 15, 12, 0, 0, 44, 0, }, /* 289 */+ { 54, 12, 3, 0, 0, 54, 0, }, /* 290 */+ { 54, 7, 12, 0, 0, 54, 0, }, /* 291 */+ { 54, 10, 3, 0, 0, 54, 0, }, /* 292 */+ { 54, 10, 5, 0, 0, 54, 0, }, /* 293 */+ { 54, 13, 12, 0, 0, -55, 0, }, /* 294 */+ { 54, 15, 12, 0, 0, -55, 0, }, /* 295 */+ { 54, 26, 12, 0, 0, -55, 0, }, /* 296 */+ { 54, 26, 12, 0, 0, 54, 0, }, /* 297 */+ { 54, 23, 12, 0, 0, 54, 0, }, /* 298 */+ { 55, 12, 3, 0, 0, 55, 0, }, /* 299 */+ { 55, 10, 5, 0, 0, 55, 0, }, /* 300 */+ { 55, 7, 12, 0, 0, 55, 0, }, /* 301 */+ { 55, 13, 12, 0, 0, 55, 0, }, /* 302 */+ { 55, 21, 12, 0, 0, 55, 0, }, /* 303 */+ { 55, 15, 12, 0, 0, 55, 0, }, /* 304 */+ { 55, 26, 12, 0, 0, 55, 0, }, /* 305 */+ { 29, 7, 12, 0, 0, 29, 0, }, /* 306 */+ { 29, 12, 3, 0, 0, 29, 0, }, /* 307 */+ { 29, 10, 5, 0, 0, 29, 0, }, /* 308 */+ { 29, 21, 12, 0, 0, 29, 0, }, /* 309 */+ { 29, 10, 3, 0, 0, 29, 0, }, /* 310 */+ { 29, 13, 12, 0, 0, -70, 0, }, /* 311 */+ { 37, 12, 3, 0, 0, 37, 0, }, /* 312 */+ { 37, 10, 5, 0, 0, 37, 0, }, /* 313 */+ { 37, 7, 12, 0, 0, 37, 0, }, /* 314 */+ { 37, 10, 3, 0, 0, 37, 0, }, /* 315 */+ { 37, 7, 4, 0, 0, 37, 0, }, /* 316 */+ { 37, 26, 12, 0, 0, 37, 0, }, /* 317 */+ { 37, 15, 12, 0, 0, 37, 0, }, /* 318 */+ { 37, 13, 12, 0, 0, 37, 0, }, /* 319 */+ { 48, 12, 3, 0, 0, 48, 0, }, /* 320 */+ { 48, 10, 5, 0, 0, 48, 0, }, /* 321 */+ { 48, 7, 12, 0, 0, 48, 0, }, /* 322 */+ { 48, 10, 3, 0, 0, 48, 0, }, /* 323 */+ { 48, 13, 12, 0, 0, 48, 0, }, /* 324 */+ { 48, 21, 12, 0, 0, 48, 0, }, /* 325 */+ { 57, 7, 12, 0, 0, 57, 0, }, /* 326 */+ { 57, 12, 3, 0, 0, 57, 0, }, /* 327 */+ { 57, 7, 5, 0, 0, 57, 0, }, /* 328 */+ { 57, 6, 12, 0, 0, 57, 0, }, /* 329 */+ { 57, 21, 12, 0, 0, 57, 0, }, /* 330 */+ { 57, 13, 12, 0, 0, 57, 0, }, /* 331 */+ { 33, 7, 12, 0, 0, 33, 0, }, /* 332 */+ { 33, 12, 3, 0, 0, 33, 0, }, /* 333 */+ { 33, 7, 5, 0, 0, 33, 0, }, /* 334 */+ { 33, 6, 12, 0, 0, 33, 0, }, /* 335 */+ { 33, 13, 12, 0, 0, 33, 0, }, /* 336 */+ { 58, 7, 12, 0, 0, 58, 0, }, /* 337 */+ { 58, 26, 12, 0, 0, 58, 0, }, /* 338 */+ { 58, 21, 12, 0, 0, 58, 0, }, /* 339 */+ { 58, 12, 3, 0, 0, 58, 0, }, /* 340 */+ { 58, 13, 12, 0, 0, 58, 0, }, /* 341 */+ { 58, 15, 12, 0, 0, 58, 0, }, /* 342 */+ { 58, 22, 12, 0, 0, 58, 0, }, /* 343 */+ { 58, 18, 12, 0, 0, 58, 0, }, /* 344 */+ { 58, 10, 5, 0, 0, 58, 0, }, /* 345 */+ { 39, 7, 12, 0, 0, 39, 0, }, /* 346 */+ { 39, 10, 12, 0, 0, 39, 0, }, /* 347 */+ { 39, 12, 3, 0, 0, 39, 0, }, /* 348 */+ { 39, 10, 5, 0, 0, 39, 0, }, /* 349 */+ { 39, 13, 12, 0, 0, -94, 0, }, /* 350 */+ { 39, 21, 12, 0, 0, 39, 0, }, /* 351 */+ { 39, 13, 12, 0, 0, 39, 0, }, /* 352 */+ { 39, 26, 12, 0, 0, 39, 0, }, /* 353 */+ { 17, 9, 12, 0, 7264, 17, 0, }, /* 354 */+ { 17, 5, 12, 0, 3008, 17, 0, }, /* 355 */+ { 10, 21, 12, 0, 0, -52, 0, }, /* 356 */+ { 17, 6, 12, 0, 0, 17, 0, }, /* 357 */+ { 24, 7, 6, 0, 0, 24, 0, }, /* 358 */+ { 24, 7, 7, 0, 0, 24, 0, }, /* 359 */+ { 24, 7, 8, 0, 0, 24, 0, }, /* 360 */+ { 16, 7, 12, 0, 0, 16, 0, }, /* 361 */+ { 16, 12, 3, 0, 0, 16, 0, }, /* 362 */+ { 16, 21, 12, 0, 0, 16, 0, }, /* 363 */+ { 16, 15, 12, 0, 0, 16, 0, }, /* 364 */+ { 16, 26, 12, 0, 0, 16, 0, }, /* 365 */+ { 9, 9, 12, 0, 38864, 9, 0, }, /* 366 */+ { 9, 9, 12, 0, 8, 9, 0, }, /* 367 */+ { 9, 5, 12, 0, -8, 9, 0, }, /* 368 */+ { 8, 17, 12, 0, 0, 8, 0, }, /* 369 */+ { 8, 7, 12, 0, 0, 8, 0, }, /* 370 */+ { 8, 26, 12, 0, 0, 8, 0, }, /* 371 */+ { 8, 21, 12, 0, 0, 8, 0, }, /* 372 */+ { 41, 29, 12, 0, 0, 41, 0, }, /* 373 */+ { 41, 7, 12, 0, 0, 41, 0, }, /* 374 */+ { 41, 22, 12, 0, 0, 41, 0, }, /* 375 */+ { 41, 18, 12, 0, 0, 41, 0, }, /* 376 */+ { 46, 7, 12, 0, 0, 46, 0, }, /* 377 */+ { 46, 14, 12, 0, 0, 46, 0, }, /* 378 */+ { 51, 7, 12, 0, 0, 51, 0, }, /* 379 */+ { 51, 12, 3, 0, 0, 51, 0, }, /* 380 */+ { 51, 10, 5, 0, 0, 51, 0, }, /* 381 */+ { 25, 7, 12, 0, 0, 25, 0, }, /* 382 */+ { 25, 12, 3, 0, 0, 25, 0, }, /* 383 */+ { 25, 10, 5, 0, 0, 25, 0, }, /* 384 */+ { 10, 21, 12, 0, 0, -127, 0, }, /* 385 */+ { 7, 7, 12, 0, 0, 7, 0, }, /* 386 */+ { 7, 12, 3, 0, 0, 7, 0, }, /* 387 */+ { 52, 7, 12, 0, 0, 52, 0, }, /* 388 */+ { 52, 12, 3, 0, 0, 52, 0, }, /* 389 */+ { 32, 7, 12, 0, 0, 32, 0, }, /* 390 */+ { 32, 12, 3, 0, 0, 32, 0, }, /* 391 */+ { 32, 10, 5, 0, 0, 32, 0, }, /* 392 */+ { 32, 21, 12, 0, 0, 32, 0, }, /* 393 */+ { 32, 6, 12, 0, 0, 32, 0, }, /* 394 */+ { 32, 23, 12, 0, 0, 32, 0, }, /* 395 */+ { 32, 13, 12, 0, 0, 32, 0, }, /* 396 */+ { 32, 15, 12, 0, 0, 32, 0, }, /* 397 */+ { 38, 21, 12, 0, 0, 38, 0, }, /* 398 */+ { 10, 21, 12, 0, 0, -79, 0, }, /* 399 */+ { 38, 17, 12, 0, 0, 38, 0, }, /* 400 */+ { 38, 12, 3, 0, 0, 38, 0, }, /* 401 */+ { 38, 1, 2, 0, 0, 38, 0, }, /* 402 */+ { 38, 13, 12, 0, 0, 38, 0, }, /* 403 */+ { 38, 7, 12, 0, 0, 38, 0, }, /* 404 */+ { 38, 6, 12, 0, 0, 38, 0, }, /* 405 */+ { 35, 7, 12, 0, 0, 35, 0, }, /* 406 */+ { 35, 12, 3, 0, 0, 35, 0, }, /* 407 */+ { 35, 10, 5, 0, 0, 35, 0, }, /* 408 */+ { 35, 26, 12, 0, 0, 35, 0, }, /* 409 */+ { 35, 21, 12, 0, 0, 35, 0, }, /* 410 */+ { 35, 13, 12, 0, 0, 35, 0, }, /* 411 */+ { 53, 7, 12, 0, 0, 53, 0, }, /* 412 */+ { 40, 7, 12, 0, 0, 40, 0, }, /* 413 */+ { 40, 13, 12, 0, 0, 40, 0, }, /* 414 */+ { 40, 15, 12, 0, 0, 40, 0, }, /* 415 */+ { 40, 26, 12, 0, 0, 40, 0, }, /* 416 */+ { 32, 26, 12, 0, 0, 32, 0, }, /* 417 */+ { 6, 7, 12, 0, 0, 6, 0, }, /* 418 */+ { 6, 12, 3, 0, 0, 6, 0, }, /* 419 */+ { 6, 10, 5, 0, 0, 6, 0, }, /* 420 */+ { 6, 21, 12, 0, 0, 6, 0, }, /* 421 */+ { 91, 7, 12, 0, 0, 91, 0, }, /* 422 */+ { 91, 10, 5, 0, 0, 91, 0, }, /* 423 */+ { 91, 12, 3, 0, 0, 91, 0, }, /* 424 */+ { 91, 10, 12, 0, 0, 91, 0, }, /* 425 */+ { 91, 13, 12, 0, 0, 91, 0, }, /* 426 */+ { 91, 21, 12, 0, 0, 91, 0, }, /* 427 */+ { 91, 6, 12, 0, 0, 91, 0, }, /* 428 */+ { 28, 11, 3, 0, 0, 28, 0, }, /* 429 */+ { 62, 12, 3, 0, 0, 62, 0, }, /* 430 */+ { 62, 10, 5, 0, 0, 62, 0, }, /* 431 */+ { 62, 7, 12, 0, 0, 62, 0, }, /* 432 */+ { 62, 10, 3, 0, 0, 62, 0, }, /* 433 */+ { 62, 13, 12, 0, 0, 62, 0, }, /* 434 */+ { 62, 21, 12, 0, 0, 62, 0, }, /* 435 */+ { 62, 26, 12, 0, 0, 62, 0, }, /* 436 */+ { 76, 12, 3, 0, 0, 76, 0, }, /* 437 */+ { 76, 10, 5, 0, 0, 76, 0, }, /* 438 */+ { 76, 7, 12, 0, 0, 76, 0, }, /* 439 */+ { 76, 13, 12, 0, 0, 76, 0, }, /* 440 */+ { 93, 7, 12, 0, 0, 93, 0, }, /* 441 */+ { 93, 12, 3, 0, 0, 93, 0, }, /* 442 */+ { 93, 10, 5, 0, 0, 93, 0, }, /* 443 */+ { 93, 21, 12, 0, 0, 93, 0, }, /* 444 */+ { 70, 7, 12, 0, 0, 70, 0, }, /* 445 */+ { 70, 10, 5, 0, 0, 70, 0, }, /* 446 */+ { 70, 12, 3, 0, 0, 70, 0, }, /* 447 */+ { 70, 21, 12, 0, 0, 70, 0, }, /* 448 */+ { 70, 13, 12, 0, 0, 70, 0, }, /* 449 */+ { 73, 13, 12, 0, 0, 73, 0, }, /* 450 */+ { 73, 7, 12, 0, 0, 73, 0, }, /* 451 */+ { 73, 6, 12, 0, 0, 73, 0, }, /* 452 */+ { 73, 21, 12, 0, 0, 73, 0, }, /* 453 */+ { 13, 5, 12, 63, -6222, 13, 0, }, /* 454 */+ { 13, 5, 12, 67, -6221, 13, 0, }, /* 455 */+ { 13, 5, 12, 71, -6212, 13, 0, }, /* 456 */+ { 13, 5, 12, 75, -6210, 13, 0, }, /* 457 */+ { 13, 5, 12, 79, -6210, 13, 0, }, /* 458 */+ { 13, 5, 12, 79, -6211, 13, 0, }, /* 459 */+ { 13, 5, 12, 84, -6204, 13, 0, }, /* 460 */+ { 13, 5, 12, 88, -6180, 13, 0, }, /* 461 */+ { 13, 5, 12, 108, 35267, 13, 0, }, /* 462 */+ { 17, 9, 12, 0, -3008, 17, 0, }, /* 463 */+ { 76, 21, 12, 0, 0, 76, 0, }, /* 464 */+ { 28, 12, 3, 0, 0, -122, 0, }, /* 465 */+ { 28, 12, 3, 0, 0, 15, 0, }, /* 466 */+ { 10, 21, 12, 0, 0, -40, 0, }, /* 467 */+ { 28, 12, 3, 0, 0, -16, 0, }, /* 468 */+ { 28, 12, 3, 0, 0, -46, 0, }, /* 469 */+ { 28, 12, 3, 0, 0, -157, 0, }, /* 470 */+ { 10, 10, 5, 0, 0, -16, 0, }, /* 471 */+ { 10, 7, 12, 0, 0, -43, 0, }, /* 472 */+ { 10, 7, 12, 0, 0, -16, 0, }, /* 473 */+ { 10, 7, 12, 0, 0, 15, 0, }, /* 474 */+ { 10, 7, 12, 0, 0, -172, 0, }, /* 475 */+ { 10, 7, 12, 0, 0, -40, 0, }, /* 476 */+ { 28, 12, 3, 0, 0, -106, 0, }, /* 477 */+ { 10, 10, 5, 0, 0, 3, 0, }, /* 478 */+ { 28, 12, 3, 0, 0, -40, 0, }, /* 479 */+ { 10, 7, 12, 0, 0, 150, 0, }, /* 480 */+ { 13, 5, 12, 0, 0, 13, 0, }, /* 481 */+ { 13, 6, 12, 0, 0, 13, 0, }, /* 482 */+ { 34, 5, 12, 0, 35332, 34, 0, }, /* 483 */+ { 34, 5, 12, 0, 3814, 34, 0, }, /* 484 */+ { 34, 5, 12, 0, 35384, 34, 0, }, /* 485 */+ { 28, 12, 3, 0, 0, -37, 0, }, /* 486 */+ { 28, 12, 3, 0, 0, 50, 0, }, /* 487 */+ { 34, 9, 12, 92, 1, 34, 0, }, /* 488 */+ { 34, 5, 12, 92, -1, 34, 0, }, /* 489 */+ { 34, 5, 12, 92, -58, 34, 0, }, /* 490 */+ { 34, 9, 12, 0, -7615, 34, 0, }, /* 491 */+ { 20, 5, 12, 0, 8, 20, 0, }, /* 492 */+ { 20, 9, 12, 0, -8, 20, 0, }, /* 493 */+ { 20, 5, 12, 0, 74, 20, 0, }, /* 494 */+ { 20, 5, 12, 0, 86, 20, 0, }, /* 495 */+ { 20, 5, 12, 0, 100, 20, 0, }, /* 496 */+ { 20, 5, 12, 0, 128, 20, 0, }, /* 497 */+ { 20, 5, 12, 0, 112, 20, 0, }, /* 498 */+ { 20, 5, 12, 0, 126, 20, 0, }, /* 499 */+ { 20, 8, 12, 0, -8, 20, 0, }, /* 500 */+ { 20, 5, 12, 0, 9, 20, 0, }, /* 501 */+ { 20, 9, 12, 0, -74, 20, 0, }, /* 502 */+ { 20, 8, 12, 0, -9, 20, 0, }, /* 503 */+ { 20, 5, 12, 21, -7173, 20, 0, }, /* 504 */+ { 20, 9, 12, 0, -86, 20, 0, }, /* 505 */+ { 20, 9, 12, 0, -100, 20, 0, }, /* 506 */+ { 20, 9, 12, 0, -112, 20, 0, }, /* 507 */+ { 20, 9, 12, 0, -128, 20, 0, }, /* 508 */+ { 20, 9, 12, 0, -126, 20, 0, }, /* 509 */+ { 28, 1, 3, 0, 0, 28, 0, }, /* 510 */+ { 28, 1, 13, 0, 0, 28, 0, }, /* 511 */+ { 10, 27, 2, 0, 0, 10, 0, }, /* 512 */+ { 10, 28, 2, 0, 0, 10, 0, }, /* 513 */+ { 10, 29, 12, 0, 0, -73, 0, }, /* 514 */+ { 10, 21, 14, 0, 0, 10, 0, }, /* 515 */+ { 0, 2, 2, 0, 0, 0, 0, }, /* 516 */+ { 28, 12, 3, 0, 0, -110, 0, }, /* 517 */+ { 10, 9, 12, 0, 0, 10, 0, }, /* 518 */+ { 10, 5, 12, 0, 0, 10, 0, }, /* 519 */+ { 20, 9, 12, 96, -7517, 20, 0, }, /* 520 */+ { 34, 9, 12, 100, -8383, 34, 0, }, /* 521 */+ { 34, 9, 12, 104, -8262, 34, 0, }, /* 522 */+ { 34, 9, 12, 0, 28, 34, 0, }, /* 523 */+ { 10, 7, 12, 0, 0, 10, 0, }, /* 524 */+ { 10, 5, 14, 0, 0, 10, 0, }, /* 525 */+ { 34, 5, 12, 0, -28, 34, 0, }, /* 526 */+ { 34, 14, 12, 0, 16, 34, 0, }, /* 527 */+ { 34, 14, 12, 0, -16, 34, 0, }, /* 528 */+ { 34, 14, 12, 0, 0, 34, 0, }, /* 529 */+ { 10, 25, 14, 0, 0, 10, 0, }, /* 530 */+ { 10, 26, 12, 0, 26, 10, 0, }, /* 531 */+ { 10, 26, 14, 0, 26, 10, 0, }, /* 532 */+ { 10, 26, 12, 0, -26, 10, 0, }, /* 533 */+ { 5, 26, 12, 0, 0, 5, 0, }, /* 534 */+ { 18, 9, 12, 0, 48, 18, 0, }, /* 535 */+ { 18, 5, 12, 0, -48, 18, 0, }, /* 536 */+ { 34, 9, 12, 0, -10743, 34, 0, }, /* 537 */+ { 34, 9, 12, 0, -3814, 34, 0, }, /* 538 */+ { 34, 9, 12, 0, -10727, 34, 0, }, /* 539 */+ { 34, 5, 12, 0, -10795, 34, 0, }, /* 540 */+ { 34, 5, 12, 0, -10792, 34, 0, }, /* 541 */+ { 34, 9, 12, 0, -10780, 34, 0, }, /* 542 */+ { 34, 9, 12, 0, -10749, 34, 0, }, /* 543 */+ { 34, 9, 12, 0, -10783, 34, 0, }, /* 544 */+ { 34, 9, 12, 0, -10782, 34, 0, }, /* 545 */+ { 34, 9, 12, 0, -10815, 34, 0, }, /* 546 */+ { 11, 5, 12, 0, 0, 11, 0, }, /* 547 */+ { 11, 26, 12, 0, 0, 11, 0, }, /* 548 */+ { 11, 12, 3, 0, 0, 11, 0, }, /* 549 */+ { 11, 21, 12, 0, 0, 11, 0, }, /* 550 */+ { 11, 15, 12, 0, 0, 11, 0, }, /* 551 */+ { 17, 5, 12, 0, -7264, 17, 0, }, /* 552 */+ { 59, 7, 12, 0, 0, 59, 0, }, /* 553 */+ { 59, 6, 12, 0, 0, 59, 0, }, /* 554 */+ { 59, 21, 12, 0, 0, 59, 0, }, /* 555 */+ { 59, 12, 3, 0, 0, 59, 0, }, /* 556 */+ { 13, 12, 3, 0, 0, 13, 0, }, /* 557 */+ { 10, 21, 12, 0, 0, -28, 0, }, /* 558 */+ { 23, 26, 12, 0, 0, 23, 0, }, /* 559 */+ { 10, 21, 12, 0, 0, -150, 0, }, /* 560 */+ { 10, 21, 12, 0, 0, -137, 0, }, /* 561 */+ { 23, 6, 12, 0, 0, 23, 0, }, /* 562 */+ { 10, 7, 12, 0, 0, 23, 0, }, /* 563 */+ { 23, 14, 12, 0, 0, 23, 0, }, /* 564 */+ { 10, 22, 12, 0, 0, -150, 0, }, /* 565 */+ { 10, 18, 12, 0, 0, -150, 0, }, /* 566 */+ { 10, 26, 12, 0, 0, -137, 0, }, /* 567 */+ { 10, 17, 12, 0, 0, -137, 0, }, /* 568 */+ { 10, 22, 12, 0, 0, -137, 0, }, /* 569 */+ { 10, 18, 12, 0, 0, -137, 0, }, /* 570 */+ { 28, 12, 3, 0, 0, -19, 0, }, /* 571 */+ { 24, 10, 3, 0, 0, 24, 0, }, /* 572 */+ { 10, 17, 14, 0, 0, -137, 0, }, /* 573 */+ { 10, 6, 12, 0, 0, -67, 0, }, /* 574 */+ { 10, 7, 12, 0, 0, -114, 0, }, /* 575 */+ { 10, 21, 14, 0, 0, -114, 0, }, /* 576 */+ { 10, 26, 12, 0, 0, 23, 0, }, /* 577 */+ { 27, 7, 12, 0, 0, 27, 0, }, /* 578 */+ { 28, 12, 3, 0, 0, -67, 0, }, /* 579 */+ { 10, 24, 12, 0, 0, -67, 0, }, /* 580 */+ { 27, 6, 12, 0, 0, 27, 0, }, /* 581 */+ { 10, 17, 12, 0, 0, -67, 0, }, /* 582 */+ { 30, 7, 12, 0, 0, 30, 0, }, /* 583 */+ { 30, 6, 12, 0, 0, 30, 0, }, /* 584 */+ { 4, 7, 12, 0, 0, 4, 0, }, /* 585 */+ { 24, 7, 12, 0, 0, 24, 0, }, /* 586 */+ { 10, 15, 12, 0, 0, 23, 0, }, /* 587 */+ { 24, 26, 12, 0, 0, 24, 0, }, /* 588 */+ { 10, 26, 14, 0, 0, 23, 0, }, /* 589 */+ { 30, 26, 12, 0, 0, 30, 0, }, /* 590 */+ { 23, 7, 12, 0, 0, 23, 0, }, /* 591 */+ { 61, 7, 12, 0, 0, 61, 0, }, /* 592 */+ { 61, 6, 12, 0, 0, 61, 0, }, /* 593 */+ { 61, 26, 12, 0, 0, 61, 0, }, /* 594 */+ { 86, 7, 12, 0, 0, 86, 0, }, /* 595 */+ { 86, 6, 12, 0, 0, 86, 0, }, /* 596 */+ { 86, 21, 12, 0, 0, 86, 0, }, /* 597 */+ { 77, 7, 12, 0, 0, 77, 0, }, /* 598 */+ { 77, 6, 12, 0, 0, 77, 0, }, /* 599 */+ { 77, 21, 12, 0, 0, 77, 0, }, /* 600 */+ { 77, 13, 12, 0, 0, 77, 0, }, /* 601 */+ { 13, 9, 12, 108, 1, 13, 0, }, /* 602 */+ { 13, 5, 12, 108, -35267, 13, 0, }, /* 603 */+ { 13, 7, 12, 0, 0, 13, 0, }, /* 604 */+ { 13, 21, 12, 0, 0, 13, 0, }, /* 605 */+ { 79, 7, 12, 0, 0, 79, 0, }, /* 606 */+ { 79, 14, 12, 0, 0, 79, 0, }, /* 607 */+ { 79, 12, 3, 0, 0, 79, 0, }, /* 608 */+ { 79, 21, 12, 0, 0, 79, 0, }, /* 609 */+ { 10, 24, 12, 0, 0, -64, 0, }, /* 610 */+ { 34, 9, 12, 0, -35332, 34, 0, }, /* 611 */+ { 34, 9, 12, 0, -42280, 34, 0, }, /* 612 */+ { 34, 5, 12, 0, 48, 34, 0, }, /* 613 */+ { 34, 9, 12, 0, -42308, 34, 0, }, /* 614 */+ { 34, 9, 12, 0, -42319, 34, 0, }, /* 615 */+ { 34, 9, 12, 0, -42315, 34, 0, }, /* 616 */+ { 34, 9, 12, 0, -42305, 34, 0, }, /* 617 */+ { 34, 9, 12, 0, -42258, 34, 0, }, /* 618 */+ { 34, 9, 12, 0, -42282, 34, 0, }, /* 619 */+ { 34, 9, 12, 0, -42261, 34, 0, }, /* 620 */+ { 34, 9, 12, 0, 928, 34, 0, }, /* 621 */+ { 34, 9, 12, 0, -48, 34, 0, }, /* 622 */+ { 34, 9, 12, 0, -42307, 34, 0, }, /* 623 */+ { 34, 9, 12, 0, -35384, 34, 0, }, /* 624 */+ { 49, 7, 12, 0, 0, 49, 0, }, /* 625 */+ { 49, 12, 3, 0, 0, 49, 0, }, /* 626 */+ { 49, 10, 5, 0, 0, 49, 0, }, /* 627 */+ { 49, 26, 12, 0, 0, 49, 0, }, /* 628 */+ { 10, 15, 12, 0, 0, -244, 0, }, /* 629 */+ { 10, 15, 12, 0, 0, -230, 0, }, /* 630 */+ { 10, 26, 12, 0, 0, -191, 0, }, /* 631 */+ { 10, 23, 12, 0, 0, -191, 0, }, /* 632 */+ { 65, 7, 12, 0, 0, 65, 0, }, /* 633 */+ { 65, 21, 12, 0, 0, 65, 0, }, /* 634 */+ { 75, 10, 5, 0, 0, 75, 0, }, /* 635 */+ { 75, 7, 12, 0, 0, 75, 0, }, /* 636 */+ { 75, 12, 3, 0, 0, 75, 0, }, /* 637 */+ { 75, 21, 12, 0, 0, 75, 0, }, /* 638 */+ { 75, 13, 12, 0, 0, 75, 0, }, /* 639 */+ { 15, 12, 3, 0, 0, -16, 0, }, /* 640 */+ { 15, 7, 12, 0, 0, -49, 0, }, /* 641 */+ { 69, 13, 12, 0, 0, 69, 0, }, /* 642 */+ { 69, 7, 12, 0, 0, 69, 0, }, /* 643 */+ { 69, 12, 3, 0, 0, 69, 0, }, /* 644 */+ { 10, 21, 12, 0, 0, -118, 0, }, /* 645 */+ { 69, 21, 12, 0, 0, 69, 0, }, /* 646 */+ { 74, 7, 12, 0, 0, 74, 0, }, /* 647 */+ { 74, 12, 3, 0, 0, 74, 0, }, /* 648 */+ { 74, 10, 5, 0, 0, 74, 0, }, /* 649 */+ { 74, 21, 12, 0, 0, 74, 0, }, /* 650 */+ { 84, 12, 3, 0, 0, 84, 0, }, /* 651 */+ { 84, 10, 5, 0, 0, 84, 0, }, /* 652 */+ { 84, 7, 12, 0, 0, 84, 0, }, /* 653 */+ { 84, 21, 12, 0, 0, 84, 0, }, /* 654 */+ { 10, 6, 12, 0, 0, -22, 0, }, /* 655 */+ { 84, 13, 12, 0, 0, 84, 0, }, /* 656 */+ { 39, 6, 12, 0, 0, 39, 0, }, /* 657 */+ { 68, 7, 12, 0, 0, 68, 0, }, /* 658 */+ { 68, 12, 3, 0, 0, 68, 0, }, /* 659 */+ { 68, 10, 5, 0, 0, 68, 0, }, /* 660 */+ { 68, 13, 12, 0, 0, 68, 0, }, /* 661 */+ { 68, 21, 12, 0, 0, 68, 0, }, /* 662 */+ { 92, 7, 12, 0, 0, 92, 0, }, /* 663 */+ { 92, 12, 3, 0, 0, 92, 0, }, /* 664 */+ { 92, 6, 12, 0, 0, 92, 0, }, /* 665 */+ { 92, 21, 12, 0, 0, 92, 0, }, /* 666 */+ { 87, 7, 12, 0, 0, 87, 0, }, /* 667 */+ { 87, 10, 5, 0, 0, 87, 0, }, /* 668 */+ { 87, 12, 3, 0, 0, 87, 0, }, /* 669 */+ { 87, 21, 12, 0, 0, 87, 0, }, /* 670 */+ { 87, 6, 12, 0, 0, 87, 0, }, /* 671 */+ { 34, 5, 12, 0, -928, 34, 0, }, /* 672 */+ { 9, 5, 12, 0, -38864, 9, 0, }, /* 673 */+ { 87, 13, 12, 0, 0, 87, 0, }, /* 674 */+ { 24, 7, 9, 0, 0, 24, 0, }, /* 675 */+ { 24, 7, 10, 0, 0, 24, 0, }, /* 676 */+ { 0, 4, 12, 0, 0, 0, 0, }, /* 677 */+ { 0, 3, 12, 0, 0, 0, 0, }, /* 678 */+ { 26, 25, 12, 0, 0, 26, 0, }, /* 679 */+ { 10, 18, 12, 0, 0, -7, 0, }, /* 680 */+ { 10, 22, 12, 0, 0, -7, 0, }, /* 681 */+ { 1, 7, 12, 0, 0, -13, 0, }, /* 682 */+ { 1, 26, 12, 0, 0, -13, 0, }, /* 683 */+ { 10, 6, 3, 0, 0, -67, 0, }, /* 684 */+ { 36, 7, 12, 0, 0, 36, 0, }, /* 685 */+ { 10, 21, 12, 0, 0, -98, 0, }, /* 686 */+ { 10, 21, 12, 0, 0, -25, 0, }, /* 687 */+ { 10, 15, 12, 0, 0, -102, 0, }, /* 688 */+ { 10, 26, 12, 0, 0, -25, 0, }, /* 689 */+ { 20, 14, 12, 0, 0, 20, 0, }, /* 690 */+ { 20, 15, 12, 0, 0, 20, 0, }, /* 691 */+ { 20, 26, 12, 0, 0, 20, 0, }, /* 692 */+ { 71, 7, 12, 0, 0, 71, 0, }, /* 693 */+ { 67, 7, 12, 0, 0, 67, 0, }, /* 694 */+ { 28, 12, 3, 0, 0, -1, 0, }, /* 695 */+ { 10, 15, 12, 0, 0, -1, 0, }, /* 696 */+ { 42, 7, 12, 0, 0, 42, 0, }, /* 697 */+ { 42, 15, 12, 0, 0, 42, 0, }, /* 698 */+ { 19, 7, 12, 0, 0, 19, 0, }, /* 699 */+ { 19, 14, 12, 0, 0, 19, 0, }, /* 700 */+ { 118, 7, 12, 0, 0, 118, 0, }, /* 701 */+ { 118, 12, 3, 0, 0, 118, 0, }, /* 702 */+ { 60, 7, 12, 0, 0, 60, 0, }, /* 703 */+ { 60, 21, 12, 0, 0, 60, 0, }, /* 704 */+ { 43, 7, 12, 0, 0, 43, 0, }, /* 705 */+ { 43, 21, 12, 0, 0, 43, 0, }, /* 706 */+ { 43, 14, 12, 0, 0, 43, 0, }, /* 707 */+ { 14, 9, 12, 0, 40, 14, 0, }, /* 708 */+ { 14, 5, 12, 0, -40, 14, 0, }, /* 709 */+ { 47, 7, 12, 0, 0, 47, 0, }, /* 710 */+ { 45, 7, 12, 0, 0, 45, 0, }, /* 711 */+ { 45, 13, 12, 0, 0, 45, 0, }, /* 712 */+ { 136, 9, 12, 0, 40, 136, 0, }, /* 713 */+ { 136, 5, 12, 0, -40, 136, 0, }, /* 714 */+ { 106, 7, 12, 0, 0, 106, 0, }, /* 715 */+ { 104, 7, 12, 0, 0, 104, 0, }, /* 716 */+ { 104, 21, 12, 0, 0, 104, 0, }, /* 717 */+ { 161, 9, 12, 0, 39, 161, 0, }, /* 718 */+ { 161, 5, 12, 0, -39, 161, 0, }, /* 719 */+ { 110, 7, 12, 0, 0, 110, 0, }, /* 720 */+ { 12, 7, 12, 0, 0, 12, 0, }, /* 721 */+ { 81, 7, 12, 0, 0, 81, 0, }, /* 722 */+ { 81, 21, 12, 0, 0, 81, 0, }, /* 723 */+ { 81, 15, 12, 0, 0, 81, 0, }, /* 724 */+ { 120, 7, 12, 0, 0, 120, 0, }, /* 725 */+ { 120, 26, 12, 0, 0, 120, 0, }, /* 726 */+ { 120, 15, 12, 0, 0, 120, 0, }, /* 727 */+ { 116, 7, 12, 0, 0, 116, 0, }, /* 728 */+ { 116, 15, 12, 0, 0, 116, 0, }, /* 729 */+ { 128, 7, 12, 0, 0, 128, 0, }, /* 730 */+ { 128, 15, 12, 0, 0, 128, 0, }, /* 731 */+ { 66, 7, 12, 0, 0, 66, 0, }, /* 732 */+ { 66, 15, 12, 0, 0, 66, 0, }, /* 733 */+ { 66, 21, 12, 0, 0, 66, 0, }, /* 734 */+ { 72, 7, 12, 0, 0, 72, 0, }, /* 735 */+ { 72, 21, 12, 0, 0, 72, 0, }, /* 736 */+ { 98, 7, 12, 0, 0, 98, 0, }, /* 737 */+ { 97, 7, 12, 0, 0, 97, 0, }, /* 738 */+ { 97, 15, 12, 0, 0, 97, 0, }, /* 739 */+ { 31, 7, 12, 0, 0, 31, 0, }, /* 740 */+ { 31, 12, 3, 0, 0, 31, 0, }, /* 741 */+ { 31, 15, 12, 0, 0, 31, 0, }, /* 742 */+ { 31, 21, 12, 0, 0, 31, 0, }, /* 743 */+ { 88, 7, 12, 0, 0, 88, 0, }, /* 744 */+ { 88, 15, 12, 0, 0, 88, 0, }, /* 745 */+ { 88, 21, 12, 0, 0, 88, 0, }, /* 746 */+ { 117, 7, 12, 0, 0, 117, 0, }, /* 747 */+ { 117, 15, 12, 0, 0, 117, 0, }, /* 748 */+ { 112, 7, 12, 0, 0, 112, 0, }, /* 749 */+ { 112, 26, 12, 0, 0, 112, 0, }, /* 750 */+ { 112, 12, 3, 0, 0, 112, 0, }, /* 751 */+ { 112, 15, 12, 0, 0, 112, 0, }, /* 752 */+ { 112, 21, 12, 0, 0, 112, 0, }, /* 753 */+ { 112, 21, 12, 0, 0, -76, 0, }, /* 754 */+ { 78, 7, 12, 0, 0, 78, 0, }, /* 755 */+ { 78, 21, 12, 0, 0, 78, 0, }, /* 756 */+ { 83, 7, 12, 0, 0, 83, 0, }, /* 757 */+ { 83, 15, 12, 0, 0, 83, 0, }, /* 758 */+ { 82, 7, 12, 0, 0, 82, 0, }, /* 759 */+ { 82, 15, 12, 0, 0, 82, 0, }, /* 760 */+ { 121, 7, 12, 0, 0, 121, 0, }, /* 761 */+ { 121, 21, 12, 0, 0, 121, 0, }, /* 762 */+ { 121, 15, 12, 0, 0, 121, 0, }, /* 763 */+ { 89, 7, 12, 0, 0, 89, 0, }, /* 764 */+ { 130, 9, 12, 0, 64, 130, 0, }, /* 765 */+ { 130, 5, 12, 0, -64, 130, 0, }, /* 766 */+ { 130, 15, 12, 0, 0, 130, 0, }, /* 767 */+ { 144, 7, 12, 0, 0, 144, 0, }, /* 768 */+ { 144, 12, 3, 0, 0, 144, 0, }, /* 769 */+ { 144, 13, 12, 0, 0, 144, 0, }, /* 770 */+ { 1, 15, 12, 0, 0, 1, 0, }, /* 771 */+ { 156, 7, 12, 0, 0, 156, 0, }, /* 772 */+ { 156, 12, 3, 0, 0, 156, 0, }, /* 773 */+ { 156, 17, 12, 0, 0, 156, 0, }, /* 774 */+ { 147, 7, 12, 0, 0, 147, 0, }, /* 775 */+ { 147, 15, 12, 0, 0, 147, 0, }, /* 776 */+ { 148, 7, 12, 0, 0, 148, 0, }, /* 777 */+ { 148, 12, 3, 0, 0, 148, 0, }, /* 778 */+ { 148, 15, 12, 0, 0, 148, 0, }, /* 779 */+ { 148, 21, 12, 0, 0, 148, 0, }, /* 780 */+ { 158, 7, 12, 0, 0, 158, 0, }, /* 781 */+ { 158, 12, 3, 0, 0, 158, 0, }, /* 782 */+ { 158, 21, 12, 0, 0, 158, 0, }, /* 783 */+ { 153, 7, 12, 0, 0, 153, 0, }, /* 784 */+ { 153, 15, 12, 0, 0, 153, 0, }, /* 785 */+ { 149, 7, 12, 0, 0, 149, 0, }, /* 786 */+ { 94, 10, 5, 0, 0, 94, 0, }, /* 787 */+ { 94, 12, 3, 0, 0, 94, 0, }, /* 788 */+ { 94, 7, 12, 0, 0, 94, 0, }, /* 789 */+ { 94, 21, 12, 0, 0, 94, 0, }, /* 790 */+ { 94, 15, 12, 0, 0, 94, 0, }, /* 791 */+ { 94, 13, 12, 0, 0, 94, 0, }, /* 792 */+ { 85, 12, 3, 0, 0, 85, 0, }, /* 793 */+ { 85, 10, 5, 0, 0, 85, 0, }, /* 794 */+ { 85, 7, 12, 0, 0, 85, 0, }, /* 795 */+ { 85, 21, 12, 0, 0, 85, 0, }, /* 796 */+ { 85, 1, 4, 0, 0, 85, 0, }, /* 797 */+ { 101, 7, 12, 0, 0, 101, 0, }, /* 798 */+ { 101, 13, 12, 0, 0, 101, 0, }, /* 799 */+ { 96, 12, 3, 0, 0, 96, 0, }, /* 800 */+ { 96, 7, 12, 0, 0, 96, 0, }, /* 801 */+ { 96, 10, 5, 0, 0, 96, 0, }, /* 802 */+ { 96, 13, 12, 0, 0, 96, 0, }, /* 803 */+ { 96, 21, 12, 0, 0, 96, 0, }, /* 804 */+ { 111, 7, 12, 0, 0, 111, 0, }, /* 805 */+ { 111, 12, 3, 0, 0, 111, 0, }, /* 806 */+ { 111, 21, 12, 0, 0, 111, 0, }, /* 807 */+ { 100, 12, 3, 0, 0, 100, 0, }, /* 808 */+ { 100, 10, 5, 0, 0, 100, 0, }, /* 809 */+ { 100, 7, 12, 0, 0, 100, 0, }, /* 810 */+ { 100, 7, 4, 0, 0, 100, 0, }, /* 811 */+ { 100, 21, 12, 0, 0, 100, 0, }, /* 812 */+ { 100, 13, 12, 0, 0, 100, 0, }, /* 813 */+ { 48, 15, 12, 0, 0, 48, 0, }, /* 814 */+ { 108, 7, 12, 0, 0, 108, 0, }, /* 815 */+ { 108, 10, 5, 0, 0, 108, 0, }, /* 816 */+ { 108, 12, 3, 0, 0, 108, 0, }, /* 817 */+ { 108, 21, 12, 0, 0, 108, 0, }, /* 818 */+ { 129, 7, 12, 0, 0, 129, 0, }, /* 819 */+ { 129, 21, 12, 0, 0, 129, 0, }, /* 820 */+ { 109, 7, 12, 0, 0, 109, 0, }, /* 821 */+ { 109, 12, 3, 0, 0, 109, 0, }, /* 822 */+ { 109, 10, 5, 0, 0, 109, 0, }, /* 823 */+ { 109, 13, 12, 0, 0, 109, 0, }, /* 824 */+ { 107, 12, 3, 0, 0, 107, 0, }, /* 825 */+ { 107, 12, 3, 0, 0, -55, 0, }, /* 826 */+ { 107, 10, 5, 0, 0, 107, 0, }, /* 827 */+ { 107, 10, 5, 0, 0, -55, 0, }, /* 828 */+ { 107, 7, 12, 0, 0, 107, 0, }, /* 829 */+ { 28, 12, 3, 0, 0, -55, 0, }, /* 830 */+ { 107, 10, 3, 0, 0, 107, 0, }, /* 831 */+ { 135, 7, 12, 0, 0, 135, 0, }, /* 832 */+ { 135, 10, 5, 0, 0, 135, 0, }, /* 833 */+ { 135, 12, 3, 0, 0, 135, 0, }, /* 834 */+ { 135, 21, 12, 0, 0, 135, 0, }, /* 835 */+ { 135, 13, 12, 0, 0, 135, 0, }, /* 836 */+ { 124, 7, 12, 0, 0, 124, 0, }, /* 837 */+ { 124, 10, 3, 0, 0, 124, 0, }, /* 838 */+ { 124, 10, 5, 0, 0, 124, 0, }, /* 839 */+ { 124, 12, 3, 0, 0, 124, 0, }, /* 840 */+ { 124, 21, 12, 0, 0, 124, 0, }, /* 841 */+ { 124, 13, 12, 0, 0, 124, 0, }, /* 842 */+ { 123, 7, 12, 0, 0, 123, 0, }, /* 843 */+ { 123, 10, 3, 0, 0, 123, 0, }, /* 844 */+ { 123, 10, 5, 0, 0, 123, 0, }, /* 845 */+ { 123, 12, 3, 0, 0, 123, 0, }, /* 846 */+ { 123, 21, 12, 0, 0, 123, 0, }, /* 847 */+ { 114, 7, 12, 0, 0, 114, 0, }, /* 848 */+ { 114, 10, 5, 0, 0, 114, 0, }, /* 849 */+ { 114, 12, 3, 0, 0, 114, 0, }, /* 850 */+ { 114, 21, 12, 0, 0, 114, 0, }, /* 851 */+ { 114, 13, 12, 0, 0, 114, 0, }, /* 852 */+ { 102, 7, 12, 0, 0, 102, 0, }, /* 853 */+ { 102, 12, 3, 0, 0, 102, 0, }, /* 854 */+ { 102, 10, 5, 0, 0, 102, 0, }, /* 855 */+ { 102, 21, 12, 0, 0, 102, 0, }, /* 856 */+ { 102, 13, 12, 0, 0, 102, 0, }, /* 857 */+ { 126, 7, 12, 0, 0, 126, 0, }, /* 858 */+ { 126, 12, 3, 0, 0, 126, 0, }, /* 859 */+ { 126, 10, 12, 0, 0, 126, 0, }, /* 860 */+ { 126, 10, 5, 0, 0, 126, 0, }, /* 861 */+ { 126, 13, 12, 0, 0, 126, 0, }, /* 862 */+ { 126, 15, 12, 0, 0, 126, 0, }, /* 863 */+ { 126, 21, 12, 0, 0, 126, 0, }, /* 864 */+ { 126, 26, 12, 0, 0, 126, 0, }, /* 865 */+ { 142, 7, 12, 0, 0, 142, 0, }, /* 866 */+ { 142, 10, 5, 0, 0, 142, 0, }, /* 867 */+ { 142, 12, 3, 0, 0, 142, 0, }, /* 868 */+ { 142, 21, 12, 0, 0, 142, 0, }, /* 869 */+ { 125, 9, 12, 0, 32, 125, 0, }, /* 870 */+ { 125, 5, 12, 0, -32, 125, 0, }, /* 871 */+ { 125, 13, 12, 0, 0, 125, 0, }, /* 872 */+ { 125, 15, 12, 0, 0, 125, 0, }, /* 873 */+ { 125, 7, 12, 0, 0, 125, 0, }, /* 874 */+ { 154, 7, 12, 0, 0, 154, 0, }, /* 875 */+ { 154, 10, 3, 0, 0, 154, 0, }, /* 876 */+ { 154, 10, 5, 0, 0, 154, 0, }, /* 877 */+ { 154, 12, 3, 0, 0, 154, 0, }, /* 878 */+ { 154, 7, 4, 0, 0, 154, 0, }, /* 879 */+ { 154, 21, 12, 0, 0, 154, 0, }, /* 880 */+ { 154, 13, 12, 0, 0, 154, 0, }, /* 881 */+ { 150, 7, 12, 0, 0, 150, 0, }, /* 882 */+ { 150, 10, 5, 0, 0, 150, 0, }, /* 883 */+ { 150, 12, 3, 0, 0, 150, 0, }, /* 884 */+ { 150, 21, 12, 0, 0, 150, 0, }, /* 885 */+ { 141, 7, 12, 0, 0, 141, 0, }, /* 886 */+ { 141, 12, 3, 0, 0, 141, 0, }, /* 887 */+ { 141, 10, 5, 0, 0, 141, 0, }, /* 888 */+ { 141, 7, 4, 0, 0, 141, 0, }, /* 889 */+ { 141, 21, 12, 0, 0, 141, 0, }, /* 890 */+ { 140, 7, 12, 0, 0, 140, 0, }, /* 891 */+ { 140, 12, 3, 0, 0, 140, 0, }, /* 892 */+ { 140, 10, 5, 0, 0, 140, 0, }, /* 893 */+ { 140, 7, 4, 0, 0, 140, 0, }, /* 894 */+ { 140, 21, 12, 0, 0, 140, 0, }, /* 895 */+ { 122, 7, 12, 0, 0, 122, 0, }, /* 896 */+ { 133, 7, 12, 0, 0, 133, 0, }, /* 897 */+ { 133, 10, 5, 0, 0, 133, 0, }, /* 898 */+ { 133, 12, 3, 0, 0, 133, 0, }, /* 899 */+ { 133, 21, 12, 0, 0, 133, 0, }, /* 900 */+ { 133, 13, 12, 0, 0, 133, 0, }, /* 901 */+ { 133, 15, 12, 0, 0, 133, 0, }, /* 902 */+ { 134, 21, 12, 0, 0, 134, 0, }, /* 903 */+ { 134, 7, 12, 0, 0, 134, 0, }, /* 904 */+ { 134, 12, 3, 0, 0, 134, 0, }, /* 905 */+ { 134, 10, 5, 0, 0, 134, 0, }, /* 906 */+ { 138, 7, 12, 0, 0, 138, 0, }, /* 907 */+ { 138, 12, 3, 0, 0, 138, 0, }, /* 908 */+ { 138, 7, 4, 0, 0, 138, 0, }, /* 909 */+ { 138, 13, 12, 0, 0, 138, 0, }, /* 910 */+ { 143, 7, 12, 0, 0, 143, 0, }, /* 911 */+ { 143, 10, 5, 0, 0, 143, 0, }, /* 912 */+ { 143, 12, 3, 0, 0, 143, 0, }, /* 913 */+ { 143, 13, 12, 0, 0, 143, 0, }, /* 914 */+ { 145, 7, 12, 0, 0, 145, 0, }, /* 915 */+ { 145, 12, 3, 0, 0, 145, 0, }, /* 916 */+ { 145, 10, 5, 0, 0, 145, 0, }, /* 917 */+ { 145, 21, 12, 0, 0, 145, 0, }, /* 918 */+ { 54, 15, 12, 0, 0, 54, 0, }, /* 919 */+ { 54, 21, 12, 0, 0, 54, 0, }, /* 920 */+ { 63, 7, 12, 0, 0, 63, 0, }, /* 921 */+ { 63, 14, 12, 0, 0, 63, 0, }, /* 922 */+ { 63, 21, 12, 0, 0, 63, 0, }, /* 923 */+ { 157, 7, 12, 0, 0, 157, 0, }, /* 924 */+ { 157, 21, 12, 0, 0, 157, 0, }, /* 925 */+ { 80, 7, 12, 0, 0, 80, 0, }, /* 926 */+ { 80, 1, 2, 0, 0, 80, 0, }, /* 927 */+ { 127, 7, 12, 0, 0, 127, 0, }, /* 928 */+ { 115, 7, 12, 0, 0, 115, 0, }, /* 929 */+ { 115, 13, 12, 0, 0, 115, 0, }, /* 930 */+ { 115, 21, 12, 0, 0, 115, 0, }, /* 931 */+ { 159, 7, 12, 0, 0, 159, 0, }, /* 932 */+ { 159, 13, 12, 0, 0, 159, 0, }, /* 933 */+ { 103, 7, 12, 0, 0, 103, 0, }, /* 934 */+ { 103, 12, 3, 0, 0, 103, 0, }, /* 935 */+ { 103, 21, 12, 0, 0, 103, 0, }, /* 936 */+ { 119, 7, 12, 0, 0, 119, 0, }, /* 937 */+ { 119, 12, 3, 0, 0, 119, 0, }, /* 938 */+ { 119, 21, 12, 0, 0, 119, 0, }, /* 939 */+ { 119, 26, 12, 0, 0, 119, 0, }, /* 940 */+ { 119, 6, 12, 0, 0, 119, 0, }, /* 941 */+ { 119, 13, 12, 0, 0, 119, 0, }, /* 942 */+ { 119, 15, 12, 0, 0, 119, 0, }, /* 943 */+ { 146, 9, 12, 0, 32, 146, 0, }, /* 944 */+ { 146, 5, 12, 0, -32, 146, 0, }, /* 945 */+ { 146, 15, 12, 0, 0, 146, 0, }, /* 946 */+ { 146, 21, 12, 0, 0, 146, 0, }, /* 947 */+ { 99, 7, 12, 0, 0, 99, 0, }, /* 948 */+ { 99, 12, 3, 0, 0, 99, 0, }, /* 949 */+ { 99, 10, 5, 0, 0, 99, 0, }, /* 950 */+ { 99, 6, 12, 0, 0, 99, 0, }, /* 951 */+ { 137, 6, 12, 0, 0, 137, 0, }, /* 952 */+ { 139, 6, 12, 0, 0, 139, 0, }, /* 953 */+ { 23, 21, 12, 0, 0, 23, 0, }, /* 954 */+ { 155, 12, 3, 0, 0, 155, 0, }, /* 955 */+ { 23, 10, 5, 0, 0, 23, 0, }, /* 956 */+ { 137, 7, 12, 0, 0, 137, 0, }, /* 957 */+ { 155, 7, 12, 0, 0, 155, 0, }, /* 958 */+ { 139, 7, 12, 0, 0, 139, 0, }, /* 959 */+ { 105, 7, 12, 0, 0, 105, 0, }, /* 960 */+ { 105, 26, 12, 0, 0, 105, 0, }, /* 961 */+ { 105, 12, 3, 0, 0, 105, 0, }, /* 962 */+ { 105, 21, 12, 0, 0, 105, 0, }, /* 963 */+ { 10, 1, 2, 0, 0, 105, 0, }, /* 964 */+ { 10, 10, 3, 0, 0, 10, 0, }, /* 965 */+ { 10, 10, 5, 0, 0, 10, 0, }, /* 966 */+ { 20, 12, 3, 0, 0, 20, 0, }, /* 967 */+ { 131, 26, 12, 0, 0, 131, 0, }, /* 968 */+ { 131, 12, 3, 0, 0, 131, 0, }, /* 969 */+ { 131, 21, 12, 0, 0, 131, 0, }, /* 970 */+ { 18, 12, 3, 0, 0, 18, 0, }, /* 971 */+ { 151, 7, 12, 0, 0, 151, 0, }, /* 972 */+ { 151, 12, 3, 0, 0, 151, 0, }, /* 973 */+ { 151, 6, 12, 0, 0, 151, 0, }, /* 974 */+ { 151, 13, 12, 0, 0, 151, 0, }, /* 975 */+ { 151, 26, 12, 0, 0, 151, 0, }, /* 976 */+ { 160, 7, 12, 0, 0, 160, 0, }, /* 977 */+ { 160, 12, 3, 0, 0, 160, 0, }, /* 978 */+ { 152, 7, 12, 0, 0, 152, 0, }, /* 979 */+ { 152, 12, 3, 0, 0, 152, 0, }, /* 980 */+ { 152, 13, 12, 0, 0, 152, 0, }, /* 981 */+ { 152, 23, 12, 0, 0, 152, 0, }, /* 982 */+ { 113, 7, 12, 0, 0, 113, 0, }, /* 983 */+ { 113, 15, 12, 0, 0, 113, 0, }, /* 984 */+ { 113, 12, 3, 0, 0, 113, 0, }, /* 985 */+ { 132, 9, 12, 0, 34, 132, 0, }, /* 986 */+ { 132, 5, 12, 0, -34, 132, 0, }, /* 987 */+ { 132, 12, 3, 0, 0, 132, 0, }, /* 988 */+ { 132, 6, 12, 0, 0, 132, 0, }, /* 989 */+ { 132, 13, 12, 0, 0, 132, 0, }, /* 990 */+ { 132, 21, 12, 0, 0, 132, 0, }, /* 991 */+ { 0, 2, 14, 0, 0, 0, 0, }, /* 992 */+ { 10, 26, 11, 0, 0, 10, 0, }, /* 993 */+ { 27, 26, 12, 0, 0, 27, 0, }, /* 994 */+ { 10, 24, 3, 0, 0, 10, 0, }, /* 995 */+ { 10, 1, 3, 0, 0, 10, 0, }, /* 996 */+};++const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, /* U+0000 */+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, /* U+0800 */+ 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 41, 42, 43, 44, 45, /* U+1000 */+ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, /* U+1800 */+ 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, /* U+2000 */+ 77, 77, 78, 79, 66, 66, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, /* U+2800 */+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 98, 98, 98, 98, 98, 98, /* U+3000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+3800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+4000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 99, 98, 98, 98, 98, /* U+4800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+5000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+5800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+6000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+6800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+7000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+7800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+8800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+9000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+9800 */+100,101,101,101,101,101,101,101,101,102,103,103,104,105,106,107, /* U+A000 */+108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,116, /* U+A800 */+117,118,119,120,121,122,116,117,118,119,120,121,122,116,117,118, /* U+B000 */+119,120,121,122,116,117,118,119,120,121,122,116,117,118,119,120, /* U+B800 */+121,122,116,117,118,119,120,121,122,116,117,118,119,120,121,122, /* U+C000 */+116,117,118,119,120,121,122,116,117,118,119,120,121,122,116,117, /* U+C800 */+118,119,120,121,122,116,117,118,119,120,121,122,116,117,118,123, /* U+D000 */+124,124,124,124,124,124,124,124,124,124,124,124,124,124,124,124, /* U+D800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+E000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+E800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F000 */+125,125, 98, 98,126,127,128,129,130,130,131,132,133,134,135,136, /* U+F800 */+137,138,139,140,141,142,143,144,145,146,147,148,149,149,150,151, /* U+10000 */+152,153,154,155,156,157,158,159,160,161,162,141,163,164,165,166, /* U+10800 */+167,168,169,170,171,172,173,141,174,175,141,176,177,178,179,141, /* U+11000 */+180,181,182,183,184,185,141,141,186,187,188,189,141,190,141,191, /* U+11800 */+192,192,192,192,192,192,192,193,194,192,195,141,141,141,141,141, /* U+12000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,196, /* U+12800 */+197,197,197,197,197,197,197,197,198,141,141,141,141,141,141,141, /* U+13000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+13800 */+141,141,141,141,141,141,141,141,199,199,199,199,200,141,141,141, /* U+14000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+14800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+15000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+15800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+16000 */+201,201,201,201,202,203,204,205,141,141,141,141,206,207,208,209, /* U+16800 */+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210, /* U+17000 */+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,210, /* U+17800 */+210,210,210,210,210,210,210,210,210,210,210,210,210,210,210,211, /* U+18000 */+210,210,210,210,210,210,212,212,212,213,214,141,141,141,141,141, /* U+18800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+19000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+19800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1A000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,215, /* U+1A800 */+216,217,218,219,219,220,141,141,141,141,141,141,141,141,141,141, /* U+1B000 */+141,141,141,141,141,141,141,141,221,222,141,141,141,141,141,141, /* U+1B800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+1C000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,223,224, /* U+1C800 */+ 71,225,226,227,228,229,230,141,231,232,233,234,235,236,237,238, /* U+1D000 */+239,239,239,239,240,241,141,141,141,141,141,141,141,141,242,141, /* U+1D800 */+243,141,244,141,141,245,141,141,141,141,141,141,141,141,141,246, /* U+1E000 */+247,248,249,141,141,141,141,141,250,251,252,141,253,254,141,141, /* U+1E800 */+255,256,257,258,259,260,261,262,261,261,263,261,264,265,266,267, /* U+1F000 */+268,269,270,261,271,272, 71,273,260,260,260,260,260,260,260,274, /* U+1F800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+20800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+21800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+22000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+22800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+23000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+23800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+24000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+24800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+25000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+25800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+26000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+26800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+27000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+27800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+28800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+29800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,275, 98, 98, /* U+2A000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2A800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,276, 98, /* U+2B000 */+277, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2B800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2C000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,278, 98, 98, /* U+2C800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2D800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+2E000 */+ 98, 98, 98, 98, 98, 98, 98,279,141,141,141,141,141,141,141,141, /* U+2E800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+2F000 */+ 98, 98, 98, 98,280,141,141,141,141,141,141,141,141,141,141,141, /* U+2F800 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30000 */+ 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, /* U+30800 */+ 98, 98, 98, 98, 98, 98,281,141,141,141,141,141,141,141,141,141, /* U+31000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+31800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+32000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+32800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+33000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+33800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+34000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+34800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+35000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+35800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+36000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+36800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+37000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+37800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+38000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+38800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+39000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+39800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3A000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3A800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3B000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3B800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3C000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3C800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3D000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3D800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3E000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3E800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3F000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+3F800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+40000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+40800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+41000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+41800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+42000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+42800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+43000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+43800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+44000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+44800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+45000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+45800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+46000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+46800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+47000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+47800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+48000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+48800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+49000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+49800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4A000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4A800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4B000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4B800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4C000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4C800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4D000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4D800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4E000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4E800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4F000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+4F800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+50000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+50800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+51000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+51800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+52000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+52800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+53000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+53800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+54000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+54800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+55000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+55800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+56000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+56800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+57000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+57800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+58000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+58800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+59000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+59800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5A000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5A800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5B000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5B800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5C000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5C800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5D000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5D800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5E000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5E800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5F000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+5F800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+60000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+60800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+61000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+61800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+62000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+62800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+63000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+63800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+64000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+64800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+65000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+65800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+66000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+66800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+67000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+67800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+68000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+68800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+69000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+69800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6A000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6A800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6B000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6B800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6C000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6C800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6D000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6D800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6E000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6E800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6F000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+6F800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+70000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+70800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+71000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+71800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+72000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+72800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+73000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+73800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+74000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+74800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+75000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+75800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+76000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+76800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+77000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+77800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+78000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+78800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+79000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+79800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7A000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7A800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7B000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7B800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7C000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7C800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7D000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7D800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7E000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7E800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7F000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+7F800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+80000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+80800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+81000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+81800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+82000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+82800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+83000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+83800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+84000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+84800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+85000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+85800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+86000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+86800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+87000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+87800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+88000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+88800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+89000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+89800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8A000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8A800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8B000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8B800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8C000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8C800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8D000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8D800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8E000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8E800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8F000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+8F800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+90000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+90800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+91000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+91800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+92000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+92800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+93000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+93800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+94000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+94800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+95000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+95800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+96000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+96800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+97000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+97800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+98000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+98800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+99000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+99800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9A000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9A800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9B000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9B800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9C000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9C800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9D000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9D800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9E000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9E800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9F000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+9F800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A0000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A0800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A1000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A1800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A2000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A2800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A3000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A3800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A4000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A4800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A5000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A5800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A6000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A6800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A7000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A7800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A8000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A8800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A9000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+A9800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AA000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AA800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AB000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AB800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AC000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AC800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AD000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AD800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AE000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AE800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AF000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+AF800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B0000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B0800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B1000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B1800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B2000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B2800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B3000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B3800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B4000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B4800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B5000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B5800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B6000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B6800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B7000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B7800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B8000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B8800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B9000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+B9800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BA000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BA800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BB000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BB800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BC000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BC800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BD000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BD800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BE000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BE800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BF000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+BF800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C0000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C0800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C1000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C1800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C2000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C2800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C3000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C3800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C4000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C4800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C5000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C5800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C6000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C6800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C7000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C7800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C8000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C8800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C9000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+C9800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CA000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CA800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CB000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CB800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CC000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CC800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CD000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CD800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CE000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CE800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CF000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+CF800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D0000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D0800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D1000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D1800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D2000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D2800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D3000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D3800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D4000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D4800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D5000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D5800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D6000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D6800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D7000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D7800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D8000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D8800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D9000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+D9800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DA000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DA800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DB000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DB800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DC000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DC800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DD000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DD800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DE000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DE800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DF000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+DF800 */+282,283,284,285,283,283,283,283,283,283,283,283,283,283,283,283, /* U+E0000 */+283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283, /* U+E0800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E1000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E1800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E2000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E2800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E3000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E3800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E4000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E4800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E5000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E5800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E6000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E6800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E7000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E7800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E8000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E8800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E9000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+E9800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EA000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EA800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EB000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EB800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EC000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EC800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+ED000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+ED800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EE000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EE800 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EF000 */+141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, /* U+EF800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F0000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F0800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F1000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F1800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F2000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F2800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F3000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F3800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F4000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F4800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F5000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F5800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F6000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F6800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F7000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F7800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F8000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F8800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F9000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+F9800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FA000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FA800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FB000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FB800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FC000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FC800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FD000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FD800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FE000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FE800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+FF000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,286, /* U+FF800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+100000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+100800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+101000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+101800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+102000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+102800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+103000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+103800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+104000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+104800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+105000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+105800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+106000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+106800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+107000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+107800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+108000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+108800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+109000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+109800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10A000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10A800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10B000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10B800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10C000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10C800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10D000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10D800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10E000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10E800 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125, /* U+10F000 */+125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,286, /* U+10F800 */+};++const uint16_t PRIV(ucd_stage2)[] = { /* 73472 bytes, block = 128 */+/* block 0 */+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 4, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5,+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5,+ 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 12, 12, 12, 12,+ 12, 12, 12, 14, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16,+ 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 17, 17, 17, 17,+ 17, 17, 17, 19, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 1,++/* block 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,+ 4, 5, 6, 6, 6, 6, 20, 5, 15, 21, 22, 23, 9, 24, 21, 15,+ 20, 9, 25, 25, 15, 26, 5, 5, 15, 25, 22, 27, 25, 25, 25, 5,+ 12, 12, 12, 12, 12, 28, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,+ 12, 12, 12, 12, 12, 12, 12, 9, 12, 12, 12, 12, 12, 12, 12, 29,+ 17, 17, 17, 17, 17, 30, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,+ 17, 17, 17, 17, 17, 17, 17, 9, 17, 17, 17, 17, 17, 17, 17, 31,++/* block 2 */+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 34, 35, 32, 33, 32, 33, 32, 33, 35, 32, 33, 32, 33, 32, 33, 32,+ 33, 32, 33, 32, 33, 32, 33, 32, 33, 35, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 36, 32, 33, 32, 33, 32, 33, 37,++/* block 3 */+ 38, 39, 32, 33, 32, 33, 40, 32, 33, 41, 41, 32, 33, 35, 42, 43,+ 44, 32, 33, 41, 45, 46, 47, 48, 32, 33, 49, 35, 47, 50, 51, 52,+ 32, 33, 32, 33, 32, 33, 53, 32, 33, 53, 35, 35, 32, 33, 53, 32,+ 33, 54, 54, 32, 33, 32, 33, 55, 32, 33, 35, 22, 32, 33, 35, 56,+ 22, 22, 22, 22, 57, 58, 59, 60, 61, 62, 63, 64, 65, 32, 33, 32,+ 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 66, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 35, 67, 68, 69, 32, 33, 70, 71, 32, 33, 32, 33, 32, 33, 32, 33,++/* block 4 */+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 72, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 35, 35, 35, 35, 35, 35, 73, 32, 33, 74, 75, 76,+ 76, 32, 33, 77, 78, 79, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 80, 81, 82, 83, 84, 35, 85, 85, 35, 86, 35, 87, 88, 35, 35, 35,+ 85, 89, 35, 90, 35, 91, 92, 35, 93, 94, 92, 95, 96, 35, 35, 94,+ 35, 97, 98, 35, 35, 99, 35, 35, 35, 35, 35, 35, 35,100, 35, 35,++/* block 5 */+101, 35,102,101, 35, 35, 35,103,101,104,105,105,106, 35, 35, 35,+ 35, 35,107, 35, 22, 35, 35, 35, 35, 35, 35, 35, 35,108,109, 35,+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,+110,110,110,110,110,110,110,110,110,111,111,111,111,111,111,111,+111,111, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111,111,+111,111, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,+110,110,110,110,110, 15, 15, 15, 15, 15,112,112,111, 15,111, 15,+ 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,++/* block 6 */+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,114,113,113,115,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,116,116,116,116,116,116,116,116,116,116,116,116,116,+117,118,117,118,111,119,117,118,120,120,121,122,122,122, 5,123,++/* block 7 */+120,120,120,120,119, 15,124, 5,125,125,125,120,126,120,127,127,+128,129,130,129,129,131,129,129,132,133,134,129,135,129,129,129,+136,137,120,138,129,129,139,129,129,140,129,129,141,142,142,142,+128,143,144,143,143,145,143,143,146,147,148,143,149,143,143,143,+150,151,152,153,143,143,154,143,143,155,143,143,156,157,157,158,+159,160,161,161,161,162,163,164,117,118,117,118,117,118,117,118,+117,118,165,166,165,166,165,166,165,166,165,166,165,166,165,166,+167,168,169,170,171,172,173,117,118,174,117,118,128,175,175,175,++/* block 8 */+176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,+177,177,178,177,179,177,177,177,177,177,177,177,177,177,180,177,+177,181,182,177,177,177,177,177,177,177,183,177,177,177,177,177,+184,184,185,184,186,184,184,184,184,184,184,184,184,184,187,184,+184,188,189,184,184,184,184,184,184,184,190,184,184,184,184,184,+191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,+192,193,194,195,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,++/* block 9 */+192,193,196,197,198,199,199,198,200,200,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+201,192,193,192,193,192,193,192,193,192,193,192,193,192,193,202,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,++/* block 10 */+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+120,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,+203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,203,+203,203,203,203,203,203,203,120,120,204,205,205,205,205,205,205,+206,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,+207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,207,++/* block 11 */+207,207,207,207,207,207,207,206,206,205,208,120,120,209,209,210,+120,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,+211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,211,+211,211,211,211,211,211,211,211,211,211,211,211,211,211,212,211,+213,211,211,213,211,211,213,211,120,120,120,120,120,120,120,120,+214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,214,+214,214,214,214,214,214,214,214,214,214,214,120,120,120,120,214,+214,214,214,213,213,120,120,120,120,120,120,120,120,120,120,120,++/* block 12 */+215,215,215,215,215,216,217,217,217,218,218,219,220,218,221,221,+222,222,222,222,222,222,222,222,222,222,222,220,223,218,218,224,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+226,225,225,225,225,225,225,225,225,225,225,227,227,227,227,227,+227,227,227,227,227,227,222,222,222,222,222,222,222,222,222,222,+228,228,228,228,228,228,228,228,228,228,218,218,218,218,225,225,+227,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,++/* block 13 */+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,229,225,222,222,222,222,222,222,222,216,221,222,+222,222,222,222,222,230,230,222,222,221,222,222,222,222,225,225,+231,231,231,231,231,231,231,231,231,231,225,225,225,221,221,225,++/* block 14 */+232,232,232,232,232,232,232,232,232,232,232,232,232,232,120,233,+234,235,234,234,234,234,234,234,234,234,234,234,234,234,234,234,+234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,234,+235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,235,+235,235,235,235,235,235,235,235,235,235,235,120,120,234,234,234,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,++/* block 15 */+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,+236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,236,+236,236,236,236,236,236,237,237,237,237,237,237,237,237,237,237,+237,236,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+238,238,238,238,238,238,238,238,238,238,239,239,239,239,239,239,+239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,239,+239,239,239,239,239,239,239,239,239,239,239,240,240,240,240,240,+240,240,240,240,241,241,242,243,243,243,241,120,120,240,244,244,++/* block 16 */+245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,245,+245,245,245,245,245,245,246,246,246,246,247,246,246,246,246,246,+246,246,246,246,247,246,246,246,247,246,246,246,246,246,120,120,+248,248,248,248,248,248,248,248,248,248,248,248,248,248,248,120,+249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,+249,249,249,249,249,249,249,249,249,250,250,250,120,120,251,120,+234,234,234,234,234,234,234,234,234,234,234,120,120,120,120,120,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,++/* block 17 */+225,225,225,225,225,225,225,225,252,225,225,225,225,225,225,120,+215,215,120,120,120,120,120,120,222,222,222,222,222,222,222,222,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,230,222,222,222,222,222,222,+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,+222,222,216,222,222,222,222,222,222,222,222,222,222,222,222,222,+222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,222,++/* block 18 */+253,253,253,254,255,255,255,255,255,255,255,255,255,255,255,255,+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,+255,255,255,255,255,255,255,255,255,255,253,254,253,255,254,254,+254,253,253,253,253,253,253,253,253,254,254,254,254,253,254,254,+255,256,257,113,113,253,253,253,255,255,255,255,255,255,255,255,+255,255,253,253,258,259,260,260,260,260,260,260,260,260,260,260,+261,262,255,255,255,255,255,255,255,255,255,255,255,255,255,255,++/* block 19 */+263,264,265,265,120,263,263,263,263,263,263,263,263,120,120,263,+263,120,120,263,263,263,263,263,263,263,263,263,263,263,263,263,+263,263,263,263,263,263,263,263,263,120,263,263,263,263,263,263,+263,120,263,120,120,120,263,263,263,263,120,120,264,263,266,265,+265,264,264,264,264,120,120,265,265,120,120,265,265,264,263,120,+120,120,120,120,120,120,120,266,120,120,120,120,263,263,120,263,+263,263,264,264,120,120,267,267,267,267,267,267,267,267,267,267,+263,263,268,268,269,269,269,269,269,269,270,268,263,271,264,120,++/* block 20 */+120,272,272,273,120,274,274,274,274,274,274,120,120,120,120,274,+274,120,120,274,274,274,274,274,274,274,274,274,274,274,274,274,+274,274,274,274,274,274,274,274,274,120,274,274,274,274,274,274,+274,120,274,274,120,274,274,120,274,274,120,120,272,120,273,273,+273,272,272,120,120,120,120,272,272,120,120,272,272,272,120,120,+120,272,120,120,120,120,120,120,120,274,274,274,274,120,274,120,+120,120,120,120,120,120,275,275,275,275,275,275,275,275,275,275,+272,272,274,274,274,272,276,120,120,120,120,120,120,120,120,120,++/* block 21 */+120,277,277,278,120,279,279,279,279,279,279,279,279,279,120,279,+279,279,120,279,279,279,279,279,279,279,279,279,279,279,279,279,+279,279,279,279,279,279,279,279,279,120,279,279,279,279,279,279,+279,120,279,279,120,279,279,279,279,279,120,120,277,279,278,278,+278,277,277,277,277,277,120,277,277,278,120,278,278,277,120,120,+279,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+279,279,277,277,120,120,280,280,280,280,280,280,280,280,280,280,+281,282,120,120,120,120,120,120,120,279,277,277,277,277,277,277,++/* block 22 */+120,283,284,284,120,285,285,285,285,285,285,285,285,120,120,285,+285,120,120,285,285,285,285,285,285,285,285,285,285,285,285,285,+285,285,285,285,285,285,285,285,285,120,285,285,285,285,285,285,+285,120,285,285,120,285,285,285,285,285,120,120,283,285,286,283,+284,283,283,283,283,120,120,284,284,120,120,284,284,283,120,120,+120,120,120,120,120,283,283,286,120,120,120,120,285,285,120,285,+285,285,283,283,120,120,287,287,287,287,287,287,287,287,287,287,+288,285,289,289,289,289,289,289,120,120,120,120,120,120,120,120,++/* block 23 */+120,120,290,291,120,291,291,291,291,291,291,120,120,120,291,291,+291,120,291,291,291,291,120,120,120,291,291,120,291,120,291,291,+120,120,120,291,291,120,120,120,291,291,291,120,120,120,291,291,+291,291,291,291,291,291,291,291,291,291,120,120,120,120,292,293,+290,293,293,120,120,120,293,293,293,120,293,293,293,290,120,120,+291,120,120,120,120,120,120,292,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,294,294,294,294,294,294,294,294,294,294,+295,295,295,296,297,297,297,297,297,298,297,120,120,120,120,120,++/* block 24 */+299,300,300,300,299,301,301,301,301,301,301,301,301,120,301,301,+301,120,301,301,301,301,301,301,301,301,301,301,301,301,301,301,+301,301,301,301,301,301,301,301,301,120,301,301,301,301,301,301,+301,301,301,301,301,301,301,301,301,301,120,120,299,301,299,299,+299,300,300,300,300,120,299,299,299,120,299,299,299,299,120,120,+120,120,120,120,120,299,299,120,301,301,301,120,120,301,120,120,+301,301,299,299,120,120,302,302,302,302,302,302,302,302,302,302,+120,120,120,120,120,120,120,303,304,304,304,304,304,304,304,305,++/* block 25 */+306,307,308,308,309,306,306,306,306,306,306,306,306,120,306,306,+306,120,306,306,306,306,306,306,306,306,306,306,306,306,306,306,+306,306,306,306,306,306,306,306,306,120,306,306,306,306,306,306,+306,306,306,306,120,306,306,306,306,306,120,120,307,306,308,307,+308,308,310,308,308,120,307,308,308,120,308,308,307,307,120,120,+120,120,120,120,120,310,310,120,120,120,120,120,120,306,306,120,+306,306,307,307,120,120,311,311,311,311,311,311,311,311,311,311,+120,306,306,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 26 */+312,312,313,313,314,314,314,314,314,314,314,314,314,120,314,314,+314,120,314,314,314,314,314,314,314,314,314,314,314,314,314,314,+314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,314,+314,314,314,314,314,314,314,314,314,314,314,312,312,314,315,313,+313,312,312,312,312,120,313,313,313,120,313,313,313,312,316,317,+120,120,120,120,314,314,314,315,318,318,318,318,318,318,318,314,+314,314,312,312,120,120,319,319,319,319,319,319,319,319,319,319,+318,318,318,318,318,318,318,318,318,317,314,314,314,314,314,314,++/* block 27 */+120,320,321,321,120,322,322,322,322,322,322,322,322,322,322,322,+322,322,322,322,322,322,322,120,120,120,322,322,322,322,322,322,+322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,322,+322,322,120,322,322,322,322,322,322,322,322,322,120,322,120,120,+322,322,322,322,322,322,322,120,120,120,320,120,120,120,120,323,+321,321,320,320,320,120,320,120,321,321,321,321,321,321,321,323,+120,120,120,120,120,120,324,324,324,324,324,324,324,324,324,324,+120,120,321,321,325,120,120,120,120,120,120,120,120,120,120,120,++/* block 28 */+120,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,+326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,+326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,326,+326,327,326,328,327,327,327,327,327,327,327,120,120,120,120, 6,+326,326,326,326,326,326,329,327,327,327,327,327,327,327,327,330,+331,331,331,331,331,331,331,331,331,331,330,330,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 29 */+120,332,332,120,332,120,332,332,332,332,332,120,332,332,332,332,+332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,332,+332,332,332,332,120,332,120,332,332,332,332,332,332,332,332,332,+332,333,332,334,333,333,333,333,333,333,333,333,333,332,120,120,+332,332,332,332,332,120,335,120,333,333,333,333,333,333,120,120,+336,336,336,336,336,336,336,336,336,336,120,120,332,332,332,332,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 30 */+337,338,338,338,339,339,339,339,339,339,339,339,339,339,339,339,+339,339,339,338,339,338,338,338,340,340,338,338,338,338,338,338,+341,341,341,341,341,341,341,341,341,341,342,342,342,342,342,342,+342,342,342,342,338,340,338,340,338,340,343,344,343,344,345,345,+337,337,337,337,337,337,337,337,120,337,337,337,337,337,337,337,+337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,337,+337,337,337,337,337,337,337,337,337,337,337,337,337,120,120,120,+120,340,340,340,340,340,340,340,340,340,340,340,340,340,340,345,++/* block 31 */+340,340,340,340,340,339,340,340,337,337,337,337,337,340,340,340,+340,340,340,340,340,340,340,340,120,340,340,340,340,340,340,340,+340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,+340,340,340,340,340,340,340,340,340,340,340,340,340,120,338,338,+338,338,338,338,338,338,340,338,338,338,338,338,338,120,338,338,+339,339,339,339,339, 20, 20, 20, 20,339,339,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 32 */+346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,+346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,+346,346,346,346,346,346,346,346,346,346,346,347,347,348,348,348,+348,349,348,348,348,348,348,348,347,348,348,349,349,348,348,346,+350,350,350,350,350,350,350,350,350,350,351,351,351,351,351,351,+346,346,346,346,346,346,349,349,348,348,346,346,346,346,348,348,+348,346,347,347,347,346,346,347,347,347,347,347,347,347,346,346,+346,348,348,348,348,346,346,346,346,346,346,346,346,346,346,346,++/* block 33 */+346,346,348,347,349,348,348,347,347,347,347,347,347,348,346,347,+352,352,352,352,352,352,352,352,352,352,347,347,347,348,353,353,+354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,+354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,354,+354,354,354,354,354,354,120,354,120,120,120,120,120,354,120,120,+355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,+355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,355,+355,355,355,355,355,355,355,355,355,355,355,356,357,355,355,355,++/* block 34 */+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,++/* block 35 */+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,+359,359,359,359,359,359,359,359,360,360,360,360,360,360,360,360,+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,++/* block 36 */+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,120,361,361,361,361,120,120,+361,361,361,361,361,361,361,120,361,120,361,361,361,361,120,120,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,++/* block 37 */+361,361,361,361,361,361,361,361,361,120,361,361,361,361,120,120,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,120,+361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,++/* block 38 */+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,120,361,361,361,361,120,120,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,361,361,361,361,120,120,362,362,362,+363,363,363,363,363,363,363,363,363,364,364,364,364,364,364,364,+364,364,364,364,364,364,364,364,364,364,364,364,364,120,120,120,++/* block 39 */+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+365,365,365,365,365,365,365,365,365,365,120,120,120,120,120,120,+366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,+366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,+366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,+366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,+366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,366,+367,367,367,367,367,367,120,120,368,368,368,368,368,368,120,120,++/* block 40 */+369,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,++/* block 41 */+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,++/* block 42 */+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,371,372,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,++/* block 43 */+373,374,374,374,374,374,374,374,374,374,374,374,374,374,374,374,+374,374,374,374,374,374,374,374,374,374,374,375,376,120,120,120,+377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,+377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,+377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,+377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,377,+377,377,377,377,377,377,377,377,377,377,377, 5, 5, 5,378,378,+378,377,377,377,377,377,377,377,377,120,120,120,120,120,120,120,++/* block 44 */+379,379,379,379,379,379,379,379,379,379,379,379,379,379,379,379,+379,379,380,380,380,381,120,120,120,120,120,120,120,120,120,379,+382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,382,+382,382,383,383,384,385,385,120,120,120,120,120,120,120,120,120,+386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,386,+386,386,387,387,120,120,120,120,120,120,120,120,120,120,120,120,+388,388,388,388,388,388,388,388,388,388,388,388,388,120,388,388,+388,120,389,389,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 45 */+390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,+390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,+390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,390,+390,390,390,390,391,391,392,391,391,391,391,391,391,391,392,392,+392,392,392,392,392,392,391,392,392,391,391,391,391,391,391,391,+391,391,391,391,393,393,393,394,393,393,393,395,390,391,120,120,+396,396,396,396,396,396,396,396,396,396,120,120,120,120,120,120,+397,397,397,397,397,397,397,397,397,397,120,120,120,120,120,120,++/* block 46 */+398,398,399,399,398,399,400,398,398,398,398,401,401,401,402,401,+403,403,403,403,403,403,403,403,403,403,120,120,120,120,120,120,+404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,+404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,+404,404,404,405,404,404,404,404,404,404,404,404,404,404,404,404,+404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,+404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,+404,404,404,404,404,404,404,404,404,120,120,120,120,120,120,120,++/* block 47 */+404,404,404,404,404,401,401,404,404,404,404,404,404,404,404,404,+404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,404,+404,404,404,404,404,404,404,404,404,401,404,120,120,120,120,120,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+370,370,370,370,370,370,120,120,120,120,120,120,120,120,120,120,++/* block 48 */+406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,+406,406,406,406,406,406,406,406,406,406,406,406,406,406,406,120,+407,407,407,408,408,408,408,407,407,408,408,408,120,120,120,120,+408,408,407,408,408,408,408,408,408,407,407,407,120,120,120,120,+409,120,120,120,410,410,411,411,411,411,411,411,411,411,411,411,+412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,412,+412,412,412,412,412,412,412,412,412,412,412,412,412,412,120,120,+412,412,412,412,412,120,120,120,120,120,120,120,120,120,120,120,++/* block 49 */+413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,+413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,+413,413,413,413,413,413,413,413,413,413,413,413,120,120,120,120,+413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,413,+413,413,413,413,413,413,413,413,413,413,120,120,120,120,120,120,+414,414,414,414,414,414,414,414,414,414,415,120,120,120,416,416,+417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,+417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,417,++/* block 50 */+418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,418,+418,418,418,418,418,418,418,419,419,420,420,419,120,120,421,421,+422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,+422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,+422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,422,+422,422,422,422,422,423,424,423,424,424,424,424,424,424,424,120,+424,425,424,425,425,424,424,424,424,424,424,424,424,423,423,423,+423,423,423,424,424,424,424,424,424,424,424,424,424,120,120,424,++/* block 51 */+426,426,426,426,426,426,426,426,426,426,120,120,120,120,120,120,+426,426,426,426,426,426,426,426,426,426,120,120,120,120,120,120,+427,427,427,427,427,427,427,428,427,427,427,427,427,427,120,120,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,429,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 52 */+430,430,430,430,431,432,432,432,432,432,432,432,432,432,432,432,+432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,+432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,432,+432,432,432,432,430,433,430,430,430,430,430,431,430,431,431,431,+431,431,430,431,431,432,432,432,432,432,432,432,432,120,120,120,+434,434,434,434,434,434,434,434,434,434,435,435,435,435,435,435,+435,436,436,436,436,436,436,436,436,436,436,430,430,430,430,430,+430,430,430,430,436,436,436,436,436,436,436,436,436,435,435,120,++/* block 53 */+437,437,438,439,439,439,439,439,439,439,439,439,439,439,439,439,+439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,439,+439,438,437,437,437,437,438,438,437,437,438,437,437,437,439,439,+440,440,440,440,440,440,440,440,440,440,439,439,439,439,439,439,+441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,+441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,441,+441,441,441,441,441,441,442,443,442,442,443,443,443,442,443,442,+442,442,443,443,120,120,120,120,120,120,120,120,444,444,444,444,++/* block 54 */+445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,+445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,445,+445,445,445,445,446,446,446,446,446,446,446,446,447,447,447,447,+447,447,447,447,446,446,447,447,120,120,120,448,448,448,448,448,+449,449,449,449,449,449,449,449,449,449,120,120,120,445,445,445,+450,450,450,450,450,450,450,450,450,450,451,451,451,451,451,451,+451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,451,+451,451,451,451,451,451,451,451,452,452,452,452,452,452,453,453,++/* block 55 */+454,455,456,457,458,459,460,461,462,120,120,120,120,120,120,120,+463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,+463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,463,+463,463,463,463,463,463,463,463,463,463,463,120,120,463,463,463,+464,464,464,464,464,464,464,464,120,120,120,120,120,120,120,120,+465,466,465,467,466,468,468,469,468,469,470,466,469,469,466,466,+469,471,466,466,466,466,466,466,466,472,473,474,474,468,474,474,+474,474,475,476,477,473,473,478,479,479,480,120,120,120,120,120,++/* block 56 */+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,+ 35, 35, 35, 35, 35, 35,128,128,128,128,128,481,110,110,110,110,+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,+110,110,110,110,110,110,110,110,110,110,110,110,110,121,121,121,+121,121,110,110,110,110,121,121,121,121,121, 35, 35, 35, 35, 35,+ 35, 35, 35, 35, 35, 35, 35, 35,482,483, 35, 35, 35,484, 35, 35,++/* block 57 */+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,485, 35,+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,110,110,110,110,110,+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,121,+114,114,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,486,113,487,113,113,113,113,113,++/* block 58 */+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+488,489, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,++/* block 59 */+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 35, 35, 35, 35, 35,490, 35, 35,491, 35,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,++/* block 60 */+492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,+492,492,492,492,492,492,120,120,493,493,493,493,493,493,120,120,+492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,+492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,+492,492,492,492,492,492,120,120,493,493,493,493,493,493,120,120,+128,492,128,492,128,492,128,492,120,493,120,493,120,493,120,493,+492,492,492,492,492,492,492,492,493,493,493,493,493,493,493,493,+494,494,495,495,495,495,496,496,497,497,498,498,499,499,120,120,++/* block 61 */+492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500,+492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500,+492,492,492,492,492,492,492,492,500,500,500,500,500,500,500,500,+492,492,128,501,128,120,128,128,493,493,502,502,503,119,504,119,+119,119,128,501,128,120,128,128,505,505,505,505,503,119,119,119,+492,492,128,128,120,120,128,128,493,493,506,506,120,119,119,119,+492,492,128,128,128,169,128,128,493,493,507,507,174,119,119,119,+120,120,128,501,128,120,128,128,508,508,509,509,503,119,119,120,++/* block 62 */+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 24,510,511, 24, 24,+ 10, 10, 10, 10, 10, 10, 5, 5, 23, 27, 7, 23, 23, 27, 7, 23,+ 5, 5, 5, 5, 5, 5, 5, 5,512,513, 24, 24, 24, 24, 24,514,+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 23, 27, 5,515, 5, 5, 16,+ 16, 5, 5, 5, 9, 7, 8, 5, 5,515, 5, 5, 5, 5, 5, 5,+ 5, 5, 9, 5, 16, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4,+ 24, 24, 24, 24, 24,516, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,+ 25,110,120,120, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,110,++/* block 63 */+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 9, 9, 9, 7, 8,120,+110,110,110,110,110,110,110,110,110,110,110,110,110,120,120,120,+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,+ 6,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+113,113,113,113,113,113,113,113,113,113,113,113,113,429,429,429,+429,113,429,429,429,113,113,113,113,113,113,113,113,113,113,113,+517,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 64 */+ 20, 20,518, 20, 20, 20, 20,518, 20, 20,519,518,518,518,519,519,+518,518,518,519, 20,518, 20, 20, 9,518,518,518,518,518, 20, 20,+ 20, 20, 21, 20,518, 20,520, 20,518, 20,521,522,518,518, 20,519,+518,518,523,518,519,524,524,524,524,525, 20, 20,519,519,518,518,+ 9, 9, 9, 9, 9,518,519,519,519,519, 20, 9, 20, 20,526, 20,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,527,+528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,528,++/* block 65 */+529,529,529, 32, 33,529,529,529,529, 25, 20, 20,120,120,120,120,+ 9, 9, 9, 9,530, 21, 21, 21, 21, 21, 9, 9, 20, 20, 20, 20,+ 9, 20, 20, 9, 20, 20, 9, 20, 20, 21, 21, 20, 20, 20, 9, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9,+ 20, 20, 9, 20, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,++/* block 66 */+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,++/* block 67 */+ 20, 20, 20, 20, 20, 20, 20, 20, 7, 8, 7, 8, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20, 20,+ 9, 9, 20, 20, 20, 20, 20, 20, 21, 7, 8, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 20, 20, 20,++/* block 68 */+ 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9, 9,+ 9, 9, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 20, 20, 20, 20, 21, 21, 21, 20, 20, 20, 20, 20,++/* block 69 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,++/* block 70 */+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20,531,531,531,531,531,531,531,531,531,531,+531,531,532,531,531,531,531,531,531,531,531,531,531,531,531,531,+533,533,533,533,533,533,533,533,533,533,533,533,533,533,533,533,+533,533,533,533,533,533,533,533,533,533, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,++/* block 71 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,++/* block 72 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 21, 9, 20, 20, 20, 20, 20, 20, 20, 20,+ 21, 9, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 9, 9, 9,530,530,530,530, 9,++/* block 73 */+ 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,530,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,++/* block 74 */+ 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,++/* block 75 */+ 21, 21, 21, 21, 21, 21, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 20, 21, 20, 21, 20, 20, 20, 20, 20, 20, 21, 20, 20,+ 20, 21, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 21, 20, 20, 21, 20, 20, 20, 20, 21, 20, 21, 20,+ 20, 20, 20, 21, 21, 21, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 21, 21, 21, 21, 21, 7, 8, 7, 8, 7, 8, 7, 8,+ 7, 8, 7, 8, 7, 8, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,++/* block 76 */+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25, 20, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,+ 9, 9, 9, 9, 9, 7, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,++/* block 77 */+534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,+534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,+534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,+534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,+534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,+534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,+534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,+534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,534,++/* block 78 */+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9,530,530, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,++/* block 79 */+ 9, 9, 9, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7,+ 8, 7, 8, 7, 8, 7, 8, 7, 8, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, 7, 8, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 8, 9, 9,++/* block 80 */+ 20, 20, 20, 20, 20, 21, 21, 21, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,+ 9, 9, 9, 9, 9, 20, 20, 9, 9, 9, 9, 9, 9, 20, 20, 20,+ 21, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,++/* block 81 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20,120, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,++/* block 82 */+535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,+535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,+535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,535,+536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,+536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,+536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,536,+ 32, 33,537,538,539,540,541, 32, 33, 32, 33, 32, 33,542,543,544,+545, 35, 32, 33, 35, 32, 33, 35, 35, 35, 35, 35,110,110,546,546,++/* block 83 */+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,+165,166,165,166,165,166,165,166,165,166,165,166,165,166,165,166,+165,166,165,166,547,548,548,548,548,548,548,165,166,165,166,549,+549,549,165,166,120,120,120,120,120,550,550,550,550,551,550,550,++/* block 84 */+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,+552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,552,+552,552,552,552,552,552,120,552,120,120,120,120,120,552,120,120,+553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,+553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,+553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,553,+553,553,553,553,553,553,553,553,120,120,120,120,120,120,120,554,+555,120,120,120,120,120,120,120,120,120,120,120,120,120,120,556,++/* block 85 */+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,+361,361,361,361,361,361,361,120,120,120,120,120,120,120,120,120,+361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120,+361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120,+361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120,+361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120,+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,+557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,557,++/* block 86 */+ 5, 5, 23, 27, 23, 27, 5, 5, 5, 23, 27, 5, 23, 27, 5, 5,+ 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 10, 5, 23, 27, 5, 5,+ 23, 27, 7, 8, 7, 8, 7, 8, 7, 8, 5, 5, 5, 5, 5,111,+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 5, 5, 5, 5,+ 10, 5, 7,558, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,+ 20, 20, 5, 5, 5, 7, 8, 7, 8, 7, 8, 7, 8, 10,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 87 */+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,120,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 88 */+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,++/* block 89 */+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,559,+559,559,559,559,559,559,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,++/* block 90 */+ 4,560,560,561, 20,562,563,564,565,566,565,566,565,566,565,566,+565,566, 20,567,565,566,565,566,565,566,565,566,568,569,570,570,+ 20,564,564,564,564,564,564,564,564,564,571,571,571,571,572,572,+573,574,574,574,574,574, 20,567,564,564,564,562,575,576,577,577,+120,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,++/* block 91 */+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,120,120,579,579,580,580,581,581,578,+582,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,+583,583,583,583,583,583,583,583,583,583,583,560,574,584,584,583,++/* block 92 */+120,120,120,120,120,585,585,585,585,585,585,585,585,585,585,585,+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,+120,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,++/* block 93 */+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,+577,577,587,587,587,587,577,577,577,577,577,577,577,577,577,577,+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,+585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,585,+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,+577,577,577,577,120,120,120,120,120,120,120,120,120,120,120,120,+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,++/* block 94 */+588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,+588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,120,+587,587,587,587,587,587,587,587,587,587,577,577,577,577,577,577,+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,+577,577,577,577,577,577,577,577, 25, 25, 25, 25, 25, 25, 25, 25,+ 20, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,588,+588,588,588,588,588,588,588,588,588,588,588,588,588,588,588, 20,++/* block 95 */+587,587,587,587,587,587,587,587,587,587,577,577,577,577,577,577,+577,577,577,577,577,577,577,589,577,589,577,577,577,577,577,577,+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,+577, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+577,577,577,577,577,577,577,577,577,577,577,577, 20, 20, 20, 20,+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,577,++/* block 96 */+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,+590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,590,+590,590,590,590,590,590,590,590,577,577,577,577,577,577,577,577,+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,+577, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,577,577,577,577,577,++/* block 97 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,577,+577,577,577,577,577,577,577,577,577,577,577,577,577,577,577, 20,++/* block 98 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,++/* block 99 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,++/* block 100 */+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,593,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,++/* block 101 */+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,+592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,592,++/* block 102 */+592,592,592,592,592,592,592,592,592,592,592,592,592,120,120,120,+594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,+594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,+594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,594,+594,594,594,594,594,594,594,120,120,120,120,120,120,120,120,120,+595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,+595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,595,+595,595,595,595,595,595,595,595,596,596,596,596,596,596,597,597,++/* block 103 */+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,++/* block 104 */+598,598,598,598,598,598,598,598,598,598,598,598,599,600,600,600,+598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,598,+601,601,601,601,601,601,601,601,601,601,598,598,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+192,193,192,193,192,193,192,193,192,193,602,603,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,192,193,604,198,+200,200,200,605,557,557,557,557,557,557,557,557,557,557,605,482,++/* block 105 */+192,193,192,193,192,193,192,193,192,193,192,193,192,193,192,193,+192,193,192,193,192,193,192,193,192,193,192,193,482,482,557,557,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,607,607,607,607,607,607,607,607,607,607,+608,608,609,609,609,609,609,609,120,120,120,120,120,120,120,120,++/* block 106 */+610,610,610,610,610,610,610,610, 15, 15, 15, 15, 15, 15, 15, 15,+ 15, 15, 15, 15, 15, 15, 15,111,111,111,111,111,111,111,111,111,+ 15, 15, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 35, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+110, 35, 35, 35, 35, 35, 35, 35, 35, 32, 33, 32, 33,611, 32, 33,++/* block 107 */+ 32, 33, 32, 33, 32, 33, 32, 33,111, 15, 15, 32, 33,612, 35, 22,+ 32, 33, 32, 33,613, 35, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,614,615,616,617,614, 35,+618,619,620,621, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33, 32, 33,+ 32, 33, 32, 33,622,623,624, 32, 33, 32, 33,120,120,120,120,120,+ 32, 33,120, 35,120, 35, 32, 33, 32, 33,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,110,110,110, 32, 33, 22,110,110, 35, 22, 22, 22, 22, 22,++/* block 108 */+625,625,626,625,625,625,626,625,625,625,625,626,625,625,625,625,+625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,625,+625,625,625,627,627,626,626,627,628,628,628,628,626,120,120,120,+629,629,629,630,630,630,631,631,632,631,120,120,120,120,120,120,+633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,+633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,+633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,633,+633,633,633,633,634,634,634,634,120,120,120,120,120,120,120,120,++/* block 109 */+635,635,636,636,636,636,636,636,636,636,636,636,636,636,636,636,+636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,+636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,636,+636,636,636,636,635,635,635,635,635,635,635,635,635,635,635,635,+635,635,635,635,637,637,120,120,120,120,120,120,120,120,638,638,+639,639,639,639,639,639,639,639,639,639,120,120,120,120,120,120,+253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,+253,640,255,641,255,255,255,255,261,261,261,255,261,255,255,253,++/* block 110 */+642,642,642,642,642,642,642,642,642,642,643,643,643,643,643,643,+643,643,643,643,643,643,643,643,643,643,643,643,643,643,643,643,+643,643,643,643,643,643,644,644,644,644,644,644,644,644,645,646,+647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,647,+647,647,647,647,647,647,647,648,648,648,648,648,648,648,648,648,+648,648,649,649,120,120,120,120,120,120,120,120,120,120,120,650,+358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,358,+358,358,358,358,358,358,358,358,358,358,358,358,358,120,120,120,++/* block 111 */+651,651,651,652,653,653,653,653,653,653,653,653,653,653,653,653,+653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,+653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,653,+653,653,653,651,652,652,651,651,651,651,652,652,651,651,652,652,+652,654,654,654,654,654,654,654,654,654,654,654,654,654,120,655,+656,656,656,656,656,656,656,656,656,656,120,120,120,120,654,654,+346,346,346,346,346,348,657,346,346,346,346,346,346,346,346,346,+352,352,352,352,352,352,352,352,352,352,346,346,346,346,346,120,++/* block 112 */+658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,+658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,658,+658,658,658,658,658,658,658,658,658,659,659,659,659,659,659,660,+660,659,659,660,660,659,659,120,120,120,120,120,120,120,120,120,+658,658,658,659,658,658,658,658,658,658,658,658,659,660,120,120,+661,661,661,661,661,661,661,661,661,661,120,120,662,662,662,662,+346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,346,+657,346,346,346,346,346,346,353,353,353,346,347,348,347,346,346,++/* block 113 */+663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,+663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,+663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,663,+664,663,664,664,664,663,663,664,664,663,663,663,663,663,664,664,+663,664,663,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,663,663,665,666,666,+667,667,667,667,667,667,667,667,667,667,667,668,669,669,668,668,+670,670,667,671,671,668,669,120,120,120,120,120,120,120,120,120,++/* block 114 */+120,361,361,361,361,361,361,120,120,361,361,361,361,361,361,120,+120,361,361,361,361,361,361,120,120,120,120,120,120,120,120,120,+361,361,361,361,361,361,361,120,361,361,361,361,361,361,361,120,+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,+ 35, 35, 35,672, 35, 35, 35, 35, 35, 35, 35, 15,110,110,110,110,+ 35, 35, 35, 35, 35,128, 35, 35, 35,110, 15, 15,120,120,120,120,+673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,++/* block 115 */+673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,+673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,+673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,+673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,673,+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,+667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,667,+667,667,667,668,668,669,668,668,669,668,668,670,668,669,120,120,+674,674,674,674,674,674,674,674,674,674,120,120,120,120,120,120,++/* block 116 */+675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,++/* block 117 */+676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676,++/* block 118 */+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,++/* block 119 */+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,++/* block 120 */+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,++/* block 121 */+676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676,++/* block 122 */+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+675,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,675,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,675,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,++/* block 123 */+676,676,676,676,676,676,676,676,675,676,676,676,676,676,676,676,+676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,676,+676,676,676,676,120,120,120,120,120,120,120,120,120,120,120,120,+359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,359,+359,359,359,359,359,359,359,120,120,120,120,360,360,360,360,360,+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,+360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,360,+360,360,360,360,360,360,360,360,360,360,360,360,120,120,120,120,++/* block 124 */+677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,+677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,+677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,+677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,+677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,+677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,+677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,+677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,677,++/* block 125 */+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,++/* block 126 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,++/* block 127 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 128 */+ 35, 35, 35, 35, 35, 35, 35,120,120,120,120,120,120,120,120,120,+120,120,120,206,206,206,206,206,120,120,120,120,120,214,211,214,+214,214,214,214,214,214,214,214,214,679,214,214,214,214,214,214,+214,214,214,214,214,214,214,120,214,214,214,214,214,120,214,120,+214,214,120,214,214,120,214,214,214,214,214,214,214,214,214,214,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,++/* block 129 */+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,252,252,252,252,252,252,252,252,252,252,252,252,252,252,+252,252,252,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,++/* block 130 */+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,++/* block 131 */+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,680,681,+221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,221,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,++/* block 132 */+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+120,120,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,120,120,120,120,120,120,120,221,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+225,225,682,225,225,225,225,225,225,225,225,225,219,683,221,221,++/* block 133 */+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+ 5, 5, 5, 5, 5, 5, 5, 7, 8, 5,120,120,120,120,120,120,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,557,557,+ 5, 10, 10, 16, 16, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7,+ 8, 7, 8, 7, 8,561,561, 7, 8, 5, 5, 5, 5, 16, 16, 16,+ 5, 5, 5,120, 5, 5, 5, 5, 10, 7, 8, 7, 8, 7, 8, 5,+ 5, 5, 9, 10, 9, 9, 9,120, 5, 6, 5, 5,120,120,120,120,+225,225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,++/* block 134 */+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,120,120, 24,++/* block 135 */+120, 5, 5, 5, 6, 5, 5, 5, 7, 8, 5, 9, 5, 10, 5, 5,+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 5, 5, 9, 9, 9, 5,+ 5, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,+ 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 7, 5, 8, 15, 16,+ 15, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,+ 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 7, 9, 8, 9, 7,+ 8,560,565,566,560,560,583,583,583,583,583,583,583,583,583,583,+574,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,++/* block 136 */+583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,583,+583,583,583,583,583,583,583,583,583,583,583,583,583,583,684,684,+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,+586,586,586,586,586,586,586,586,586,586,586,586,586,586,586,120,+120,120,586,586,586,586,586,586,120,120,586,586,586,586,586,586,+120,120,586,586,586,586,586,586,120,120,586,586,586,120,120,120,+ 6, 6, 9, 15, 20, 6, 6,120, 20, 9, 9, 9, 9, 20, 20,120,+516,516,516,516,516,516,516,516,516, 24, 24, 24, 20, 20,120,120,++/* block 137 */+685,685,685,685,685,685,685,685,685,685,685,685,120,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,120,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,120,685,685,120,685,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,120,120,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 138 */+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,685,+685,685,685,685,685,685,685,685,685,685,685,120,120,120,120,120,++/* block 139 */+686,686,687,120,120,120,120,688,688,688,688,688,688,688,688,688,+688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,+688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,688,+688,688,688,688,120,120,120,689,689,689,689,689,689,689,689,689,+690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,+690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,+690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,690,+690,690,690,690,690,691,691,691,691,692,692,692,692,692,692,692,++/* block 140 */+692,692,692,692,692,692,692,692,692,692,691,691,692,692,692,120,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,+692,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,120,120,++/* block 141 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 142 */+693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,693,+693,693,693,693,693,693,693,693,693,693,693,693,693,120,120,120,+694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,+694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,+694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,694,+694,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+695,696,696,696,696,696,696,696,696,696,696,696,696,696,696,696,+696,696,696,696,696,696,696,696,696,696,696,696,120,120,120,120,++/* block 143 */+697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,+697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,697,+698,698,698,698,120,120,120,120,120,120,120,120,120,697,697,697,+699,699,699,699,699,699,699,699,699,699,699,699,699,699,699,699,+699,700,699,699,699,699,699,699,699,699,700,120,120,120,120,120,+701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,+701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,701,+701,701,701,701,701,701,702,702,702,702,702,120,120,120,120,120,++/* block 144 */+703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,703,+703,703,703,703,703,703,703,703,703,703,703,703,703,703,120,704,+705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,+705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,705,+705,705,705,705,120,120,120,120,705,705,705,705,705,705,705,705,+706,707,707,707,707,707,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 145 */+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,+708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,708,+708,708,708,708,708,708,708,708,709,709,709,709,709,709,709,709,+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,+709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,709,+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,+710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,710,++/* block 146 */+711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,711,+711,711,711,711,711,711,711,711,711,711,711,711,711,711,120,120,+712,712,712,712,712,712,712,712,712,712,120,120,120,120,120,120,+713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,+713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,713,+713,713,713,713,120,120,120,120,714,714,714,714,714,714,714,714,+714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,714,+714,714,714,714,714,714,714,714,714,714,714,714,120,120,120,120,++/* block 147 */+715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,+715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,715,+715,715,715,715,715,715,715,715,120,120,120,120,120,120,120,120,+716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,+716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,+716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,716,+716,716,716,716,120,120,120,120,120,120,120,120,120,120,120,717,+718,718,718,718,718,718,718,718,718,718,718,120,718,718,718,718,++/* block 148 */+718,718,718,718,718,718,718,718,718,718,718,120,718,718,718,718,+718,718,718,120,718,718,120,719,719,719,719,719,719,719,719,719,+719,719,120,719,719,719,719,719,719,719,719,719,719,719,719,719,+719,719,120,719,719,719,719,719,719,719,120,719,719,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 149 */+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,++/* block 150 */+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,720,120,120,120,120,120,120,120,120,120,+720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,720,+720,720,720,720,720,720,120,120,120,120,120,120,120,120,120,120,+720,720,720,720,720,720,720,720,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 151 */+110,110,110,110,110,110,120,110,110,110,110,110,110,110,110,110,+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,+110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,110,+110,120,110,110,110,110,110,110,110,110,110,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 152 */+721,721,721,721,721,721,120,120,721,120,721,721,721,721,721,721,+721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,+721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,721,+721,721,721,721,721,721,120,721,721,120,120,120,721,120,120,721,+722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,722,+722,722,722,722,722,722,120,723,724,724,724,724,724,724,724,724,+725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,725,+725,725,725,725,725,725,725,726,726,727,727,727,727,727,727,727,++/* block 153 */+728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,+728,728,728,728,728,728,728,728,728,728,728,728,728,728,728,120,+120,120,120,120,120,120,120,729,729,729,729,729,729,729,729,729,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,730,+730,730,730,120,730,730,120,120,120,120,120,731,731,731,731,731,++/* block 154 */+732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,732,+732,732,732,732,732,732,733,733,733,733,733,733,120,120,120,734,+735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,735,+735,735,735,735,735,735,735,735,735,735,120,120,120,120,120,736,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 155 */+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,+737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,737,+738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,738,+738,738,738,738,738,738,738,738,120,120,120,120,739,739,738,738,+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,+120,120,739,739,739,739,739,739,739,739,739,739,739,739,739,739,+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,+739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,739,++/* block 156 */+740,741,741,741,120,741,741,120,120,120,120,120,741,741,741,741,+740,740,740,740,120,740,740,740,120,740,740,740,740,740,740,740,+740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,740,+740,740,740,740,740,740,120,120,741,741,741,120,120,120,120,741,+742,742,742,742,742,742,742,742,742,120,120,120,120,120,120,120,+743,743,743,743,743,743,743,743,743,120,120,120,120,120,120,120,+744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,744,+744,744,744,744,744,744,744,744,744,744,744,744,744,745,745,746,++/* block 157 */+747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,747,+747,747,747,747,747,747,747,747,747,747,747,747,747,748,748,748,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+749,749,749,749,749,749,749,749,750,749,749,749,749,749,749,749,+749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,749,+749,749,749,749,749,751,751,120,120,120,120,752,752,752,752,752,+753,753,754,753,753,753,753,120,120,120,120,120,120,120,120,120,++/* block 158 */+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,755,755,+755,755,755,755,755,755,120,120,120,756,756,756,756,756,756,756,+757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,757,+757,757,757,757,757,757,120,120,758,758,758,758,758,758,758,758,+759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,759,+759,759,759,120,120,120,120,120,760,760,760,760,760,760,760,760,++/* block 159 */+761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,761,+761,761,120,120,120,120,120,120,120,762,762,762,762,120,120,120,+120,120,120,120,120,120,120,120,120,763,763,763,763,763,763,763,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 160 */+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,+764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,764,+764,764,764,764,764,764,764,764,764,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 161 */+765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,+765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,+765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,765,+765,765,765,120,120,120,120,120,120,120,120,120,120,120,120,120,+766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,+766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,+766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,766,+766,766,766,120,120,120,120,120,120,120,767,767,767,767,767,767,++/* block 162 */+768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,+768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,768,+768,768,768,768,769,769,769,769,120,120,120,120,120,120,120,120,+770,770,770,770,770,770,770,770,770,770,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 163 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,+771,771,771,771,771,771,771,771,771,771,771,771,771,771,771,120,++/* block 164 */+772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,+772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,772,+772,772,772,772,772,772,772,772,772,772,120,773,773,774,120,120,+772,772,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 165 */+775,775,775,775,775,775,775,775,775,775,775,775,775,775,775,775,+775,775,775,775,775,775,775,775,775,775,775,775,775,776,776,776,+776,776,776,776,776,776,776,775,120,120,120,120,120,120,120,120,+777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,777,+777,777,777,777,777,777,778,778,778,778,778,778,778,778,778,778,+778,779,779,779,779,780,780,780,780,780,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+781,781,781,781,781,781,781,781,781,781,781,781,781,781,781,781,++/* block 166 */+781,781,782,782,782,782,783,783,783,783,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,784,+784,784,784,784,784,785,785,785,785,785,785,785,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,786,+786,786,786,786,786,786,786,120,120,120,120,120,120,120,120,120,++/* block 167 */+787,788,787,789,789,789,789,789,789,789,789,789,789,789,789,789,+789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,+789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,789,+789,789,789,789,789,789,789,789,788,788,788,788,788,788,788,788,+788,788,788,788,788,788,788,790,790,790,790,790,790,790,120,120,+120,120,791,791,791,791,791,791,791,791,791,791,791,791,791,791,+791,791,791,791,791,791,792,792,792,792,792,792,792,792,792,792,+788,789,789,788,788,789,120,120,120,120,120,120,120,120,120,788,++/* block 168 */+793,793,794,795,795,795,795,795,795,795,795,795,795,795,795,795,+795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,+795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,795,+794,794,794,793,793,793,793,794,794,793,793,796,796,797,796,796,+796,796,793,120,120,120,120,120,120,120,120,120,120,797,120,120,+798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,798,+798,798,798,798,798,798,798,798,798,120,120,120,120,120,120,120,+799,799,799,799,799,799,799,799,799,799,120,120,120,120,120,120,++/* block 169 */+800,800,800,801,801,801,801,801,801,801,801,801,801,801,801,801,+801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,801,+801,801,801,801,801,801,801,800,800,800,800,800,802,800,800,800,+800,800,800,800,800,120,803,803,803,803,803,803,803,803,803,803,+804,804,804,804,801,802,802,801,120,120,120,120,120,120,120,120,+805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,+805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,805,+805,805,805,806,807,807,805,120,120,120,120,120,120,120,120,120,++/* block 170 */+808,808,809,810,810,810,810,810,810,810,810,810,810,810,810,810,+810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,+810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,810,+810,810,810,809,809,809,808,808,808,808,808,808,808,808,808,809,+809,810,811,811,810,812,812,812,812,808,808,808,808,812,809,808,+813,813,813,813,813,813,813,813,813,813,810,812,810,812,812,812,+120,814,814,814,814,814,814,814,814,814,814,814,814,814,814,814,+814,814,814,814,814,120,120,120,120,120,120,120,120,120,120,120,++/* block 171 */+815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,815,+815,815,120,815,815,815,815,815,815,815,815,815,815,815,815,815,+815,815,815,815,815,815,815,815,815,815,815,815,816,816,816,817,+817,817,816,816,817,816,817,817,818,818,818,818,818,818,817,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 172 */+819,819,819,819,819,819,819,120,819,120,819,819,819,819,120,819,+819,819,819,819,819,819,819,819,819,819,819,819,819,819,120,819,+819,819,819,819,819,819,819,819,819,820,120,120,120,120,120,120,+821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,+821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,+821,821,821,821,821,821,821,821,821,821,821,821,821,821,821,822,+823,823,823,822,822,822,822,822,822,822,822,120,120,120,120,120,+824,824,824,824,824,824,824,824,824,824,120,120,120,120,120,120,++/* block 173 */+825,826,827,828,120,829,829,829,829,829,829,829,829,120,120,829,+829,120,120,829,829,829,829,829,829,829,829,829,829,829,829,829,+829,829,829,829,829,829,829,829,829,120,829,829,829,829,829,829,+829,120,829,829,120,829,829,829,829,829,120,830,826,829,831,827,+825,827,827,827,827,120,120,827,827,120,120,827,827,827,120,120,+829,120,120,120,120,120,120,831,120,120,120,120,120,829,829,829,+829,829,827,827,120,120,825,825,825,825,825,825,825,120,120,120,+825,825,825,825,825,120,120,120,120,120,120,120,120,120,120,120,++/* block 174 */+832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,+832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,+832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,832,+832,832,832,832,832,833,833,833,834,834,834,834,834,834,834,834,+833,833,834,834,834,833,834,832,832,832,832,835,835,835,835,835,+836,836,836,836,836,836,836,836,836,836,835,835,120,835,834,832,+832,832,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 175 */+837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,+837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,+837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,837,+838,839,839,840,840,840,840,840,840,839,840,839,839,838,839,840,+840,839,840,840,837,837,841,837,120,120,120,120,120,120,120,120,+842,842,842,842,842,842,842,842,842,842,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 176 */+843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,+843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,+843,843,843,843,843,843,843,843,843,843,843,843,843,843,843,844,+845,845,846,846,846,846,120,120,845,845,845,845,846,846,845,846,+846,847,847,847,847,847,847,847,847,847,847,847,847,847,847,847,+847,847,847,847,847,847,847,847,843,843,843,843,846,846,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 177 */+848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,+848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,+848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,848,+849,849,849,850,850,850,850,850,850,850,850,849,849,850,849,850,+850,851,851,851,848,120,120,120,120,120,120,120,120,120,120,120,+852,852,852,852,852,852,852,852,852,852,120,120,120,120,120,120,+398,398,398,398,398,398,398,398,398,398,398,398,398,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 178 */+853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,+853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,853,+853,853,853,853,853,853,853,853,853,853,853,854,855,854,855,855,+854,854,854,854,854,854,855,854,853,856,120,120,120,120,120,120,+857,857,857,857,857,857,857,857,857,857,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 179 */+858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,858,+858,858,858,858,858,858,858,858,858,858,858,120,120,859,859,859,+860,860,859,859,859,859,861,859,859,859,859,859,120,120,120,120,+862,862,862,862,862,862,862,862,862,862,863,863,864,864,864,865,+858,858,858,858,858,858,858,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 180 */+866,866,866,866,866,866,866,866,866,866,866,866,866,866,866,866,+866,866,866,866,866,866,866,866,866,866,866,866,866,866,866,866,+866,866,866,866,866,866,866,866,866,866,866,866,867,867,867,868,+868,868,868,868,868,868,868,868,867,868,868,869,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 181 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+870,870,870,870,870,870,870,870,870,870,870,870,870,870,870,870,+870,870,870,870,870,870,870,870,870,870,870,870,870,870,870,870,+871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,+871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,871,+872,872,872,872,872,872,872,872,872,872,873,873,873,873,873,873,+873,873,873,120,120,120,120,120,120,120,120,120,120,120,120,874,++/* block 182 */+875,875,875,875,875,875,875,120,120,875,120,120,875,875,875,875,+875,875,875,875,120,875,875,120,875,875,875,875,875,875,875,875,+875,875,875,875,875,875,875,875,875,875,875,875,875,875,875,875,+876,877,877,877,877,877,120,877,877,120,120,878,878,877,878,879,+877,879,877,878,880,880,880,120,120,120,120,120,120,120,120,120,+881,881,881,881,881,881,881,881,881,881,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 183 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+882,882,882,882,882,882,882,882,120,120,882,882,882,882,882,882,+882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,+882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,882,+882,883,883,883,884,884,884,884,120,120,884,884,883,883,883,883,+884,882,885,882,883,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 184 */+886,887,887,887,887,887,887,887,887,887,887,886,886,886,886,886,+886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,+886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,886,+886,886,886,887,887,887,887,887,887,888,889,887,887,887,887,890,+890,890,890,890,890,890,890,887,120,120,120,120,120,120,120,120,+891,892,892,892,892,892,892,893,893,892,892,892,891,891,891,891,+891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,+891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,891,++/* block 185 */+891,891,891,891,894,894,894,894,894,894,892,892,892,892,892,892,+892,892,892,892,892,892,892,893,892,892,895,895,895,891,895,895,+895,895,895,120,120,120,120,120,120,120,120,120,120,120,120,120,+370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,370,+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,+896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,896,+896,896,896,896,896,896,896,896,896,120,120,120,120,120,120,120,++/* block 186 */+897,897,897,897,897,897,897,897,897,120,897,897,897,897,897,897,+897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,+897,897,897,897,897,897,897,897,897,897,897,897,897,897,897,898,+899,899,899,899,899,899,899,120,899,899,899,899,899,899,898,899,+897,900,900,900,900,900,120,120,120,120,120,120,120,120,120,120,+901,901,901,901,901,901,901,901,901,901,902,902,902,902,902,902,+902,902,902,902,902,902,902,902,902,902,902,902,902,120,120,120,+903,903,904,904,904,904,904,904,904,904,904,904,904,904,904,904,++/* block 187 */+904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,904,+120,120,905,905,905,905,905,905,905,905,905,905,905,905,905,905,+905,905,905,905,905,905,905,905,120,906,905,905,905,905,905,905,+905,906,905,905,906,905,905,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 188 */+907,907,907,907,907,907,907,120,907,907,120,907,907,907,907,907,+907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,+907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,907,+907,908,908,908,908,908,908,120,120,120,908,120,908,908,120,908,+908,908,908,908,908,908,909,908,120,120,120,120,120,120,120,120,+910,910,910,910,910,910,910,910,910,910,120,120,120,120,120,120,+911,911,911,911,911,911,120,911,911,120,911,911,911,911,911,911,+911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,911,++/* block 189 */+911,911,911,911,911,911,911,911,911,911,912,912,912,912,912,120,+913,913,120,912,912,913,912,913,911,120,120,120,120,120,120,120,+914,914,914,914,914,914,914,914,914,914,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 190 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,915,+915,915,915,916,916,917,917,918,918,120,120,120,120,120,120,120,++/* block 191 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+595,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,919,+295,295,919,295,919,297,297,297,297,297,297,297,297,298,298,298,+298,297,297,297,297,297,297,297,297,297,297,297,297,297,297,297,+297,297,120,120,120,120,120,120,120,120,120,120,120,120,120,920,++/* block 192 */+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,++/* block 193 */+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 194 */+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,+922,922,922,922,922,922,922,922,922,922,922,922,922,922,922,120,+923,923,923,923,923,120,120,120,120,120,120,120,120,120,120,120,++/* block 195 */+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,921,+921,921,921,921,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 196 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,+924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,924,+924,925,925,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 197 */+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,++/* block 198 */+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,+926,926,926,926,926,926,926,926,926,926,926,926,926,926,926,120,+927,927,927,927,927,927,927,927,927,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 199 */+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,++/* block 200 */+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,928,+928,928,928,928,928,928,928,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 201 */+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,++/* block 202 */+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,606,+606,606,606,606,606,606,606,606,606,120,120,120,120,120,120,120,+929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,+929,929,929,929,929,929,929,929,929,929,929,929,929,929,929,120,+930,930,930,930,930,930,930,930,930,930,120,120,120,120,931,931,+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,++/* block 203 */+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,+932,932,932,932,932,932,932,932,932,932,932,932,932,932,932,120,+933,933,933,933,933,933,933,933,933,933,120,120,120,120,120,120,+934,934,934,934,934,934,934,934,934,934,934,934,934,934,934,934,+934,934,934,934,934,934,934,934,934,934,934,934,934,934,120,120,+935,935,935,935,935,936,120,120,120,120,120,120,120,120,120,120,++/* block 204 */+937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,+937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,+937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,+938,938,938,938,938,938,938,939,939,939,939,939,940,940,940,940,+941,941,941,941,939,940,120,120,120,120,120,120,120,120,120,120,+942,942,942,942,942,942,942,942,942,942,120,943,943,943,943,943,+943,943,120,937,937,937,937,937,937,937,937,937,937,937,937,937,+937,937,937,937,937,937,937,937,120,120,120,120,120,937,937,937,++/* block 205 */+937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,937,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 206 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,+944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,944,+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,+945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,945,++/* block 207 */+946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,946,+946,946,946,946,946,946,946,947,947,947,947,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 208 */+948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,+948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,+948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,+948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,948,+948,948,948,948,948,948,948,948,948,948,948,120,120,120,120,949,+948,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,+950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,+950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,950,++/* block 209 */+950,950,950,950,950,950,950,950,120,120,120,120,120,120,120,949,+949,949,949,951,951,951,951,951,951,951,951,951,951,951,951,951,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+952,953,954,562,955,120,120,120,120,120,120,120,120,120,120,120,+956,956,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 210 */+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,++/* block 211 */+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,957,+957,957,957,957,957,957,957,957,120,120,120,120,120,120,120,120,++/* block 212 */+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,++/* block 213 */+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,958,+958,958,958,958,958,958,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 214 */+957,957,957,957,957,957,957,957,957,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 215 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+584,584,584,584,120,584,584,584,584,584,584,584,120,584,584,120,++/* block 216 */+583,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,++/* block 217 */+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,++/* block 218 */+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,578,+583,583,583,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+578,578,578,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,583,583,583,583,120,120,120,120,120,120,120,120,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,++/* block 219 */+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,++/* block 220 */+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,959,+959,959,959,959,959,959,959,959,959,959,959,959,120,120,120,120,++/* block 221 */+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,+960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,960,+960,960,960,960,960,960,960,960,960,960,960,120,120,120,120,120,+960,960,960,960,960,960,960,960,960,960,960,960,960,120,120,120,++/* block 222 */+960,960,960,960,960,960,960,960,960,120,120,120,120,120,120,120,+960,960,960,960,960,960,960,960,960,960,120,120,961,962,962,963,+964,964,964,964,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 223 */+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,120,120,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,120,120,120,120,120,120,120,120,120,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,++/* block 224 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 225 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,120,++/* block 226 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20,120,120, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20,965,966,113,113,113, 20, 20, 20,966,965,965,+965,965,965, 24, 24, 24, 24, 24, 24, 24, 24,113,113,113,113,113,++/* block 227 */+113,113,113, 20, 20,113,113,113,113,113,113,113, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,113,113,113,113, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 228 */+692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,+692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,+692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,+692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,692,+692,692,967,967,967,692,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 229 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 230 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,120,120,120,120,+587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,587,+587,587, 25, 25, 25, 25, 25, 25, 25,120,120,120,120,120,120,120,++/* block 231 */+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,519,519,+519,519,519,519,519,120,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,++/* block 232 */+518,518,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,518,120,518,518,+120,120,518,120,120,518,518,120,120,518,518,518,518,120,518,518,+518,518,518,518,518,518,519,519,519,519,120,519,120,519,519,519,+519,519,519,519,120,519,519,519,519,519,519,519,519,519,519,519,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,++/* block 233 */+519,519,519,519,518,518,120,518,518,518,518,120,120,518,518,518,+518,518,518,518,518,120,518,518,518,518,518,518,518,120,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,518,518,120,518,518,518,518,120,+518,518,518,518,518,120,518,120,120,120,518,518,518,518,518,518,+518,120,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,++/* block 234 */+518,518,518,518,518,518,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,++/* block 235 */+519,519,519,519,519,519,519,519,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,++/* block 236 */+518,518,518,518,518,518,518,518,518,518,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,120,120,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518, 9,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519, 9,519,519,519,519,+519,519,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518, 9,519,519,519,519,++/* block 237 */+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519, 9,519,519,519,519,519,519,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518, 9,519,519,519,519,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519, 9,+519,519,519,519,519,519,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518, 9,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,++/* block 238 */+519,519,519,519,519,519,519,519,519, 9,519,519,519,519,519,519,+518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,518,+518,518,518,518,518,518,518,518,518, 9,519,519,519,519,519,519,+519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,519,+519,519,519, 9,519,519,519,519,519,519,518,519,120,120, 11, 11,+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,++/* block 239 */+968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,+968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,+968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,+968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,+968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,+968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,+968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,+968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,968,++/* block 240 */+969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,+969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,+969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,+969,969,969,969,969,969,969,968,968,968,968,969,969,969,969,969,+969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,+969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,+969,969,969,969,969,969,969,969,969,969,969,969,969,968,968,968,+968,968,968,968,968,969,968,968,968,968,968,968,968,968,968,968,++/* block 241 */+968,968,968,968,969,968,968,970,970,970,970,970,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,969,969,969,969,969,+120,969,969,969,969,969,969,969,969,969,969,969,969,969,969,969,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 242 */+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 22, 35, 35, 35, 35, 35,+ 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 243 */+971,971,971,971,971,971,971,120,971,971,971,971,971,971,971,971,+971,971,971,971,971,971,971,971,971,120,120,971,971,971,971,971,+971,971,120,971,971,120,971,971,971,971,971,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 244 */+972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,+972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,972,+972,972,972,972,972,972,972,972,972,972,972,972,972,120,120,120,+973,973,973,973,973,973,973,974,974,974,974,974,974,974,120,120,+975,975,975,975,975,975,975,975,975,975,120,120,120,120,972,976,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 245 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+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,978,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+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,980,980,980,980,+981,981,981,981,981,981,981,981,981,981,120,120,120,120,120,982,++/* block 246 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+361,361,361,361,361,361,361,120,361,361,361,361,120,361,361,120,+361,361,361,361,361,361,361,361,361,361,361,361,361,361,361,120,++/* block 247 */+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,++/* block 248 */+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,983,+983,983,983,983,983,120,120,984,984,984,984,984,984,984,984,984,+985,985,985,985,985,985,985,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 249 */+986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,+986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,986,+986,986,987,987,987,987,987,987,987,987,987,987,987,987,987,987,+987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,987,+987,987,987,987,988,988,988,988,988,988,988,989,120,120,120,120,+990,990,990,990,990,990,990,990,990,990,120,120,120,120,991,991,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 250 */+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,++/* block 251 */+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25, 25, 25,+ 6, 25, 25, 25, 25,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 252 */+120, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 20, 25,+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 253 */+225,225,225,225,120,225,225,225,225,225,225,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,225,+120,225,225,120,225,120,120,225,120,225,225,225,225,225,225,225,+225,225,225,120,225,225,225,225,120,225,120,225,120,120,120,120,+120,120,225,120,120,120,120,225,120,225,120,225,120,225,225,225,+120,225,225,120,225,120,120,225,120,225,120,225,120,225,120,225,+120,225,225,120,225,120,120,225,225,225,225,120,225,225,225,225,+225,225,225,120,225,225,225,225,120,225,225,225,225,120,225,120,++/* block 254 */+225,225,225,225,225,225,225,225,225,225,120,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120,+120,225,225,225,120,225,225,225,225,225,120,225,225,225,225,225,+225,225,225,225,225,225,225,225,225,225,225,225,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+217,217,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 255 */+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,++/* block 256 */+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,+992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+992, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,++/* block 257 */+ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 21, 21, 21,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21,+ 21, 21, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21,++/* block 258 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20,+ 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,993,993,993,993,993,993,993,993,993,993,+993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,993,++/* block 259 */+994, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992,992,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,+ 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20,992,992,992,992,+ 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992,+589,589,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,++/* block 260 */+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,++/* block 261 */+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,++/* block 262 */+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,995,995,995,995,995,++/* block 263 */+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20,+ 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,++/* block 264 */+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,++/* block 265 */+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,++/* block 266 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20,992,992,992,992,992,992,992,992,992,992,992,992,++/* block 267 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 21, 21, 21, 21,992,992,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,+ 21,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,++/* block 268 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992,992,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,++/* block 269 */+ 20, 20, 20, 20, 20, 20, 20, 20,992,992,992,992,992,992,992,992,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,992,992,+ 21, 21,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,++/* block 270 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,++/* block 271 */+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,+ 21, 21, 21, 21, 21,992,992,992, 21, 21, 21, 21, 21,992,992,992,++/* block 272 */+ 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,+ 21, 21, 21, 21, 21, 21, 21,992,992,992,992,992,992,992,992,992,++/* block 273 */+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20,120, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+ 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,120,120,120,120,120,120,++/* block 274 */+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,992,+992,992,992,992,992,992,992,992,992,992,992,992,992,992,120,120,++/* block 275 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 276 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,120,120,120,120,120,120,120,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,++/* block 277 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,++/* block 278 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,++/* block 279 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 280 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 281 */+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,591,+591,591,591,591,591,591,591,591,591,591,591,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,+120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,++/* block 282 */+516, 24,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,+996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,+996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,+996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,+996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,+996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,996,++/* block 283 */+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,++/* block 284 */+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,++/* block 285 */+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,113,+516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,516,++/* block 286 */+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,678,+678,678,678,678,678,678,678,678,678,678,678,678,678,678,120,120, };
src/c/pcre2/src/pcre2_ucp.h view
@@ -291,7 +291,13 @@ ucp_Chorasmian, ucp_Dives_Akuru, ucp_Khitan_Small_Script,- ucp_Yezidi+ ucp_Yezidi,+ /* New for Unicode 14.0.0 */+ ucp_Cypro_Minoan,+ ucp_Old_Uyghur,+ ucp_Tangsa,+ ucp_Toto,+ ucp_Vithkuqi }; #endif /* PCRE2_UCP_H_IDEMPOTENT_GUARD */
src/c/pcre2/src/pcre2demo.c view
@@ -198,8 +198,8 @@ return 1; } -/* Match succeded. Get a pointer to the output vector, where string offsets are-stored. */+/* Match succeeded. Get a pointer to the output vector, where string offsets+are stored. */ ovector = pcre2_get_ovector_pointer(match_data); printf("Match succeeded at offset %d\n", (int)ovector[0]);@@ -217,9 +217,12 @@ if (rc == 0) printf("ovector was not big enough for all the captured substrings\n"); -/* We must guard against patterns such as /(?=.\K)/ that use \K in an assertion-to set the start of a match later than its end. In this demonstration program,-we just detect this case and give up. */+/* Since release 10.38 PCRE2 has locked out the use of \K in lookaround+assertions. However, there is an option to re-enable the old behaviour. If that+is set, it is possible to run patterns such as /(?=.\K)/ that use \K in an+assertion to set the start of a match later than its end. In this demonstration+program, we show how to detect this case, but it shouldn't arise because the+option is never set. */ if (ovector[0] > ovector[1]) {@@ -436,7 +439,7 @@ return 1; } - /* Match succeded */+ /* Match succeeded */ printf("\nMatch succeeded again at offset %d\n", (int)ovector[0]);
src/c/pcre2/src/pcre2grep.c view
@@ -63,7 +63,7 @@ #define WIN32 #endif -/* Some cmake's define it still */+/* Some CMake's define it still */ #if defined(__CYGWIN__) && defined(WIN32) #undef WIN32 #endif@@ -110,17 +110,18 @@ #define snprintf _snprintf #endif -/* VC and older compilers don't support %td or %zu, and even some that claim to+/* old VC and older compilers don't support %td or %zu, and even some that claim to be C99 don't support it (hence DISABLE_PERCENT_ZT). */ -#if defined(_MSC_VER) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L || defined(DISABLE_PERCENT_ZT)-#define PTR_FORM "lu"+#if defined(DISABLE_PERCENT_ZT) || (defined(_MSC_VER) && (_MSC_VER < 1800)) || \+ (!defined(_MSC_VER) && (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L))+#ifdef _WIN64+#define SIZ_FORM "llu"+#else #define SIZ_FORM "lu"-#define SIZ_CAST (unsigned long int)+#endif #else-#define PTR_FORM "td" #define SIZ_FORM "zu"-#define SIZ_CAST #endif #define FALSE 0@@ -423,6 +424,7 @@ #define N_OM_SEPARATOR (-22) #define N_MAX_BUFSIZE (-23) #define N_OM_CAPTURE (-24)+#define N_ALLABSK (-25) static option_item optionlist[] = { { OP_NODATA, N_NULL, NULL, "", "terminate options" },@@ -490,6 +492,7 @@ { OP_NODATA, 'v', NULL, "invert-match", "select non-matching lines" }, { OP_NODATA, 'w', NULL, "word-regex(p)", "force patterns to match only as words" }, { OP_NODATA, 'x', NULL, "line-regex(p)", "force patterns to match only whole lines" },+ { OP_NODATA, N_ALLABSK, NULL, "allow-lookaround-bsk", "allow \\K in lookarounds" }, { OP_NODATA, 0, NULL, NULL, NULL } }; @@ -1854,8 +1857,7 @@ unsigned char mbuffer[256]; PCRE2_SIZE startchar = pcre2_get_startchar(match_data); (void)pcre2_get_error_message(*mrc, mbuffer, sizeof(mbuffer));- fprintf(stderr, "%s at offset %" SIZ_FORM "\n\n", mbuffer,- SIZ_CAST startchar);+ fprintf(stderr, "%s at offset %" SIZ_FORM "\n\n", mbuffer, startchar); } if (*mrc == PCRE2_ERROR_MATCHLIMIT || *mrc == PCRE2_ERROR_DEPTHLIMIT || *mrc == PCRE2_ERROR_HEAPLIMIT || *mrc == PCRE2_ERROR_JIT_STACKLIMIT)@@ -3327,7 +3329,7 @@ if (dee_action == dee_RECURSE) {- char buffer[FNBUFSIZ];+ char childpath[FNBUFSIZ]; char *nextfile; directory_type *dir = opendirectory(pathname); @@ -3349,8 +3351,36 @@ rc = 2; break; }- sprintf(buffer, "%s%c%s", pathname, FILESEP, nextfile);- frc = grep_or_recurse(buffer, dir_recurse, FALSE);+ sprintf(childpath, "%s%c%s", pathname, FILESEP, nextfile);++ /* If the realpath() function is available, we can try to prevent endless+ recursion caused by a symlink pointing to a parent directory (GitHub+ issue #2 (old Bugzilla #2794). Original patch from Thomas Tempelmann.+ Modified to avoid using strlcat() because that isn't a standard C+ function, and also modified not to copy back the fully resolved path,+ because that affects the output from pcre2grep. */++#ifdef HAVE_REALPATH+ {+ char resolvedpath[PATH_MAX];+ BOOL isSame;+ size_t rlen;+ if (realpath(childpath, resolvedpath) == NULL)+ continue; /* This path is invalid - we can skip processing this */+ isSame = strcmp(pathname, resolvedpath) == 0;+ if (isSame) continue; /* We have a recursion */+ rlen = strlen(resolvedpath);+ if (rlen++ < sizeof(resolvedpath) - 3)+ {+ BOOL contained;+ strcat(resolvedpath, "/");+ contained = strncmp(pathname, resolvedpath, rlen) == 0;+ if (contained) continue; /* We have a recursion */+ }+ }+#endif /* HAVE_REALPATH */++ frc = grep_or_recurse(childpath, dir_recurse, FALSE); if (frc > 1) rc = frc; else if (frc == 0 && rc == 1) rc = 0; }@@ -3521,7 +3551,7 @@ /*************************************************-* Handle a single-letter, no data option *+* Handle a no-data option * *************************************************/ static int@@ -3534,6 +3564,7 @@ case N_LBUFFER: line_buffered = TRUE; break; case N_LOFFSETS: line_offsets = number = TRUE; break; case N_NOJIT: use_jit = FALSE; break;+ case N_ALLABSK: extra_options |= PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK; break; case 'a': binary_files = BIN_TEXT; break; case 'c': count_only = TRUE; break; case 'F': options |= PCRE2_LITERAL; break;
src/c/pcre2/src/pcre2posix.c view
@@ -148,6 +148,7 @@ 37, REG_EESCAPE, /* PCRE2 does not support \L, \l, \N{name}, \U, or \u */ 56, REG_INVARG, /* internal error: unknown newline setting */ 92, REG_INVARG, /* invalid option bits with PCRE2_LITERAL */+ 99, REG_EESCAPE /* \K in lookaround */ }; /* Table of texts corresponding to POSIX error codes */
src/c/pcre2/src/pcre2test.c view
@@ -11,7 +11,7 @@ Written by Philip Hazel Original code Copyright (c) 1997-2012 University of Cambridge- Rewritten code Copyright (c) 2016-2020 University of Cambridge+ Rewritten code Copyright (c) 2016-2021 University of Cambridge ----------------------------------------------------------------------------- Redistribution and use in source and binary forms, with or without@@ -169,19 +169,21 @@ /* void vms_setsymbol( char *, char *, int ); Original code from [1]. */ #endif -/* VC and older compilers don't support %td or %zu, and even some that claim to-be C99 don't support it (hence DISABLE_PERCENT_ZT). There are some non-C99-environments where %lu gives a warning with 32-bit pointers. As there doesn't-seem to be an easy way round this, just live with it (the cases are rare). */+/* old VC and older compilers don't support %td or %zu, and even some that+claim to be C99 don't support it (hence DISABLE_PERCENT_ZT). */ -#if defined(_MSC_VER) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L || defined(DISABLE_PERCENT_ZT)-#define PTR_FORM "lu"+#if defined(DISABLE_PERCENT_ZT) || (defined(_MSC_VER) && (_MSC_VER < 1800)) || \+ (!defined(_MSC_VER) && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L)))+#ifdef _WIN64+#define PTR_FORM "lld"+#define SIZ_FORM "llu"+#else+#define PTR_FORM "ld" #define SIZ_FORM "lu"-#define SIZ_CAST (unsigned long int)+#endif #else #define PTR_FORM "td" #define SIZ_FORM "zu"-#define SIZ_CAST #endif /* ------------------End of system-specific definitions -------------------- */@@ -622,6 +624,7 @@ { "allaftertext", MOD_PNDP, MOD_CTL, CTL_ALLAFTERTEXT, PO(control) }, { "allcaptures", MOD_PND, MOD_CTL, CTL_ALLCAPTURES, PO(control) }, { "allow_empty_class", MOD_PAT, MOD_OPT, PCRE2_ALLOW_EMPTY_CLASS, PO(options) },+ { "allow_lookaround_bsk", MOD_CTC, MOD_OPT, PCRE2_EXTRA_ALLOW_LOOKAROUND_BSK, CO(extra_options) }, { "allow_surrogate_escapes", MOD_CTC, MOD_OPT, PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES, CO(extra_options) }, { "allusedtext", MOD_PNDP, MOD_CTL, CTL_ALLUSEDTEXT, PO(control) }, { "allvector", MOD_PND, MOD_CTL, CTL2_ALLVECTOR, PO(control2) },@@ -2745,11 +2748,11 @@ { if (block == NULL) {- fprintf(outfile, "** malloc() failed for %" SIZ_FORM "\n", SIZ_CAST size);+ fprintf(outfile, "** malloc() failed for %" SIZ_FORM "\n", size); } else {- fprintf(outfile, "malloc %5" SIZ_FORM, SIZ_CAST size);+ fprintf(outfile, "malloc %5" SIZ_FORM, size); #ifdef DEBUG_SHOW_MALLOC_ADDRESSES fprintf(outfile, " %p", block); /* Not portable */ #endif@@ -2779,7 +2782,7 @@ { if (block == malloclist[i]) {- fprintf(outfile, " %5" SIZ_FORM, SIZ_CAST malloclistlength[i]);+ fprintf(outfile, " %5" SIZ_FORM, malloclistlength[i]); malloclistptr--; for (j = i; j < malloclistptr; j++) {@@ -3159,7 +3162,7 @@ if (pbuffer16 == NULL) { fprintf(stderr, "pcre2test: malloc(%" SIZ_FORM ") failed for pbuffer16\n",- SIZ_CAST pbuffer16_size);+ pbuffer16_size); exit(1); } }@@ -3246,7 +3249,7 @@ if (pbuffer32 == NULL) { fprintf(stderr, "pcre2test: malloc(%" SIZ_FORM ") failed for pbuffer32\n",- SIZ_CAST pbuffer32_size);+ pbuffer32_size); exit(1); } }@@ -5031,7 +5034,7 @@ if (serial == NULL) { fprintf(outfile, "** Failed to get memory (size %" SIZ_FORM ") for #load\n",- SIZ_CAST serial_size);+ serial_size); fclose(f); return PR_ABEND; }@@ -5706,7 +5709,7 @@ if (rc != 0) { fprintf(outfile, "** Pattern conversion error at offset %" SIZ_FORM ": ",- SIZ_CAST converted_length);+ converted_length); convert_return = print_error_message(rc, "", "\n")? PR_SKIP:PR_ABEND; } @@ -6107,13 +6110,13 @@ fprintf(outfile, "%2d(%d) Old %" SIZ_FORM " %" SIZ_FORM " \"", scb->subscount, scb->oveccount,- SIZ_CAST scb->ovector[0], SIZ_CAST scb->ovector[1]);+ scb->ovector[0], scb->ovector[1]); PCHARSV(scb->input, scb->ovector[0], scb->ovector[1] - scb->ovector[0], utf, outfile); fprintf(outfile, "\" New %" SIZ_FORM " %" SIZ_FORM " \"",- SIZ_CAST scb->output_offsets[0], SIZ_CAST scb->output_offsets[1]);+ scb->output_offsets[0], scb->output_offsets[1]); PCHARSV(scb->output, scb->output_offsets[0], scb->output_offsets[1] - scb->output_offsets[0], utf, outfile);@@ -6200,7 +6203,7 @@ { uint32_t delimiter = CODE_UNIT(cb->callout_string, -1); fprintf(outfile, "Callout (%" SIZ_FORM "): %c",- SIZ_CAST cb->callout_string_offset, delimiter);+ cb->callout_string_offset, delimiter); PCHARSV(cb->callout_string, 0, cb->callout_string_length, utf, outfile); for (i = 0; callout_start_delims[i] != 0; i++)@@ -6400,11 +6403,11 @@ else if (length2 != length) { fprintf(outfile, "Mismatched substring lengths: %"- SIZ_FORM " %" SIZ_FORM "\n", SIZ_CAST length, SIZ_CAST length2);+ SIZ_FORM " %" SIZ_FORM "\n", length, length2); } fprintf(outfile, "%2dC ", n); PCHARSV(copybuffer, 0, length, utf, outfile);- fprintf(outfile, " (%" SIZ_FORM ")\n", SIZ_CAST length);+ fprintf(outfile, " (%" SIZ_FORM ")\n", length); } } @@ -6455,11 +6458,11 @@ else if (length2 != length) { fprintf(outfile, "Mismatched substring lengths: %"- SIZ_FORM " %" SIZ_FORM "\n", SIZ_CAST length, SIZ_CAST length2);+ SIZ_FORM " %" SIZ_FORM "\n", length, length2); } fprintf(outfile, " C "); PCHARSV(copybuffer, 0, length, utf, outfile);- fprintf(outfile, " (%" SIZ_FORM ") %s", SIZ_CAST length, nptr);+ fprintf(outfile, " (%" SIZ_FORM ") %s", length, nptr); if (groupnumber >= 0) fprintf(outfile, " (group %d)\n", groupnumber); else fprintf(outfile, " (non-unique)\n"); }@@ -6484,7 +6487,7 @@ { fprintf(outfile, "%2dG ", n); PCHARSV(gotbuffer, 0, length, utf, outfile);- fprintf(outfile, " (%" SIZ_FORM ")\n", SIZ_CAST length);+ fprintf(outfile, " (%" SIZ_FORM ")\n", length); PCRE2_SUBSTRING_FREE(gotbuffer); } }@@ -6528,7 +6531,7 @@ { fprintf(outfile, " G "); PCHARSV(gotbuffer, 0, length, utf, outfile);- fprintf(outfile, " (%" SIZ_FORM ") %s", SIZ_CAST length, nptr);+ fprintf(outfile, " (%" SIZ_FORM ") %s", length, nptr); if (groupnumber >= 0) fprintf(outfile, " (group %d)\n", groupnumber); else fprintf(outfile, " (non-unique)\n"); PCRE2_SUBSTRING_FREE(gotbuffer);@@ -7364,7 +7367,7 @@ if (n > nsize) { fprintf(outfile, "Replacement buffer setting (%" SIZ_FORM ") is too "- "large (max %" SIZ_FORM ")\n", SIZ_CAST n, SIZ_CAST nsize);+ "large (max %" SIZ_FORM ")\n", n, nsize); return PR_OK; } nsize = n;@@ -7996,7 +7999,7 @@ { PCRE2_SIZE startchar; PCRE2_GET_STARTCHAR(startchar, match_data);- fprintf(outfile, " at offset %" SIZ_FORM, SIZ_CAST startchar);+ fprintf(outfile, " at offset %" SIZ_FORM, startchar); } fprintf(outfile, "\n"); break;@@ -8852,7 +8855,7 @@ if (pbuffer16 == NULL) { fprintf(stderr, "pcre2test: malloc(%" SIZ_FORM ") failed for pbuffer16\n",- SIZ_CAST pbuffer16_size);+ pbuffer16_size); yield = 1; goto EXIT; }@@ -8867,7 +8870,7 @@ if (pbuffer32 == NULL) { fprintf(stderr, "pcre2test: malloc(%" SIZ_FORM ") failed for pbuffer32\n",- SIZ_CAST pbuffer32_size);+ pbuffer32_size); yield = 1; goto EXIT; }
src/c/pcre2/src/sljit/sljitConfigInternal.h view
@@ -761,6 +761,18 @@ #define SLJIT_NUMBER_OF_SCRATCH_FLOAT_REGISTERS \ (SLJIT_NUMBER_OF_FLOAT_REGISTERS - SLJIT_NUMBER_OF_SAVED_FLOAT_REGISTERS) +/********************************/+/* CPU status flags management. */+/********************************/++#if (defined SLJIT_CONFIG_ARM_32 && SLJIT_CONFIG_ARM_32) \+ || (defined SLJIT_CONFIG_ARM_64 && SLJIT_CONFIG_ARM_64) \+ || (defined SLJIT_CONFIG_MIPS && SLJIT_CONFIG_MIPS) \+ || (defined SLJIT_CONFIG_SPARC && SLJIT_CONFIG_SPARC) \+ || (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X)+#define SLJIT_HAS_STATUS_FLAGS_STATE 1+#endif+ /*************************************/ /* Debug and verbose related macros. */ /*************************************/
src/c/pcre2/src/sljit/sljitLir.c view
@@ -532,13 +532,21 @@ put_label->label = label; } +#define SLJIT_CURRENT_FLAGS_ALL \+ (SLJIT_CURRENT_FLAGS_I32_OP | SLJIT_CURRENT_FLAGS_ADD_SUB | SLJIT_CURRENT_FLAGS_COMPARE)+ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags) { SLJIT_UNUSED_ARG(compiler); SLJIT_UNUSED_ARG(current_flags); +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE)+ compiler->status_flags_state = current_flags;+#endif+ #if (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)- if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_I32_OP | SLJIT_SET_Z)) == 0) {+ compiler->last_flags = 0;+ if ((current_flags & ~(VARIABLE_FLAG_MASK | SLJIT_SET_Z | SLJIT_CURRENT_FLAGS_ALL)) == 0) { compiler->last_flags = GET_FLAG_TYPE(current_flags) | (current_flags & (SLJIT_I32_OP | SLJIT_SET_Z)); } #endif@@ -968,7 +976,7 @@ }; #define JUMP_POSTFIX(type) \- ((type & 0xff) <= SLJIT_MUL_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? "32" : "") \+ ((type & 0xff) <= SLJIT_NOT_OVERFLOW ? ((type & SLJIT_I32_OP) ? "32" : "") \ : ((type & 0xff) <= SLJIT_ORDERED_F64 ? ((type & SLJIT_F32_OP) ? ".f32" : ".f64") : "")) static char* jump_names[] = {@@ -978,7 +986,6 @@ (char*)"sig_less", (char*)"sig_greater_equal", (char*)"sig_greater", (char*)"sig_less_equal", (char*)"overflow", (char*)"not_overflow",- (char*)"mul_overflow", (char*)"mul_not_overflow", (char*)"carry", (char*)"", (char*)"equal", (char*)"not_equal", (char*)"less", (char*)"greater_equal",@@ -1278,7 +1285,7 @@ case SLJIT_MUL: CHECK_ARGUMENT(!(op & SLJIT_SET_Z)); CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)- || GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW);+ || GET_FLAG_TYPE(op) == SLJIT_OVERFLOW); break; case SLJIT_ADD: CHECK_ARGUMENT(!(op & VARIABLE_FLAG_MASK)@@ -1601,9 +1608,7 @@ CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)- || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)- || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));- CHECK_ARGUMENT((type & SLJIT_I32_OP) == (compiler->last_flags & SLJIT_I32_OP));+ || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); } #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)@@ -1818,8 +1823,7 @@ CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)- || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)- || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));+ || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); FUNCTION_CHECK_DST(dst, dstw, 0); @@ -1858,8 +1862,7 @@ CHECK_ARGUMENT(compiler->last_flags & SLJIT_SET_Z); else CHECK_ARGUMENT((type & 0xff) == (compiler->last_flags & 0xff)- || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)- || ((type & 0xff) == SLJIT_MUL_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_MUL_OVERFLOW));+ || ((type & 0xff) == SLJIT_NOT_OVERFLOW && (compiler->last_flags & 0xff) == SLJIT_OVERFLOW)); #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) if (SLJIT_UNLIKELY(!!compiler->verbose)) {
src/c/pcre2/src/sljit/sljitLir.h view
@@ -412,6 +412,10 @@ /* Executable size for statistical purposes. */ sljit_uw executable_size; +#if (defined SLJIT_HAS_STATUS_FLAGS_STATE && SLJIT_HAS_STATUS_FLAGS_STATE)+ sljit_s32 status_flags_state;+#endif+ #if (defined SLJIT_CONFIG_X86_32 && SLJIT_CONFIG_X86_32) sljit_s32 args; sljit_s32 locals_offset;@@ -460,7 +464,7 @@ #if (defined SLJIT_CONFIG_S390X && SLJIT_CONFIG_S390X) /* Need to allocate register save area to make calls. */- sljit_s32 have_save_area;+ sljit_s32 mode; #endif #if (defined SLJIT_VERBOSE && SLJIT_VERBOSE)@@ -996,7 +1000,7 @@ #define SLJIT_SUBC (SLJIT_OP2_BASE + 3) #define SLJIT_SUBC32 (SLJIT_SUBC | SLJIT_I32_OP) /* Note: integer mul- Flags: MUL_OVERFLOW */+ Flags: OVERFLOW */ #define SLJIT_MUL (SLJIT_OP2_BASE + 4) #define SLJIT_MUL32 (SLJIT_MUL | SLJIT_I32_OP) /* Flags: Z */@@ -1141,89 +1145,69 @@ /* Integer comparison types. */ #define SLJIT_EQUAL 0-#define SLJIT_EQUAL32 (SLJIT_EQUAL | SLJIT_I32_OP)-#define SLJIT_ZERO 0-#define SLJIT_ZERO32 (SLJIT_ZERO | SLJIT_I32_OP)+#define SLJIT_ZERO SLJIT_EQUAL #define SLJIT_NOT_EQUAL 1-#define SLJIT_NOT_EQUAL32 (SLJIT_NOT_EQUAL | SLJIT_I32_OP)-#define SLJIT_NOT_ZERO 1-#define SLJIT_NOT_ZERO32 (SLJIT_NOT_ZERO | SLJIT_I32_OP)+#define SLJIT_NOT_ZERO SLJIT_NOT_EQUAL #define SLJIT_LESS 2-#define SLJIT_LESS32 (SLJIT_LESS | SLJIT_I32_OP) #define SLJIT_SET_LESS SLJIT_SET(SLJIT_LESS) #define SLJIT_GREATER_EQUAL 3-#define SLJIT_GREATER_EQUAL32 (SLJIT_GREATER_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_GREATER_EQUAL SLJIT_SET(SLJIT_GREATER_EQUAL) #define SLJIT_GREATER 4-#define SLJIT_GREATER32 (SLJIT_GREATER | SLJIT_I32_OP) #define SLJIT_SET_GREATER SLJIT_SET(SLJIT_GREATER) #define SLJIT_LESS_EQUAL 5-#define SLJIT_LESS_EQUAL32 (SLJIT_LESS_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_LESS_EQUAL SLJIT_SET(SLJIT_LESS_EQUAL) #define SLJIT_SIG_LESS 6-#define SLJIT_SIG_LESS32 (SLJIT_SIG_LESS | SLJIT_I32_OP) #define SLJIT_SET_SIG_LESS SLJIT_SET(SLJIT_SIG_LESS) #define SLJIT_SIG_GREATER_EQUAL 7-#define SLJIT_SIG_GREATER_EQUAL32 (SLJIT_SIG_GREATER_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_SIG_GREATER_EQUAL SLJIT_SET(SLJIT_SIG_GREATER_EQUAL) #define SLJIT_SIG_GREATER 8-#define SLJIT_SIG_GREATER32 (SLJIT_SIG_GREATER | SLJIT_I32_OP) #define SLJIT_SET_SIG_GREATER SLJIT_SET(SLJIT_SIG_GREATER) #define SLJIT_SIG_LESS_EQUAL 9-#define SLJIT_SIG_LESS_EQUAL32 (SLJIT_SIG_LESS_EQUAL | SLJIT_I32_OP) #define SLJIT_SET_SIG_LESS_EQUAL SLJIT_SET(SLJIT_SIG_LESS_EQUAL) #define SLJIT_OVERFLOW 10-#define SLJIT_OVERFLOW32 (SLJIT_OVERFLOW | SLJIT_I32_OP) #define SLJIT_SET_OVERFLOW SLJIT_SET(SLJIT_OVERFLOW) #define SLJIT_NOT_OVERFLOW 11-#define SLJIT_NOT_OVERFLOW32 (SLJIT_NOT_OVERFLOW | SLJIT_I32_OP) -#define SLJIT_MUL_OVERFLOW 12-#define SLJIT_MUL_OVERFLOW32 (SLJIT_MUL_OVERFLOW | SLJIT_I32_OP)-#define SLJIT_SET_MUL_OVERFLOW SLJIT_SET(SLJIT_MUL_OVERFLOW)-#define SLJIT_MUL_NOT_OVERFLOW 13-#define SLJIT_MUL_NOT_OVERFLOW32 (SLJIT_MUL_NOT_OVERFLOW | SLJIT_I32_OP)- /* There is no SLJIT_CARRY or SLJIT_NOT_CARRY. */-#define SLJIT_SET_CARRY SLJIT_SET(14)+#define SLJIT_SET_CARRY SLJIT_SET(12) /* Floating point comparison types. */-#define SLJIT_EQUAL_F64 16+#define SLJIT_EQUAL_F64 14 #define SLJIT_EQUAL_F32 (SLJIT_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_EQUAL_F SLJIT_SET(SLJIT_EQUAL_F64)-#define SLJIT_NOT_EQUAL_F64 17+#define SLJIT_NOT_EQUAL_F64 15 #define SLJIT_NOT_EQUAL_F32 (SLJIT_NOT_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_NOT_EQUAL_F SLJIT_SET(SLJIT_NOT_EQUAL_F64)-#define SLJIT_LESS_F64 18+#define SLJIT_LESS_F64 16 #define SLJIT_LESS_F32 (SLJIT_LESS_F64 | SLJIT_F32_OP) #define SLJIT_SET_LESS_F SLJIT_SET(SLJIT_LESS_F64)-#define SLJIT_GREATER_EQUAL_F64 19+#define SLJIT_GREATER_EQUAL_F64 17 #define SLJIT_GREATER_EQUAL_F32 (SLJIT_GREATER_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_GREATER_EQUAL_F SLJIT_SET(SLJIT_GREATER_EQUAL_F64)-#define SLJIT_GREATER_F64 20+#define SLJIT_GREATER_F64 18 #define SLJIT_GREATER_F32 (SLJIT_GREATER_F64 | SLJIT_F32_OP) #define SLJIT_SET_GREATER_F SLJIT_SET(SLJIT_GREATER_F64)-#define SLJIT_LESS_EQUAL_F64 21+#define SLJIT_LESS_EQUAL_F64 19 #define SLJIT_LESS_EQUAL_F32 (SLJIT_LESS_EQUAL_F64 | SLJIT_F32_OP) #define SLJIT_SET_LESS_EQUAL_F SLJIT_SET(SLJIT_LESS_EQUAL_F64)-#define SLJIT_UNORDERED_F64 22+#define SLJIT_UNORDERED_F64 20 #define SLJIT_UNORDERED_F32 (SLJIT_UNORDERED_F64 | SLJIT_F32_OP) #define SLJIT_SET_UNORDERED_F SLJIT_SET(SLJIT_UNORDERED_F64)-#define SLJIT_ORDERED_F64 23+#define SLJIT_ORDERED_F64 21 #define SLJIT_ORDERED_F32 (SLJIT_ORDERED_F64 | SLJIT_F32_OP) #define SLJIT_SET_ORDERED_F SLJIT_SET(SLJIT_ORDERED_F64) /* Unconditional jump types. */-#define SLJIT_JUMP 24+#define SLJIT_JUMP 22 /* Fast calling method. See sljit_emit_fast_enter / SLJIT_FAST_RETURN. */-#define SLJIT_FAST_CALL 25+#define SLJIT_FAST_CALL 23 /* Called function must be declared with the SLJIT_FUNC attribute. */-#define SLJIT_CALL 26+#define SLJIT_CALL 24 /* Called function must be declared with cdecl attribute. This is the default attribute for C functions. */-#define SLJIT_CALL_CDECL 27+#define SLJIT_CALL_CDECL 25 /* The target can be changed during runtime (see: sljit_set_jump_addr). */ #define SLJIT_REWRITABLE_JUMP 0x1000@@ -1534,8 +1518,22 @@ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler, void *instruction, sljit_s32 size); -/* Define the currently available CPU status flags. It is usually used after an- sljit_emit_op_custom call to define which flags are set. */+/* Flags were set by a 32 bit operation. */+#define SLJIT_CURRENT_FLAGS_I32_OP SLJIT_I32_OP++/* Flags were set by an ADD, ADDC, SUB, SUBC, or NEG operation. */+#define SLJIT_CURRENT_FLAGS_ADD_SUB 0x01++/* Flags were set by a SUB with unused destination.+ Must be combined with SLJIT_CURRENT_FLAGS_ADD_SUB. */+#define SLJIT_CURRENT_FLAGS_COMPARE 0x02++/* Define the currently available CPU status flags. It is usually used after+ an sljit_emit_label or sljit_emit_op_custom operations to define which CPU+ status flags are available.++ The current_flags must be a valid combination of SLJIT_SET_* and+ SLJIT_CURRENT_FLAGS_* constants. */ SLJIT_API_FUNC_ATTRIBUTE void sljit_set_current_flags(struct sljit_compiler *compiler, sljit_s32 current_flags);
src/c/pcre2/src/sljit/sljitNativeARM_32.c view
@@ -1197,6 +1197,8 @@ case SLJIT_ADD: SLJIT_ASSERT(!(flags & INV_IMM));+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB;+ if ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED)) return push_inst(compiler, CMN | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); return push_inst(compiler, ADD | (flags & SET_FLAGS) | RD(dst) | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2)));@@ -1207,6 +1209,8 @@ case SLJIT_SUB: SLJIT_ASSERT(!(flags & INV_IMM));+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB;+ if ((flags & (UNUSED_RETURN | SET_FLAGS)) == (UNUSED_RETURN | SET_FLAGS) && !(flags & ARGS_SWAPPED)) return push_inst(compiler, CMP | SET_FLAGS | RN(src1) | ((src2 & SRC2_IMM) ? src2 : RM(src2))); return push_inst(compiler, (!(flags & ARGS_SWAPPED) ? SUB : RSB) | (flags & SET_FLAGS)@@ -1220,6 +1224,7 @@ case SLJIT_MUL: SLJIT_ASSERT(!(flags & INV_IMM)); SLJIT_ASSERT(!(src2 & SRC2_IMM));+ compiler->status_flags_state = 0; if (!HAS_FLAGS(op)) return push_inst(compiler, MUL | (reg_map[dst] << 16) | (reg_map[src2] << 8) | reg_map[src1]);@@ -2153,16 +2158,14 @@ /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type)+static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL:- case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x00000000; case SLJIT_NOT_EQUAL:- case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x10000000; @@ -2195,10 +2198,16 @@ return 0xd0000000; case SLJIT_OVERFLOW:+ if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB))+ return 0x10000000;+ case SLJIT_UNORDERED_F64: return 0x60000000; case SLJIT_NOT_OVERFLOW:+ if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB))+ return 0x00000000;+ case SLJIT_ORDERED_F64: return 0x70000000; @@ -2242,7 +2251,7 @@ if (type >= SLJIT_FAST_CALL) PTR_FAIL_IF(prepare_blx(compiler)); PTR_FAIL_IF(push_inst_with_unique_literal(compiler, ((EMIT_DATA_TRANSFER(WORD_SIZE | LOAD_DATA, 1,- type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(type), 0));+ type <= SLJIT_JUMP ? TMP_PC : TMP_REG1, TMP_PC, 0)) & ~COND_MASK) | get_cc(compiler, type), 0)); if (jump->flags & SLJIT_REWRITABLE_JUMP) { jump->addr = compiler->size;@@ -2260,7 +2269,7 @@ if (type >= SLJIT_FAST_CALL) jump->flags |= IS_BL; PTR_FAIL_IF(emit_imm(compiler, TMP_REG1, 0));- PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(type)));+ PTR_FAIL_IF(push_inst(compiler, (((type <= SLJIT_JUMP ? BX : BLX) | RM(TMP_REG1)) & ~COND_MASK) | get_cc(compiler, type))); jump->addr = compiler->size; #endif return jump;@@ -2589,7 +2598,7 @@ ADJUST_LOCAL_OFFSET(dst, dstw); op = GET_OPCODE(op);- cc = get_cc(type & 0xff);+ cc = get_cc(compiler, type & 0xff); dst_reg = FAST_IS_REG(dst) ? dst : TMP_REG1; if (op < SLJIT_ADD) {@@ -2629,7 +2638,7 @@ dst_reg &= ~SLJIT_I32_OP; - cc = get_cc(type & 0xff);+ cc = get_cc(compiler, type & 0xff); if (SLJIT_UNLIKELY(src & SLJIT_IMM)) { tmp = get_imm(srcw);
src/c/pcre2/src/sljit/sljitNativeARM_64.c view
@@ -644,6 +644,7 @@ imm = -imm; /* Fall through. */ case SLJIT_ADD:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (imm == 0) { CHECK_FLAGS(1 << 29); return push_inst(compiler, ((op == SLJIT_ADD ? ADDI : SUBI) ^ inv_bits) | RD(dst) | RN(reg));@@ -781,6 +782,7 @@ break; /* Set flags. */ case SLJIT_NEG: SLJIT_ASSERT(arg1 == TMP_REG1);+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & SET_FLAGS) inv_bits |= 1 << 29; return push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(TMP_ZERO) | RM(arg2));@@ -789,17 +791,20 @@ return push_inst(compiler, (CLZ ^ inv_bits) | RD(dst) | RN(arg2)); case SLJIT_ADD: CHECK_FLAGS(1 << 29);+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, (ADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_ADDC: CHECK_FLAGS(1 << 29); return push_inst(compiler, (ADC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_SUB: CHECK_FLAGS(1 << 29);+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, (SUB ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_SUBC: CHECK_FLAGS(1 << 29); return push_inst(compiler, (SBC ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2)); case SLJIT_MUL:+ compiler->status_flags_state = 0; if (!(flags & SET_FLAGS)) return push_inst(compiler, (MADD ^ inv_bits) | RD(dst) | RN(arg1) | RM(arg2) | RT2(TMP_ZERO)); if (flags & INT_OP) {@@ -1600,16 +1605,14 @@ /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type)+static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL:- case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x1; case SLJIT_NOT_EQUAL:- case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x0; @@ -1642,10 +1645,16 @@ return 0xc; case SLJIT_OVERFLOW:+ if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB))+ return 0x0;+ case SLJIT_UNORDERED_F64: return 0x7; case SLJIT_NOT_OVERFLOW:+ if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB))+ return 0x1;+ case SLJIT_ORDERED_F64: return 0x6; @@ -1685,7 +1694,7 @@ if (type < SLJIT_JUMP) { jump->flags |= IS_COND;- PTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(type)));+ PTR_FAIL_IF(push_inst(compiler, B_CC | (6 << 5) | get_cc(compiler, type))); } else if (type >= SLJIT_FAST_CALL) jump->flags |= IS_BL;@@ -1799,7 +1808,7 @@ CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type)); ADJUST_LOCAL_OFFSET(dst, dstw); - cc = get_cc(type & 0xff);+ cc = get_cc(compiler, type & 0xff); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; if (GET_OPCODE(op) < SLJIT_ADD) {@@ -1854,7 +1863,7 @@ srcw = 0; } - cc = get_cc(type & 0xff);+ cc = get_cc(compiler, type & 0xff); dst_reg &= ~SLJIT_I32_OP; return push_inst(compiler, (CSEL ^ inv_bits) | (cc << 12) | RD(dst_reg) | RN(dst_reg) | RM(src));
src/c/pcre2/src/sljit/sljitNativeARM_T2_32.c view
@@ -610,6 +610,7 @@ Although some clever things could be done here, "NOT IMM" does not worth the efforts. */ break; case SLJIT_ADD:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; nimm = -(sljit_sw)imm; if (IS_2_LO_REGS(reg, dst)) { if (imm <= 0x7)@@ -643,6 +644,7 @@ break; case SLJIT_SUB: /* SUB operation can be replaced by ADD because of the negative carry flag. */+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & ARG1_IMM) { if (imm == 0 && IS_2_LO_REGS(reg, dst)) return push_inst16(compiler, RSBSI | RD3(dst) | RN3(reg));@@ -801,6 +803,7 @@ FAIL_IF(push_inst32(compiler, CLZ | RN4(arg2) | RD4(dst) | RM4(arg2))); return SLJIT_SUCCESS; case SLJIT_ADD:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (IS_3_LO_REGS(dst, arg1, arg2)) return push_inst16(compiler, ADDS | RD3(dst) | RN3(arg1) | RM3(arg2)); if (dst == arg1 && !(flags & SET_FLAGS))@@ -811,6 +814,7 @@ return push_inst16(compiler, ADCS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, ADC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_SUB:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; if (flags & UNUSED_RETURN) { if (IS_2_LO_REGS(arg1, arg2)) return push_inst16(compiler, CMP | RD3(arg1) | RN3(arg2));@@ -824,6 +828,7 @@ return push_inst16(compiler, SBCS | RD3(dst) | RN3(arg2)); return push_inst32(compiler, SBC_W | (flags & SET_FLAGS) | RD4(dst) | RN4(arg1) | RM4(arg2)); case SLJIT_MUL:+ compiler->status_flags_state = 0; if (!(flags & SET_FLAGS)) return push_inst32(compiler, MUL | RD4(dst) | RN4(arg1) | RM4(arg2)); SLJIT_ASSERT(dst != TMP_REG2);@@ -1760,16 +1765,14 @@ /* Conditional instructions */ /* --------------------------------------------------------------------- */ -static sljit_uw get_cc(sljit_s32 type)+static sljit_uw get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL:- case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_EQUAL_F64: return 0x0; case SLJIT_NOT_EQUAL:- case SLJIT_MUL_OVERFLOW: case SLJIT_NOT_EQUAL_F64: return 0x1; @@ -1802,10 +1805,16 @@ return 0xd; case SLJIT_OVERFLOW:+ if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB))+ return 0x1;+ case SLJIT_UNORDERED_F64: return 0x6; case SLJIT_NOT_OVERFLOW:+ if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB))+ return 0x0;+ case SLJIT_ORDERED_F64: return 0x7; @@ -1847,7 +1856,7 @@ PTR_FAIL_IF(emit_imm32_const(compiler, TMP_REG1, 0)); if (type < SLJIT_JUMP) { jump->flags |= IS_COND;- cc = get_cc(type);+ cc = get_cc(compiler, type); jump->flags |= cc << 8; PTR_FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8)); }@@ -2177,7 +2186,7 @@ ADJUST_LOCAL_OFFSET(dst, dstw); op = GET_OPCODE(op);- cc = get_cc(type & 0xff);+ cc = get_cc(compiler, type & 0xff); dst_r = FAST_IS_REG(dst) ? dst : TMP_REG1; if (op < SLJIT_ADD) {@@ -2229,7 +2238,7 @@ dst_reg &= ~SLJIT_I32_OP; - cc = get_cc(type & 0xff);+ cc = get_cc(compiler, type & 0xff); if (!(src & SLJIT_IMM)) { FAIL_IF(push_inst16(compiler, IT | (cc << 4) | 0x8));
src/c/pcre2/src/sljit/sljitNativeMIPS_32.c view
@@ -367,7 +367,7 @@ case SLJIT_MUL: SLJIT_ASSERT(!(flags & SRC2_IMM)); - if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) {+ if (GET_FLAG_TYPE(op) != SLJIT_OVERFLOW) { #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1) return push_inst(compiler, MUL | S(src1) | T(src2) | D(dst), DR(dst)); #else /* SLJIT_MIPS_REV < 1 */
src/c/pcre2/src/sljit/sljitNativeMIPS_64.c view
@@ -458,7 +458,7 @@ case SLJIT_MUL: SLJIT_ASSERT(!(flags & SRC2_IMM)); - if (GET_FLAG_TYPE(op) != SLJIT_MUL_OVERFLOW) {+ if (GET_FLAG_TYPE(op) != SLJIT_OVERFLOW) { #if (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 6) return push_inst(compiler, SELECT_OP(DMUL, MUL) | S(src1) | T(src2) | D(dst), DR(dst)); #elif (defined SLJIT_MIPS_REV && SLJIT_MIPS_REV >= 1)
src/c/pcre2/src/sljit/sljitNativeMIPS_common.c view
@@ -1377,6 +1377,7 @@ return emit_op(compiler, op, flags, dst, dstw, TMP_REG1, 0, src, srcw); case SLJIT_NEG:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, SLJIT_SUB | GET_ALL_FLAGS(op), flags | IMM_OP, dst, dstw, SLJIT_IMM, 0, src, srcw); case SLJIT_CLZ:@@ -1424,13 +1425,16 @@ switch (GET_OPCODE(op)) { case SLJIT_ADD: case SLJIT_ADDC:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, op, flags | CUMULATIVE_OP | IMM_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_SUB: case SLJIT_SUBC:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return emit_op(compiler, op, flags | IMM_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_MUL:+ compiler->status_flags_state = 0; return emit_op(compiler, op, flags | CUMULATIVE_OP, dst, dstw, src1, src1w, src2, src2w); case SLJIT_AND:@@ -1860,7 +1864,6 @@ case SLJIT_SIG_LESS: case SLJIT_SIG_GREATER: case SLJIT_OVERFLOW:- case SLJIT_MUL_OVERFLOW: BR_Z(OTHER_FLAG); break; case SLJIT_GREATER_EQUAL:@@ -1868,7 +1871,6 @@ case SLJIT_SIG_GREATER_EQUAL: case SLJIT_SIG_LESS_EQUAL: case SLJIT_NOT_OVERFLOW:- case SLJIT_MUL_NOT_OVERFLOW: BR_NZ(OTHER_FLAG); break; case SLJIT_NOT_EQUAL_F64:@@ -2127,8 +2129,12 @@ FAIL_IF(push_inst(compiler, SLTIU | SA(EQUAL_FLAG) | TA(dst_ar) | IMM(1), dst_ar)); src_ar = dst_ar; break;- case SLJIT_MUL_OVERFLOW:- case SLJIT_MUL_NOT_OVERFLOW:+ case SLJIT_OVERFLOW:+ case SLJIT_NOT_OVERFLOW:+ if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB) {+ src_ar = OTHER_FLAG;+ break;+ } FAIL_IF(push_inst(compiler, SLTIU | SA(OTHER_FLAG) | TA(dst_ar) | IMM(1), dst_ar)); src_ar = dst_ar; type ^= 0x1; /* Flip type bit for the XORI below. */@@ -2219,7 +2225,6 @@ case SLJIT_SIG_LESS: case SLJIT_SIG_GREATER: case SLJIT_OVERFLOW:- case SLJIT_MUL_OVERFLOW: ins = MOVN | TA(OTHER_FLAG); break; case SLJIT_GREATER_EQUAL:@@ -2227,7 +2232,6 @@ case SLJIT_SIG_GREATER_EQUAL: case SLJIT_SIG_LESS_EQUAL: case SLJIT_NOT_OVERFLOW:- case SLJIT_MUL_NOT_OVERFLOW: ins = MOVZ | TA(OTHER_FLAG); break; case SLJIT_EQUAL_F64:
src/c/pcre2/src/sljit/sljitNativePPC_32.c view
@@ -119,9 +119,10 @@ SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm); }+ SLJIT_ASSERT(!(flags & ALT_FORM4)); if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2));- if (flags & ALT_FORM4)+ if (flags & ALT_FORM5) return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); @@ -143,22 +144,27 @@ } if (flags & ALT_FORM2) {+ if (flags & ALT_FORM3) {+ FAIL_IF(push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm));+ if (!(flags & ALT_FORM4))+ return SLJIT_SUCCESS;+ return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff));+ }+ FAIL_IF(push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2)));+ if (!(flags & ALT_FORM4))+ return SLJIT_SUCCESS;+ return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));+ }++ if (flags & ALT_FORM3) { /* Setting XER SO is not enough, CR SO is also needed. */ return push_inst(compiler, SUBF | OE(ALT_SET_FLAGS) | RC(ALT_SET_FLAGS) | D(dst) | A(src2) | B(src1)); } - if (flags & ALT_FORM3) {+ if (flags & ALT_FORM4) { /* Flags does not set: BIN_IMM_EXTS unnecessary. */ SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm);- }-- if (flags & ALT_FORM4) {- if (flags & ALT_FORM5) {- SLJIT_ASSERT(src2 == TMP_REG2);- return push_inst(compiler, CMPI | CRD(0) | A(src1) | compiler->imm);- }- return push_inst(compiler, CMP | CRD(0) | A(src1) | B(src2)); } if (!(flags & ALT_SET_FLAGS))
src/c/pcre2/src/sljit/sljitNativePPC_64.c view
@@ -252,10 +252,17 @@ BIN_IMM_EXTS(); return push_inst(compiler, ADDIC | D(dst) | A(src1) | compiler->imm); }+ if (flags & ALT_FORM4) {+ if (flags & ALT_FORM5)+ FAIL_IF(push_inst(compiler, ADDI | D(dst) | A(src1) | compiler->imm));+ else+ FAIL_IF(push_inst(compiler, ADD | D(dst) | A(src1) | B(src2)));+ return push_inst(compiler, CMPI | A(dst) | 0);+ } if (!(flags & ALT_SET_FLAGS)) return push_inst(compiler, ADD | D(dst) | A(src1) | B(src2)); BIN_EXTS();- if (flags & ALT_FORM4)+ if (flags & ALT_FORM5) return push_inst(compiler, ADDC | RC(ALT_SET_FLAGS) | D(dst) | A(src1) | B(src2)); return push_inst(compiler, ADD | RC(flags) | D(dst) | A(src1) | B(src2)); @@ -278,6 +285,19 @@ } if (flags & ALT_FORM2) {+ if (flags & ALT_FORM3) {+ FAIL_IF(push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm));+ if (!(flags & ALT_FORM4))+ return SLJIT_SUCCESS;+ return push_inst(compiler, ADDI | D(dst) | A(src1) | (-compiler->imm & 0xffff));+ }+ FAIL_IF(push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2)));+ if (!(flags & ALT_FORM4))+ return SLJIT_SUCCESS;+ return push_inst(compiler, SUBF | D(dst) | A(src2) | B(src1));+ }++ if (flags & ALT_FORM3) { if (flags & ALT_SIGN_EXT) { FAIL_IF(push_inst(compiler, RLDI(TMP_REG1, src1, 32, 31, 1))); src1 = TMP_REG1;@@ -291,18 +311,10 @@ return SLJIT_SUCCESS; } - if (flags & ALT_FORM3) {+ if (flags & ALT_FORM4) { /* Flags does not set: BIN_IMM_EXTS unnecessary. */ SLJIT_ASSERT(src2 == TMP_REG2); return push_inst(compiler, SUBFIC | D(dst) | A(src1) | compiler->imm);- }-- if (flags & ALT_FORM4) {- if (flags & ALT_FORM5) {- SLJIT_ASSERT(src2 == TMP_REG2);- return push_inst(compiler, CMPI | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | compiler->imm);- }- return push_inst(compiler, CMP | CRD(0 | ((flags & ALT_SIGN_EXT) ? 0 : 1)) | A(src1) | B(src2)); } if (!(flags & ALT_SET_FLAGS))
src/c/pcre2/src/sljit/sljitNativePPC_common.c view
@@ -1324,6 +1324,25 @@ ((src) & SLJIT_IMM) #endif +#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)+#define TEST_ADD_FORM1(op) \+ (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \+ || (op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_I32_OP | SLJIT_SET_Z | SLJIT_SET_CARRY))+#define TEST_SUB_FORM2(op) \+ ((GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) \+ || (op & (SLJIT_I32_OP | SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_I32_OP | SLJIT_SET_Z))+#define TEST_SUB_FORM3(op) \+ (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW \+ || (op & (SLJIT_I32_OP | SLJIT_SET_Z)) == (SLJIT_I32_OP | SLJIT_SET_Z))+#else+#define TEST_ADD_FORM1(op) \+ (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)+#define TEST_SUB_FORM2(op) \+ (GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL)+#define TEST_SUB_FORM3(op) \+ (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)+#endif+ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 dst, sljit_sw dstw, sljit_s32 src1, sljit_sw src1w,@@ -1362,7 +1381,7 @@ switch (GET_OPCODE(op)) { case SLJIT_ADD:- if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)+ if (TEST_ADD_FORM1(op)) return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM1, dst, dstw, src1, src1w, src2, src2w); if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) {@@ -1392,6 +1411,20 @@ return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src2, src2w, TMP_REG2, 0); } }++#if (defined SLJIT_CONFIG_PPC_64 && SLJIT_CONFIG_PPC_64)+ if ((op & (SLJIT_I32_OP | SLJIT_SET_Z)) == (SLJIT_I32_OP | SLJIT_SET_Z)) {+ if (TEST_SL_IMM(src2, src2w)) {+ compiler->imm = src2w & 0xffff;+ return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src1, src1w, TMP_REG2, 0);+ }+ if (TEST_SL_IMM(src1, src1w)) {+ compiler->imm = src1w & 0xffff;+ return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src2, src2w, TMP_REG2, 0);+ }+ return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w);+ }+#endif if (HAS_FLAGS(op)) { if (TEST_SL_IMM(src2, src2w)) { compiler->imm = src2w & 0xffff;@@ -1402,7 +1435,7 @@ return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0); } }- return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM4 : 0), dst, dstw, src1, src1w, src2, src2w);+ return emit_op(compiler, SLJIT_ADD, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w); case SLJIT_ADDC: return emit_op(compiler, SLJIT_ADDC, flags, dst, dstw, src1, src1w, src2, src2w);@@ -1424,18 +1457,36 @@ return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM1 | ALT_FORM3, dst, dstw, src1, src1w, src2, src2w); } - if (GET_FLAG_TYPE(op) == SLJIT_OVERFLOW)+ if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) {+ if (TEST_SL_IMM(src2, src2w)) {+ compiler->imm = src2w & 0xffff;+ return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);+ } return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2, dst, dstw, src1, src1w, src2, src2w);+ } - if (!HAS_FLAGS(op) && ((src1 | src2) & SLJIT_IMM)) {- if (TEST_SL_IMM(src2, -src2w)) {- compiler->imm = (-src2w) & 0xffff;- return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2, dst, dstw, src1, src1w, TMP_REG2, 0);- }- if (TEST_SL_IMM(src1, src1w)) {- compiler->imm = src1w & 0xffff;- return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src2, src2w, TMP_REG2, 0);+ if (TEST_SUB_FORM2(op)) {+ if ((src2 & SLJIT_IMM) && src2w >= -SIMM_MAX && src2w <= SIMM_MAX) {+ compiler->imm = src2w & 0xffff;+ return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM3 | ALT_FORM4, dst, dstw, src1, src1w, TMP_REG2, 0); }+ return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM2 | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w);+ }++ if (TEST_SUB_FORM3(op))+ return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM3, dst, dstw, src1, src1w, src2, src2w);++ if (TEST_SL_IMM(src2, -src2w)) {+ compiler->imm = (-src2w) & 0xffff;+ return emit_op(compiler, SLJIT_ADD, flags | (!HAS_FLAGS(op) ? ALT_FORM2 : ALT_FORM3), dst, dstw, src1, src1w, TMP_REG2, 0);+ }++ if (TEST_SL_IMM(src1, src1w) && !(op & SLJIT_SET_Z)) {+ compiler->imm = src1w & 0xffff;+ return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4, dst, dstw, src2, src2w, TMP_REG2, 0);+ }++ if (!HAS_FLAGS(op)) { if (TEST_SH_IMM(src2, -src2w)) { compiler->imm = ((-src2w) >> 16) & 0xffff; return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM2 | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);@@ -1447,18 +1498,6 @@ } } - if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) != GET_FLAG_TYPE(SLJIT_SET_CARRY)) {- if (TEST_SL_IMM(src2, src2w)) {- compiler->imm = src2w & 0xffff;- return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4 | ALT_FORM5, dst, dstw, src1, src1w, TMP_REG2, 0);- }- return emit_op(compiler, SLJIT_SUB, flags | ALT_FORM4, dst, dstw, src1, src1w, src2, src2w);- }-- if (TEST_SL_IMM(src2, -src2w)) {- compiler->imm = (-src2w) & 0xffff;- return emit_op(compiler, SLJIT_ADD, flags | ALT_FORM3, dst, dstw, src1, src1w, TMP_REG2, 0);- } /* We know ALT_SIGN_EXT is set if it is an SLJIT_I32_OP on 64 bit systems. */ return emit_op(compiler, SLJIT_SUB, flags | ((GET_FLAG_TYPE(op) == GET_FLAG_TYPE(SLJIT_SET_CARRY)) ? ALT_FORM5 : 0), dst, dstw, src1, src1w, src2, src2w); @@ -1536,6 +1575,10 @@ return SLJIT_SUCCESS; } +#undef TEST_ADD_FORM1+#undef TEST_SUB_FORM2+#undef TEST_SUB_FORM3+ SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw) {@@ -1941,11 +1984,9 @@ return (4 << 21) | ((4 + 1) << 16); case SLJIT_OVERFLOW:- case SLJIT_MUL_OVERFLOW: return (12 << 21) | (3 << 16); case SLJIT_NOT_OVERFLOW:- case SLJIT_MUL_NOT_OVERFLOW: return (4 << 21) | (3 << 16); case SLJIT_EQUAL_F64:@@ -2143,12 +2184,10 @@ break; case SLJIT_OVERFLOW:- case SLJIT_MUL_OVERFLOW: cr_bit = 3; break; case SLJIT_NOT_OVERFLOW:- case SLJIT_MUL_NOT_OVERFLOW: cr_bit = 3; invert = 1; break;
src/c/pcre2/src/sljit/sljitNativeS390X.c view
@@ -45,2760 +45,2981 @@ static const sljit_ins sljit_ins_const = (sljit_ins)1 << 48; static const sljit_u8 reg_map[SLJIT_NUMBER_OF_REGISTERS + 4] = {- 14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1-};--/* there are also a[2-15] available, but they are slower to access and- * their use is limited as mundaym explained:- * https://github.com/zherczeg/sljit/pull/91#discussion_r486895689- */--/* General Purpose Registers [0-15]. */-typedef sljit_uw sljit_gpr;--/*- * WARNING- * the following code is non standard and should be improved for- * consistency, but doesn't use SLJIT_NUMBER_OF_REGISTERS based- * registers because r0 and r1 are the ABI recommended volatiles.- * there is a gpr() function that maps sljit to physical register numbers- * that should be used instead of the usual index into reg_map[] and- * will be retired ASAP (TODO: carenas)- */--static const sljit_gpr r0 = 0; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 2]: 0 in address calculations; reserved */-static const sljit_gpr r1 = 1; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 3]: reserved */-static const sljit_gpr r2 = 2; /* reg_map[1]: 1st argument */-static const sljit_gpr r3 = 3; /* reg_map[2]: 2nd argument */-static const sljit_gpr r4 = 4; /* reg_map[3]: 3rd argument */-static const sljit_gpr r5 = 5; /* reg_map[4]: 4th argument */-static const sljit_gpr r6 = 6; /* reg_map[5]: 5th argument; 1st saved register */-static const sljit_gpr r7 = 7; /* reg_map[6] */-static const sljit_gpr r8 = 8; /* reg_map[7] */-static const sljit_gpr r9 = 9; /* reg_map[8] */-static const sljit_gpr r10 = 10; /* reg_map[9] */-static const sljit_gpr r11 = 11; /* reg_map[10] */-static const sljit_gpr r12 = 12; /* reg_map[11]: GOT */-static const sljit_gpr r13 = 13; /* reg_map[12]: Literal Pool pointer */-static const sljit_gpr r14 = 14; /* reg_map[0]: return address and flag register */-static const sljit_gpr r15 = 15; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 1]: stack pointer */--/* WARNING: r12 and r13 shouldn't be used as per ABI recommendation */-/* TODO(carenas): r12 might conflict in PIC code, reserve? */-/* TODO(carenas): r13 is usually pointed to "pool" per ABI, using a tmp- * like we do know might be faster though, reserve?- */--/* TODO(carenas): should be named TMP_REG[1-2] for consistency */-#define tmp0 r0-#define tmp1 r1--/* TODO(carenas): flags should move to a different register so that- * link register doesn't need to change- */--/* Link registers. The normal link register is r14, but since- we use that for flags we need to use r0 instead to do fast- calls so that flags are preserved. */-static const sljit_gpr link_r = 14; /* r14 */-static const sljit_gpr fast_link_r = 0; /* r0 */--/* Flag register layout:-- 0 32 33 34 36 64- +---------------+---+---+-------+-------+- | ZERO | 0 | 0 | C C |///////|- +---------------+---+---+-------+-------+-*/-static const sljit_gpr flag_r = 14; /* r14 */--struct sljit_s390x_const {- struct sljit_const const_; /* must be first */- sljit_sw init_value; /* required to build literal pool */-};--/* Convert SLJIT register to hardware register. */-static SLJIT_INLINE sljit_gpr gpr(sljit_s32 r)-{- SLJIT_ASSERT(r != SLJIT_UNUSED);- SLJIT_ASSERT(r < (sljit_s32)(sizeof(reg_map) / sizeof(reg_map[0])));- return reg_map[r];-}--/* Size of instruction in bytes. Tags must already be cleared. */-static SLJIT_INLINE sljit_uw sizeof_ins(sljit_ins ins)-{- /* keep faulting instructions */- if (ins == 0)- return 2;-- if ((ins & 0x00000000ffffL) == ins)- return 2;- if ((ins & 0x0000ffffffffL) == ins)- return 4;- if ((ins & 0xffffffffffffL) == ins)- return 6;-- SLJIT_UNREACHABLE();- return (sljit_uw)-1;-}--static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)-{- sljit_ins *ibuf = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins));- FAIL_IF(!ibuf);- *ibuf = ins;- compiler->size++;- return SLJIT_SUCCESS;-}--static sljit_s32 encode_inst(void **ptr, sljit_ins ins)-{- sljit_u16 *ibuf = (sljit_u16 *)*ptr;- sljit_uw size = sizeof_ins(ins);-- SLJIT_ASSERT((size & 6) == size);- switch (size) {- case 6:- *ibuf++ = (sljit_u16)(ins >> 32);- /* fallthrough */- case 4:- *ibuf++ = (sljit_u16)(ins >> 16);- /* fallthrough */- case 2:- *ibuf++ = (sljit_u16)(ins);- }- *ptr = (void*)ibuf;- return SLJIT_SUCCESS;-}--/* Map the given type to a 4-bit condition code mask. */-static SLJIT_INLINE sljit_u8 get_cc(sljit_s32 type) {- const sljit_u8 eq = 1 << 3; /* equal {,to zero} */- const sljit_u8 lt = 1 << 2; /* less than {,zero} */- const sljit_u8 gt = 1 << 1; /* greater than {,zero} */- const sljit_u8 ov = 1 << 0; /* {overflow,NaN} */-- switch (type) {- case SLJIT_EQUAL:- case SLJIT_EQUAL_F64:- return eq;-- case SLJIT_NOT_EQUAL:- case SLJIT_NOT_EQUAL_F64:- return ~eq;-- case SLJIT_LESS:- case SLJIT_SIG_LESS:- case SLJIT_LESS_F64:- return lt;-- case SLJIT_LESS_EQUAL:- case SLJIT_SIG_LESS_EQUAL:- case SLJIT_LESS_EQUAL_F64:- return (lt | eq);-- case SLJIT_GREATER:- case SLJIT_SIG_GREATER:- case SLJIT_GREATER_F64:- return gt;-- case SLJIT_GREATER_EQUAL:- case SLJIT_SIG_GREATER_EQUAL:- case SLJIT_GREATER_EQUAL_F64:- return (gt | eq);-- case SLJIT_OVERFLOW:- case SLJIT_MUL_OVERFLOW:- case SLJIT_UNORDERED_F64:- return ov;-- case SLJIT_NOT_OVERFLOW:- case SLJIT_MUL_NOT_OVERFLOW:- case SLJIT_ORDERED_F64:- return ~ov;- }-- SLJIT_UNREACHABLE();- return (sljit_u8)-1;-}--/* Facility to bit index mappings.- Note: some facilities share the same bit index. */-typedef sljit_uw facility_bit;-#define STORE_FACILITY_LIST_EXTENDED_FACILITY 7-#define FAST_LONG_DISPLACEMENT_FACILITY 19-#define EXTENDED_IMMEDIATE_FACILITY 21-#define GENERAL_INSTRUCTION_EXTENSION_FACILITY 34-#define DISTINCT_OPERAND_FACILITY 45-#define HIGH_WORD_FACILITY 45-#define POPULATION_COUNT_FACILITY 45-#define LOAD_STORE_ON_CONDITION_1_FACILITY 45-#define MISCELLANEOUS_INSTRUCTION_EXTENSIONS_1_FACILITY 49-#define LOAD_STORE_ON_CONDITION_2_FACILITY 53-#define MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY 58-#define VECTOR_FACILITY 129-#define VECTOR_ENHANCEMENTS_1_FACILITY 135--/* Report whether a facility is known to be present due to the compiler- settings. This function should always be compiled to a constant- value given a constant argument. */-static SLJIT_INLINE int have_facility_static(facility_bit x)-{-#if ENABLE_STATIC_FACILITY_DETECTION- switch (x) {- case FAST_LONG_DISPLACEMENT_FACILITY:- return (__ARCH__ >= 6 /* z990 */);- case EXTENDED_IMMEDIATE_FACILITY:- case STORE_FACILITY_LIST_EXTENDED_FACILITY:- return (__ARCH__ >= 7 /* z9-109 */);- case GENERAL_INSTRUCTION_EXTENSION_FACILITY:- return (__ARCH__ >= 8 /* z10 */);- case DISTINCT_OPERAND_FACILITY:- return (__ARCH__ >= 9 /* z196 */);- case MISCELLANEOUS_INSTRUCTION_EXTENSIONS_1_FACILITY:- return (__ARCH__ >= 10 /* zEC12 */);- case LOAD_STORE_ON_CONDITION_2_FACILITY:- case VECTOR_FACILITY:- return (__ARCH__ >= 11 /* z13 */);- case MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY:- case VECTOR_ENHANCEMENTS_1_FACILITY:- return (__ARCH__ >= 12 /* z14 */);- default:- SLJIT_UNREACHABLE();- }-#endif- return 0;-}--static SLJIT_INLINE unsigned long get_hwcap()-{- static unsigned long hwcap = 0;- if (SLJIT_UNLIKELY(!hwcap)) {- hwcap = getauxval(AT_HWCAP);- SLJIT_ASSERT(hwcap != 0);- }- return hwcap;-}--static SLJIT_INLINE int have_stfle()-{- if (have_facility_static(STORE_FACILITY_LIST_EXTENDED_FACILITY))- return 1;-- return (get_hwcap() & HWCAP_S390_STFLE);-}--/* Report whether the given facility is available. This function always- performs a runtime check. */-static int have_facility_dynamic(facility_bit x)-{-#if ENABLE_DYNAMIC_FACILITY_DETECTION- static struct {- sljit_uw bits[4];- } cpu_features;- size_t size = sizeof(cpu_features);- const sljit_uw word_index = x >> 6;- const sljit_uw bit_index = ((1UL << 63) >> (x & 63));-- SLJIT_ASSERT(x < size * 8);- if (SLJIT_UNLIKELY(!have_stfle()))- return 0;-- if (SLJIT_UNLIKELY(cpu_features.bits[0] == 0)) {- __asm__ __volatile__ (- "lgr %%r0, %0;"- "stfle 0(%1);"- /* outputs */:- /* inputs */: "d" ((size / 8) - 1), "a" (&cpu_features)- /* clobbers */: "r0", "cc", "memory"- );- SLJIT_ASSERT(cpu_features.bits[0] != 0);- }- return (cpu_features.bits[word_index] & bit_index) != 0;-#else- return 0;-#endif-}--#define HAVE_FACILITY(name, bit) \-static SLJIT_INLINE int name() \-{ \- static int have = -1; \- /* Static check first. May allow the function to be optimized away. */ \- if (have_facility_static(bit)) \- have = 1; \- else if (SLJIT_UNLIKELY(have < 0)) \- have = have_facility_dynamic(bit) ? 1 : 0; \-\- return have; \-}--HAVE_FACILITY(have_eimm, EXTENDED_IMMEDIATE_FACILITY)-HAVE_FACILITY(have_ldisp, FAST_LONG_DISPLACEMENT_FACILITY)-HAVE_FACILITY(have_genext, GENERAL_INSTRUCTION_EXTENSION_FACILITY)-HAVE_FACILITY(have_lscond1, LOAD_STORE_ON_CONDITION_1_FACILITY)-HAVE_FACILITY(have_lscond2, LOAD_STORE_ON_CONDITION_2_FACILITY)-HAVE_FACILITY(have_misc2, MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY)-#undef HAVE_FACILITY--#define is_u12(d) (0 <= (d) && (d) <= 0x00000fffL)-#define is_u32(d) (0 <= (d) && (d) <= 0xffffffffL)--#define CHECK_SIGNED(v, bitlen) \- ((v) == (((v) << (sizeof(v) * 8 - bitlen)) >> (sizeof(v) * 8 - bitlen)))--#define is_s16(d) CHECK_SIGNED((d), 16)-#define is_s20(d) CHECK_SIGNED((d), 20)-#define is_s32(d) CHECK_SIGNED((d), 32)--static SLJIT_INLINE sljit_uw disp_s20(sljit_s32 d)-{- sljit_uw dh = (d >> 12) & 0xff;- sljit_uw dl = (d << 8) & 0xfff00;-- SLJIT_ASSERT(is_s20(d));- return dh | dl;-}--/* TODO(carenas): variadic macro is not strictly needed */-#define SLJIT_S390X_INSTRUCTION(op, ...) \-static SLJIT_INLINE sljit_ins op(__VA_ARGS__)--/* RR form instructions. */-#define SLJIT_S390X_RR(name, pattern) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src) \-{ \- return (pattern) | ((dst & 0xf) << 4) | (src & 0xf); \-}--/* ADD */-SLJIT_S390X_RR(ar, 0x1a00)--/* ADD LOGICAL */-SLJIT_S390X_RR(alr, 0x1e00)--/* AND */-SLJIT_S390X_RR(nr, 0x1400)--/* BRANCH AND SAVE */-SLJIT_S390X_RR(basr, 0x0d00)--/* BRANCH ON CONDITION */-SLJIT_S390X_RR(bcr, 0x0700) /* TODO(mundaym): type for mask? */--/* COMPARE */-SLJIT_S390X_RR(cr, 0x1900)--/* COMPARE LOGICAL */-SLJIT_S390X_RR(clr, 0x1500)--/* DIVIDE */-SLJIT_S390X_RR(dr, 0x1d00)--/* EXCLUSIVE OR */-SLJIT_S390X_RR(xr, 0x1700)--/* LOAD */-SLJIT_S390X_RR(lr, 0x1800)--/* LOAD COMPLEMENT */-SLJIT_S390X_RR(lcr, 0x1300)--/* OR */-SLJIT_S390X_RR(or, 0x1600)--/* SUBTRACT */-SLJIT_S390X_RR(sr, 0x1b00)--/* SUBTRACT LOGICAL */-SLJIT_S390X_RR(slr, 0x1f00)--#undef SLJIT_S390X_RR--/* RRE form instructions */-#define SLJIT_S390X_RRE(name, pattern) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src) \-{ \- return (pattern) | ((dst & 0xf) << 4) | (src & 0xf); \-}--/* ADD */-SLJIT_S390X_RRE(agr, 0xb9080000)--/* ADD LOGICAL */-SLJIT_S390X_RRE(algr, 0xb90a0000)--/* ADD LOGICAL WITH CARRY */-SLJIT_S390X_RRE(alcr, 0xb9980000)-SLJIT_S390X_RRE(alcgr, 0xb9880000)--/* AND */-SLJIT_S390X_RRE(ngr, 0xb9800000)--/* COMPARE */-SLJIT_S390X_RRE(cgr, 0xb9200000)--/* COMPARE LOGICAL */-SLJIT_S390X_RRE(clgr, 0xb9210000)--/* DIVIDE LOGICAL */-SLJIT_S390X_RRE(dlr, 0xb9970000)-SLJIT_S390X_RRE(dlgr, 0xb9870000)--/* DIVIDE SINGLE */-SLJIT_S390X_RRE(dsgr, 0xb90d0000)--/* EXCLUSIVE OR */-SLJIT_S390X_RRE(xgr, 0xb9820000)--/* LOAD */-SLJIT_S390X_RRE(lgr, 0xb9040000)-SLJIT_S390X_RRE(lgfr, 0xb9140000)--/* LOAD BYTE */-SLJIT_S390X_RRE(lbr, 0xb9260000)-SLJIT_S390X_RRE(lgbr, 0xb9060000)--/* LOAD COMPLEMENT */-SLJIT_S390X_RRE(lcgr, 0xb9030000)--/* LOAD HALFWORD */-SLJIT_S390X_RRE(lhr, 0xb9270000)-SLJIT_S390X_RRE(lghr, 0xb9070000)--/* LOAD LOGICAL */-SLJIT_S390X_RRE(llgfr, 0xb9160000)--/* LOAD LOGICAL CHARACTER */-SLJIT_S390X_RRE(llcr, 0xb9940000)-SLJIT_S390X_RRE(llgcr, 0xb9840000)--/* LOAD LOGICAL HALFWORD */-SLJIT_S390X_RRE(llhr, 0xb9950000)-SLJIT_S390X_RRE(llghr, 0xb9850000)--/* MULTIPLY LOGICAL */-SLJIT_S390X_RRE(mlgr, 0xb9860000)--/* MULTIPLY SINGLE */-SLJIT_S390X_RRE(msr, 0xb2520000)-SLJIT_S390X_RRE(msgr, 0xb90c0000)-SLJIT_S390X_RRE(msgfr, 0xb91c0000)--/* OR */-SLJIT_S390X_RRE(ogr, 0xb9810000)--/* SUBTRACT */-SLJIT_S390X_RRE(sgr, 0xb9090000)--/* SUBTRACT LOGICAL */-SLJIT_S390X_RRE(slgr, 0xb90b0000)--/* SUBTRACT LOGICAL WITH BORROW */-SLJIT_S390X_RRE(slbr, 0xb9990000)-SLJIT_S390X_RRE(slbgr, 0xb9890000)--#undef SLJIT_S390X_RRE--/* RI-a form instructions */-#define SLJIT_S390X_RIA(name, pattern, imm_type) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, imm_type imm) \-{ \- return (pattern) | ((reg & 0xf) << 20) | (imm & 0xffff); \-}--/* ADD HALFWORD IMMEDIATE */-SLJIT_S390X_RIA(ahi, 0xa70a0000, sljit_s16)-SLJIT_S390X_RIA(aghi, 0xa70b0000, sljit_s16)--/* COMPARE HALFWORD IMMEDIATE */-SLJIT_S390X_RIA(chi, 0xa70e0000, sljit_s16)-SLJIT_S390X_RIA(cghi, 0xa70f0000, sljit_s16)--/* LOAD HALFWORD IMMEDIATE */-SLJIT_S390X_RIA(lhi, 0xa7080000, sljit_s16)-SLJIT_S390X_RIA(lghi, 0xa7090000, sljit_s16)--/* LOAD LOGICAL IMMEDIATE */-SLJIT_S390X_RIA(llihh, 0xa50c0000, sljit_u16)-SLJIT_S390X_RIA(llihl, 0xa50d0000, sljit_u16)-SLJIT_S390X_RIA(llilh, 0xa50e0000, sljit_u16)-SLJIT_S390X_RIA(llill, 0xa50f0000, sljit_u16)--/* MULTIPLY HALFWORD IMMEDIATE */-SLJIT_S390X_RIA(mhi, 0xa70c0000, sljit_s16)-SLJIT_S390X_RIA(mghi, 0xa70d0000, sljit_s16)--/* OR IMMEDIATE */-SLJIT_S390X_RIA(oilh, 0xa50a0000, sljit_u16)--/* TEST UNDER MASK */-SLJIT_S390X_RIA(tmlh, 0xa7000000, sljit_u16)--#undef SLJIT_S390X_RIA--/* RIL-a form instructions (requires extended immediate facility) */-#define SLJIT_S390X_RILA(name, pattern, imm_type) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, imm_type imm) \-{ \- SLJIT_ASSERT(have_eimm()); \- return (pattern) | ((sljit_ins)(reg & 0xf) << 36) | (imm & 0xffffffff); \-}--/* ADD IMMEDIATE */-SLJIT_S390X_RILA(afi, 0xc20900000000, sljit_s32)-SLJIT_S390X_RILA(agfi, 0xc20800000000, sljit_s32)--/* ADD IMMEDIATE HIGH */-SLJIT_S390X_RILA(aih, 0xcc0800000000, sljit_s32) /* TODO(mundaym): high-word facility? */--/* ADD LOGICAL IMMEDIATE */-SLJIT_S390X_RILA(alfi, 0xc20b00000000, sljit_u32)-SLJIT_S390X_RILA(algfi, 0xc20a00000000, sljit_u32)--/* AND IMMEDIATE */-SLJIT_S390X_RILA(nihf, 0xc00a00000000, sljit_u32)-SLJIT_S390X_RILA(nilf, 0xc00b00000000, sljit_u32)--/* COMPARE IMMEDIATE */-SLJIT_S390X_RILA(cfi, 0xc20d00000000, sljit_s32)-SLJIT_S390X_RILA(cgfi, 0xc20c00000000, sljit_s32)--/* COMPARE IMMEDIATE HIGH */-SLJIT_S390X_RILA(cih, 0xcc0d00000000, sljit_s32) /* TODO(mundaym): high-word facility? */--/* COMPARE LOGICAL IMMEDIATE */-SLJIT_S390X_RILA(clfi, 0xc20f00000000, sljit_u32)-SLJIT_S390X_RILA(clgfi, 0xc20e00000000, sljit_u32)--/* EXCLUSIVE OR IMMEDIATE */-SLJIT_S390X_RILA(xilf, 0xc00700000000, sljit_u32)--/* INSERT IMMEDIATE */-SLJIT_S390X_RILA(iihf, 0xc00800000000, sljit_u32)-SLJIT_S390X_RILA(iilf, 0xc00900000000, sljit_u32)--/* LOAD IMMEDIATE */-SLJIT_S390X_RILA(lgfi, 0xc00100000000, sljit_s32)--/* LOAD LOGICAL IMMEDIATE */-SLJIT_S390X_RILA(llihf, 0xc00e00000000, sljit_u32)-SLJIT_S390X_RILA(llilf, 0xc00f00000000, sljit_u32)--/* OR IMMEDIATE */-SLJIT_S390X_RILA(oilf, 0xc00d00000000, sljit_u32)--#undef SLJIT_S390X_RILA--/* RX-a form instructions */-#define SLJIT_S390X_RXA(name, pattern) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr r, sljit_u16 d, sljit_gpr x, sljit_gpr b) \-{ \- sljit_ins ri, xi, bi, di; \-\- SLJIT_ASSERT((d & 0xfff) == d); \- ri = (sljit_ins)(r & 0xf) << 20; \- xi = (sljit_ins)(x & 0xf) << 16; \- bi = (sljit_ins)(b & 0xf) << 12; \- di = (sljit_ins)(d & 0xfff); \-\- return (pattern) | ri | xi | bi | di; \-}--/* ADD */-SLJIT_S390X_RXA(a, 0x5a000000)--/* ADD LOGICAL */-SLJIT_S390X_RXA(al, 0x5e000000)--/* AND */-SLJIT_S390X_RXA(n, 0x54000000)--/* EXCLUSIVE OR */-SLJIT_S390X_RXA(x, 0x57000000)--/* LOAD */-SLJIT_S390X_RXA(l, 0x58000000)--/* LOAD ADDRESS */-SLJIT_S390X_RXA(la, 0x41000000)--/* LOAD HALFWORD */-SLJIT_S390X_RXA(lh, 0x48000000)--/* MULTIPLY SINGLE */-SLJIT_S390X_RXA(ms, 0x71000000)--/* OR */-SLJIT_S390X_RXA(o, 0x56000000)--/* STORE */-SLJIT_S390X_RXA(st, 0x50000000)--/* STORE CHARACTER */-SLJIT_S390X_RXA(stc, 0x42000000)--/* STORE HALFWORD */-SLJIT_S390X_RXA(sth, 0x40000000)--/* SUBTRACT */-SLJIT_S390X_RXA(s, 0x5b000000)--/* SUBTRACT LOGICAL */-SLJIT_S390X_RXA(sl, 0x5f000000)--#undef SLJIT_S390X_RXA--/* RXY-a instructions */-#define SLJIT_S390X_RXYA(name, pattern, cond) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b) \-{ \- sljit_ins ri, xi, bi, di; \-\- SLJIT_ASSERT(cond); \- ri = (sljit_ins)(r & 0xf) << 36; \- xi = (sljit_ins)(x & 0xf) << 32; \- bi = (sljit_ins)(b & 0xf) << 28; \- di = (sljit_ins)disp_s20(d) << 8; \-\- return (pattern) | ri | xi | bi | di; \-}--/* ADD */-SLJIT_S390X_RXYA(ay, 0xe3000000005a, have_ldisp())-SLJIT_S390X_RXYA(ag, 0xe30000000008, 1)--/* ADD LOGICAL */-SLJIT_S390X_RXYA(aly, 0xe3000000005e, have_ldisp())-SLJIT_S390X_RXYA(alg, 0xe3000000000a, 1)--/* ADD LOGICAL WITH CARRY */-SLJIT_S390X_RXYA(alc, 0xe30000000098, 1)-SLJIT_S390X_RXYA(alcg, 0xe30000000088, 1)--/* AND */-SLJIT_S390X_RXYA(ny, 0xe30000000054, have_ldisp())-SLJIT_S390X_RXYA(ng, 0xe30000000080, 1)--/* EXCLUSIVE OR */-SLJIT_S390X_RXYA(xy, 0xe30000000057, have_ldisp())-SLJIT_S390X_RXYA(xg, 0xe30000000082, 1)--/* LOAD */-SLJIT_S390X_RXYA(ly, 0xe30000000058, have_ldisp())-SLJIT_S390X_RXYA(lg, 0xe30000000004, 1)-SLJIT_S390X_RXYA(lgf, 0xe30000000014, 1)--/* LOAD BYTE */-SLJIT_S390X_RXYA(lb, 0xe30000000076, have_ldisp())-SLJIT_S390X_RXYA(lgb, 0xe30000000077, have_ldisp())--/* LOAD HALFWORD */-SLJIT_S390X_RXYA(lhy, 0xe30000000078, have_ldisp())-SLJIT_S390X_RXYA(lgh, 0xe30000000015, 1)--/* LOAD LOGICAL */-SLJIT_S390X_RXYA(llgf, 0xe30000000016, 1)--/* LOAD LOGICAL CHARACTER */-SLJIT_S390X_RXYA(llc, 0xe30000000094, have_eimm())-SLJIT_S390X_RXYA(llgc, 0xe30000000090, 1)--/* LOAD LOGICAL HALFWORD */-SLJIT_S390X_RXYA(llh, 0xe30000000095, have_eimm())-SLJIT_S390X_RXYA(llgh, 0xe30000000091, 1)--/* MULTIPLY SINGLE */-SLJIT_S390X_RXYA(msy, 0xe30000000051, have_ldisp())-SLJIT_S390X_RXYA(msg, 0xe3000000000c, 1)--/* OR */-SLJIT_S390X_RXYA(oy, 0xe30000000056, have_ldisp())-SLJIT_S390X_RXYA(og, 0xe30000000081, 1)--/* STORE */-SLJIT_S390X_RXYA(sty, 0xe30000000050, have_ldisp())-SLJIT_S390X_RXYA(stg, 0xe30000000024, 1)--/* STORE CHARACTER */-SLJIT_S390X_RXYA(stcy, 0xe30000000072, have_ldisp())--/* STORE HALFWORD */-SLJIT_S390X_RXYA(sthy, 0xe30000000070, have_ldisp())--/* SUBTRACT */-SLJIT_S390X_RXYA(sy, 0xe3000000005b, have_ldisp())-SLJIT_S390X_RXYA(sg, 0xe30000000009, 1)--/* SUBTRACT LOGICAL */-SLJIT_S390X_RXYA(sly, 0xe3000000005f, have_ldisp())-SLJIT_S390X_RXYA(slg, 0xe3000000000b, 1)--/* SUBTRACT LOGICAL WITH BORROW */-SLJIT_S390X_RXYA(slb, 0xe30000000099, 1)-SLJIT_S390X_RXYA(slbg, 0xe30000000089, 1)--#undef SLJIT_S390X_RXYA--/* RS-a instructions */-#define SLJIT_S390X_RSA(name, pattern) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, sljit_sw d, sljit_gpr b) \-{ \- sljit_ins r1 = (sljit_ins)(reg & 0xf) << 20; \- sljit_ins b2 = (sljit_ins)(b & 0xf) << 12; \- sljit_ins d2 = (sljit_ins)(d & 0xfff); \- return (pattern) | r1 | b2 | d2; \-}--/* SHIFT LEFT SINGLE LOGICAL */-SLJIT_S390X_RSA(sll, 0x89000000)--/* SHIFT RIGHT SINGLE */-SLJIT_S390X_RSA(sra, 0x8a000000)--/* SHIFT RIGHT SINGLE LOGICAL */-SLJIT_S390X_RSA(srl, 0x88000000)--#undef SLJIT_S390X_RSA--/* RSY-a instructions */-#define SLJIT_S390X_RSYA(name, pattern, cond) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_sw d, sljit_gpr b) \-{ \- sljit_ins r1, r3, b2, d2; \-\- SLJIT_ASSERT(cond); \- r1 = (sljit_ins)(dst & 0xf) << 36; \- r3 = (sljit_ins)(src & 0xf) << 32; \- b2 = (sljit_ins)(b & 0xf) << 28; \- d2 = (sljit_ins)disp_s20(d) << 8; \-\- return (pattern) | r1 | r3 | b2 | d2; \-}--/* LOAD MULTIPLE */-SLJIT_S390X_RSYA(lmg, 0xeb0000000004, 1)--/* SHIFT LEFT LOGICAL */-SLJIT_S390X_RSYA(sllg, 0xeb000000000d, 1)--/* SHIFT RIGHT SINGLE */-SLJIT_S390X_RSYA(srag, 0xeb000000000a, 1)--/* SHIFT RIGHT SINGLE LOGICAL */-SLJIT_S390X_RSYA(srlg, 0xeb000000000c, 1)--/* STORE MULTIPLE */-SLJIT_S390X_RSYA(stmg, 0xeb0000000024, 1)--#undef SLJIT_S390X_RSYA--/* RIE-f instructions (require general-instructions-extension facility) */-#define SLJIT_S390X_RIEF(name, pattern) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_u8 start, sljit_u8 end, sljit_u8 rot) \-{ \- sljit_ins r1, r2, i3, i4, i5; \-\- SLJIT_ASSERT(have_genext()); \- r1 = (sljit_ins)(dst & 0xf) << 36; \- r2 = (sljit_ins)(src & 0xf) << 32; \- i3 = (sljit_ins)start << 24; \- i4 = (sljit_ins)end << 16; \- i5 = (sljit_ins)rot << 8; \-\- return (pattern) | r1 | r2 | i3 | i4 | i5; \-}--/* ROTATE THEN AND SELECTED BITS */-/* SLJIT_S390X_RIEF(rnsbg, 0xec0000000054) */--/* ROTATE THEN EXCLUSIVE OR SELECTED BITS */-/* SLJIT_S390X_RIEF(rxsbg, 0xec0000000057) */--/* ROTATE THEN OR SELECTED BITS */-SLJIT_S390X_RIEF(rosbg, 0xec0000000056)--/* ROTATE THEN INSERT SELECTED BITS */-/* SLJIT_S390X_RIEF(risbg, 0xec0000000055) */-/* SLJIT_S390X_RIEF(risbgn, 0xec0000000059) */--/* ROTATE THEN INSERT SELECTED BITS HIGH */-SLJIT_S390X_RIEF(risbhg, 0xec000000005d)--/* ROTATE THEN INSERT SELECTED BITS LOW */-/* SLJIT_S390X_RIEF(risblg, 0xec0000000051) */--#undef SLJIT_S390X_RIEF--/* RRF-a instructions */-#define SLJIT_S390X_RRFA(name, pattern, cond) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src1, sljit_gpr src2) \-{ \- sljit_ins r1, r2, r3; \-\- SLJIT_ASSERT(cond); \- r1 = (sljit_ins)(dst & 0xf) << 4; \- r2 = (sljit_ins)(src1 & 0xf); \- r3 = (sljit_ins)(src2 & 0xf) << 12; \-\- return (pattern) | r3 | r1 | r2; \-}--/* MULTIPLY */-SLJIT_S390X_RRFA(msrkc, 0xb9fd0000, have_misc2())-SLJIT_S390X_RRFA(msgrkc, 0xb9ed0000, have_misc2())--#undef SLJIT_S390X_RRFA--/* RRF-c instructions (require load/store-on-condition 1 facility) */-#define SLJIT_S390X_RRFC(name, pattern) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_uw mask) \-{ \- sljit_ins r1, r2, m3; \-\- SLJIT_ASSERT(have_lscond1()); \- r1 = (sljit_ins)(dst & 0xf) << 4; \- r2 = (sljit_ins)(src & 0xf); \- m3 = (sljit_ins)(mask & 0xf) << 12; \-\- return (pattern) | m3 | r1 | r2; \-}--/* LOAD HALFWORD IMMEDIATE ON CONDITION */-SLJIT_S390X_RRFC(locr, 0xb9f20000)-SLJIT_S390X_RRFC(locgr, 0xb9e20000)--#undef SLJIT_S390X_RRFC--/* RIE-g instructions (require load/store-on-condition 2 facility) */-#define SLJIT_S390X_RIEG(name, pattern) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, sljit_sw imm, sljit_uw mask) \-{ \- sljit_ins r1, m3, i2; \-\- SLJIT_ASSERT(have_lscond2()); \- r1 = (sljit_ins)(reg & 0xf) << 36; \- m3 = (sljit_ins)(mask & 0xf) << 32; \- i2 = (sljit_ins)(imm & 0xffffL) << 16; \-\- return (pattern) | r1 | m3 | i2; \-}--/* LOAD HALFWORD IMMEDIATE ON CONDITION */-SLJIT_S390X_RIEG(lochi, 0xec0000000042)-SLJIT_S390X_RIEG(locghi, 0xec0000000046)--#undef SLJIT_S390X_RIEG--#define SLJIT_S390X_RILB(name, pattern, cond) \-SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, sljit_sw ri) \-{ \- sljit_ins r1, ri2; \-\- SLJIT_ASSERT(cond); \- r1 = (sljit_ins)(reg & 0xf) << 36; \- ri2 = (sljit_ins)(ri & 0xffffffff); \-\- return (pattern) | r1 | ri2; \-}--/* BRANCH RELATIVE AND SAVE LONG */-SLJIT_S390X_RILB(brasl, 0xc00500000000, 1)--/* LOAD ADDRESS RELATIVE LONG */-SLJIT_S390X_RILB(larl, 0xc00000000000, 1)--/* LOAD RELATIVE LONG */-SLJIT_S390X_RILB(lgrl, 0xc40800000000, have_genext())--#undef SLJIT_S390X_RILB--SLJIT_S390X_INSTRUCTION(br, sljit_gpr target)-{- return 0x07f0 | target;-}--SLJIT_S390X_INSTRUCTION(brcl, sljit_uw mask, sljit_sw target)-{- sljit_ins m1 = (sljit_ins)(mask & 0xf) << 36;- sljit_ins ri2 = (sljit_ins)target & 0xffffffff;- return 0xc00400000000L | m1 | ri2;-}--SLJIT_S390X_INSTRUCTION(flogr, sljit_gpr dst, sljit_gpr src)-{- sljit_ins r1 = ((sljit_ins)dst & 0xf) << 8;- sljit_ins r2 = ((sljit_ins)src & 0xf);- SLJIT_ASSERT(have_eimm());- return 0xb9830000 | r1 | r2;-}--/* INSERT PROGRAM MASK */-SLJIT_S390X_INSTRUCTION(ipm, sljit_gpr dst)-{- return 0xb2220000 | ((sljit_ins)(dst & 0xf) << 4);-}--/* ROTATE THEN INSERT SELECTED BITS HIGH (ZERO) */-SLJIT_S390X_INSTRUCTION(risbhgz, sljit_gpr dst, sljit_gpr src, sljit_u8 start, sljit_u8 end, sljit_u8 rot)-{- return risbhg(dst, src, start, 0x8 | end, rot);-}--#undef SLJIT_S390X_INSTRUCTION--/* load condition code as needed to match type */-static sljit_s32 push_load_cc(struct sljit_compiler *compiler, sljit_s32 type)-{- type &= ~SLJIT_I32_OP;- switch (type) {- case SLJIT_ZERO:- case SLJIT_NOT_ZERO:- return push_inst(compiler, cih(flag_r, 0));- break;- default:- return push_inst(compiler, tmlh(flag_r, 0x3000));- break;- }- return SLJIT_SUCCESS;-}--static sljit_s32 push_store_zero_flag(struct sljit_compiler *compiler, sljit_s32 op, sljit_gpr source)-{- /* insert low 32-bits into high 32-bits of flag register */- FAIL_IF(push_inst(compiler, risbhgz(flag_r, source, 0, 31, 32)));- if (!(op & SLJIT_I32_OP)) {- /* OR high 32-bits with high 32-bits of flag register */- return push_inst(compiler, rosbg(flag_r, source, 0, 31, 0));- }- return SLJIT_SUCCESS;-}--/* load 64-bit immediate into register without clobbering flags */-static sljit_s32 push_load_imm_inst(struct sljit_compiler *compiler, sljit_gpr target, sljit_sw v)-{- /* 4 byte instructions */- if (is_s16(v))- return push_inst(compiler, lghi(target, (sljit_s16)v));-- if ((sljit_uw)v == (v & 0x000000000000ffffU))- return push_inst(compiler, llill(target, (sljit_u16)v));-- if ((sljit_uw)v == (v & 0x00000000ffff0000U))- return push_inst(compiler, llilh(target, (sljit_u16)(v >> 16)));-- if ((sljit_uw)v == (v & 0x0000ffff00000000U))- return push_inst(compiler, llihl(target, (sljit_u16)(v >> 32)));-- if ((sljit_uw)v == (v & 0xffff000000000000U))- return push_inst(compiler, llihh(target, (sljit_u16)(v >> 48)));-- /* 6 byte instructions (requires extended immediate facility) */- if (have_eimm()) {- if (is_s32(v))- return push_inst(compiler, lgfi(target, (sljit_s32)v));-- if ((sljit_uw)v == (v & 0x00000000ffffffffU))- return push_inst(compiler, llilf(target, (sljit_u32)v));-- if ((sljit_uw)v == (v & 0xffffffff00000000U))- return push_inst(compiler, llihf(target, (sljit_u32)(v >> 32)));-- FAIL_IF(push_inst(compiler, llilf(target, (sljit_u32)v)));- return push_inst(compiler, iihf(target, (sljit_u32)(v >> 32)));- }- /* TODO(mundaym): instruction sequences that don't use extended immediates */- abort();-}--struct addr {- sljit_gpr base;- sljit_gpr index;- sljit_sw offset;-};--/* transform memory operand into D(X,B) form with a signed 20-bit offset */-static sljit_s32 make_addr_bxy(struct sljit_compiler *compiler,- struct addr *addr, sljit_s32 mem, sljit_sw off,- sljit_gpr tmp /* clobbered, must not be r0 */)-{- sljit_gpr base = r0;- sljit_gpr index = r0;-- SLJIT_ASSERT(tmp != r0);- if (mem & REG_MASK)- base = gpr(mem & REG_MASK);-- if (mem & OFFS_REG_MASK) {- index = gpr(OFFS_REG(mem));- if (off != 0) {- /* shift and put the result into tmp */- SLJIT_ASSERT(0 <= off && off < 64);- FAIL_IF(push_inst(compiler, sllg(tmp, index, off, 0)));- index = tmp;- off = 0; /* clear offset */- }- }- else if (!is_s20(off)) {- FAIL_IF(push_load_imm_inst(compiler, tmp, off));- index = tmp;- off = 0; /* clear offset */- }- addr->base = base;- addr->index = index;- addr->offset = off;- return SLJIT_SUCCESS;-}--/* transform memory operand into D(X,B) form with an unsigned 12-bit offset */-static sljit_s32 make_addr_bx(struct sljit_compiler *compiler,- struct addr *addr, sljit_s32 mem, sljit_sw off,- sljit_gpr tmp /* clobbered, must not be r0 */)-{- sljit_gpr base = r0;- sljit_gpr index = r0;-- SLJIT_ASSERT(tmp != r0);- if (mem & REG_MASK)- base = gpr(mem & REG_MASK);-- if (mem & OFFS_REG_MASK) {- index = gpr(OFFS_REG(mem));- if (off != 0) {- /* shift and put the result into tmp */- SLJIT_ASSERT(0 <= off && off < 64);- FAIL_IF(push_inst(compiler, sllg(tmp, index, off, 0)));- index = tmp;- off = 0; /* clear offset */- }- }- else if (!is_u12(off)) {- FAIL_IF(push_load_imm_inst(compiler, tmp, off));- index = tmp;- off = 0; /* clear offset */- }- addr->base = base;- addr->index = index;- addr->offset = off;- return SLJIT_SUCCESS;-}--#define EVAL(op, r, addr) op(r, addr.offset, addr.index, addr.base)-#define WHEN(cond, r, i1, i2, addr) \- (cond) ? EVAL(i1, r, addr) : EVAL(i2, r, addr)--static sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst,- sljit_s32 src, sljit_sw srcw,- sljit_gpr tmp /* clobbered */, sljit_s32 is_32bit)-{- struct addr addr;- sljit_ins ins;-- SLJIT_ASSERT(src & SLJIT_MEM);- if (have_ldisp() || !is_32bit)- FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp));- else- FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp));-- if (is_32bit)- ins = WHEN(is_u12(addr.offset), dst, l, ly, addr);- else- ins = lg(dst, addr.offset, addr.index, addr.base);-- return push_inst(compiler, ins);-}--static sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src,- sljit_s32 dst, sljit_sw dstw,- sljit_gpr tmp /* clobbered */, sljit_s32 is_32bit)-{- struct addr addr;- sljit_ins ins;-- SLJIT_ASSERT(dst & SLJIT_MEM);- if (have_ldisp() || !is_32bit)- FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp));- else- FAIL_IF(make_addr_bx(compiler, &addr, dst, dstw, tmp));-- if (is_32bit)- ins = WHEN(is_u12(addr.offset), src, st, sty, addr);- else- ins = stg(src, addr.offset, addr.index, addr.base);-- return push_inst(compiler, ins);-}--#undef WHEN--SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)-{- struct sljit_label *label;- struct sljit_jump *jump;- struct sljit_s390x_const *const_;- struct sljit_put_label *put_label;- sljit_sw executable_offset;- sljit_uw ins_size = 0; /* instructions */- sljit_uw pool_size = 0; /* literal pool */- sljit_uw pad_size;- sljit_uw i, j = 0;- struct sljit_memory_fragment *buf;- void *code, *code_ptr;- sljit_uw *pool, *pool_ptr;-- sljit_uw source;- sljit_sw offset; /* TODO(carenas): only need 32 bit */-- CHECK_ERROR_PTR();- CHECK_PTR(check_sljit_generate_code(compiler));- reverse_buf(compiler);-- /* branch handling */- label = compiler->labels;- jump = compiler->jumps;- put_label = compiler->put_labels;-- /* TODO(carenas): compiler->executable_size could be calculated- * before to avoid the following loop (except for- * pool_size)- */- /* calculate the size of the code */- for (buf = compiler->buf; buf != NULL; buf = buf->next) {- sljit_uw len = buf->used_size / sizeof(sljit_ins);- sljit_ins *ibuf = (sljit_ins *)buf->memory;- for (i = 0; i < len; ++i, ++j) {- sljit_ins ins = ibuf[i];-- /* TODO(carenas): instruction tag vs size/addr == j- * using instruction tags for const is creative- * but unlike all other architectures, and is not- * done consistently for all other objects.- * This might need reviewing later.- */- if (ins & sljit_ins_const) {- pool_size += sizeof(*pool);- ins &= ~sljit_ins_const;- }- if (label && label->size == j) {- label->size = ins_size;- label = label->next;- }- if (jump && jump->addr == j) {- if ((jump->flags & SLJIT_REWRITABLE_JUMP) || (jump->flags & JUMP_ADDR)) {- /* encoded: */- /* brasl %r14, <rel_addr> (or brcl <mask>, <rel_addr>) */- /* replace with: */- /* lgrl %r1, <pool_addr> */- /* bras %r14, %r1 (or bcr <mask>, %r1) */- pool_size += sizeof(*pool);- ins_size += 2;- }- jump = jump->next;- }- if (put_label && put_label->addr == j) {- pool_size += sizeof(*pool);- put_label = put_label->next;- }- ins_size += sizeof_ins(ins);- }- }-- /* emit trailing label */- if (label && label->size == j) {- label->size = ins_size;- label = label->next;- }-- SLJIT_ASSERT(!label);- SLJIT_ASSERT(!jump);- SLJIT_ASSERT(!put_label);-- /* pad code size to 8 bytes so is accessible with half word offsets */- /* the literal pool needs to be doubleword aligned */- pad_size = ((ins_size + 7UL) & ~7UL) - ins_size;- SLJIT_ASSERT(pad_size < 8UL);-- /* allocate target buffer */- code = SLJIT_MALLOC_EXEC(ins_size + pad_size + pool_size,- compiler->exec_allocator_data);- PTR_FAIL_WITH_EXEC_IF(code);- code_ptr = code;- executable_offset = SLJIT_EXEC_OFFSET(code);-- /* TODO(carenas): pool is optional, and the ABI recommends it to- * be created before the function code, instead of- * globally; if generated code is too big could- * need offsets bigger than 32bit words and asser()- */- pool = (sljit_uw *)((sljit_uw)code + ins_size + pad_size);- pool_ptr = pool;- const_ = (struct sljit_s390x_const *)compiler->consts;-- /* update label addresses */- label = compiler->labels;- while (label) {- label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(- (sljit_uw)code_ptr + label->size, executable_offset);- label = label->next;- }-- /* reset jumps */- jump = compiler->jumps;- put_label = compiler->put_labels;-- /* emit the code */- j = 0;- for (buf = compiler->buf; buf != NULL; buf = buf->next) {- sljit_uw len = buf->used_size / sizeof(sljit_ins);- sljit_ins *ibuf = (sljit_ins *)buf->memory;- for (i = 0; i < len; ++i, ++j) {- sljit_ins ins = ibuf[i];- if (ins & sljit_ins_const) {- /* clear the const tag */- ins &= ~sljit_ins_const;-- /* update instruction with relative address of constant */- source = (sljit_uw)code_ptr;- offset = (sljit_uw)pool_ptr - source;- SLJIT_ASSERT(!(offset & 1));- offset >>= 1; /* halfword (not byte) offset */- SLJIT_ASSERT(is_s32(offset));- ins |= (sljit_ins)offset & 0xffffffff;-- /* update address */- const_->const_.addr = (sljit_uw)pool_ptr;-- /* store initial value into pool and update pool address */- *(pool_ptr++) = const_->init_value;-- /* move to next constant */- const_ = (struct sljit_s390x_const *)const_->const_.next;- }- if (jump && jump->addr == j) {- sljit_sw target = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;- if ((jump->flags & SLJIT_REWRITABLE_JUMP) || (jump->flags & JUMP_ADDR)) {- jump->addr = (sljit_uw)pool_ptr;-- /* load address into tmp1 */- source = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);- offset = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(pool_ptr, executable_offset) - source;- SLJIT_ASSERT(!(offset & 1));- offset >>= 1;- SLJIT_ASSERT(is_s32(offset));- encode_inst(&code_ptr,- lgrl(tmp1, offset & 0xffffffff));-- /* store jump target into pool and update pool address */- *(pool_ptr++) = target;-- /* branch to tmp1 */- sljit_ins op = (ins >> 32) & 0xf;- sljit_ins arg = (ins >> 36) & 0xf;- switch (op) {- case 4: /* brcl -> bcr */- ins = bcr(arg, tmp1);- break;- case 5: /* brasl -> basr */- ins = basr(arg, tmp1);- break;- default:- abort();- }- }- else {- jump->addr = (sljit_uw)code_ptr + 2;- source = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);- offset = target - source;-- /* offset must be halfword aligned */- SLJIT_ASSERT(!(offset & 1));- offset >>= 1;- SLJIT_ASSERT(is_s32(offset)); /* TODO(mundaym): handle arbitrary offsets */-- /* patch jump target */- ins |= (sljit_ins)offset & 0xffffffff;- }- jump = jump->next;- }- if (put_label && put_label->addr == j) {- source = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);-- SLJIT_ASSERT(put_label->label);- put_label->addr = (sljit_uw)code_ptr;-- /* store target into pool */- *pool_ptr = put_label->label->addr;- offset = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(pool_ptr, executable_offset) - source;- pool_ptr++;-- SLJIT_ASSERT(!(offset & 1));- offset >>= 1;- SLJIT_ASSERT(is_s32(offset));- ins |= (sljit_ins)offset & 0xffffffff;-- put_label = put_label->next;- }- encode_inst(&code_ptr, ins);- }- }- SLJIT_ASSERT((sljit_u8 *)code + ins_size == code_ptr);- SLJIT_ASSERT((sljit_u8 *)pool + pool_size == (sljit_u8 *)pool_ptr);-- compiler->error = SLJIT_ERR_COMPILED;- compiler->executable_offset = executable_offset;- compiler->executable_size = ins_size;- code = SLJIT_ADD_EXEC_OFFSET(code, executable_offset);- code_ptr = SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);- SLJIT_CACHE_FLUSH(code, code_ptr);- SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1);- return code;-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)-{- /* TODO(mundaym): implement all */- switch (feature_type) {- case SLJIT_HAS_CLZ:- return have_eimm() ? 1 : 0; /* FLOGR instruction */- case SLJIT_HAS_CMOV:- return have_lscond1() ? 1 : 0;- case SLJIT_HAS_FPU:- return 0;- }- return 0;-}--/* --------------------------------------------------------------------- */-/* Entry, exit */-/* --------------------------------------------------------------------- */--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,- sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,- sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)-{- sljit_s32 args = get_arg_count(arg_types);- sljit_sw frame_size;-- CHECK_ERROR();- CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));- set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);-- /* saved registers go in callee allocated save area */- compiler->local_size = (local_size + 0xf) & ~0xf;- frame_size = compiler->local_size + SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE;-- FAIL_IF(push_inst(compiler, stmg(r6, r15, r6 * sizeof(sljit_sw), r15))); /* save registers TODO(MGM): optimize */- if (frame_size != 0) {- if (is_s16(-frame_size))- FAIL_IF(push_inst(compiler, aghi(r15, -((sljit_s16)frame_size))));- else if (is_s32(-frame_size))- FAIL_IF(push_inst(compiler, agfi(r15, -((sljit_s32)frame_size))));- else {- FAIL_IF(push_load_imm_inst(compiler, tmp1, -frame_size));- FAIL_IF(push_inst(compiler, la(r15, 0, tmp1, r15)));- }- }-- if (args >= 1)- FAIL_IF(push_inst(compiler, lgr(gpr(SLJIT_S0), gpr(SLJIT_R0))));- if (args >= 2)- FAIL_IF(push_inst(compiler, lgr(gpr(SLJIT_S1), gpr(SLJIT_R1))));- if (args >= 3)- FAIL_IF(push_inst(compiler, lgr(gpr(SLJIT_S2), gpr(SLJIT_R2))));- SLJIT_ASSERT(args < 4);-- return SLJIT_SUCCESS;-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,- sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,- sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)-{- CHECK_ERROR();- CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));- set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);-- /* TODO(mundaym): stack space for saved floating point registers */- compiler->local_size = (local_size + 0xf) & ~0xf;- return SLJIT_SUCCESS;-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)-{- sljit_sw size;- sljit_gpr end;-- CHECK_ERROR();- CHECK(check_sljit_emit_return(compiler, op, src, srcw));-- FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));-- size = compiler->local_size + SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE + (r6 * sizeof(sljit_sw));- if (!is_s20(size)) {- FAIL_IF(push_load_imm_inst(compiler, tmp1, compiler->local_size + SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE));- FAIL_IF(push_inst(compiler, la(r15, 0, tmp1, r15)));- size = r6 * sizeof(sljit_sw);- end = r14; /* r15 has been restored already */- }- else- end = r15;-- FAIL_IF(push_inst(compiler, lmg(r6, end, size, r15))); /* restore registers TODO(MGM): optimize */- FAIL_IF(push_inst(compiler, br(r14))); /* return */-- return SLJIT_SUCCESS;-}--/* --------------------------------------------------------------------- */-/* Operators */-/* --------------------------------------------------------------------- */--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)-{- sljit_gpr arg0 = gpr(SLJIT_R0);- sljit_gpr arg1 = gpr(SLJIT_R1);-- CHECK_ERROR();- CHECK(check_sljit_emit_op0(compiler, op));-- op = GET_OPCODE(op) | (op & SLJIT_I32_OP);- switch (op) {- case SLJIT_BREAKPOINT:- /* The following invalid instruction is emitted by gdb. */- return push_inst(compiler, 0x0001 /* 2-byte trap */);- case SLJIT_NOP:- return push_inst(compiler, 0x0700 /* 2-byte nop */);- case SLJIT_LMUL_UW:- FAIL_IF(push_inst(compiler, mlgr(arg0, arg0)));- break;- case SLJIT_LMUL_SW:- /* signed multiplication from: */- /* Hacker's Delight, Second Edition: Chapter 8-3. */- FAIL_IF(push_inst(compiler, srag(tmp0, arg0, 63, 0)));- FAIL_IF(push_inst(compiler, srag(tmp1, arg1, 63, 0)));- FAIL_IF(push_inst(compiler, ngr(tmp0, arg1)));- FAIL_IF(push_inst(compiler, ngr(tmp1, arg0)));-- /* unsigned multiplication */- FAIL_IF(push_inst(compiler, mlgr(arg0, arg0)));-- FAIL_IF(push_inst(compiler, sgr(arg0, tmp0)));- FAIL_IF(push_inst(compiler, sgr(arg0, tmp1)));- break;- case SLJIT_DIV_U32:- case SLJIT_DIVMOD_U32:- FAIL_IF(push_inst(compiler, lhi(tmp0, 0)));- FAIL_IF(push_inst(compiler, lr(tmp1, arg0)));- FAIL_IF(push_inst(compiler, dlr(tmp0, arg1)));- FAIL_IF(push_inst(compiler, lr(arg0, tmp1))); /* quotient */- if (op == SLJIT_DIVMOD_U32)- return push_inst(compiler, lr(arg1, tmp0)); /* remainder */-- return SLJIT_SUCCESS;- case SLJIT_DIV_S32:- case SLJIT_DIVMOD_S32:- FAIL_IF(push_inst(compiler, lhi(tmp0, 0)));- FAIL_IF(push_inst(compiler, lr(tmp1, arg0)));- FAIL_IF(push_inst(compiler, dr(tmp0, arg1)));- FAIL_IF(push_inst(compiler, lr(arg0, tmp1))); /* quotient */- if (op == SLJIT_DIVMOD_S32)- return push_inst(compiler, lr(arg1, tmp0)); /* remainder */-- return SLJIT_SUCCESS;- case SLJIT_DIV_UW:- case SLJIT_DIVMOD_UW:- FAIL_IF(push_inst(compiler, lghi(tmp0, 0)));- FAIL_IF(push_inst(compiler, lgr(tmp1, arg0)));- FAIL_IF(push_inst(compiler, dlgr(tmp0, arg1)));- FAIL_IF(push_inst(compiler, lgr(arg0, tmp1))); /* quotient */- if (op == SLJIT_DIVMOD_UW)- return push_inst(compiler, lgr(arg1, tmp0)); /* remainder */-- return SLJIT_SUCCESS;- case SLJIT_DIV_SW:- case SLJIT_DIVMOD_SW:- FAIL_IF(push_inst(compiler, lgr(tmp1, arg0)));- FAIL_IF(push_inst(compiler, dsgr(tmp0, arg1)));- FAIL_IF(push_inst(compiler, lgr(arg0, tmp1))); /* quotient */- if (op == SLJIT_DIVMOD_SW)- return push_inst(compiler, lgr(arg1, tmp0)); /* remainder */-- return SLJIT_SUCCESS;- case SLJIT_ENDBR:- return SLJIT_SUCCESS;- case SLJIT_SKIP_FRAMES_BEFORE_RETURN:- return SLJIT_SUCCESS;- default:- SLJIT_UNREACHABLE();- }- /* swap result registers */- FAIL_IF(push_inst(compiler, lgr(tmp0, arg0)));- FAIL_IF(push_inst(compiler, lgr(arg0, arg1)));- return push_inst(compiler, lgr(arg1, tmp0));-}--/* LEVAL will be defined later with different parameters as needed */-#define WHEN2(cond, i1, i2) (cond) ? LEVAL(i1) : LEVAL(i2)--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,- sljit_s32 dst, sljit_sw dstw,- sljit_s32 src, sljit_sw srcw)-{- sljit_ins ins;- struct addr mem;- sljit_gpr dst_r;- sljit_gpr src_r;- sljit_s32 opcode = GET_OPCODE(op);-- CHECK_ERROR();- CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));- ADJUST_LOCAL_OFFSET(dst, dstw);- ADJUST_LOCAL_OFFSET(src, srcw);-- if ((dst == SLJIT_UNUSED) && !HAS_FLAGS(op)) {- /* TODO(carenas): implement prefetch? */- return SLJIT_SUCCESS;- }- if (opcode >= SLJIT_MOV && opcode <= SLJIT_MOV_P) {- /* LOAD REGISTER */- if (FAST_IS_REG(dst) && FAST_IS_REG(src)) {- dst_r = gpr(dst);- src_r = gpr(src);- switch (opcode | (op & SLJIT_I32_OP)) {- /* 32-bit */- case SLJIT_MOV32_U8:- ins = llcr(dst_r, src_r);- break;- case SLJIT_MOV32_S8:- ins = lbr(dst_r, src_r);- break;- case SLJIT_MOV32_U16:- ins = llhr(dst_r, src_r);- break;- case SLJIT_MOV32_S16:- ins = lhr(dst_r, src_r);- break;- case SLJIT_MOV32:- ins = lr(dst_r, src_r);- break;- /* 64-bit */- case SLJIT_MOV_U8:- ins = llgcr(dst_r, src_r);- break;- case SLJIT_MOV_S8:- ins = lgbr(dst_r, src_r);- break;- case SLJIT_MOV_U16:- ins = llghr(dst_r, src_r);- break;- case SLJIT_MOV_S16:- ins = lghr(dst_r, src_r);- break;- case SLJIT_MOV_U32:- ins = llgfr(dst_r, src_r);- break;- case SLJIT_MOV_S32:- ins = lgfr(dst_r, src_r);- break;- case SLJIT_MOV:- case SLJIT_MOV_P:- ins = lgr(dst_r, src_r);- break;- default:- ins = 0;- SLJIT_UNREACHABLE();- }- FAIL_IF(push_inst(compiler, ins));- if (HAS_FLAGS(op)) {- /* only handle zero flag */- SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK));- return push_store_zero_flag(compiler, op, dst_r);- }- return SLJIT_SUCCESS;- }- /* LOAD IMMEDIATE */- if (FAST_IS_REG(dst) && (src & SLJIT_IMM)) {- switch (opcode) {- case SLJIT_MOV_U8:- srcw = (sljit_sw)((sljit_u8)(srcw));- break;- case SLJIT_MOV_S8:- srcw = (sljit_sw)((sljit_s8)(srcw));- break;- case SLJIT_MOV_U16:- srcw = (sljit_sw)((sljit_u16)(srcw));- break;- case SLJIT_MOV_S16:- srcw = (sljit_sw)((sljit_s16)(srcw));- break;- case SLJIT_MOV_U32:- srcw = (sljit_sw)((sljit_u32)(srcw));- break;- case SLJIT_MOV_S32:- srcw = (sljit_sw)((sljit_s32)(srcw));- break;- }- return push_load_imm_inst(compiler, gpr(dst), srcw);- }- /* LOAD */- /* TODO(carenas): avoid reg being defined later */- #define LEVAL(i) EVAL(i, reg, mem)- if (FAST_IS_REG(dst) && (src & SLJIT_MEM)) {- sljit_gpr reg = gpr(dst);-- FAIL_IF(make_addr_bxy(compiler, &mem, src, srcw, tmp1));- /* TODO(carenas): convert all calls below to LEVAL */- switch (opcode | (op & SLJIT_I32_OP)) {- case SLJIT_MOV32_U8:- ins = llc(reg, mem.offset, mem.index, mem.base);- break;- case SLJIT_MOV32_S8:- ins = lb(reg, mem.offset, mem.index, mem.base);- break;- case SLJIT_MOV32_U16:- ins = llh(reg, mem.offset, mem.index, mem.base);- break;- case SLJIT_MOV32_S16:- ins = WHEN2(is_u12(mem.offset), lh, lhy);- break;- case SLJIT_MOV32:- ins = WHEN2(is_u12(mem.offset), l, ly);- break;- case SLJIT_MOV_U8:- ins = LEVAL(llgc);- break;- case SLJIT_MOV_S8:- ins = lgb(reg, mem.offset, mem.index, mem.base);- break;- case SLJIT_MOV_U16:- ins = LEVAL(llgh);- break;- case SLJIT_MOV_S16:- ins = lgh(reg, mem.offset, mem.index, mem.base);- break;- case SLJIT_MOV_U32:- ins = LEVAL(llgf);- break;- case SLJIT_MOV_S32:- ins = lgf(reg, mem.offset, mem.index, mem.base);- break;- case SLJIT_MOV_P:- case SLJIT_MOV:- ins = lg(reg, mem.offset, mem.index, mem.base);- break;- default:- SLJIT_UNREACHABLE();- }- FAIL_IF(push_inst(compiler, ins));- if (HAS_FLAGS(op)) {- /* only handle zero flag */- SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK));- return push_store_zero_flag(compiler, op, reg);- }- return SLJIT_SUCCESS;- }- /* STORE and STORE IMMEDIATE */- if ((dst & SLJIT_MEM)- && (FAST_IS_REG(src) || (src & SLJIT_IMM))) {- sljit_gpr reg = FAST_IS_REG(src) ? gpr(src) : tmp0;- if (src & SLJIT_IMM) {- /* TODO(mundaym): MOVE IMMEDIATE? */- FAIL_IF(push_load_imm_inst(compiler, reg, srcw));- }- struct addr mem;- FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));- switch (opcode) {- case SLJIT_MOV_U8:- case SLJIT_MOV_S8:- return push_inst(compiler,- WHEN2(is_u12(mem.offset), stc, stcy));- case SLJIT_MOV_U16:- case SLJIT_MOV_S16:- return push_inst(compiler,- WHEN2(is_u12(mem.offset), sth, sthy));- case SLJIT_MOV_U32:- case SLJIT_MOV_S32:- return push_inst(compiler,- WHEN2(is_u12(mem.offset), st, sty));- case SLJIT_MOV_P:- case SLJIT_MOV:- FAIL_IF(push_inst(compiler, LEVAL(stg)));- if (HAS_FLAGS(op)) {- /* only handle zero flag */- SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK));- return push_store_zero_flag(compiler, op, reg);- }- return SLJIT_SUCCESS;- default:- SLJIT_UNREACHABLE();- }- }- #undef LEVAL- /* MOVE CHARACTERS */- if ((dst & SLJIT_MEM) && (src & SLJIT_MEM)) {- struct addr mem;- FAIL_IF(make_addr_bxy(compiler, &mem, src, srcw, tmp1));- switch (opcode) {- case SLJIT_MOV_U8:- case SLJIT_MOV_S8:- FAIL_IF(push_inst(compiler,- EVAL(llgc, tmp0, mem)));- FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));- return push_inst(compiler,- EVAL(stcy, tmp0, mem));- case SLJIT_MOV_U16:- case SLJIT_MOV_S16:- FAIL_IF(push_inst(compiler,- EVAL(llgh, tmp0, mem)));- FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));- return push_inst(compiler,- EVAL(sthy, tmp0, mem));- case SLJIT_MOV_U32:- case SLJIT_MOV_S32:- FAIL_IF(push_inst(compiler,- EVAL(ly, tmp0, mem)));- FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));- return push_inst(compiler,- EVAL(sty, tmp0, mem));- case SLJIT_MOV_P:- case SLJIT_MOV:- FAIL_IF(push_inst(compiler,- EVAL(lg, tmp0, mem)));- FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));- FAIL_IF(push_inst(compiler,- EVAL(stg, tmp0, mem)));- if (HAS_FLAGS(op)) {- /* only handle zero flag */- SLJIT_ASSERT(!(op & VARIABLE_FLAG_MASK));- return push_store_zero_flag(compiler, op, tmp0);- }- return SLJIT_SUCCESS;- default:- SLJIT_UNREACHABLE();- }- }- SLJIT_UNREACHABLE();- }-- SLJIT_ASSERT((src & SLJIT_IMM) == 0); /* no immediates */-- dst_r = SLOW_IS_REG(dst) ? gpr(REG_MASK & dst) : tmp0;- src_r = FAST_IS_REG(src) ? gpr(REG_MASK & src) : tmp0;- if (src & SLJIT_MEM)- FAIL_IF(load_word(compiler, src_r, src, srcw, tmp1, src & SLJIT_I32_OP));-- /* TODO(mundaym): optimize loads and stores */- switch (opcode | (op & SLJIT_I32_OP)) {- case SLJIT_NOT:- /* emulate ~x with x^-1 */- FAIL_IF(push_load_imm_inst(compiler, tmp1, -1));- if (src_r != dst_r)- FAIL_IF(push_inst(compiler, lgr(dst_r, src_r)));-- FAIL_IF(push_inst(compiler, xgr(dst_r, tmp1)));- break;- case SLJIT_NOT32:- /* emulate ~x with x^-1 */- if (have_eimm())- FAIL_IF(push_inst(compiler, xilf(dst_r, -1)));- else {- FAIL_IF(push_load_imm_inst(compiler, tmp1, -1));- if (src_r != dst_r)- FAIL_IF(push_inst(compiler, lr(dst_r, src_r)));-- FAIL_IF(push_inst(compiler, xr(dst_r, tmp1)));- }- break;- case SLJIT_NEG:- FAIL_IF(push_inst(compiler, lcgr(dst_r, src_r)));- break;- case SLJIT_NEG32:- FAIL_IF(push_inst(compiler, lcr(dst_r, src_r)));- break;- case SLJIT_CLZ:- if (have_eimm()) {- FAIL_IF(push_inst(compiler, flogr(tmp0, src_r))); /* clobbers tmp1 */- if (dst_r != tmp0)- FAIL_IF(push_inst(compiler, lgr(dst_r, tmp0)));- } else {- abort(); /* TODO(mundaym): no eimm (?) */- }- break;- case SLJIT_CLZ32:- if (have_eimm()) {- FAIL_IF(push_inst(compiler, sllg(tmp1, src_r, 32, 0)));- FAIL_IF(push_inst(compiler, iilf(tmp1, 0xffffffff)));- FAIL_IF(push_inst(compiler, flogr(tmp0, tmp1))); /* clobbers tmp1 */- if (dst_r != tmp0)- FAIL_IF(push_inst(compiler, lr(dst_r, tmp0)));- } else {- abort(); /* TODO(mundaym): no eimm (?) */- }- break;- default:- SLJIT_UNREACHABLE();- }-- /* write condition code to emulated flag register */- if (op & VARIABLE_FLAG_MASK)- FAIL_IF(push_inst(compiler, ipm(flag_r)));-- /* write zero flag to emulated flag register */- if (op & SLJIT_SET_Z)- FAIL_IF(push_store_zero_flag(compiler, op, dst_r));-- /* TODO(carenas): doesn't need FAIL_IF */- if ((dst != SLJIT_UNUSED) && (dst & SLJIT_MEM))- FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP));-- return SLJIT_SUCCESS;-}--static SLJIT_INLINE int is_commutative(sljit_s32 op)-{- switch (GET_OPCODE(op)) {- case SLJIT_ADD:- case SLJIT_ADDC:- case SLJIT_MUL:- case SLJIT_AND:- case SLJIT_OR:- case SLJIT_XOR:- return 1;- }- return 0;-}--static SLJIT_INLINE int is_shift(sljit_s32 op) {- sljit_s32 v = GET_OPCODE(op);- return (v == SLJIT_SHL || v == SLJIT_ASHR || v == SLJIT_LSHR) ? 1 : 0;-}--static SLJIT_INLINE int sets_signed_flag(sljit_s32 op)-{- switch (GET_FLAG_TYPE(op)) {- case SLJIT_OVERFLOW:- case SLJIT_NOT_OVERFLOW:- case SLJIT_SIG_LESS:- case SLJIT_SIG_LESS_EQUAL:- case SLJIT_SIG_GREATER:- case SLJIT_SIG_GREATER_EQUAL:- return 1;- }- return 0;-}--/* Report whether we have an instruction for:- op dst src imm- where dst and src are separate registers. */-static int have_op_3_imm(sljit_s32 op, sljit_sw imm) {- return 0; /* TODO(mundaym): implement */-}--/* Report whether we have an instruction for:- op reg imm- where reg is both a source and the destination. */-static int have_op_2_imm(sljit_s32 op, sljit_sw imm) {- switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) {- case SLJIT_ADD32:- case SLJIT_ADD:- if (!HAS_FLAGS(op) || sets_signed_flag(op))- return have_eimm() ? is_s32(imm) : is_s16(imm);-- return have_eimm() && is_u32(imm);- case SLJIT_MUL32:- case SLJIT_MUL:- /* TODO(mundaym): general extension check */- /* for ms{,g}fi */- if (op & VARIABLE_FLAG_MASK)- return 0;-- return have_genext() && is_s16(imm);- case SLJIT_OR32:- case SLJIT_XOR32:- case SLJIT_AND32:- /* only use if have extended immediate facility */- /* this ensures flags are set correctly */- return have_eimm();- case SLJIT_AND:- case SLJIT_OR:- case SLJIT_XOR:- /* TODO(mundaym): make this more flexible */- /* avoid using immediate variations, flags */- /* won't be set correctly */- return 0;- case SLJIT_ADDC32:- case SLJIT_ADDC:- /* no ADD LOGICAL WITH CARRY IMMEDIATE */- return 0;- case SLJIT_SUB:- case SLJIT_SUB32:- case SLJIT_SUBC:- case SLJIT_SUBC32:- /* no SUBTRACT IMMEDIATE */- /* TODO(mundaym): SUBTRACT LOGICAL IMMEDIATE */- return 0;- }- return 0;-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,- sljit_s32 dst, sljit_sw dstw,- sljit_s32 src1, sljit_sw src1w,- sljit_s32 src2, sljit_sw src2w)-{- CHECK_ERROR();- CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));- ADJUST_LOCAL_OFFSET(dst, dstw);- ADJUST_LOCAL_OFFSET(src1, src1w);- ADJUST_LOCAL_OFFSET(src2, src2w);-- if (dst == SLJIT_UNUSED && !HAS_FLAGS(op))- return SLJIT_SUCCESS;-- sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;-- if (is_commutative(op)) {- #define SWAP_ARGS \- do { \- sljit_s32 t = src1; \- sljit_sw tw = src1w; \- src1 = src2; \- src1w = src2w; \- src2 = t; \- src2w = tw; \- } while(0);-- /* prefer immediate in src2 */- if (src1 & SLJIT_IMM) {- SWAP_ARGS- }-- /* prefer to have src1 use same register as dst */- if (FAST_IS_REG(src2) && gpr(src2 & REG_MASK) == dst_r) {- SWAP_ARGS- }-- /* prefer memory argument in src2 */- if (FAST_IS_REG(src2) && (src1 & SLJIT_MEM)) {- SWAP_ARGS- }- #undef SWAP_ARGS- }-- /* src1 must be in a register */- sljit_gpr src1_r = FAST_IS_REG(src1) ? gpr(src1 & REG_MASK) : tmp0;- if (src1 & SLJIT_IMM)- FAIL_IF(push_load_imm_inst(compiler, src1_r, src1w));-- if (src1 & SLJIT_MEM)- FAIL_IF(load_word(compiler, src1_r, src1, src1w, tmp1, op & SLJIT_I32_OP));-- /* emit comparison before subtract */- if (GET_OPCODE(op) == SLJIT_SUB && (op & VARIABLE_FLAG_MASK)) {- sljit_sw cmp = 0;- switch (GET_FLAG_TYPE(op)) {- case SLJIT_LESS:- case SLJIT_LESS_EQUAL:- case SLJIT_GREATER:- case SLJIT_GREATER_EQUAL:- cmp = 1; /* unsigned */- break;- case SLJIT_EQUAL:- case SLJIT_SIG_LESS:- case SLJIT_SIG_LESS_EQUAL:- case SLJIT_SIG_GREATER:- case SLJIT_SIG_GREATER_EQUAL:- cmp = -1; /* signed */- break;- }- if (cmp) {- /* clear flags - no need to generate now */- op &= ~VARIABLE_FLAG_MASK;- sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1;- if (src2 & SLJIT_IMM) {- #define LEVAL(i) i(src1_r, src2w)- if (cmp > 0 && is_u32(src2w)) {- /* unsigned */- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, clfi, clgfi)));- }- else if (cmp < 0 && is_s16(src2w)) {- /* signed */- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, chi, cghi)));- }- else if (cmp < 0 && is_s32(src2w)) {- /* signed */- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, cfi, cgfi)));- }- #undef LEVAL- #define LEVAL(i) i(src1_r, src2_r)- else {- FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w));- if (cmp > 0) {- /* unsigned */- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, clr, clgr)));- }- if (cmp < 0) {- /* signed */- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, cr, cgr)));- }- }- }- else {- if (src2 & SLJIT_MEM) {- /* TODO(mundaym): comparisons with memory */- /* load src2 into register */- FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP));- }- if (cmp > 0) {- /* unsigned */- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, clr, clgr)));- }- if (cmp < 0) {- /* signed */- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, cr, cgr)));- }- #undef LEVAL- }- FAIL_IF(push_inst(compiler, ipm(flag_r)));- }- }-- if (!HAS_FLAGS(op) && dst == SLJIT_UNUSED)- return SLJIT_SUCCESS;-- /* need to specify signed or logical operation */- int signed_flags = sets_signed_flag(op);-- if (is_shift(op)) {- /* handle shifts first, they have more constraints than other operations */- sljit_sw d = 0;- sljit_gpr b = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : r0;- if (src2 & SLJIT_IMM)- d = src2w & ((op & SLJIT_I32_OP) ? 31 : 63);-- if (src2 & SLJIT_MEM) {- /* shift amount (b) cannot be in r0 (i.e. tmp0) */- FAIL_IF(load_word(compiler, tmp1, src2, src2w, tmp1, op & SLJIT_I32_OP));- b = tmp1;- }- /* src1 and dst share the same register in the base 32-bit ISA */- /* TODO(mundaym): not needed when distinct-operand facility is available */- int workaround_alias = op & SLJIT_I32_OP && src1_r != dst_r;- if (workaround_alias) {- /* put src1 into tmp0 so we can overwrite it */- FAIL_IF(push_inst(compiler, lr(tmp0, src1_r)));- src1_r = tmp0;- }- switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) {- case SLJIT_SHL:- FAIL_IF(push_inst(compiler, sllg(dst_r, src1_r, d, b)));- break;- case SLJIT_SHL32:- FAIL_IF(push_inst(compiler, sll(src1_r, d, b)));- break;- case SLJIT_LSHR:- FAIL_IF(push_inst(compiler, srlg(dst_r, src1_r, d, b)));- break;- case SLJIT_LSHR32:- FAIL_IF(push_inst(compiler, srl(src1_r, d, b)));- break;- case SLJIT_ASHR:- FAIL_IF(push_inst(compiler, srag(dst_r, src1_r, d, b)));- break;- case SLJIT_ASHR32:- FAIL_IF(push_inst(compiler, sra(src1_r, d, b)));- break;- default:- SLJIT_UNREACHABLE();- }- if (workaround_alias && dst_r != src1_r)- FAIL_IF(push_inst(compiler, lr(dst_r, src1_r)));-- }- else if ((GET_OPCODE(op) == SLJIT_MUL) && HAS_FLAGS(op)) {- /* multiply instructions do not generally set flags so we need to manually */- /* detect overflow conditions */- /* TODO(mundaym): 64-bit overflow */- SLJIT_ASSERT(GET_FLAG_TYPE(op) == SLJIT_MUL_OVERFLOW ||- GET_FLAG_TYPE(op) == SLJIT_MUL_NOT_OVERFLOW);- sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1;- if (src2 & SLJIT_IMM) {- /* load src2 into register */- FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w));- }- if (src2 & SLJIT_MEM) {- /* load src2 into register */- FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP));- }- if (have_misc2()) {- #define LEVAL(i) i(dst_r, src1_r, src2_r)- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, msrkc, msgrkc)));- #undef LEVAL- }- else if (op & SLJIT_I32_OP) {- op &= ~VARIABLE_FLAG_MASK;- FAIL_IF(push_inst(compiler, lgfr(tmp0, src1_r)));- FAIL_IF(push_inst(compiler, msgfr(tmp0, src2_r)));- if (dst_r != tmp0) {- FAIL_IF(push_inst(compiler, lr(dst_r, tmp0)));- }- FAIL_IF(push_inst(compiler, aih(tmp0, 1)));- FAIL_IF(push_inst(compiler, nihf(tmp0, ~1U)));- FAIL_IF(push_inst(compiler, ipm(flag_r)));- FAIL_IF(push_inst(compiler, oilh(flag_r, 0x2000)));- }- else- return SLJIT_ERR_UNSUPPORTED;-- }- else if ((GET_OPCODE(op) == SLJIT_SUB) && (op & SLJIT_SET_Z) && !signed_flags) {- /* subtract logical instructions do not set the right flags unfortunately */- /* instead, negate src2 and issue an add logical */- /* TODO(mundaym): distinct operand facility where needed */- if (src1_r != dst_r && src1_r != tmp0) {- #define LEVAL(i) i(tmp0, src1_r)- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, lr, lgr)));- src1_r = tmp0;- #undef LEVAL- }- sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1;- if (src2 & SLJIT_IMM) {- /* load src2 into register */- FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w));- }- if (src2 & SLJIT_MEM) {- /* load src2 into register */- FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP));- }- if (op & SLJIT_I32_OP) {- FAIL_IF(push_inst(compiler, lcr(tmp1, src2_r)));- FAIL_IF(push_inst(compiler, alr(src1_r, tmp1)));- if (src1_r != dst_r)- FAIL_IF(push_inst(compiler, lr(dst_r, src1_r)));- }- else {- FAIL_IF(push_inst(compiler, lcgr(tmp1, src2_r)));- FAIL_IF(push_inst(compiler, algr(src1_r, tmp1)));- if (src1_r != dst_r)- FAIL_IF(push_inst(compiler, lgr(dst_r, src1_r)));- }- }- else if ((src2 & SLJIT_IMM) && (src1_r == dst_r) && have_op_2_imm(op, src2w)) {- switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) {- #define LEVAL(i) i(dst_r, src2w)- case SLJIT_ADD:- if (!HAS_FLAGS(op) || signed_flags) {- FAIL_IF(push_inst(compiler,- WHEN2(is_s16(src2w), aghi, agfi)));- }- else- FAIL_IF(push_inst(compiler, LEVAL(algfi)));-- break;- case SLJIT_ADD32:- if (!HAS_FLAGS(op) || signed_flags)- FAIL_IF(push_inst(compiler,- WHEN2(is_s16(src2w), ahi, afi)));- else- FAIL_IF(push_inst(compiler, LEVAL(alfi)));-- break;- #undef LEVAL /* TODO(carenas): move down and refactor? */- case SLJIT_MUL:- FAIL_IF(push_inst(compiler, mhi(dst_r, src2w)));- break;- case SLJIT_MUL32:- FAIL_IF(push_inst(compiler, mghi(dst_r, src2w)));- break;- case SLJIT_OR32:- FAIL_IF(push_inst(compiler, oilf(dst_r, src2w)));- break;- case SLJIT_XOR32:- FAIL_IF(push_inst(compiler, xilf(dst_r, src2w)));- break;- case SLJIT_AND32:- FAIL_IF(push_inst(compiler, nilf(dst_r, src2w)));- break;- default:- SLJIT_UNREACHABLE();- }- }- else if ((src2 & SLJIT_IMM) && have_op_3_imm(op, src2w)) {- abort(); /* TODO(mundaym): implement */- }- else if ((src2 & SLJIT_MEM) && (dst_r == src1_r)) {- /* most 32-bit instructions can only handle 12-bit immediate offsets */- int need_u12 = !have_ldisp() &&- (op & SLJIT_I32_OP) &&- (GET_OPCODE(op) != SLJIT_ADDC) &&- (GET_OPCODE(op) != SLJIT_SUBC);- struct addr mem;- if (need_u12)- FAIL_IF(make_addr_bx(compiler, &mem, src2, src2w, tmp1));- else- FAIL_IF(make_addr_bxy(compiler, &mem, src2, src2w, tmp1));-- int can_u12 = is_u12(mem.offset) ? 1 : 0;- sljit_ins ins = 0;- switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) {- /* 64-bit ops */- #define LEVAL(i) EVAL(i, dst_r, mem)- case SLJIT_ADD:- ins = WHEN2(signed_flags, ag, alg);- break;- case SLJIT_SUB:- ins = WHEN2(signed_flags, sg, slg);- break;- case SLJIT_ADDC:- ins = LEVAL(alcg);- break;- case SLJIT_SUBC:- ins = LEVAL(slbg);- break;- case SLJIT_MUL:- ins = LEVAL(msg);- break;- case SLJIT_OR:- ins = LEVAL(og);- break;- case SLJIT_XOR:- ins = LEVAL(xg);- break;- case SLJIT_AND:- ins = LEVAL(ng);- break;- /* 32-bit ops */- case SLJIT_ADD32:- if (signed_flags)- ins = WHEN2(can_u12, a, ay);- else- ins = WHEN2(can_u12, al, aly);- break;- case SLJIT_SUB32:- if (signed_flags)- ins = WHEN2(can_u12, s, sy);- else- ins = WHEN2(can_u12, sl, sly);- break;- case SLJIT_ADDC32:- ins = LEVAL(alc);- break;- case SLJIT_SUBC32:- ins = LEVAL(slb);- break;- case SLJIT_MUL32:- ins = WHEN2(can_u12, ms, msy);- break;- case SLJIT_OR32:- ins = WHEN2(can_u12, o, oy);- break;- case SLJIT_XOR32:- ins = WHEN2(can_u12, x, xy);- break;- case SLJIT_AND32:- ins = WHEN2(can_u12, n, ny);- break;- #undef LEVAL- default:- SLJIT_UNREACHABLE();- }- FAIL_IF(push_inst(compiler, ins));- }- else {- sljit_gpr src2_r = FAST_IS_REG(src2) ? gpr(src2 & REG_MASK) : tmp1;- if (src2 & SLJIT_IMM) {- /* load src2 into register */- FAIL_IF(push_load_imm_inst(compiler, src2_r, src2w));- }- if (src2 & SLJIT_MEM) {- /* load src2 into register */- FAIL_IF(load_word(compiler, src2_r, src2, src2w, tmp1, op & SLJIT_I32_OP));- }- /* TODO(mundaym): distinct operand facility where needed */- #define LEVAL(i) i(tmp0, src1_r)- if (src1_r != dst_r && src1_r != tmp0) {- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, lr, lgr)));- src1_r = tmp0;- }- #undef LEVAL- sljit_ins ins = 0;- switch (GET_OPCODE(op) | (op & SLJIT_I32_OP)) {- #define LEVAL(i) i(src1_r, src2_r)- /* 64-bit ops */- case SLJIT_ADD:- ins = WHEN2(signed_flags, agr, algr);- break;- case SLJIT_SUB:- ins = WHEN2(signed_flags, sgr, slgr);- break;- case SLJIT_ADDC:- ins = LEVAL(alcgr);- break;- case SLJIT_SUBC:- ins = LEVAL(slbgr);- break;- case SLJIT_MUL:- ins = LEVAL(msgr);- break;- case SLJIT_AND:- ins = LEVAL(ngr);- break;- case SLJIT_OR:- ins = LEVAL(ogr);- break;- case SLJIT_XOR:- ins = LEVAL(xgr);- break;- /* 32-bit ops */- case SLJIT_ADD32:- ins = WHEN2(signed_flags, ar, alr);- break;- case SLJIT_SUB32:- ins = WHEN2(signed_flags, sr, slr);- break;- case SLJIT_ADDC32:- ins = LEVAL(alcr);- break;- case SLJIT_SUBC32:- ins = LEVAL(slbr);- break;- case SLJIT_MUL32:- ins = LEVAL(msr);- break;- case SLJIT_AND32:- ins = LEVAL(nr);- break;- case SLJIT_OR32:- ins = LEVAL(or);- break;- case SLJIT_XOR32:- ins = LEVAL(xr);- break;- #undef LEVAL- default:- SLJIT_UNREACHABLE();- }- FAIL_IF(push_inst(compiler, ins));- #define LEVAL(i) i(dst_r, src1_r)- if (src1_r != dst_r)- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, lr, lgr)));- #undef LEVAL- }-- /* write condition code to emulated flag register */- if (op & VARIABLE_FLAG_MASK)- FAIL_IF(push_inst(compiler, ipm(flag_r)));-- /* write zero flag to emulated flag register */- if (op & SLJIT_SET_Z)- FAIL_IF(push_store_zero_flag(compiler, op, dst_r));-- /* finally write the result to memory if required */- if (dst & SLJIT_MEM) {- SLJIT_ASSERT(dst_r != tmp1);- /* TODO(carenas): s/FAIL_IF/ return */- FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP));- }-- return SLJIT_SUCCESS;-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(- struct sljit_compiler *compiler,- sljit_s32 op, sljit_s32 src, sljit_sw srcw)-{- sljit_gpr src_r;-- CHECK_ERROR();- CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));- ADJUST_LOCAL_OFFSET(src, srcw);-- switch (op) {- case SLJIT_FAST_RETURN:- src_r = FAST_IS_REG(src) ? gpr(src) : tmp1;- if (src & SLJIT_MEM)- FAIL_IF(load_word(compiler, tmp1, src, srcw, tmp1, 0));-- return push_inst(compiler, br(src_r));- case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:- /* TODO(carenas): implement? */- return SLJIT_SUCCESS;- case SLJIT_PREFETCH_L1:- case SLJIT_PREFETCH_L2:- case SLJIT_PREFETCH_L3:- case SLJIT_PREFETCH_ONCE:- /* TODO(carenas): implement */- return SLJIT_SUCCESS;- default:- /* TODO(carenas): probably should not success by default */- return SLJIT_SUCCESS;- }-- return SLJIT_SUCCESS;-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)-{- CHECK_REG_INDEX(check_sljit_get_register_index(reg));- return gpr(reg);-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)-{- CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));- abort();-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,- void *instruction, sljit_s32 size)-{- sljit_ins ins = 0;-- CHECK_ERROR();- CHECK(check_sljit_emit_op_custom(compiler, instruction, size));-- memcpy((sljit_u8 *)&ins + sizeof(ins) - size, instruction, size);- return push_inst(compiler, ins);-}--/* --------------------------------------------------------------------- */-/* Floating point operators */-/* --------------------------------------------------------------------- */--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,- sljit_s32 dst, sljit_sw dstw,- sljit_s32 src, sljit_sw srcw)-{- CHECK_ERROR();- abort();-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,- sljit_s32 dst, sljit_sw dstw,- sljit_s32 src1, sljit_sw src1w,- sljit_s32 src2, sljit_sw src2w)-{- CHECK_ERROR();- abort();-}--/* --------------------------------------------------------------------- */-/* Other instructions */-/* --------------------------------------------------------------------- */--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)-{- CHECK_ERROR();- CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));- ADJUST_LOCAL_OFFSET(dst, dstw);-- if (FAST_IS_REG(dst))- return push_inst(compiler, lgr(gpr(dst), fast_link_r));-- /* memory */- return store_word(compiler, fast_link_r, dst, dstw, tmp1, 0);-}--/* --------------------------------------------------------------------- */-/* Conditional instructions */-/* --------------------------------------------------------------------- */--SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)-{- struct sljit_label *label;-- CHECK_ERROR_PTR();- CHECK_PTR(check_sljit_emit_label(compiler));-- if (compiler->last_label && compiler->last_label->size == compiler->size)- return compiler->last_label;-- label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));- PTR_FAIL_IF(!label);- set_label(label, compiler);- return label;-}--SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)-{- sljit_u8 mask = ((type & 0xff) < SLJIT_JUMP) ? get_cc(type & 0xff) : 0xf;-- CHECK_ERROR_PTR();- CHECK_PTR(check_sljit_emit_jump(compiler, type));-- /* reload condition code */- if (mask != 0xf)- PTR_FAIL_IF(push_load_cc(compiler, type & 0xff));-- /* record jump */- struct sljit_jump *jump = (struct sljit_jump *)- ensure_abuf(compiler, sizeof(struct sljit_jump));- PTR_FAIL_IF(!jump);- set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);- jump->addr = compiler->size;-- /* emit jump instruction */- type &= 0xff;- if (type >= SLJIT_FAST_CALL)- PTR_FAIL_IF(push_inst(compiler, brasl(type == SLJIT_FAST_CALL ? fast_link_r : link_r, 0)));- else- PTR_FAIL_IF(push_inst(compiler, brcl(mask, 0)));-- return jump;-}--SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,- sljit_s32 arg_types)-{- CHECK_ERROR_PTR();- CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));--#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \- || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)- compiler->skip_checks = 1;-#endif-- return sljit_emit_jump(compiler, type);-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)-{- sljit_gpr src_r = FAST_IS_REG(src) ? gpr(src) : tmp1;-- CHECK_ERROR();- CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));- ADJUST_LOCAL_OFFSET(src, srcw);-- if (src & SLJIT_IMM) {- SLJIT_ASSERT(!(srcw & 1)); /* target address must be even */- FAIL_IF(push_load_imm_inst(compiler, src_r, srcw));- }- else if (src & SLJIT_MEM)- FAIL_IF(load_word(compiler, src_r, src, srcw, tmp1, 0 /* 64-bit */));-- /* emit jump instruction */- if (type >= SLJIT_FAST_CALL)- return push_inst(compiler, basr(type == SLJIT_FAST_CALL ? fast_link_r : link_r, src_r));-- return push_inst(compiler, br(src_r));-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,- sljit_s32 arg_types,- sljit_s32 src, sljit_sw srcw)-{- CHECK_ERROR();- CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));--#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \- || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)- compiler->skip_checks = 1;-#endif-- return sljit_emit_ijump(compiler, type, src, srcw);-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,- sljit_s32 dst, sljit_sw dstw,- sljit_s32 type)-{- sljit_u8 mask = get_cc(type & 0xff);-- CHECK_ERROR();- CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));-- sljit_gpr dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;- sljit_gpr loc_r = tmp1;- switch (GET_OPCODE(op)) {- case SLJIT_AND:- case SLJIT_OR:- case SLJIT_XOR:- /* dst is also source operand */- if (dst & SLJIT_MEM)- FAIL_IF(load_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP));-- break;- case SLJIT_MOV:- case (SLJIT_MOV32 & ~SLJIT_I32_OP):- /* can write straight into destination */- loc_r = dst_r;- break;- default:- SLJIT_UNREACHABLE();- }-- if (mask != 0xf)- FAIL_IF(push_load_cc(compiler, type & 0xff));-- /* TODO(mundaym): fold into cmov helper function? */- #define LEVAL(i) i(loc_r, 1, mask)- if (have_lscond2()) {- FAIL_IF(push_load_imm_inst(compiler, loc_r, 0));- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, lochi, locghi)));- } else {- /* TODO(mundaym): no load/store-on-condition 2 facility (ipm? branch-and-set?) */- abort();- }- #undef LEVAL-- /* apply bitwise op and set condition codes */- switch (GET_OPCODE(op)) {- #define LEVAL(i) i(dst_r, loc_r)- case SLJIT_AND:- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, nr, ngr)));- break;- case SLJIT_OR:- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, or, ogr)));- break;- case SLJIT_XOR:- FAIL_IF(push_inst(compiler,- WHEN2(op & SLJIT_I32_OP, xr, xgr)));- break;- #undef LEVAL- }-- /* set zero flag if needed */- if (op & SLJIT_SET_Z)- FAIL_IF(push_store_zero_flag(compiler, op, dst_r));-- /* store result to memory if required */- /* TODO(carenas): s/FAIL_IF/ return */- if (dst & SLJIT_MEM)- FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, op & SLJIT_I32_OP));-- return SLJIT_SUCCESS;-}--SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,- sljit_s32 dst_reg,- sljit_s32 src, sljit_sw srcw)-{- sljit_u8 mask = get_cc(type & 0xff);- sljit_gpr dst_r = gpr(dst_reg & ~SLJIT_I32_OP);- sljit_gpr src_r = FAST_IS_REG(src) ? gpr(src) : tmp0;-- CHECK_ERROR();- CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));-- if (mask != 0xf)- FAIL_IF(push_load_cc(compiler, type & 0xff));-- if (src & SLJIT_IMM) {- /* TODO(mundaym): fast path with lscond2 */- FAIL_IF(push_load_imm_inst(compiler, src_r, srcw));- }-- #define LEVAL(i) i(dst_r, src_r, mask)- if (have_lscond1())- return push_inst(compiler,- WHEN2(dst_reg & SLJIT_I32_OP, locr, locgr));-- #undef LEVAL-- /* TODO(mundaym): implement */- return SLJIT_ERR_UNSUPPORTED;-}--/* --------------------------------------------------------------------- */-/* Other instructions */-/* --------------------------------------------------------------------- */--/* On s390x we build a literal pool to hold constants. This has two main- advantages:-- 1. we only need one instruction in the instruction stream (LGRL)- 2. we can store 64 bit addresses and use 32 bit offsets-- To retrofit the extra information needed to build the literal pool we- add a new sljit_s390x_const struct that contains the initial value but- can still be cast to a sljit_const. */--SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)-{- struct sljit_s390x_const *const_;- sljit_gpr dst_r;-- CHECK_ERROR_PTR();- CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));-- const_ = (struct sljit_s390x_const*)ensure_abuf(compiler,- sizeof(struct sljit_s390x_const));- PTR_FAIL_IF(!const_);- set_const((struct sljit_const*)const_, compiler);- const_->init_value = init_value;-- dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;- if (have_genext())- PTR_FAIL_IF(push_inst(compiler, sljit_ins_const | lgrl(dst_r, 0)));- else {- PTR_FAIL_IF(push_inst(compiler, sljit_ins_const | larl(tmp1, 0)));- PTR_FAIL_IF(push_inst(compiler, lg(dst_r, 0, r0, tmp1)));- }-- if (dst & SLJIT_MEM)- PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, 0 /* always 64-bit */));-- return (struct sljit_const*)const_;-}--SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)-{- /* Update the constant pool. */- sljit_uw *ptr = (sljit_uw *)addr;- SLJIT_UNUSED_ARG(executable_offset);-- SLJIT_UPDATE_WX_FLAGS(ptr, ptr + 1, 0);- *ptr = new_target;- SLJIT_UPDATE_WX_FLAGS(ptr, ptr + 1, 1);- SLJIT_CACHE_FLUSH(ptr, ptr + 1);-}--SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)-{- sljit_set_jump_addr(addr, new_constant, executable_offset);-}--SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label *sljit_emit_put_label(- struct sljit_compiler *compiler,- sljit_s32 dst, sljit_sw dstw)-{- struct sljit_put_label *put_label;- sljit_gpr dst_r;-- CHECK_ERROR_PTR();- CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));- ADJUST_LOCAL_OFFSET(dst, dstw);-- put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));- PTR_FAIL_IF(!put_label);- set_put_label(put_label, compiler, 0);-- dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;-- if (have_genext())- PTR_FAIL_IF(push_inst(compiler, lgrl(dst_r, 0)));- else {- PTR_FAIL_IF(push_inst(compiler, larl(tmp1, 0)));- PTR_FAIL_IF(push_inst(compiler, lg(dst_r, 0, r0, tmp1)));- }-- if (dst & SLJIT_MEM)- PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, tmp1, 0));+ 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 0, 1+};++/* there are also a[2-15] available, but they are slower to access and+ * their use is limited as mundaym explained:+ * https://github.com/zherczeg/sljit/pull/91#discussion_r486895689+ */++/* General Purpose Registers [0-15]. */+typedef sljit_uw sljit_gpr;++/*+ * WARNING+ * the following code is non standard and should be improved for+ * consistency, but doesn't use SLJIT_NUMBER_OF_REGISTERS based+ * registers because r0 and r1 are the ABI recommended volatiles.+ * there is a gpr() function that maps sljit to physical register numbers+ * that should be used instead of the usual index into reg_map[] and+ * will be retired ASAP (TODO: carenas)+ */++static const sljit_gpr r0 = 0; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 2]: 0 in address calculations; reserved */+static const sljit_gpr r1 = 1; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 3]: reserved */+static const sljit_gpr r2 = 2; /* reg_map[1]: 1st argument */+static const sljit_gpr r3 = 3; /* reg_map[2]: 2nd argument */+static const sljit_gpr r4 = 4; /* reg_map[3]: 3rd argument */+static const sljit_gpr r5 = 5; /* reg_map[4]: 4th argument */+static const sljit_gpr r6 = 6; /* reg_map[5]: 5th argument; 1st saved register */+static const sljit_gpr r7 = 7; /* reg_map[6] */+static const sljit_gpr r8 = 8; /* reg_map[7] */+static const sljit_gpr r9 = 9; /* reg_map[8] */+static const sljit_gpr r10 = 10; /* reg_map[9] */+static const sljit_gpr r11 = 11; /* reg_map[10] */+static const sljit_gpr r12 = 12; /* reg_map[11]: GOT */+static const sljit_gpr r13 = 13; /* reg_map[12]: Literal Pool pointer */+static const sljit_gpr r14 = 14; /* reg_map[0]: return address and flag register */+static const sljit_gpr r15 = 15; /* reg_map[SLJIT_NUMBER_OF_REGISTERS + 1]: stack pointer */++/* WARNING: r12 and r13 shouldn't be used as per ABI recommendation */+/* TODO(carenas): r12 might conflict in PIC code, reserve? */+/* TODO(carenas): r13 is usually pointed to "pool" per ABI, using a tmp+ * like we do know might be faster though, reserve?+ */++/* TODO(carenas): should be named TMP_REG[1-2] for consistency */+#define tmp0 r0+#define tmp1 r1++/* TODO(carenas): flags should move to a different register so that+ * link register doesn't need to change+ */++/* Link registers. The normal link register is r14, but since+ we use that for flags we need to use r0 instead to do fast+ calls so that flags are preserved. */+static const sljit_gpr link_r = 14; /* r14 */+static const sljit_gpr fast_link_r = 0; /* r0 */++/* Flag register layout:++ 0 32 33 34 36 64+ +---------------+---+---+-------+-------++ | ZERO | 0 | 0 | C C |///////|+ +---------------+---+---+-------+-------++*/+static const sljit_gpr flag_r = 14; /* r14 */++struct sljit_s390x_const {+ struct sljit_const const_; /* must be first */+ sljit_sw init_value; /* required to build literal pool */+};++/* Convert SLJIT register to hardware register. */+static SLJIT_INLINE sljit_gpr gpr(sljit_s32 r)+{+ SLJIT_ASSERT(r >= 0 && r < (sljit_s32)(sizeof(reg_map) / sizeof(reg_map[0])));+ return reg_map[r];+}++/* Size of instruction in bytes. Tags must already be cleared. */+static SLJIT_INLINE sljit_uw sizeof_ins(sljit_ins ins)+{+ /* keep faulting instructions */+ if (ins == 0)+ return 2;++ if ((ins & 0x00000000ffffL) == ins)+ return 2;+ if ((ins & 0x0000ffffffffL) == ins)+ return 4;+ if ((ins & 0xffffffffffffL) == ins)+ return 6;++ SLJIT_UNREACHABLE();+ return (sljit_uw)-1;+}++static sljit_s32 push_inst(struct sljit_compiler *compiler, sljit_ins ins)+{+ sljit_ins *ibuf = (sljit_ins *)ensure_buf(compiler, sizeof(sljit_ins));+ FAIL_IF(!ibuf);+ *ibuf = ins;+ compiler->size++;+ return SLJIT_SUCCESS;+}++static sljit_s32 encode_inst(void **ptr, sljit_ins ins)+{+ sljit_u16 *ibuf = (sljit_u16 *)*ptr;+ sljit_uw size = sizeof_ins(ins);++ SLJIT_ASSERT((size & 6) == size);+ switch (size) {+ case 6:+ *ibuf++ = (sljit_u16)(ins >> 32);+ /* fallthrough */+ case 4:+ *ibuf++ = (sljit_u16)(ins >> 16);+ /* fallthrough */+ case 2:+ *ibuf++ = (sljit_u16)(ins);+ }+ *ptr = (void*)ibuf;+ return SLJIT_SUCCESS;+}++#define SLJIT_ADD_SUB_NO_COMPARE(status_flags_state) \+ (((status_flags_state) & (SLJIT_CURRENT_FLAGS_ADD_SUB | SLJIT_CURRENT_FLAGS_COMPARE)) == SLJIT_CURRENT_FLAGS_ADD_SUB)++/* Map the given type to a 4-bit condition code mask. */+static SLJIT_INLINE sljit_u8 get_cc(struct sljit_compiler *compiler, sljit_s32 type) {+ const sljit_u8 cc0 = 1 << 3; /* equal {,to zero} */+ const sljit_u8 cc1 = 1 << 2; /* less than {,zero} */+ const sljit_u8 cc2 = 1 << 1; /* greater than {,zero} */+ const sljit_u8 cc3 = 1 << 0; /* {overflow,NaN} */++ switch (type) {+ case SLJIT_EQUAL:+ if (SLJIT_ADD_SUB_NO_COMPARE(compiler->status_flags_state)) {+ sljit_s32 type = GET_FLAG_TYPE(compiler->status_flags_state);+ if (type >= SLJIT_SIG_LESS && type <= SLJIT_SIG_LESS_EQUAL)+ return cc0;+ if (type == SLJIT_OVERFLOW)+ return (cc0 | cc3);+ return (cc0 | cc2);+ }++ case SLJIT_EQUAL_F64:+ return cc0;++ case SLJIT_NOT_EQUAL:+ if (SLJIT_ADD_SUB_NO_COMPARE(compiler->status_flags_state)) {+ sljit_s32 type = GET_FLAG_TYPE(compiler->status_flags_state);+ if (type >= SLJIT_SIG_LESS && type <= SLJIT_SIG_LESS_EQUAL)+ return (cc1 | cc2 | cc3);+ if (type == SLJIT_OVERFLOW)+ return (cc1 | cc2);+ return (cc1 | cc3);+ }++ case SLJIT_NOT_EQUAL_F64:+ return (cc1 | cc2 | cc3);++ case SLJIT_LESS:+ return cc1;++ case SLJIT_GREATER_EQUAL:+ return (cc0 | cc2 | cc3);++ case SLJIT_GREATER:+ if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_COMPARE)+ return cc2;+ return cc3;++ case SLJIT_LESS_EQUAL:+ if (compiler->status_flags_state & SLJIT_CURRENT_FLAGS_COMPARE)+ return (cc0 | cc1);+ return (cc0 | cc1 | cc2);++ case SLJIT_SIG_LESS:+ case SLJIT_LESS_F64:+ return cc1;++ case SLJIT_SIG_LESS_EQUAL:+ case SLJIT_LESS_EQUAL_F64:+ return (cc0 | cc1);++ case SLJIT_SIG_GREATER:+ /* Overflow is considered greater, see SLJIT_SUB. */+ return cc2 | cc3;++ case SLJIT_SIG_GREATER_EQUAL:+ return (cc0 | cc2 | cc3);++ case SLJIT_OVERFLOW:+ if (compiler->status_flags_state & SLJIT_SET_Z)+ return (cc2 | cc3);++ case SLJIT_UNORDERED_F64:+ return cc3;++ case SLJIT_NOT_OVERFLOW:+ if (compiler->status_flags_state & SLJIT_SET_Z)+ return (cc0 | cc1);++ case SLJIT_ORDERED_F64:+ return (cc0 | cc1 | cc2);++ case SLJIT_GREATER_F64:+ return cc2;++ case SLJIT_GREATER_EQUAL_F64:+ return (cc0 | cc2);+ }++ SLJIT_UNREACHABLE();+ return (sljit_u8)-1;+}++/* Facility to bit index mappings.+ Note: some facilities share the same bit index. */+typedef sljit_uw facility_bit;+#define STORE_FACILITY_LIST_EXTENDED_FACILITY 7+#define FAST_LONG_DISPLACEMENT_FACILITY 19+#define EXTENDED_IMMEDIATE_FACILITY 21+#define GENERAL_INSTRUCTION_EXTENSION_FACILITY 34+#define DISTINCT_OPERAND_FACILITY 45+#define HIGH_WORD_FACILITY 45+#define POPULATION_COUNT_FACILITY 45+#define LOAD_STORE_ON_CONDITION_1_FACILITY 45+#define MISCELLANEOUS_INSTRUCTION_EXTENSIONS_1_FACILITY 49+#define LOAD_STORE_ON_CONDITION_2_FACILITY 53+#define MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY 58+#define VECTOR_FACILITY 129+#define VECTOR_ENHANCEMENTS_1_FACILITY 135++/* Report whether a facility is known to be present due to the compiler+ settings. This function should always be compiled to a constant+ value given a constant argument. */+static SLJIT_INLINE int have_facility_static(facility_bit x)+{+#if ENABLE_STATIC_FACILITY_DETECTION+ switch (x) {+ case FAST_LONG_DISPLACEMENT_FACILITY:+ return (__ARCH__ >= 6 /* z990 */);+ case EXTENDED_IMMEDIATE_FACILITY:+ case STORE_FACILITY_LIST_EXTENDED_FACILITY:+ return (__ARCH__ >= 7 /* z9-109 */);+ case GENERAL_INSTRUCTION_EXTENSION_FACILITY:+ return (__ARCH__ >= 8 /* z10 */);+ case DISTINCT_OPERAND_FACILITY:+ return (__ARCH__ >= 9 /* z196 */);+ case MISCELLANEOUS_INSTRUCTION_EXTENSIONS_1_FACILITY:+ return (__ARCH__ >= 10 /* zEC12 */);+ case LOAD_STORE_ON_CONDITION_2_FACILITY:+ case VECTOR_FACILITY:+ return (__ARCH__ >= 11 /* z13 */);+ case MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY:+ case VECTOR_ENHANCEMENTS_1_FACILITY:+ return (__ARCH__ >= 12 /* z14 */);+ default:+ SLJIT_UNREACHABLE();+ }+#endif+ return 0;+}++static SLJIT_INLINE unsigned long get_hwcap()+{+ static unsigned long hwcap = 0;+ if (SLJIT_UNLIKELY(!hwcap)) {+ hwcap = getauxval(AT_HWCAP);+ SLJIT_ASSERT(hwcap != 0);+ }+ return hwcap;+}++static SLJIT_INLINE int have_stfle()+{+ if (have_facility_static(STORE_FACILITY_LIST_EXTENDED_FACILITY))+ return 1;++ return (get_hwcap() & HWCAP_S390_STFLE);+}++/* Report whether the given facility is available. This function always+ performs a runtime check. */+static int have_facility_dynamic(facility_bit x)+{+#if ENABLE_DYNAMIC_FACILITY_DETECTION+ static struct {+ sljit_uw bits[4];+ } cpu_features;+ size_t size = sizeof(cpu_features);+ const sljit_uw word_index = x >> 6;+ const sljit_uw bit_index = ((1UL << 63) >> (x & 63));++ SLJIT_ASSERT(x < size * 8);+ if (SLJIT_UNLIKELY(!have_stfle()))+ return 0;++ if (SLJIT_UNLIKELY(cpu_features.bits[0] == 0)) {+ __asm__ __volatile__ (+ "lgr %%r0, %0;"+ "stfle 0(%1);"+ /* outputs */:+ /* inputs */: "d" ((size / 8) - 1), "a" (&cpu_features)+ /* clobbers */: "r0", "cc", "memory"+ );+ SLJIT_ASSERT(cpu_features.bits[0] != 0);+ }+ return (cpu_features.bits[word_index] & bit_index) != 0;+#else+ return 0;+#endif+}++#define HAVE_FACILITY(name, bit) \+static SLJIT_INLINE int name() \+{ \+ static int have = -1; \+ /* Static check first. May allow the function to be optimized away. */ \+ if (have_facility_static(bit)) \+ have = 1; \+ else if (SLJIT_UNLIKELY(have < 0)) \+ have = have_facility_dynamic(bit) ? 1 : 0; \+\+ return have; \+}++HAVE_FACILITY(have_eimm, EXTENDED_IMMEDIATE_FACILITY)+HAVE_FACILITY(have_ldisp, FAST_LONG_DISPLACEMENT_FACILITY)+HAVE_FACILITY(have_genext, GENERAL_INSTRUCTION_EXTENSION_FACILITY)+HAVE_FACILITY(have_lscond1, LOAD_STORE_ON_CONDITION_1_FACILITY)+HAVE_FACILITY(have_lscond2, LOAD_STORE_ON_CONDITION_2_FACILITY)+HAVE_FACILITY(have_misc2, MISCELLANEOUS_INSTRUCTION_EXTENSIONS_2_FACILITY)+#undef HAVE_FACILITY++#define is_u12(d) (0 <= (d) && (d) <= 0x00000fffL)+#define is_u32(d) (0 <= (d) && (d) <= 0xffffffffL)++#define CHECK_SIGNED(v, bitlen) \+ ((v) >= -(1 << ((bitlen) - 1)) && (v) < (1 << ((bitlen) - 1)))++#define is_s8(d) CHECK_SIGNED((d), 8)+#define is_s16(d) CHECK_SIGNED((d), 16)+#define is_s20(d) CHECK_SIGNED((d), 20)+#define is_s32(d) ((d) == (sljit_s32)(d))++static SLJIT_INLINE sljit_ins disp_s20(sljit_s32 d)+{+ SLJIT_ASSERT(is_s20(d));++ sljit_uw dh = (d >> 12) & 0xff;+ sljit_uw dl = (d << 8) & 0xfff00;+ return (dh | dl) << 8;+}++/* TODO(carenas): variadic macro is not strictly needed */+#define SLJIT_S390X_INSTRUCTION(op, ...) \+static SLJIT_INLINE sljit_ins op(__VA_ARGS__)++/* RR form instructions. */+#define SLJIT_S390X_RR(name, pattern) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src) \+{ \+ return (pattern) | ((dst & 0xf) << 4) | (src & 0xf); \+}++/* AND */+SLJIT_S390X_RR(nr, 0x1400)++/* BRANCH AND SAVE */+SLJIT_S390X_RR(basr, 0x0d00)++/* BRANCH ON CONDITION */+SLJIT_S390X_RR(bcr, 0x0700) /* TODO(mundaym): type for mask? */++/* DIVIDE */+SLJIT_S390X_RR(dr, 0x1d00)++/* EXCLUSIVE OR */+SLJIT_S390X_RR(xr, 0x1700)++/* LOAD */+SLJIT_S390X_RR(lr, 0x1800)++/* LOAD COMPLEMENT */+SLJIT_S390X_RR(lcr, 0x1300)++/* OR */+SLJIT_S390X_RR(or, 0x1600)++#undef SLJIT_S390X_RR++/* RRE form instructions */+#define SLJIT_S390X_RRE(name, pattern) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src) \+{ \+ return (pattern) | ((dst & 0xf) << 4) | (src & 0xf); \+}++/* AND */+SLJIT_S390X_RRE(ngr, 0xb9800000)++/* DIVIDE LOGICAL */+SLJIT_S390X_RRE(dlr, 0xb9970000)+SLJIT_S390X_RRE(dlgr, 0xb9870000)++/* DIVIDE SINGLE */+SLJIT_S390X_RRE(dsgr, 0xb90d0000)++/* EXCLUSIVE OR */+SLJIT_S390X_RRE(xgr, 0xb9820000)++/* LOAD */+SLJIT_S390X_RRE(lgr, 0xb9040000)+SLJIT_S390X_RRE(lgfr, 0xb9140000)++/* LOAD BYTE */+SLJIT_S390X_RRE(lbr, 0xb9260000)+SLJIT_S390X_RRE(lgbr, 0xb9060000)++/* LOAD COMPLEMENT */+SLJIT_S390X_RRE(lcgr, 0xb9030000)++/* LOAD HALFWORD */+SLJIT_S390X_RRE(lhr, 0xb9270000)+SLJIT_S390X_RRE(lghr, 0xb9070000)++/* LOAD LOGICAL */+SLJIT_S390X_RRE(llgfr, 0xb9160000)++/* LOAD LOGICAL CHARACTER */+SLJIT_S390X_RRE(llcr, 0xb9940000)+SLJIT_S390X_RRE(llgcr, 0xb9840000)++/* LOAD LOGICAL HALFWORD */+SLJIT_S390X_RRE(llhr, 0xb9950000)+SLJIT_S390X_RRE(llghr, 0xb9850000)++/* MULTIPLY LOGICAL */+SLJIT_S390X_RRE(mlgr, 0xb9860000)++/* MULTIPLY SINGLE */+SLJIT_S390X_RRE(msgfr, 0xb91c0000)++/* OR */+SLJIT_S390X_RRE(ogr, 0xb9810000)++/* SUBTRACT */+SLJIT_S390X_RRE(sgr, 0xb9090000)++#undef SLJIT_S390X_RRE++/* RI-a form instructions */+#define SLJIT_S390X_RIA(name, pattern, imm_type) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, imm_type imm) \+{ \+ return (pattern) | ((reg & 0xf) << 20) | (imm & 0xffff); \+}++/* ADD HALFWORD IMMEDIATE */+SLJIT_S390X_RIA(aghi, 0xa70b0000, sljit_s16)++/* LOAD HALFWORD IMMEDIATE */+SLJIT_S390X_RIA(lhi, 0xa7080000, sljit_s16)+SLJIT_S390X_RIA(lghi, 0xa7090000, sljit_s16)++/* LOAD LOGICAL IMMEDIATE */+SLJIT_S390X_RIA(llihh, 0xa50c0000, sljit_u16)+SLJIT_S390X_RIA(llihl, 0xa50d0000, sljit_u16)+SLJIT_S390X_RIA(llilh, 0xa50e0000, sljit_u16)+SLJIT_S390X_RIA(llill, 0xa50f0000, sljit_u16)++/* MULTIPLY HALFWORD IMMEDIATE */+SLJIT_S390X_RIA(mhi, 0xa70c0000, sljit_s16)+SLJIT_S390X_RIA(mghi, 0xa70d0000, sljit_s16)++/* OR IMMEDIATE */+SLJIT_S390X_RIA(oilh, 0xa50a0000, sljit_u16)++#undef SLJIT_S390X_RIA++/* RIL-a form instructions (requires extended immediate facility) */+#define SLJIT_S390X_RILA(name, pattern, imm_type) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, imm_type imm) \+{ \+ SLJIT_ASSERT(have_eimm()); \+ return (pattern) | ((sljit_ins)(reg & 0xf) << 36) | (imm & 0xffffffff); \+}++/* ADD IMMEDIATE */+SLJIT_S390X_RILA(agfi, 0xc20800000000, sljit_s32)++/* ADD IMMEDIATE HIGH */+SLJIT_S390X_RILA(aih, 0xcc0800000000, sljit_s32) /* TODO(mundaym): high-word facility? */++/* AND IMMEDIATE */+SLJIT_S390X_RILA(nihf, 0xc00a00000000, sljit_u32)++/* EXCLUSIVE OR IMMEDIATE */+SLJIT_S390X_RILA(xilf, 0xc00700000000, sljit_u32)++/* INSERT IMMEDIATE */+SLJIT_S390X_RILA(iihf, 0xc00800000000, sljit_u32)+SLJIT_S390X_RILA(iilf, 0xc00900000000, sljit_u32)++/* LOAD IMMEDIATE */+SLJIT_S390X_RILA(lgfi, 0xc00100000000, sljit_s32)++/* LOAD LOGICAL IMMEDIATE */+SLJIT_S390X_RILA(llihf, 0xc00e00000000, sljit_u32)+SLJIT_S390X_RILA(llilf, 0xc00f00000000, sljit_u32)++/* SUBTRACT LOGICAL IMMEDIATE */+SLJIT_S390X_RILA(slfi, 0xc20500000000, sljit_u32)++#undef SLJIT_S390X_RILA++/* RX-a form instructions */+#define SLJIT_S390X_RXA(name, pattern) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr r, sljit_u16 d, sljit_gpr x, sljit_gpr b) \+{ \+ sljit_ins ri, xi, bi, di; \+\+ SLJIT_ASSERT((d & 0xfff) == d); \+ ri = (sljit_ins)(r & 0xf) << 20; \+ xi = (sljit_ins)(x & 0xf) << 16; \+ bi = (sljit_ins)(b & 0xf) << 12; \+ di = (sljit_ins)(d & 0xfff); \+\+ return (pattern) | ri | xi | bi | di; \+}++/* LOAD */+SLJIT_S390X_RXA(l, 0x58000000)++/* LOAD ADDRESS */+SLJIT_S390X_RXA(la, 0x41000000)++/* LOAD HALFWORD */+SLJIT_S390X_RXA(lh, 0x48000000)++/* MULTIPLY SINGLE */+SLJIT_S390X_RXA(ms, 0x71000000)++/* STORE */+SLJIT_S390X_RXA(st, 0x50000000)++/* STORE CHARACTER */+SLJIT_S390X_RXA(stc, 0x42000000)++/* STORE HALFWORD */+SLJIT_S390X_RXA(sth, 0x40000000)++#undef SLJIT_S390X_RXA++/* RXY-a instructions */+#define SLJIT_S390X_RXYA(name, pattern, cond) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr r, sljit_s32 d, sljit_gpr x, sljit_gpr b) \+{ \+ sljit_ins ri, xi, bi, di; \+\+ SLJIT_ASSERT(cond); \+ ri = (sljit_ins)(r & 0xf) << 36; \+ xi = (sljit_ins)(x & 0xf) << 32; \+ bi = (sljit_ins)(b & 0xf) << 28; \+ di = disp_s20(d); \+\+ return (pattern) | ri | xi | bi | di; \+}++/* LOAD */+SLJIT_S390X_RXYA(ly, 0xe30000000058, have_ldisp())+SLJIT_S390X_RXYA(lg, 0xe30000000004, 1)+SLJIT_S390X_RXYA(lgf, 0xe30000000014, 1)++/* LOAD BYTE */+SLJIT_S390X_RXYA(lb, 0xe30000000076, have_ldisp())+SLJIT_S390X_RXYA(lgb, 0xe30000000077, have_ldisp())++/* LOAD HALFWORD */+SLJIT_S390X_RXYA(lhy, 0xe30000000078, have_ldisp())+SLJIT_S390X_RXYA(lgh, 0xe30000000015, 1)++/* LOAD LOGICAL */+SLJIT_S390X_RXYA(llgf, 0xe30000000016, 1)++/* LOAD LOGICAL CHARACTER */+SLJIT_S390X_RXYA(llc, 0xe30000000094, have_eimm())+SLJIT_S390X_RXYA(llgc, 0xe30000000090, 1)++/* LOAD LOGICAL HALFWORD */+SLJIT_S390X_RXYA(llh, 0xe30000000095, have_eimm())+SLJIT_S390X_RXYA(llgh, 0xe30000000091, 1)++/* MULTIPLY SINGLE */+SLJIT_S390X_RXYA(msy, 0xe30000000051, have_ldisp())+SLJIT_S390X_RXYA(msg, 0xe3000000000c, 1)++/* STORE */+SLJIT_S390X_RXYA(sty, 0xe30000000050, have_ldisp())+SLJIT_S390X_RXYA(stg, 0xe30000000024, 1)++/* STORE CHARACTER */+SLJIT_S390X_RXYA(stcy, 0xe30000000072, have_ldisp())++/* STORE HALFWORD */+SLJIT_S390X_RXYA(sthy, 0xe30000000070, have_ldisp())++#undef SLJIT_S390X_RXYA++/* RSY-a instructions */+#define SLJIT_S390X_RSYA(name, pattern, cond) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_sw d, sljit_gpr b) \+{ \+ sljit_ins r1, r3, b2, d2; \+\+ SLJIT_ASSERT(cond); \+ r1 = (sljit_ins)(dst & 0xf) << 36; \+ r3 = (sljit_ins)(src & 0xf) << 32; \+ b2 = (sljit_ins)(b & 0xf) << 28; \+ d2 = disp_s20(d); \+\+ return (pattern) | r1 | r3 | b2 | d2; \+}++/* LOAD MULTIPLE */+SLJIT_S390X_RSYA(lmg, 0xeb0000000004, 1)++/* SHIFT LEFT LOGICAL */+SLJIT_S390X_RSYA(sllg, 0xeb000000000d, 1)++/* SHIFT RIGHT SINGLE */+SLJIT_S390X_RSYA(srag, 0xeb000000000a, 1)++/* STORE MULTIPLE */+SLJIT_S390X_RSYA(stmg, 0xeb0000000024, 1)++#undef SLJIT_S390X_RSYA++/* RIE-f instructions (require general-instructions-extension facility) */+#define SLJIT_S390X_RIEF(name, pattern) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_u8 start, sljit_u8 end, sljit_u8 rot) \+{ \+ sljit_ins r1, r2, i3, i4, i5; \+\+ SLJIT_ASSERT(have_genext()); \+ r1 = (sljit_ins)(dst & 0xf) << 36; \+ r2 = (sljit_ins)(src & 0xf) << 32; \+ i3 = (sljit_ins)start << 24; \+ i4 = (sljit_ins)end << 16; \+ i5 = (sljit_ins)rot << 8; \+\+ return (pattern) | r1 | r2 | i3 | i4 | i5; \+}++/* ROTATE THEN AND SELECTED BITS */+/* SLJIT_S390X_RIEF(rnsbg, 0xec0000000054) */++/* ROTATE THEN EXCLUSIVE OR SELECTED BITS */+/* SLJIT_S390X_RIEF(rxsbg, 0xec0000000057) */++/* ROTATE THEN OR SELECTED BITS */+SLJIT_S390X_RIEF(rosbg, 0xec0000000056)++/* ROTATE THEN INSERT SELECTED BITS */+/* SLJIT_S390X_RIEF(risbg, 0xec0000000055) */+/* SLJIT_S390X_RIEF(risbgn, 0xec0000000059) */++/* ROTATE THEN INSERT SELECTED BITS HIGH */+SLJIT_S390X_RIEF(risbhg, 0xec000000005d)++/* ROTATE THEN INSERT SELECTED BITS LOW */+/* SLJIT_S390X_RIEF(risblg, 0xec0000000051) */++#undef SLJIT_S390X_RIEF++/* RRF-c instructions (require load/store-on-condition 1 facility) */+#define SLJIT_S390X_RRFC(name, pattern) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr dst, sljit_gpr src, sljit_uw mask) \+{ \+ sljit_ins r1, r2, m3; \+\+ SLJIT_ASSERT(have_lscond1()); \+ r1 = (sljit_ins)(dst & 0xf) << 4; \+ r2 = (sljit_ins)(src & 0xf); \+ m3 = (sljit_ins)(mask & 0xf) << 12; \+\+ return (pattern) | m3 | r1 | r2; \+}++/* LOAD HALFWORD IMMEDIATE ON CONDITION */+SLJIT_S390X_RRFC(locr, 0xb9f20000)+SLJIT_S390X_RRFC(locgr, 0xb9e20000)++#undef SLJIT_S390X_RRFC++/* RIE-g instructions (require load/store-on-condition 2 facility) */+#define SLJIT_S390X_RIEG(name, pattern) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, sljit_sw imm, sljit_uw mask) \+{ \+ sljit_ins r1, m3, i2; \+\+ SLJIT_ASSERT(have_lscond2()); \+ r1 = (sljit_ins)(reg & 0xf) << 36; \+ m3 = (sljit_ins)(mask & 0xf) << 32; \+ i2 = (sljit_ins)(imm & 0xffffL) << 16; \+\+ return (pattern) | r1 | m3 | i2; \+}++/* LOAD HALFWORD IMMEDIATE ON CONDITION */+SLJIT_S390X_RIEG(lochi, 0xec0000000042)+SLJIT_S390X_RIEG(locghi, 0xec0000000046)++#undef SLJIT_S390X_RIEG++#define SLJIT_S390X_RILB(name, pattern, cond) \+SLJIT_S390X_INSTRUCTION(name, sljit_gpr reg, sljit_sw ri) \+{ \+ sljit_ins r1, ri2; \+\+ SLJIT_ASSERT(cond); \+ r1 = (sljit_ins)(reg & 0xf) << 36; \+ ri2 = (sljit_ins)(ri & 0xffffffff); \+\+ return (pattern) | r1 | ri2; \+}++/* BRANCH RELATIVE AND SAVE LONG */+SLJIT_S390X_RILB(brasl, 0xc00500000000, 1)++/* LOAD ADDRESS RELATIVE LONG */+SLJIT_S390X_RILB(larl, 0xc00000000000, 1)++/* LOAD RELATIVE LONG */+SLJIT_S390X_RILB(lgrl, 0xc40800000000, have_genext())++#undef SLJIT_S390X_RILB++SLJIT_S390X_INSTRUCTION(br, sljit_gpr target)+{+ return 0x07f0 | target;+}++SLJIT_S390X_INSTRUCTION(brc, sljit_uw mask, sljit_sw target)+{+ sljit_ins m1 = (sljit_ins)(mask & 0xf) << 20;+ sljit_ins ri2 = (sljit_ins)target & 0xffff;+ return 0xa7040000L | m1 | ri2;+}++SLJIT_S390X_INSTRUCTION(brcl, sljit_uw mask, sljit_sw target)+{+ sljit_ins m1 = (sljit_ins)(mask & 0xf) << 36;+ sljit_ins ri2 = (sljit_ins)target & 0xffffffff;+ return 0xc00400000000L | m1 | ri2;+}++SLJIT_S390X_INSTRUCTION(flogr, sljit_gpr dst, sljit_gpr src)+{+ sljit_ins r1 = ((sljit_ins)dst & 0xf) << 8;+ sljit_ins r2 = ((sljit_ins)src & 0xf);+ SLJIT_ASSERT(have_eimm());+ return 0xb9830000 | r1 | r2;+}++/* INSERT PROGRAM MASK */+SLJIT_S390X_INSTRUCTION(ipm, sljit_gpr dst)+{+ return 0xb2220000 | ((sljit_ins)(dst & 0xf) << 4);+}++/* SET PROGRAM MASK */+SLJIT_S390X_INSTRUCTION(spm, sljit_gpr dst)+{+ return 0x0400 | ((sljit_ins)(dst & 0xf) << 4);+}++/* ROTATE THEN INSERT SELECTED BITS HIGH (ZERO) */+SLJIT_S390X_INSTRUCTION(risbhgz, sljit_gpr dst, sljit_gpr src, sljit_u8 start, sljit_u8 end, sljit_u8 rot)+{+ return risbhg(dst, src, start, 0x8 | end, rot);+}++#undef SLJIT_S390X_INSTRUCTION++static sljit_s32 update_zero_overflow(struct sljit_compiler *compiler, sljit_s32 op, sljit_gpr dst_r)+{+ /* Condition codes: bits 18 and 19.+ Transformation:+ 0 (zero and no overflow) : unchanged+ 1 (non-zero and no overflow) : unchanged+ 2 (zero and overflow) : decreased by 1+ 3 (non-zero and overflow) : decreased by 1 if non-zero */+ FAIL_IF(push_inst(compiler, brc(0xc, 2 + 2 + ((op & SLJIT_I32_OP) ? 1 : 2) + 2 + 3 + 1)));+ FAIL_IF(push_inst(compiler, ipm(flag_r)));+ FAIL_IF(push_inst(compiler, (op & SLJIT_I32_OP) ? or(dst_r, dst_r) : ogr(dst_r, dst_r)));+ FAIL_IF(push_inst(compiler, brc(0x8, 2 + 3)));+ FAIL_IF(push_inst(compiler, slfi(flag_r, 0x10000000)));+ FAIL_IF(push_inst(compiler, spm(flag_r)));+ return SLJIT_SUCCESS;+}++/* load 64-bit immediate into register without clobbering flags */+static sljit_s32 push_load_imm_inst(struct sljit_compiler *compiler, sljit_gpr target, sljit_sw v)+{+ /* 4 byte instructions */+ if (is_s16(v))+ return push_inst(compiler, lghi(target, (sljit_s16)v));++ if ((sljit_uw)v == (v & 0x000000000000ffffU))+ return push_inst(compiler, llill(target, (sljit_u16)v));++ if ((sljit_uw)v == (v & 0x00000000ffff0000U))+ return push_inst(compiler, llilh(target, (sljit_u16)(v >> 16)));++ if ((sljit_uw)v == (v & 0x0000ffff00000000U))+ return push_inst(compiler, llihl(target, (sljit_u16)(v >> 32)));++ if ((sljit_uw)v == (v & 0xffff000000000000U))+ return push_inst(compiler, llihh(target, (sljit_u16)(v >> 48)));++ /* 6 byte instructions (requires extended immediate facility) */+ if (have_eimm()) {+ if (is_s32(v))+ return push_inst(compiler, lgfi(target, (sljit_s32)v));++ if ((sljit_uw)v == (v & 0x00000000ffffffffU))+ return push_inst(compiler, llilf(target, (sljit_u32)v));++ if ((sljit_uw)v == (v & 0xffffffff00000000U))+ return push_inst(compiler, llihf(target, (sljit_u32)(v >> 32)));++ FAIL_IF(push_inst(compiler, llilf(target, (sljit_u32)v)));+ return push_inst(compiler, iihf(target, (sljit_u32)(v >> 32)));+ }+ /* TODO(mundaym): instruction sequences that don't use extended immediates */+ abort();+}++struct addr {+ sljit_gpr base;+ sljit_gpr index;+ sljit_sw offset;+};++/* transform memory operand into D(X,B) form with a signed 20-bit offset */+static sljit_s32 make_addr_bxy(struct sljit_compiler *compiler,+ struct addr *addr, sljit_s32 mem, sljit_sw off,+ sljit_gpr tmp /* clobbered, must not be r0 */)+{+ sljit_gpr base = r0;+ sljit_gpr index = r0;++ SLJIT_ASSERT(tmp != r0);+ if (mem & REG_MASK)+ base = gpr(mem & REG_MASK);++ if (mem & OFFS_REG_MASK) {+ index = gpr(OFFS_REG(mem));+ if (off != 0) {+ /* shift and put the result into tmp */+ SLJIT_ASSERT(0 <= off && off < 64);+ FAIL_IF(push_inst(compiler, sllg(tmp, index, off, 0)));+ index = tmp;+ off = 0; /* clear offset */+ }+ }+ else if (!is_s20(off)) {+ FAIL_IF(push_load_imm_inst(compiler, tmp, off));+ index = tmp;+ off = 0; /* clear offset */+ }+ addr->base = base;+ addr->index = index;+ addr->offset = off;+ return SLJIT_SUCCESS;+}++/* transform memory operand into D(X,B) form with an unsigned 12-bit offset */+static sljit_s32 make_addr_bx(struct sljit_compiler *compiler,+ struct addr *addr, sljit_s32 mem, sljit_sw off,+ sljit_gpr tmp /* clobbered, must not be r0 */)+{+ sljit_gpr base = r0;+ sljit_gpr index = r0;++ SLJIT_ASSERT(tmp != r0);+ if (mem & REG_MASK)+ base = gpr(mem & REG_MASK);++ if (mem & OFFS_REG_MASK) {+ index = gpr(OFFS_REG(mem));+ if (off != 0) {+ /* shift and put the result into tmp */+ SLJIT_ASSERT(0 <= off && off < 64);+ FAIL_IF(push_inst(compiler, sllg(tmp, index, off, 0)));+ index = tmp;+ off = 0; /* clear offset */+ }+ }+ else if (!is_u12(off)) {+ FAIL_IF(push_load_imm_inst(compiler, tmp, off));+ index = tmp;+ off = 0; /* clear offset */+ }+ addr->base = base;+ addr->index = index;+ addr->offset = off;+ return SLJIT_SUCCESS;+}++#define EVAL(op, r, addr) op(r, addr.offset, addr.index, addr.base)+#define WHEN(cond, r, i1, i2, addr) \+ (cond) ? EVAL(i1, r, addr) : EVAL(i2, r, addr)++/* May clobber tmp1. */+static sljit_s32 load_word(struct sljit_compiler *compiler, sljit_gpr dst,+ sljit_s32 src, sljit_sw srcw,+ sljit_s32 is_32bit)+{+ struct addr addr;+ sljit_ins ins;++ SLJIT_ASSERT(src & SLJIT_MEM);+ if (have_ldisp() || !is_32bit)+ FAIL_IF(make_addr_bxy(compiler, &addr, src, srcw, tmp1));+ else+ FAIL_IF(make_addr_bx(compiler, &addr, src, srcw, tmp1));++ if (is_32bit)+ ins = WHEN(is_u12(addr.offset), dst, l, ly, addr);+ else+ ins = lg(dst, addr.offset, addr.index, addr.base);++ return push_inst(compiler, ins);+}++/* May clobber tmp1. */+static sljit_s32 store_word(struct sljit_compiler *compiler, sljit_gpr src,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 is_32bit)+{+ struct addr addr;+ sljit_ins ins;++ SLJIT_ASSERT(dst & SLJIT_MEM);+ if (have_ldisp() || !is_32bit)+ FAIL_IF(make_addr_bxy(compiler, &addr, dst, dstw, tmp1));+ else+ FAIL_IF(make_addr_bx(compiler, &addr, dst, dstw, tmp1));++ if (is_32bit)+ ins = WHEN(is_u12(addr.offset), src, st, sty, addr);+ else+ ins = stg(src, addr.offset, addr.index, addr.base);++ return push_inst(compiler, ins);+}++#undef WHEN++static sljit_s32 emit_move(struct sljit_compiler *compiler,+ sljit_gpr dst_r,+ sljit_s32 src, sljit_sw srcw)+{+ SLJIT_ASSERT(!SLOW_IS_REG(src) || dst_r != gpr(src & REG_MASK));++ if (src & SLJIT_IMM)+ return push_load_imm_inst(compiler, dst_r, srcw);++ if (src & SLJIT_MEM)+ return load_word(compiler, dst_r, src, srcw, (compiler->mode & SLJIT_I32_OP) != 0);++ sljit_gpr src_r = gpr(src & REG_MASK);+ return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, src_r) : lgr(dst_r, src_r));+}++static sljit_s32 emit_rr(struct sljit_compiler *compiler, sljit_ins ins,+ sljit_s32 dst,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ sljit_gpr dst_r = tmp0;+ sljit_gpr src_r = tmp1;+ sljit_s32 needs_move = 1;++ if (SLOW_IS_REG(dst)) {+ dst_r = gpr(dst & REG_MASK);++ if (dst == src1)+ needs_move = 0;+ else if (dst == src2) {+ dst_r = tmp0;+ needs_move = 2;+ }+ }++ if (needs_move)+ FAIL_IF(emit_move(compiler, dst_r, src1, src1w));++ if (FAST_IS_REG(src2))+ src_r = gpr(src2 & REG_MASK);+ else+ FAIL_IF(emit_move(compiler, tmp1, src2, src2w));++ FAIL_IF(push_inst(compiler, ins | (dst_r << 4) | src_r));++ if (needs_move != 2)+ return SLJIT_SUCCESS;++ dst_r = gpr(dst & REG_MASK);+ return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, tmp0) : lgr(dst_r, tmp0));+}++static sljit_s32 emit_rrf(struct sljit_compiler *compiler, sljit_ins ins,+ sljit_s32 dst,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;+ sljit_gpr src1_r = tmp0;+ sljit_gpr src2_r = tmp1;++ if (FAST_IS_REG(src1))+ src1_r = gpr(src1 & REG_MASK);+ else+ FAIL_IF(emit_move(compiler, tmp0, src1, src1w));++ if (FAST_IS_REG(src2))+ src2_r = gpr(src2 & REG_MASK);+ else+ FAIL_IF(emit_move(compiler, tmp1, src2, src2w));++ return push_inst(compiler, ins | (dst_r << 4) | src1_r | (src2_r << 12));+}++typedef enum {+ RI_A,+ RIL_A,+} emit_ril_type;++static sljit_s32 emit_ri(struct sljit_compiler *compiler, sljit_ins ins,+ sljit_s32 dst,+ sljit_s32 src1, sljit_sw src1w,+ sljit_sw src2w,+ emit_ril_type type)+{+ sljit_gpr dst_r = tmp0;+ sljit_s32 needs_move = 1;++ if (SLOW_IS_REG(dst)) {+ dst_r = gpr(dst & REG_MASK);++ if (dst == src1)+ needs_move = 0;+ }++ if (needs_move)+ FAIL_IF(emit_move(compiler, dst_r, src1, src1w));++ if (type == RIL_A)+ return push_inst(compiler, ins | (dst_r << 36) | (src2w & 0xffffffff));+ return push_inst(compiler, ins | (dst_r << 20) | (src2w & 0xffff));+}++static sljit_s32 emit_rie_d(struct sljit_compiler *compiler, sljit_ins ins,+ sljit_s32 dst,+ sljit_s32 src1, sljit_sw src1w,+ sljit_sw src2w)+{+ sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;+ sljit_gpr src_r = tmp0;++ if (!SLOW_IS_REG(src1))+ FAIL_IF(emit_move(compiler, tmp0, src1, src1w));+ else+ src_r = gpr(src1 & REG_MASK);++ return push_inst(compiler, ins | (dst_r << 36) | (src_r << 32) | (src2w & 0xffff) << 16);+}++typedef enum {+ RX_A,+ RXY_A,+} emit_rx_type;++static sljit_s32 emit_rx(struct sljit_compiler *compiler, sljit_ins ins,+ sljit_s32 dst,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w,+ emit_rx_type type)+{+ sljit_gpr dst_r = tmp0;+ sljit_s32 needs_move = 1;+ sljit_gpr base, index;++ SLJIT_ASSERT(src2 & SLJIT_MEM);++ if (SLOW_IS_REG(dst)) {+ dst_r = gpr(dst);++ if (dst == src1)+ needs_move = 0;+ else if (dst == (src2 & REG_MASK) || (dst == OFFS_REG(src2))) {+ dst_r = tmp0;+ needs_move = 2;+ }+ }++ if (needs_move)+ FAIL_IF(emit_move(compiler, dst_r, src1, src1w));++ base = gpr(src2 & REG_MASK);+ index = tmp0;++ if (src2 & OFFS_REG_MASK) {+ index = gpr(OFFS_REG(src2));++ if (src2w != 0) {+ FAIL_IF(push_inst(compiler, sllg(tmp1, index, src2w & 0x3, 0)));+ src2w = 0;+ index = tmp1;+ }+ } else if ((type == RX_A && !is_u12(src2w)) || (type == RXY_A && !is_s20(src2w))) {+ FAIL_IF(push_load_imm_inst(compiler, tmp1, src2w));++ if (src2 & REG_MASK)+ index = tmp1;+ else+ base = tmp1;+ src2w = 0;+ }++ if (type == RX_A)+ ins |= (dst_r << 20) | (index << 16) | (base << 12) | src2w;+ else+ ins |= (dst_r << 36) | (index << 32) | (base << 28) | disp_s20(src2w);++ FAIL_IF(push_inst(compiler, ins));++ if (needs_move != 2)+ return SLJIT_SUCCESS;++ dst_r = gpr(dst);+ return push_inst(compiler, (compiler->mode & SLJIT_I32_OP) ? lr(dst_r, tmp0) : lgr(dst_r, tmp0));+}++static sljit_s32 emit_siy(struct sljit_compiler *compiler, sljit_ins ins,+ sljit_s32 dst, sljit_sw dstw,+ sljit_sw srcw)+{+ SLJIT_ASSERT(dst & SLJIT_MEM);++ sljit_gpr dst_r = tmp1;++ if (dst & OFFS_REG_MASK) {+ sljit_gpr index = tmp1;++ if ((dstw & 0x3) == 0)+ index = gpr(OFFS_REG(dst));+ else+ FAIL_IF(push_inst(compiler, sllg(tmp1, index, dstw & 0x3, 0)));++ FAIL_IF(push_inst(compiler, la(tmp1, 0, dst_r, index)));+ dstw = 0;+ }+ else if (!is_s20(dstw)) {+ FAIL_IF(push_load_imm_inst(compiler, tmp1, dstw));++ if (dst & REG_MASK)+ FAIL_IF(push_inst(compiler, la(tmp1, 0, dst_r, tmp1)));++ dstw = 0;+ }+ else+ dst_r = gpr(dst & REG_MASK);++ return push_inst(compiler, ins | ((srcw & 0xff) << 32) | (dst_r << 28) | disp_s20(dstw));+}++struct ins_forms {+ sljit_ins op_r;+ sljit_ins op_gr;+ sljit_ins op_rk;+ sljit_ins op_grk;+ sljit_ins op;+ sljit_ins op_y;+ sljit_ins op_g;+};++static sljit_s32 emit_commutative(struct sljit_compiler *compiler, const struct ins_forms *forms,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ sljit_s32 mode = compiler->mode;+ sljit_ins ins, ins_k;++ if ((src1 | src2) & SLJIT_MEM) {+ sljit_ins ins12, ins20;++ if (mode & SLJIT_I32_OP) {+ ins12 = forms->op;+ ins20 = forms->op_y;+ }+ else {+ ins12 = 0;+ ins20 = forms->op_g;+ }++ if (ins12 && ins20) {+ /* Extra instructions needed for address computation can be executed independently. */+ if ((src2 & SLJIT_MEM) && (!(src1 & SLJIT_MEM)+ || ((src1 & OFFS_REG_MASK) ? (src1w & 0x3) == 0 : is_s20(src1w)))) {+ if ((src2 & OFFS_REG_MASK) || is_u12(src2w) || !is_s20(src2w))+ return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A);++ return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A);+ }++ if (src1 & SLJIT_MEM) {+ if ((src1 & OFFS_REG_MASK) || is_u12(src1w) || !is_s20(src1w))+ return emit_rx(compiler, ins12, dst, src2, src2w, src1, src1w, RX_A);++ return emit_rx(compiler, ins20, dst, src2, src2w, src1, src1w, RXY_A);+ }+ }+ else if (ins12 || ins20) {+ emit_rx_type rx_type;++ if (ins12) {+ rx_type = RX_A;+ ins = ins12;+ }+ else {+ rx_type = RXY_A;+ ins = ins20;+ }++ if ((src2 & SLJIT_MEM) && (!(src1 & SLJIT_MEM)+ || ((src1 & OFFS_REG_MASK) ? (src1w & 0x3) == 0 : (rx_type == RX_A ? is_u12(src1w) : is_s20(src1w)))))+ return emit_rx(compiler, ins, dst, src1, src1w, src2, src2w, rx_type);++ if (src1 & SLJIT_MEM)+ return emit_rx(compiler, ins, dst, src2, src2w, src1, src1w, rx_type);+ }+ }++ if (mode & SLJIT_I32_OP) {+ ins = forms->op_r;+ ins_k = forms->op_rk;+ }+ else {+ ins = forms->op_gr;+ ins_k = forms->op_grk;+ }++ SLJIT_ASSERT(ins != 0 || ins_k != 0);++ if (ins && SLOW_IS_REG(dst)) {+ if (dst == src1)+ return emit_rr(compiler, ins, dst, src1, src1w, src2, src2w);++ if (dst == src2)+ return emit_rr(compiler, ins, dst, src2, src2w, src1, src1w);+ }++ if (ins_k == 0)+ return emit_rr(compiler, ins, dst, src1, src1w, src2, src2w);++ return emit_rrf(compiler, ins_k, dst, src1, src1w, src2, src2w);+}++static sljit_s32 emit_non_commutative(struct sljit_compiler *compiler, const struct ins_forms *forms,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ sljit_s32 mode = compiler->mode;+ sljit_ins ins;++ if (src2 & SLJIT_MEM) {+ sljit_ins ins12, ins20;++ if (mode & SLJIT_I32_OP) {+ ins12 = forms->op;+ ins20 = forms->op_y;+ }+ else {+ ins12 = 0;+ ins20 = forms->op_g;+ }++ if (ins12 && ins20) {+ if ((src2 & OFFS_REG_MASK) || is_u12(src2w) || !is_s20(src2w))+ return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A);++ return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A);+ }+ else if (ins12)+ return emit_rx(compiler, ins12, dst, src1, src1w, src2, src2w, RX_A);+ else if (ins20)+ return emit_rx(compiler, ins20, dst, src1, src1w, src2, src2w, RXY_A);+ }++ ins = (mode & SLJIT_I32_OP) ? forms->op_rk : forms->op_grk;++ if (ins == 0 || (SLOW_IS_REG(dst) && dst == src1))+ return emit_rr(compiler, (mode & SLJIT_I32_OP) ? forms->op_r : forms->op_gr, dst, src1, src1w, src2, src2w);++ return emit_rrf(compiler, ins, dst, src1, src1w, src2, src2w);+}++SLJIT_API_FUNC_ATTRIBUTE void* sljit_generate_code(struct sljit_compiler *compiler)+{+ struct sljit_label *label;+ struct sljit_jump *jump;+ struct sljit_s390x_const *const_;+ struct sljit_put_label *put_label;+ sljit_sw executable_offset;+ sljit_uw ins_size = 0; /* instructions */+ sljit_uw pool_size = 0; /* literal pool */+ sljit_uw pad_size;+ sljit_uw i, j = 0;+ struct sljit_memory_fragment *buf;+ void *code, *code_ptr;+ sljit_uw *pool, *pool_ptr;++ sljit_uw source;+ sljit_sw offset; /* TODO(carenas): only need 32 bit */++ CHECK_ERROR_PTR();+ CHECK_PTR(check_sljit_generate_code(compiler));+ reverse_buf(compiler);++ /* branch handling */+ label = compiler->labels;+ jump = compiler->jumps;+ put_label = compiler->put_labels;++ /* TODO(carenas): compiler->executable_size could be calculated+ * before to avoid the following loop (except for+ * pool_size)+ */+ /* calculate the size of the code */+ for (buf = compiler->buf; buf != NULL; buf = buf->next) {+ sljit_uw len = buf->used_size / sizeof(sljit_ins);+ sljit_ins *ibuf = (sljit_ins *)buf->memory;+ for (i = 0; i < len; ++i, ++j) {+ sljit_ins ins = ibuf[i];++ /* TODO(carenas): instruction tag vs size/addr == j+ * using instruction tags for const is creative+ * but unlike all other architectures, and is not+ * done consistently for all other objects.+ * This might need reviewing later.+ */+ if (ins & sljit_ins_const) {+ pool_size += sizeof(*pool);+ ins &= ~sljit_ins_const;+ }+ if (label && label->size == j) {+ label->size = ins_size;+ label = label->next;+ }+ if (jump && jump->addr == j) {+ if ((jump->flags & SLJIT_REWRITABLE_JUMP) || (jump->flags & JUMP_ADDR)) {+ /* encoded: */+ /* brasl %r14, <rel_addr> (or brcl <mask>, <rel_addr>) */+ /* replace with: */+ /* lgrl %r1, <pool_addr> */+ /* bras %r14, %r1 (or bcr <mask>, %r1) */+ pool_size += sizeof(*pool);+ ins_size += 2;+ }+ jump = jump->next;+ }+ if (put_label && put_label->addr == j) {+ pool_size += sizeof(*pool);+ put_label = put_label->next;+ }+ ins_size += sizeof_ins(ins);+ }+ }++ /* emit trailing label */+ if (label && label->size == j) {+ label->size = ins_size;+ label = label->next;+ }++ SLJIT_ASSERT(!label);+ SLJIT_ASSERT(!jump);+ SLJIT_ASSERT(!put_label);++ /* pad code size to 8 bytes so is accessible with half word offsets */+ /* the literal pool needs to be doubleword aligned */+ pad_size = ((ins_size + 7UL) & ~7UL) - ins_size;+ SLJIT_ASSERT(pad_size < 8UL);++ /* allocate target buffer */+ code = SLJIT_MALLOC_EXEC(ins_size + pad_size + pool_size,+ compiler->exec_allocator_data);+ PTR_FAIL_WITH_EXEC_IF(code);+ code_ptr = code;+ executable_offset = SLJIT_EXEC_OFFSET(code);++ /* TODO(carenas): pool is optional, and the ABI recommends it to+ * be created before the function code, instead of+ * globally; if generated code is too big could+ * need offsets bigger than 32bit words and asser()+ */+ pool = (sljit_uw *)((sljit_uw)code + ins_size + pad_size);+ pool_ptr = pool;+ const_ = (struct sljit_s390x_const *)compiler->consts;++ /* update label addresses */+ label = compiler->labels;+ while (label) {+ label->addr = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(+ (sljit_uw)code_ptr + label->size, executable_offset);+ label = label->next;+ }++ /* reset jumps */+ jump = compiler->jumps;+ put_label = compiler->put_labels;++ /* emit the code */+ j = 0;+ for (buf = compiler->buf; buf != NULL; buf = buf->next) {+ sljit_uw len = buf->used_size / sizeof(sljit_ins);+ sljit_ins *ibuf = (sljit_ins *)buf->memory;+ for (i = 0; i < len; ++i, ++j) {+ sljit_ins ins = ibuf[i];+ if (ins & sljit_ins_const) {+ /* clear the const tag */+ ins &= ~sljit_ins_const;++ /* update instruction with relative address of constant */+ source = (sljit_uw)code_ptr;+ offset = (sljit_uw)pool_ptr - source;+ SLJIT_ASSERT(!(offset & 1));+ offset >>= 1; /* halfword (not byte) offset */+ SLJIT_ASSERT(is_s32(offset));+ ins |= (sljit_ins)offset & 0xffffffff;++ /* update address */+ const_->const_.addr = (sljit_uw)pool_ptr;++ /* store initial value into pool and update pool address */+ *(pool_ptr++) = const_->init_value;++ /* move to next constant */+ const_ = (struct sljit_s390x_const *)const_->const_.next;+ }+ if (jump && jump->addr == j) {+ sljit_sw target = (jump->flags & JUMP_LABEL) ? jump->u.label->addr : jump->u.target;+ if ((jump->flags & SLJIT_REWRITABLE_JUMP) || (jump->flags & JUMP_ADDR)) {+ jump->addr = (sljit_uw)pool_ptr;++ /* load address into tmp1 */+ source = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);+ offset = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(pool_ptr, executable_offset) - source;+ SLJIT_ASSERT(!(offset & 1));+ offset >>= 1;+ SLJIT_ASSERT(is_s32(offset));+ encode_inst(&code_ptr,+ lgrl(tmp1, offset & 0xffffffff));++ /* store jump target into pool and update pool address */+ *(pool_ptr++) = target;++ /* branch to tmp1 */+ sljit_ins op = (ins >> 32) & 0xf;+ sljit_ins arg = (ins >> 36) & 0xf;+ switch (op) {+ case 4: /* brcl -> bcr */+ ins = bcr(arg, tmp1);+ break;+ case 5: /* brasl -> basr */+ ins = basr(arg, tmp1);+ break;+ default:+ abort();+ }+ }+ else {+ jump->addr = (sljit_uw)code_ptr + 2;+ source = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);+ offset = target - source;++ /* offset must be halfword aligned */+ SLJIT_ASSERT(!(offset & 1));+ offset >>= 1;+ SLJIT_ASSERT(is_s32(offset)); /* TODO(mundaym): handle arbitrary offsets */++ /* patch jump target */+ ins |= (sljit_ins)offset & 0xffffffff;+ }+ jump = jump->next;+ }+ if (put_label && put_label->addr == j) {+ source = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);++ SLJIT_ASSERT(put_label->label);+ put_label->addr = (sljit_uw)code_ptr;++ /* store target into pool */+ *pool_ptr = put_label->label->addr;+ offset = (sljit_uw)SLJIT_ADD_EXEC_OFFSET(pool_ptr, executable_offset) - source;+ pool_ptr++;++ SLJIT_ASSERT(!(offset & 1));+ offset >>= 1;+ SLJIT_ASSERT(is_s32(offset));+ ins |= (sljit_ins)offset & 0xffffffff;++ put_label = put_label->next;+ }+ encode_inst(&code_ptr, ins);+ }+ }+ SLJIT_ASSERT((sljit_u8 *)code + ins_size == code_ptr);+ SLJIT_ASSERT((sljit_u8 *)pool + pool_size == (sljit_u8 *)pool_ptr);++ compiler->error = SLJIT_ERR_COMPILED;+ compiler->executable_offset = executable_offset;+ compiler->executable_size = ins_size;+ code = SLJIT_ADD_EXEC_OFFSET(code, executable_offset);+ code_ptr = SLJIT_ADD_EXEC_OFFSET(code_ptr, executable_offset);+ SLJIT_CACHE_FLUSH(code, code_ptr);+ SLJIT_UPDATE_WX_FLAGS(code, code_ptr, 1);+ return code;+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_has_cpu_feature(sljit_s32 feature_type)+{+ /* TODO(mundaym): implement all */+ switch (feature_type) {+ case SLJIT_HAS_CLZ:+ return have_eimm() ? 1 : 0; /* FLOGR instruction */+ case SLJIT_HAS_CMOV:+ return have_lscond1() ? 1 : 0;+ case SLJIT_HAS_FPU:+ return 0;+ }+ return 0;+}++/* --------------------------------------------------------------------- */+/* Entry, exit */+/* --------------------------------------------------------------------- */++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_enter(struct sljit_compiler *compiler,+ sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,+ sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)+{+ sljit_s32 args = get_arg_count(arg_types);+ sljit_sw frame_size;++ CHECK_ERROR();+ CHECK(check_sljit_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));+ set_emit_enter(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);++ /* saved registers go in callee allocated save area */+ compiler->local_size = (local_size + 0xf) & ~0xf;+ frame_size = compiler->local_size + SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE;++ FAIL_IF(push_inst(compiler, stmg(r6, r15, r6 * sizeof(sljit_sw), r15))); /* save registers TODO(MGM): optimize */+ if (frame_size != 0) {+ if (is_s16(-frame_size))+ FAIL_IF(push_inst(compiler, aghi(r15, -((sljit_s16)frame_size))));+ else if (is_s32(-frame_size))+ FAIL_IF(push_inst(compiler, agfi(r15, -((sljit_s32)frame_size))));+ else {+ FAIL_IF(push_load_imm_inst(compiler, tmp1, -frame_size));+ FAIL_IF(push_inst(compiler, la(r15, 0, tmp1, r15)));+ }+ }++ if (args >= 1)+ FAIL_IF(push_inst(compiler, lgr(gpr(SLJIT_S0), gpr(SLJIT_R0))));+ if (args >= 2)+ FAIL_IF(push_inst(compiler, lgr(gpr(SLJIT_S1), gpr(SLJIT_R1))));+ if (args >= 3)+ FAIL_IF(push_inst(compiler, lgr(gpr(SLJIT_S2), gpr(SLJIT_R2))));+ SLJIT_ASSERT(args < 4);++ return SLJIT_SUCCESS;+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_set_context(struct sljit_compiler *compiler,+ sljit_s32 options, sljit_s32 arg_types, sljit_s32 scratches, sljit_s32 saveds,+ sljit_s32 fscratches, sljit_s32 fsaveds, sljit_s32 local_size)+{+ CHECK_ERROR();+ CHECK(check_sljit_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size));+ set_set_context(compiler, options, arg_types, scratches, saveds, fscratches, fsaveds, local_size);++ /* TODO(mundaym): stack space for saved floating point registers */+ compiler->local_size = (local_size + 0xf) & ~0xf;+ return SLJIT_SUCCESS;+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_return(struct sljit_compiler *compiler, sljit_s32 op, sljit_s32 src, sljit_sw srcw)+{+ sljit_sw size;+ sljit_gpr end;++ CHECK_ERROR();+ CHECK(check_sljit_emit_return(compiler, op, src, srcw));++ FAIL_IF(emit_mov_before_return(compiler, op, src, srcw));++ size = compiler->local_size + SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE + (r6 * sizeof(sljit_sw));+ if (!is_s20(size)) {+ FAIL_IF(push_load_imm_inst(compiler, tmp1, compiler->local_size + SLJIT_S390X_DEFAULT_STACK_FRAME_SIZE));+ FAIL_IF(push_inst(compiler, la(r15, 0, tmp1, r15)));+ size = r6 * sizeof(sljit_sw);+ end = r14; /* r15 has been restored already */+ }+ else+ end = r15;++ FAIL_IF(push_inst(compiler, lmg(r6, end, size, r15))); /* restore registers TODO(MGM): optimize */+ FAIL_IF(push_inst(compiler, br(r14))); /* return */++ return SLJIT_SUCCESS;+}++/* --------------------------------------------------------------------- */+/* Operators */+/* --------------------------------------------------------------------- */++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op0(struct sljit_compiler *compiler, sljit_s32 op)+{+ sljit_gpr arg0 = gpr(SLJIT_R0);+ sljit_gpr arg1 = gpr(SLJIT_R1);++ CHECK_ERROR();+ CHECK(check_sljit_emit_op0(compiler, op));++ op = GET_OPCODE(op) | (op & SLJIT_I32_OP);+ switch (op) {+ case SLJIT_BREAKPOINT:+ /* The following invalid instruction is emitted by gdb. */+ return push_inst(compiler, 0x0001 /* 2-byte trap */);+ case SLJIT_NOP:+ return push_inst(compiler, 0x0700 /* 2-byte nop */);+ case SLJIT_LMUL_UW:+ FAIL_IF(push_inst(compiler, mlgr(arg0, arg0)));+ break;+ case SLJIT_LMUL_SW:+ /* signed multiplication from: */+ /* Hacker's Delight, Second Edition: Chapter 8-3. */+ FAIL_IF(push_inst(compiler, srag(tmp0, arg0, 63, 0)));+ FAIL_IF(push_inst(compiler, srag(tmp1, arg1, 63, 0)));+ FAIL_IF(push_inst(compiler, ngr(tmp0, arg1)));+ FAIL_IF(push_inst(compiler, ngr(tmp1, arg0)));++ /* unsigned multiplication */+ FAIL_IF(push_inst(compiler, mlgr(arg0, arg0)));++ FAIL_IF(push_inst(compiler, sgr(arg0, tmp0)));+ FAIL_IF(push_inst(compiler, sgr(arg0, tmp1)));+ break;+ case SLJIT_DIV_U32:+ case SLJIT_DIVMOD_U32:+ FAIL_IF(push_inst(compiler, lhi(tmp0, 0)));+ FAIL_IF(push_inst(compiler, lr(tmp1, arg0)));+ FAIL_IF(push_inst(compiler, dlr(tmp0, arg1)));+ FAIL_IF(push_inst(compiler, lr(arg0, tmp1))); /* quotient */+ if (op == SLJIT_DIVMOD_U32)+ return push_inst(compiler, lr(arg1, tmp0)); /* remainder */++ return SLJIT_SUCCESS;+ case SLJIT_DIV_S32:+ case SLJIT_DIVMOD_S32:+ FAIL_IF(push_inst(compiler, lhi(tmp0, 0)));+ FAIL_IF(push_inst(compiler, lr(tmp1, arg0)));+ FAIL_IF(push_inst(compiler, dr(tmp0, arg1)));+ FAIL_IF(push_inst(compiler, lr(arg0, tmp1))); /* quotient */+ if (op == SLJIT_DIVMOD_S32)+ return push_inst(compiler, lr(arg1, tmp0)); /* remainder */++ return SLJIT_SUCCESS;+ case SLJIT_DIV_UW:+ case SLJIT_DIVMOD_UW:+ FAIL_IF(push_inst(compiler, lghi(tmp0, 0)));+ FAIL_IF(push_inst(compiler, lgr(tmp1, arg0)));+ FAIL_IF(push_inst(compiler, dlgr(tmp0, arg1)));+ FAIL_IF(push_inst(compiler, lgr(arg0, tmp1))); /* quotient */+ if (op == SLJIT_DIVMOD_UW)+ return push_inst(compiler, lgr(arg1, tmp0)); /* remainder */++ return SLJIT_SUCCESS;+ case SLJIT_DIV_SW:+ case SLJIT_DIVMOD_SW:+ FAIL_IF(push_inst(compiler, lgr(tmp1, arg0)));+ FAIL_IF(push_inst(compiler, dsgr(tmp0, arg1)));+ FAIL_IF(push_inst(compiler, lgr(arg0, tmp1))); /* quotient */+ if (op == SLJIT_DIVMOD_SW)+ return push_inst(compiler, lgr(arg1, tmp0)); /* remainder */++ return SLJIT_SUCCESS;+ case SLJIT_ENDBR:+ return SLJIT_SUCCESS;+ case SLJIT_SKIP_FRAMES_BEFORE_RETURN:+ return SLJIT_SUCCESS;+ default:+ SLJIT_UNREACHABLE();+ }+ /* swap result registers */+ FAIL_IF(push_inst(compiler, lgr(tmp0, arg0)));+ FAIL_IF(push_inst(compiler, lgr(arg0, arg1)));+ return push_inst(compiler, lgr(arg1, tmp0));+}++/* LEVAL will be defined later with different parameters as needed */+#define WHEN2(cond, i1, i2) (cond) ? LEVAL(i1) : LEVAL(i2)++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op1(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src, sljit_sw srcw)+{+ sljit_ins ins;+ struct addr mem;+ sljit_gpr dst_r;+ sljit_gpr src_r;+ sljit_s32 opcode = GET_OPCODE(op);++ CHECK_ERROR();+ CHECK(check_sljit_emit_op1(compiler, op, dst, dstw, src, srcw));+ ADJUST_LOCAL_OFFSET(dst, dstw);+ ADJUST_LOCAL_OFFSET(src, srcw);++ if ((dst == SLJIT_UNUSED) && !HAS_FLAGS(op)) {+ /* TODO(carenas): implement prefetch? */+ return SLJIT_SUCCESS;+ }++ if (opcode >= SLJIT_MOV && opcode <= SLJIT_MOV_P) {+ /* LOAD REGISTER */+ if (FAST_IS_REG(dst) && FAST_IS_REG(src)) {+ dst_r = gpr(dst);+ src_r = gpr(src);+ switch (opcode | (op & SLJIT_I32_OP)) {+ /* 32-bit */+ case SLJIT_MOV32_U8:+ ins = llcr(dst_r, src_r);+ break;+ case SLJIT_MOV32_S8:+ ins = lbr(dst_r, src_r);+ break;+ case SLJIT_MOV32_U16:+ ins = llhr(dst_r, src_r);+ break;+ case SLJIT_MOV32_S16:+ ins = lhr(dst_r, src_r);+ break;+ case SLJIT_MOV32:+ ins = lr(dst_r, src_r);+ break;+ /* 64-bit */+ case SLJIT_MOV_U8:+ ins = llgcr(dst_r, src_r);+ break;+ case SLJIT_MOV_S8:+ ins = lgbr(dst_r, src_r);+ break;+ case SLJIT_MOV_U16:+ ins = llghr(dst_r, src_r);+ break;+ case SLJIT_MOV_S16:+ ins = lghr(dst_r, src_r);+ break;+ case SLJIT_MOV_U32:+ ins = llgfr(dst_r, src_r);+ break;+ case SLJIT_MOV_S32:+ ins = lgfr(dst_r, src_r);+ break;+ case SLJIT_MOV:+ case SLJIT_MOV_P:+ ins = lgr(dst_r, src_r);+ break;+ default:+ ins = 0;+ SLJIT_UNREACHABLE();+ }+ FAIL_IF(push_inst(compiler, ins));+ return SLJIT_SUCCESS;+ }+ /* LOAD IMMEDIATE */+ if (FAST_IS_REG(dst) && (src & SLJIT_IMM)) {+ switch (opcode) {+ case SLJIT_MOV_U8:+ srcw = (sljit_sw)((sljit_u8)(srcw));+ break;+ case SLJIT_MOV_S8:+ srcw = (sljit_sw)((sljit_s8)(srcw));+ break;+ case SLJIT_MOV_U16:+ srcw = (sljit_sw)((sljit_u16)(srcw));+ break;+ case SLJIT_MOV_S16:+ srcw = (sljit_sw)((sljit_s16)(srcw));+ break;+ case SLJIT_MOV_U32:+ srcw = (sljit_sw)((sljit_u32)(srcw));+ break;+ case SLJIT_MOV_S32:+ srcw = (sljit_sw)((sljit_s32)(srcw));+ break;+ }+ return push_load_imm_inst(compiler, gpr(dst), srcw);+ }+ /* LOAD */+ /* TODO(carenas): avoid reg being defined later */+ #define LEVAL(i) EVAL(i, reg, mem)+ if (FAST_IS_REG(dst) && (src & SLJIT_MEM)) {+ sljit_gpr reg = gpr(dst);++ FAIL_IF(make_addr_bxy(compiler, &mem, src, srcw, tmp1));+ /* TODO(carenas): convert all calls below to LEVAL */+ switch (opcode | (op & SLJIT_I32_OP)) {+ case SLJIT_MOV32_U8:+ ins = llc(reg, mem.offset, mem.index, mem.base);+ break;+ case SLJIT_MOV32_S8:+ ins = lb(reg, mem.offset, mem.index, mem.base);+ break;+ case SLJIT_MOV32_U16:+ ins = llh(reg, mem.offset, mem.index, mem.base);+ break;+ case SLJIT_MOV32_S16:+ ins = WHEN2(is_u12(mem.offset), lh, lhy);+ break;+ case SLJIT_MOV32:+ ins = WHEN2(is_u12(mem.offset), l, ly);+ break;+ case SLJIT_MOV_U8:+ ins = LEVAL(llgc);+ break;+ case SLJIT_MOV_S8:+ ins = lgb(reg, mem.offset, mem.index, mem.base);+ break;+ case SLJIT_MOV_U16:+ ins = LEVAL(llgh);+ break;+ case SLJIT_MOV_S16:+ ins = lgh(reg, mem.offset, mem.index, mem.base);+ break;+ case SLJIT_MOV_U32:+ ins = LEVAL(llgf);+ break;+ case SLJIT_MOV_S32:+ ins = lgf(reg, mem.offset, mem.index, mem.base);+ break;+ case SLJIT_MOV_P:+ case SLJIT_MOV:+ ins = lg(reg, mem.offset, mem.index, mem.base);+ break;+ default:+ SLJIT_UNREACHABLE();+ }+ FAIL_IF(push_inst(compiler, ins));+ return SLJIT_SUCCESS;+ }+ /* STORE and STORE IMMEDIATE */+ if ((dst & SLJIT_MEM)+ && (FAST_IS_REG(src) || (src & SLJIT_IMM))) {+ sljit_gpr reg = FAST_IS_REG(src) ? gpr(src) : tmp0;+ if (src & SLJIT_IMM) {+ /* TODO(mundaym): MOVE IMMEDIATE? */+ FAIL_IF(push_load_imm_inst(compiler, reg, srcw));+ }+ struct addr mem;+ FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));+ switch (opcode) {+ case SLJIT_MOV_U8:+ case SLJIT_MOV_S8:+ return push_inst(compiler,+ WHEN2(is_u12(mem.offset), stc, stcy));+ case SLJIT_MOV_U16:+ case SLJIT_MOV_S16:+ return push_inst(compiler,+ WHEN2(is_u12(mem.offset), sth, sthy));+ case SLJIT_MOV_U32:+ case SLJIT_MOV_S32:+ return push_inst(compiler,+ WHEN2(is_u12(mem.offset), st, sty));+ case SLJIT_MOV_P:+ case SLJIT_MOV:+ FAIL_IF(push_inst(compiler, LEVAL(stg)));+ return SLJIT_SUCCESS;+ default:+ SLJIT_UNREACHABLE();+ }+ }+ #undef LEVAL+ /* MOVE CHARACTERS */+ if ((dst & SLJIT_MEM) && (src & SLJIT_MEM)) {+ struct addr mem;+ FAIL_IF(make_addr_bxy(compiler, &mem, src, srcw, tmp1));+ switch (opcode) {+ case SLJIT_MOV_U8:+ case SLJIT_MOV_S8:+ FAIL_IF(push_inst(compiler,+ EVAL(llgc, tmp0, mem)));+ FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));+ return push_inst(compiler,+ EVAL(stcy, tmp0, mem));+ case SLJIT_MOV_U16:+ case SLJIT_MOV_S16:+ FAIL_IF(push_inst(compiler,+ EVAL(llgh, tmp0, mem)));+ FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));+ return push_inst(compiler,+ EVAL(sthy, tmp0, mem));+ case SLJIT_MOV_U32:+ case SLJIT_MOV_S32:+ FAIL_IF(push_inst(compiler,+ EVAL(ly, tmp0, mem)));+ FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));+ return push_inst(compiler,+ EVAL(sty, tmp0, mem));+ case SLJIT_MOV_P:+ case SLJIT_MOV:+ FAIL_IF(push_inst(compiler,+ EVAL(lg, tmp0, mem)));+ FAIL_IF(make_addr_bxy(compiler, &mem, dst, dstw, tmp1));+ FAIL_IF(push_inst(compiler,+ EVAL(stg, tmp0, mem)));+ return SLJIT_SUCCESS;+ default:+ SLJIT_UNREACHABLE();+ }+ }+ SLJIT_UNREACHABLE();+ }++ SLJIT_ASSERT((src & SLJIT_IMM) == 0); /* no immediates */++ dst_r = SLOW_IS_REG(dst) ? gpr(REG_MASK & dst) : tmp0;+ src_r = FAST_IS_REG(src) ? gpr(REG_MASK & src) : tmp0;+ if (src & SLJIT_MEM)+ FAIL_IF(load_word(compiler, src_r, src, srcw, src & SLJIT_I32_OP));++ compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z);++ /* TODO(mundaym): optimize loads and stores */+ switch (opcode | (op & SLJIT_I32_OP)) {+ case SLJIT_NOT:+ /* emulate ~x with x^-1 */+ FAIL_IF(push_load_imm_inst(compiler, tmp1, -1));+ if (src_r != dst_r)+ FAIL_IF(push_inst(compiler, lgr(dst_r, src_r)));++ FAIL_IF(push_inst(compiler, xgr(dst_r, tmp1)));+ break;+ case SLJIT_NOT32:+ /* emulate ~x with x^-1 */+ if (have_eimm())+ FAIL_IF(push_inst(compiler, xilf(dst_r, -1)));+ else {+ FAIL_IF(push_load_imm_inst(compiler, tmp1, -1));+ if (src_r != dst_r)+ FAIL_IF(push_inst(compiler, lr(dst_r, src_r)));++ FAIL_IF(push_inst(compiler, xr(dst_r, tmp1)));+ }+ break;+ case SLJIT_NEG:+ compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB;+ FAIL_IF(push_inst(compiler, lcgr(dst_r, src_r)));+ break;+ case SLJIT_NEG32:+ compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB;+ FAIL_IF(push_inst(compiler, lcr(dst_r, src_r)));+ break;+ case SLJIT_CLZ:+ if (have_eimm()) {+ FAIL_IF(push_inst(compiler, flogr(tmp0, src_r))); /* clobbers tmp1 */+ if (dst_r != tmp0)+ FAIL_IF(push_inst(compiler, lgr(dst_r, tmp0)));+ } else {+ abort(); /* TODO(mundaym): no eimm (?) */+ }+ break;+ case SLJIT_CLZ32:+ if (have_eimm()) {+ FAIL_IF(push_inst(compiler, sllg(tmp1, src_r, 32, 0)));+ FAIL_IF(push_inst(compiler, iilf(tmp1, 0xffffffff)));+ FAIL_IF(push_inst(compiler, flogr(tmp0, tmp1))); /* clobbers tmp1 */+ if (dst_r != tmp0)+ FAIL_IF(push_inst(compiler, lr(dst_r, tmp0)));+ } else {+ abort(); /* TODO(mundaym): no eimm (?) */+ }+ break;+ default:+ SLJIT_UNREACHABLE();+ }++ if ((op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW))+ FAIL_IF(update_zero_overflow(compiler, op, dst_r));++ /* TODO(carenas): doesn't need FAIL_IF */+ if ((dst != SLJIT_UNUSED) && (dst & SLJIT_MEM))+ FAIL_IF(store_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP));++ return SLJIT_SUCCESS;+}++static SLJIT_INLINE int is_commutative(sljit_s32 op)+{+ switch (GET_OPCODE(op)) {+ case SLJIT_ADD:+ case SLJIT_ADDC:+ case SLJIT_MUL:+ case SLJIT_AND:+ case SLJIT_OR:+ case SLJIT_XOR:+ return 1;+ }+ return 0;+}++static SLJIT_INLINE int is_shift(sljit_s32 op) {+ sljit_s32 v = GET_OPCODE(op);+ return (v == SLJIT_SHL || v == SLJIT_ASHR || v == SLJIT_LSHR) ? 1 : 0;+}++static SLJIT_INLINE int sets_signed_flag(sljit_s32 op)+{+ switch (GET_FLAG_TYPE(op)) {+ case SLJIT_OVERFLOW:+ case SLJIT_NOT_OVERFLOW:+ case SLJIT_SIG_LESS:+ case SLJIT_SIG_LESS_EQUAL:+ case SLJIT_SIG_GREATER:+ case SLJIT_SIG_GREATER_EQUAL:+ return 1;+ }+ return 0;+}++static const struct ins_forms add_forms = {+ 0x1a00, /* ar */+ 0xb9080000, /* agr */+ 0xb9f80000, /* ark */+ 0xb9e80000, /* agrk */+ 0x5a000000, /* a */+ 0xe3000000005a, /* ay */+ 0xe30000000008, /* ag */+};++static const struct ins_forms logical_add_forms = {+ 0x1e00, /* alr */+ 0xb90a0000, /* algr */+ 0xb9fa0000, /* alrk */+ 0xb9ea0000, /* algrk */+ 0x5e000000, /* al */+ 0xe3000000005e, /* aly */+ 0xe3000000000a, /* alg */+};++static sljit_s32 sljit_emit_add(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ int sets_overflow = (op & VARIABLE_FLAG_MASK) == SLJIT_SET_OVERFLOW;+ int sets_zero_overflow = (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW);+ const struct ins_forms *forms;+ sljit_ins ins;++ if (src2 & SLJIT_IMM) {+ if (!sets_zero_overflow && is_s8(src2w) && (src1 & SLJIT_MEM) && (dst == src1 && dstw == src1w)) {+ if (sets_overflow)+ ins = (op & SLJIT_I32_OP) ? 0xeb000000006a /* asi */ : 0xeb000000007a /* agsi */;+ else+ ins = (op & SLJIT_I32_OP) ? 0xeb000000006e /* alsi */ : 0xeb000000007e /* algsi */;+ return emit_siy(compiler, ins, dst, dstw, src2w);+ }++ if (is_s16(src2w)) {+ if (sets_overflow)+ ins = (op & SLJIT_I32_OP) ? 0xec00000000d8 /* ahik */ : 0xec00000000d9 /* aghik */;+ else+ ins = (op & SLJIT_I32_OP) ? 0xec00000000da /* alhsik */ : 0xec00000000db /* alghsik */;+ FAIL_IF(emit_rie_d(compiler, ins, dst, src1, src1w, src2w));+ goto done;+ }++ if (!sets_overflow) {+ if ((op & SLJIT_I32_OP) || is_u32(src2w)) {+ ins = (op & SLJIT_I32_OP) ? 0xc20b00000000 /* alfi */ : 0xc20a00000000 /* algfi */;+ FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A));+ goto done;+ }+ if (is_u32(-src2w)) {+ FAIL_IF(emit_ri(compiler, 0xc20400000000 /* slgfi */, dst, src1, src1w, -src2w, RIL_A));+ goto done;+ }+ }+ else if ((op & SLJIT_I32_OP) || is_s32(src2w)) {+ ins = (op & SLJIT_I32_OP) ? 0xc20900000000 /* afi */ : 0xc20800000000 /* agfi */;+ FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A));+ goto done;+ }+ }++ forms = sets_overflow ? &add_forms : &logical_add_forms;+ FAIL_IF(emit_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w));++done:+ if (sets_zero_overflow)+ FAIL_IF(update_zero_overflow(compiler, op, SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0));++ if (dst & SLJIT_MEM)+ return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP);++ return SLJIT_SUCCESS;+}++static const struct ins_forms sub_forms = {+ 0x1b00, /* sr */+ 0xb9090000, /* sgr */+ 0xb9f90000, /* srk */+ 0xb9e90000, /* sgrk */+ 0x5b000000, /* s */+ 0xe3000000005b, /* sy */+ 0xe30000000009, /* sg */+};++static const struct ins_forms logical_sub_forms = {+ 0x1f00, /* slr */+ 0xb90b0000, /* slgr */+ 0xb9fb0000, /* slrk */+ 0xb9eb0000, /* slgrk */+ 0x5f000000, /* sl */+ 0xe3000000005f, /* sly */+ 0xe3000000000b, /* slg */+};++static sljit_s32 sljit_emit_sub(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ int sets_signed = sets_signed_flag(op);+ int sets_zero_overflow = (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == (SLJIT_SET_Z | SLJIT_SET_OVERFLOW);+ const struct ins_forms *forms;+ sljit_ins ins;++ if (dst == SLJIT_UNUSED && GET_FLAG_TYPE(op) <= SLJIT_SIG_LESS_EQUAL) {+ int compare_signed = GET_FLAG_TYPE(op) >= SLJIT_SIG_LESS;++ compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_COMPARE;++ if (src2 & SLJIT_IMM) {+ if (compare_signed || ((op & VARIABLE_FLAG_MASK) == 0 && is_s32(src2w)))+ {+ if ((op & SLJIT_I32_OP) || is_s32(src2w)) {+ ins = (op & SLJIT_I32_OP) ? 0xc20d00000000 /* cfi */ : 0xc20c00000000 /* cgfi */;+ return emit_ri(compiler, ins, src1, src1, src1w, src2w, RIL_A);+ }+ }+ else {+ if ((op & SLJIT_I32_OP) || is_u32(src2w)) {+ ins = (op & SLJIT_I32_OP) ? 0xc20f00000000 /* clfi */ : 0xc20e00000000 /* clgfi */;+ return emit_ri(compiler, ins, src1, src1, src1w, src2w, RIL_A);+ }+ if (is_s16(src2w))+ return emit_rie_d(compiler, 0xec00000000db /* alghsik */, SLJIT_UNUSED, src1, src1w, src2w);+ }+ }+ else if (src2 & SLJIT_MEM) {+ if ((op & SLJIT_I32_OP) && ((src2 & OFFS_REG_MASK) || is_u12(src2w))) {+ ins = compare_signed ? 0x59000000 /* c */ : 0x55000000 /* cl */;+ return emit_rx(compiler, ins, src1, src1, src1w, src2, src2w, RX_A);+ }++ if (compare_signed)+ ins = (op & SLJIT_I32_OP) ? 0xe30000000059 /* cy */ : 0xe30000000020 /* cg */;+ else+ ins = (op & SLJIT_I32_OP) ? 0xe30000000055 /* cly */ : 0xe30000000021 /* clg */;+ return emit_rx(compiler, ins, src1, src1, src1w, src2, src2w, RXY_A);+ }++ if (compare_signed)+ ins = (op & SLJIT_I32_OP) ? 0x1900 /* cr */ : 0xb9200000 /* cgr */;+ else+ ins = (op & SLJIT_I32_OP) ? 0x1500 /* clr */ : 0xb9210000 /* clgr */;+ return emit_rr(compiler, ins, src1, src1, src1w, src2, src2w);+ }++ if (src2 & SLJIT_IMM) {+ sljit_sw neg_src2w = -src2w;++ if (sets_signed || neg_src2w != 0 || (op & (SLJIT_SET_Z | VARIABLE_FLAG_MASK)) == 0) {+ if (!sets_zero_overflow && is_s8(neg_src2w) && (src1 & SLJIT_MEM) && (dst == src1 && dstw == src1w)) {+ if (sets_signed)+ ins = (op & SLJIT_I32_OP) ? 0xeb000000006a /* asi */ : 0xeb000000007a /* agsi */;+ else+ ins = (op & SLJIT_I32_OP) ? 0xeb000000006e /* alsi */ : 0xeb000000007e /* algsi */;+ return emit_siy(compiler, ins, dst, dstw, neg_src2w);+ }++ if (is_s16(neg_src2w)) {+ if (sets_signed)+ ins = (op & SLJIT_I32_OP) ? 0xec00000000d8 /* ahik */ : 0xec00000000d9 /* aghik */;+ else+ ins = (op & SLJIT_I32_OP) ? 0xec00000000da /* alhsik */ : 0xec00000000db /* alghsik */;+ FAIL_IF(emit_rie_d(compiler, ins, dst, src1, src1w, neg_src2w));+ goto done;+ }+ }++ if (!sets_signed) {+ if ((op & SLJIT_I32_OP) || is_u32(src2w)) {+ ins = (op & SLJIT_I32_OP) ? 0xc20500000000 /* slfi */ : 0xc20400000000 /* slgfi */;+ FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A));+ goto done;+ }+ if (is_u32(neg_src2w)) {+ FAIL_IF(emit_ri(compiler, 0xc20a00000000 /* algfi */, dst, src1, src1w, neg_src2w, RIL_A));+ goto done;+ }+ }+ else if ((op & SLJIT_I32_OP) || is_s32(neg_src2w)) {+ ins = (op & SLJIT_I32_OP) ? 0xc20900000000 /* afi */ : 0xc20800000000 /* agfi */;+ FAIL_IF(emit_ri(compiler, ins, dst, src1, src1w, neg_src2w, RIL_A));+ goto done;+ }+ }++ forms = sets_signed ? &sub_forms : &logical_sub_forms;+ FAIL_IF(emit_non_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w));++done:+ if (sets_signed) {+ sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;++ if ((op & VARIABLE_FLAG_MASK) != SLJIT_SET_OVERFLOW) {+ /* In case of overflow, the sign bit of the two source operands must be different, and+ - the first operand is greater if the sign bit of the result is set+ - the first operand is less if the sign bit of the result is not set+ The -result operation sets the corrent sign, because the result cannot be zero.+ The overflow is considered greater, since the result must be equal to INT_MIN so its sign bit is set. */+ FAIL_IF(push_inst(compiler, brc(0xe, 2 + 2)));+ FAIL_IF(push_inst(compiler, (op & SLJIT_I32_OP) ? lcr(tmp1, dst_r) : lcgr(tmp1, dst_r)));+ }+ else if (op & SLJIT_SET_Z)+ FAIL_IF(update_zero_overflow(compiler, op, dst_r));+ }++ if (dst & SLJIT_MEM)+ return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP);++ return SLJIT_SUCCESS;+}++static const struct ins_forms multiply_forms = {+ 0xb2520000, /* msr */+ 0xb90c0000, /* msgr */+ 0xb9fd0000, /* msrkc */+ 0xb9ed0000, /* msgrkc */+ 0x71000000, /* ms */+ 0xe30000000051, /* msy */+ 0xe3000000000c, /* msg */+};++static const struct ins_forms multiply_overflow_forms = {+ 0,+ 0,+ 0xb9fd0000, /* msrkc */+ 0xb9ed0000, /* msgrkc */+ 0,+ 0xe30000000053, /* msc */+ 0xe30000000083, /* msgc */+};++static sljit_s32 sljit_emit_multiply(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ sljit_ins ins;++ if (HAS_FLAGS(op)) {+ /* if have_misc2 fails, this operation should be emulated. 32 bit emulation:+ FAIL_IF(push_inst(compiler, lgfr(tmp0, src1_r)));+ FAIL_IF(push_inst(compiler, msgfr(tmp0, src2_r)));+ if (dst_r != tmp0) {+ FAIL_IF(push_inst(compiler, lr(dst_r, tmp0)));+ }+ FAIL_IF(push_inst(compiler, aih(tmp0, 1)));+ FAIL_IF(push_inst(compiler, nihf(tmp0, ~1U)));+ FAIL_IF(push_inst(compiler, ipm(flag_r)));+ FAIL_IF(push_inst(compiler, oilh(flag_r, 0x2000))); */++ return emit_commutative(compiler, &multiply_overflow_forms, dst, dstw, src1, src1w, src2, src2w);+ }++ if (src2 & SLJIT_IMM) {+ if (is_s16(src2w)) {+ ins = (op & SLJIT_I32_OP) ? 0xa70c0000 /* mhi */ : 0xa70d0000 /* mghi */;+ return emit_ri(compiler, ins, dst, src1, src1w, src2w, RI_A);+ }++ if (is_s32(src2w)) {+ ins = (op & SLJIT_I32_OP) ? 0xc20100000000 /* msfi */ : 0xc20000000000 /* msgfi */;+ return emit_ri(compiler, ins, dst, src1, src1w, src2w, RIL_A);+ }+ }++ return emit_commutative(compiler, &multiply_forms, dst, dstw, src1, src1w, src2, src2w);+}++static sljit_s32 sljit_emit_bitwise_imm(struct sljit_compiler *compiler, sljit_s32 type,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_uw imm, sljit_s32 count16)+{+ sljit_s32 mode = compiler->mode;+ sljit_gpr dst_r = tmp0;+ sljit_s32 needs_move = 1;++ if (SLOW_IS_REG(dst)) {+ dst_r = gpr(dst & REG_MASK);+ if (dst == src1)+ needs_move = 0;+ }++ if (needs_move)+ FAIL_IF(emit_move(compiler, dst_r, src1, src1w));++ if (type == SLJIT_AND) {+ if (!(mode & SLJIT_I32_OP))+ FAIL_IF(push_inst(compiler, 0xc00a00000000 /* nihf */ | (dst_r << 36) | (imm >> 32)));+ return push_inst(compiler, 0xc00b00000000 /* nilf */ | (dst_r << 36) | (imm & 0xffffffff));+ }+ else if (type == SLJIT_OR) {+ if (count16 >= 3) {+ FAIL_IF(push_inst(compiler, 0xc00c00000000 /* oihf */ | (dst_r << 36) | (imm >> 32)));+ return push_inst(compiler, 0xc00d00000000 /* oilf */ | (dst_r << 36) | (imm & 0xffffffff));+ }++ if (count16 >= 2) {+ if ((imm & 0x00000000ffffffffull) == 0)+ return push_inst(compiler, 0xc00c00000000 /* oihf */ | (dst_r << 36) | (imm >> 32));+ if ((imm & 0xffffffff00000000ull) == 0)+ return push_inst(compiler, 0xc00d00000000 /* oilf */ | (dst_r << 36) | (imm & 0xffffffff));+ }++ if ((imm & 0xffff000000000000ull) != 0)+ FAIL_IF(push_inst(compiler, 0xa5080000 /* oihh */ | (dst_r << 20) | (imm >> 48)));+ if ((imm & 0x0000ffff00000000ull) != 0)+ FAIL_IF(push_inst(compiler, 0xa5090000 /* oihl */ | (dst_r << 20) | ((imm >> 32) & 0xffff)));+ if ((imm & 0x00000000ffff0000ull) != 0)+ FAIL_IF(push_inst(compiler, 0xa50a0000 /* oilh */ | (dst_r << 20) | ((imm >> 16) & 0xffff)));+ if ((imm & 0x000000000000ffffull) != 0 || imm == 0)+ return push_inst(compiler, 0xa50b0000 /* oill */ | (dst_r << 20) | (imm & 0xffff));+ return SLJIT_SUCCESS;+ }++ if ((imm & 0xffffffff00000000ull) != 0)+ FAIL_IF(push_inst(compiler, 0xc00600000000 /* xihf */ | (dst_r << 36) | (imm >> 32)));+ if ((imm & 0x00000000ffffffffull) != 0 || imm == 0)+ return push_inst(compiler, 0xc00700000000 /* xilf */ | (dst_r << 36) | (imm & 0xffffffff));+ return SLJIT_SUCCESS;+}++static const struct ins_forms bitwise_and_forms = {+ 0x1400, /* nr */+ 0xb9800000, /* ngr */+ 0xb9f40000, /* nrk */+ 0xb9e40000, /* ngrk */+ 0x54000000, /* n */+ 0xe30000000054, /* ny */+ 0xe30000000080, /* ng */+};++static const struct ins_forms bitwise_or_forms = {+ 0x1600, /* or */+ 0xb9810000, /* ogr */+ 0xb9f60000, /* ork */+ 0xb9e60000, /* ogrk */+ 0x56000000, /* o */+ 0xe30000000056, /* oy */+ 0xe30000000081, /* og */+};++static const struct ins_forms bitwise_xor_forms = {+ 0x1700, /* xr */+ 0xb9820000, /* xgr */+ 0xb9f70000, /* xrk */+ 0xb9e70000, /* xgrk */+ 0x57000000, /* x */+ 0xe30000000057, /* xy */+ 0xe30000000082, /* xg */+};++static sljit_s32 sljit_emit_bitwise(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ sljit_s32 type = GET_OPCODE(op);+ const struct ins_forms *forms;++ if ((src2 & SLJIT_IMM) && (!(op & SLJIT_SET_Z) || (type == SLJIT_AND && dst == SLJIT_UNUSED))) {+ sljit_s32 count16 = 0;+ sljit_uw imm = (sljit_uw)src2w;++ if (op & SLJIT_I32_OP)+ imm &= 0xffffffffull;++ if ((imm & 0x000000000000ffffull) != 0 || imm == 0)+ count16++;+ if ((imm & 0x00000000ffff0000ull) != 0)+ count16++;+ if ((imm & 0x0000ffff00000000ull) != 0)+ count16++;+ if ((imm & 0xffff000000000000ull) != 0)+ count16++;++ if (type == SLJIT_AND && dst == SLJIT_UNUSED && count16 == 1) {+ sljit_gpr src_r = tmp0;++ if (FAST_IS_REG(src1))+ src_r = gpr(src1 & REG_MASK);+ else+ FAIL_IF(emit_move(compiler, tmp0, src1, src1w));++ if ((imm & 0x000000000000ffffull) != 0 || imm == 0)+ return push_inst(compiler, 0xa7010000 | (src_r << 20) | imm);+ if ((imm & 0x00000000ffff0000ull) != 0)+ return push_inst(compiler, 0xa7000000 | (src_r << 20) | (imm >> 16));+ if ((imm & 0x0000ffff00000000ull) != 0)+ return push_inst(compiler, 0xa7030000 | (src_r << 20) | (imm >> 32));+ return push_inst(compiler, 0xa7020000 | (src_r << 20) | (imm >> 48));+ }++ if (!(op & SLJIT_SET_Z))+ return sljit_emit_bitwise_imm(compiler, type, dst, dstw, src1, src1w, imm, count16);+ }++ if (type == SLJIT_AND)+ forms = &bitwise_and_forms;+ else if (type == SLJIT_OR)+ forms = &bitwise_or_forms;+ else+ forms = &bitwise_xor_forms;++ return emit_commutative(compiler, forms, dst, dstw, src1, src1w, src2, src2w);+}++static sljit_s32 sljit_emit_shift(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ sljit_s32 type = GET_OPCODE(op);+ sljit_gpr dst_r = SLOW_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;+ sljit_gpr src_r = tmp0;+ sljit_gpr base_r = tmp0;+ sljit_ins imm = 0;+ sljit_ins ins;++ if (FAST_IS_REG(src1))+ src_r = gpr(src1 & REG_MASK);+ else+ FAIL_IF(emit_move(compiler, tmp0, src1, src1w));++ if (src2 & SLJIT_IMM)+ imm = src2w & ((op & SLJIT_I32_OP) ? 0x1f : 0x3f);+ else if (FAST_IS_REG(src2))+ base_r = gpr(src2 & REG_MASK);+ else {+ FAIL_IF(emit_move(compiler, tmp1, src2, src2w));+ base_r = tmp1;+ }++ if ((op & SLJIT_I32_OP) && dst_r == src_r) {+ if (type == SLJIT_SHL)+ ins = 0x89000000 /* sll */;+ else if (type == SLJIT_LSHR)+ ins = 0x88000000 /* srl */;+ else+ ins = 0x8a000000 /* sra */;++ FAIL_IF(push_inst(compiler, ins | (dst_r << 20) | (base_r << 12) | imm));+ }+ else {+ if (type == SLJIT_SHL)+ ins = (op & SLJIT_I32_OP) ? 0xeb00000000df /* sllk */ : 0xeb000000000d /* sllg */;+ else if (type == SLJIT_LSHR)+ ins = (op & SLJIT_I32_OP) ? 0xeb00000000de /* srlk */ : 0xeb000000000c /* srlg */;+ else+ ins = (op & SLJIT_I32_OP) ? 0xeb00000000dc /* srak */ : 0xeb000000000a /* srag */;++ FAIL_IF(push_inst(compiler, ins | (dst_r << 36) | (src_r << 32) | (base_r << 28) | (imm << 16)));+ }++ if ((op & SLJIT_SET_Z) && type != SLJIT_ASHR)+ return push_inst(compiler, (op & SLJIT_I32_OP) ? or(dst_r, dst_r) : ogr(dst_r, dst_r));++ return SLJIT_SUCCESS;+}++static const struct ins_forms addc_forms = {+ 0xb9980000, /* alcr */+ 0xb9880000, /* alcgr */+ 0,+ 0,+ 0,+ 0xe30000000098, /* alc */+ 0xe30000000088, /* alcg */+};++static const struct ins_forms subc_forms = {+ 0xb9990000, /* slbr */+ 0xb9890000, /* slbgr */+ 0,+ 0,+ 0,+ 0xe30000000099, /* slb */+ 0xe30000000089, /* slbg */+};++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op2(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ CHECK_ERROR();+ CHECK(check_sljit_emit_op2(compiler, op, dst, dstw, src1, src1w, src2, src2w));+ ADJUST_LOCAL_OFFSET(dst, dstw);+ ADJUST_LOCAL_OFFSET(src1, src1w);+ ADJUST_LOCAL_OFFSET(src2, src2w);++ if (dst == SLJIT_UNUSED && !HAS_FLAGS(op))+ return SLJIT_SUCCESS;++ compiler->mode = op & SLJIT_I32_OP;+ compiler->status_flags_state = op & (VARIABLE_FLAG_MASK | SLJIT_SET_Z);++ if (GET_OPCODE(op) >= SLJIT_ADD || GET_OPCODE(op) <= SLJIT_SUBC)+ compiler->status_flags_state |= SLJIT_CURRENT_FLAGS_ADD_SUB;++ if (is_commutative(op) && (src1 & SLJIT_IMM) && !(src2 & SLJIT_IMM)) {+ src1 ^= src2;+ src2 ^= src1;+ src1 ^= src2;++ src1w ^= src2w;+ src2w ^= src1w;+ src1w ^= src2w;+ }++ switch (GET_OPCODE(op)) {+ case SLJIT_ADD:+ return sljit_emit_add(compiler, op, dst, dstw, src1, src1w, src2, src2w);+ case SLJIT_ADDC:+ FAIL_IF(emit_commutative(compiler, &addc_forms, dst, dstw, src1, src1w, src2, src2w));+ if (dst & SLJIT_MEM)+ return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP);+ return SLJIT_SUCCESS;+ case SLJIT_SUB:+ return sljit_emit_sub(compiler, op, dst, dstw, src1, src1w, src2, src2w);+ case SLJIT_SUBC:+ FAIL_IF(emit_non_commutative(compiler, &subc_forms, dst, dstw, src1, src1w, src2, src2w));+ if (dst & SLJIT_MEM)+ return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP);+ return SLJIT_SUCCESS;+ case SLJIT_MUL:+ FAIL_IF(sljit_emit_multiply(compiler, op, dst, dstw, src1, src1w, src2, src2w));+ break;+ case SLJIT_AND:+ case SLJIT_OR:+ case SLJIT_XOR:+ FAIL_IF(sljit_emit_bitwise(compiler, op, dst, dstw, src1, src1w, src2, src2w));+ break;+ case SLJIT_SHL:+ case SLJIT_LSHR:+ case SLJIT_ASHR:+ FAIL_IF(sljit_emit_shift(compiler, op, dst, dstw, src1, src1w, src2, src2w));+ break;+ }++ if (dst & SLJIT_MEM)+ return store_word(compiler, tmp0, dst, dstw, op & SLJIT_I32_OP);+ return SLJIT_SUCCESS;+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_src(+ struct sljit_compiler *compiler,+ sljit_s32 op, sljit_s32 src, sljit_sw srcw)+{+ sljit_gpr src_r;++ CHECK_ERROR();+ CHECK(check_sljit_emit_op_src(compiler, op, src, srcw));+ ADJUST_LOCAL_OFFSET(src, srcw);++ switch (op) {+ case SLJIT_FAST_RETURN:+ src_r = FAST_IS_REG(src) ? gpr(src) : tmp1;+ if (src & SLJIT_MEM)+ FAIL_IF(load_word(compiler, tmp1, src, srcw, 0));++ return push_inst(compiler, br(src_r));+ case SLJIT_SKIP_FRAMES_BEFORE_FAST_RETURN:+ /* TODO(carenas): implement? */+ return SLJIT_SUCCESS;+ case SLJIT_PREFETCH_L1:+ case SLJIT_PREFETCH_L2:+ case SLJIT_PREFETCH_L3:+ case SLJIT_PREFETCH_ONCE:+ /* TODO(carenas): implement */+ return SLJIT_SUCCESS;+ default:+ /* TODO(carenas): probably should not success by default */+ return SLJIT_SUCCESS;+ }++ return SLJIT_SUCCESS;+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_register_index(sljit_s32 reg)+{+ CHECK_REG_INDEX(check_sljit_get_register_index(reg));+ return gpr(reg);+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_get_float_register_index(sljit_s32 reg)+{+ CHECK_REG_INDEX(check_sljit_get_float_register_index(reg));+ abort();+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_custom(struct sljit_compiler *compiler,+ void *instruction, sljit_s32 size)+{+ sljit_ins ins = 0;++ CHECK_ERROR();+ CHECK(check_sljit_emit_op_custom(compiler, instruction, size));++ memcpy((sljit_u8 *)&ins + sizeof(ins) - size, instruction, size);+ return push_inst(compiler, ins);+}++/* --------------------------------------------------------------------- */+/* Floating point operators */+/* --------------------------------------------------------------------- */++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop1(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src, sljit_sw srcw)+{+ CHECK_ERROR();+ abort();+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fop2(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 src1, sljit_sw src1w,+ sljit_s32 src2, sljit_sw src2w)+{+ CHECK_ERROR();+ abort();+}++/* --------------------------------------------------------------------- */+/* Other instructions */+/* --------------------------------------------------------------------- */++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_fast_enter(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw)+{+ CHECK_ERROR();+ CHECK(check_sljit_emit_fast_enter(compiler, dst, dstw));+ ADJUST_LOCAL_OFFSET(dst, dstw);++ if (FAST_IS_REG(dst))+ return push_inst(compiler, lgr(gpr(dst), fast_link_r));++ /* memory */+ return store_word(compiler, fast_link_r, dst, dstw, 0);+}++/* --------------------------------------------------------------------- */+/* Conditional instructions */+/* --------------------------------------------------------------------- */++SLJIT_API_FUNC_ATTRIBUTE struct sljit_label* sljit_emit_label(struct sljit_compiler *compiler)+{+ struct sljit_label *label;++ CHECK_ERROR_PTR();+ CHECK_PTR(check_sljit_emit_label(compiler));++ if (compiler->last_label && compiler->last_label->size == compiler->size)+ return compiler->last_label;++ label = (struct sljit_label*)ensure_abuf(compiler, sizeof(struct sljit_label));+ PTR_FAIL_IF(!label);+ set_label(label, compiler);+ return label;+}++SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_jump(struct sljit_compiler *compiler, sljit_s32 type)+{+ sljit_u8 mask = ((type & 0xff) < SLJIT_JUMP) ? get_cc(compiler, type & 0xff) : 0xf;++ CHECK_ERROR_PTR();+ CHECK_PTR(check_sljit_emit_jump(compiler, type));++ /* record jump */+ struct sljit_jump *jump = (struct sljit_jump *)+ ensure_abuf(compiler, sizeof(struct sljit_jump));+ PTR_FAIL_IF(!jump);+ set_jump(jump, compiler, type & SLJIT_REWRITABLE_JUMP);+ jump->addr = compiler->size;++ /* emit jump instruction */+ type &= 0xff;+ if (type >= SLJIT_FAST_CALL)+ PTR_FAIL_IF(push_inst(compiler, brasl(type == SLJIT_FAST_CALL ? fast_link_r : link_r, 0)));+ else+ PTR_FAIL_IF(push_inst(compiler, brcl(mask, 0)));++ return jump;+}++SLJIT_API_FUNC_ATTRIBUTE struct sljit_jump* sljit_emit_call(struct sljit_compiler *compiler, sljit_s32 type,+ sljit_s32 arg_types)+{+ CHECK_ERROR_PTR();+ CHECK_PTR(check_sljit_emit_call(compiler, type, arg_types));++#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \+ || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)+ compiler->skip_checks = 1;+#endif++ return sljit_emit_jump(compiler, type);+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_ijump(struct sljit_compiler *compiler, sljit_s32 type, sljit_s32 src, sljit_sw srcw)+{+ sljit_gpr src_r = FAST_IS_REG(src) ? gpr(src) : tmp1;++ CHECK_ERROR();+ CHECK(check_sljit_emit_ijump(compiler, type, src, srcw));+ ADJUST_LOCAL_OFFSET(src, srcw);++ if (src & SLJIT_IMM) {+ SLJIT_ASSERT(!(srcw & 1)); /* target address must be even */+ FAIL_IF(push_load_imm_inst(compiler, src_r, srcw));+ }+ else if (src & SLJIT_MEM)+ FAIL_IF(load_word(compiler, src_r, src, srcw, 0 /* 64-bit */));++ /* emit jump instruction */+ if (type >= SLJIT_FAST_CALL)+ return push_inst(compiler, basr(type == SLJIT_FAST_CALL ? fast_link_r : link_r, src_r));++ return push_inst(compiler, br(src_r));+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_icall(struct sljit_compiler *compiler, sljit_s32 type,+ sljit_s32 arg_types,+ sljit_s32 src, sljit_sw srcw)+{+ CHECK_ERROR();+ CHECK(check_sljit_emit_icall(compiler, type, arg_types, src, srcw));++#if (defined SLJIT_VERBOSE && SLJIT_VERBOSE) \+ || (defined SLJIT_ARGUMENT_CHECKS && SLJIT_ARGUMENT_CHECKS)+ compiler->skip_checks = 1;+#endif++ return sljit_emit_ijump(compiler, type, src, srcw);+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_op_flags(struct sljit_compiler *compiler, sljit_s32 op,+ sljit_s32 dst, sljit_sw dstw,+ sljit_s32 type)+{+ sljit_u8 mask = get_cc(compiler, type & 0xff);++ CHECK_ERROR();+ CHECK(check_sljit_emit_op_flags(compiler, op, dst, dstw, type));++ sljit_gpr dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;+ sljit_gpr loc_r = tmp1;+ switch (GET_OPCODE(op)) {+ case SLJIT_AND:+ case SLJIT_OR:+ case SLJIT_XOR:+ compiler->status_flags_state = op & SLJIT_SET_Z;++ /* dst is also source operand */+ if (dst & SLJIT_MEM)+ FAIL_IF(load_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP));++ break;+ case SLJIT_MOV:+ case (SLJIT_MOV32 & ~SLJIT_I32_OP):+ /* can write straight into destination */+ loc_r = dst_r;+ break;+ default:+ SLJIT_UNREACHABLE();+ }++ /* TODO(mundaym): fold into cmov helper function? */+ #define LEVAL(i) i(loc_r, 1, mask)+ if (have_lscond2()) {+ FAIL_IF(push_load_imm_inst(compiler, loc_r, 0));+ FAIL_IF(push_inst(compiler,+ WHEN2(op & SLJIT_I32_OP, lochi, locghi)));+ } else {+ /* TODO(mundaym): no load/store-on-condition 2 facility (ipm? branch-and-set?) */+ abort();+ }+ #undef LEVAL++ /* apply bitwise op and set condition codes */+ switch (GET_OPCODE(op)) {+ #define LEVAL(i) i(dst_r, loc_r)+ case SLJIT_AND:+ FAIL_IF(push_inst(compiler,+ WHEN2(op & SLJIT_I32_OP, nr, ngr)));+ break;+ case SLJIT_OR:+ FAIL_IF(push_inst(compiler,+ WHEN2(op & SLJIT_I32_OP, or, ogr)));+ break;+ case SLJIT_XOR:+ FAIL_IF(push_inst(compiler,+ WHEN2(op & SLJIT_I32_OP, xr, xgr)));+ break;+ #undef LEVAL+ }++ /* store result to memory if required */+ if (dst & SLJIT_MEM)+ return store_word(compiler, dst_r, dst, dstw, op & SLJIT_I32_OP);++ return SLJIT_SUCCESS;+}++SLJIT_API_FUNC_ATTRIBUTE sljit_s32 sljit_emit_cmov(struct sljit_compiler *compiler, sljit_s32 type,+ sljit_s32 dst_reg,+ sljit_s32 src, sljit_sw srcw)+{+ sljit_u8 mask = get_cc(compiler, type & 0xff);+ sljit_gpr dst_r = gpr(dst_reg & ~SLJIT_I32_OP);+ sljit_gpr src_r = FAST_IS_REG(src) ? gpr(src) : tmp0;++ CHECK_ERROR();+ CHECK(check_sljit_emit_cmov(compiler, type, dst_reg, src, srcw));++ if (src & SLJIT_IMM) {+ /* TODO(mundaym): fast path with lscond2 */+ FAIL_IF(push_load_imm_inst(compiler, src_r, srcw));+ }++ #define LEVAL(i) i(dst_r, src_r, mask)+ if (have_lscond1())+ return push_inst(compiler,+ WHEN2(dst_reg & SLJIT_I32_OP, locr, locgr));++ #undef LEVAL++ /* TODO(mundaym): implement */+ return SLJIT_ERR_UNSUPPORTED;+}++/* --------------------------------------------------------------------- */+/* Other instructions */+/* --------------------------------------------------------------------- */++/* On s390x we build a literal pool to hold constants. This has two main+ advantages:++ 1. we only need one instruction in the instruction stream (LGRL)+ 2. we can store 64 bit addresses and use 32 bit offsets++ To retrofit the extra information needed to build the literal pool we+ add a new sljit_s390x_const struct that contains the initial value but+ can still be cast to a sljit_const. */++SLJIT_API_FUNC_ATTRIBUTE struct sljit_const* sljit_emit_const(struct sljit_compiler *compiler, sljit_s32 dst, sljit_sw dstw, sljit_sw init_value)+{+ struct sljit_s390x_const *const_;+ sljit_gpr dst_r;++ CHECK_ERROR_PTR();+ CHECK_PTR(check_sljit_emit_const(compiler, dst, dstw, init_value));++ const_ = (struct sljit_s390x_const*)ensure_abuf(compiler,+ sizeof(struct sljit_s390x_const));+ PTR_FAIL_IF(!const_);+ set_const((struct sljit_const*)const_, compiler);+ const_->init_value = init_value;++ dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;+ if (have_genext())+ PTR_FAIL_IF(push_inst(compiler, sljit_ins_const | lgrl(dst_r, 0)));+ else {+ PTR_FAIL_IF(push_inst(compiler, sljit_ins_const | larl(tmp1, 0)));+ PTR_FAIL_IF(push_inst(compiler, lg(dst_r, 0, r0, tmp1)));+ }++ if (dst & SLJIT_MEM)+ PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, 0 /* always 64-bit */));++ return (struct sljit_const*)const_;+}++SLJIT_API_FUNC_ATTRIBUTE void sljit_set_jump_addr(sljit_uw addr, sljit_uw new_target, sljit_sw executable_offset)+{+ /* Update the constant pool. */+ sljit_uw *ptr = (sljit_uw *)addr;+ SLJIT_UNUSED_ARG(executable_offset);++ SLJIT_UPDATE_WX_FLAGS(ptr, ptr + 1, 0);+ *ptr = new_target;+ SLJIT_UPDATE_WX_FLAGS(ptr, ptr + 1, 1);+ SLJIT_CACHE_FLUSH(ptr, ptr + 1);+}++SLJIT_API_FUNC_ATTRIBUTE void sljit_set_const(sljit_uw addr, sljit_sw new_constant, sljit_sw executable_offset)+{+ sljit_set_jump_addr(addr, new_constant, executable_offset);+}++SLJIT_API_FUNC_ATTRIBUTE struct sljit_put_label *sljit_emit_put_label(+ struct sljit_compiler *compiler,+ sljit_s32 dst, sljit_sw dstw)+{+ struct sljit_put_label *put_label;+ sljit_gpr dst_r;++ CHECK_ERROR_PTR();+ CHECK_PTR(check_sljit_emit_put_label(compiler, dst, dstw));+ ADJUST_LOCAL_OFFSET(dst, dstw);++ put_label = (struct sljit_put_label*)ensure_abuf(compiler, sizeof(struct sljit_put_label));+ PTR_FAIL_IF(!put_label);+ set_put_label(put_label, compiler, 0);++ dst_r = FAST_IS_REG(dst) ? gpr(dst & REG_MASK) : tmp0;++ if (have_genext())+ PTR_FAIL_IF(push_inst(compiler, lgrl(dst_r, 0)));+ else {+ PTR_FAIL_IF(push_inst(compiler, larl(tmp1, 0)));+ PTR_FAIL_IF(push_inst(compiler, lg(dst_r, 0, r0, tmp1)));+ }++ if (dst & SLJIT_MEM)+ PTR_FAIL_IF(store_word(compiler, dst_r, dst, dstw, 0)); return put_label; }
src/c/pcre2/src/sljit/sljitNativeSPARC_32.c view
@@ -93,18 +93,21 @@ return push_inst(compiler, ADD | D(dst) | S1(dst) | IMM(1), UNMOVABLE_INS); case SLJIT_ADD:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, ADD | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_ADDC: return push_inst(compiler, ADDC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_SUB:+ compiler->status_flags_state = SLJIT_CURRENT_FLAGS_ADD_SUB; return push_inst(compiler, SUB | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_SUBC: return push_inst(compiler, SUBC | (flags & SET_FLAGS) | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst) | (flags & SET_FLAGS)); case SLJIT_MUL:+ compiler->status_flags_state = 0; FAIL_IF(push_inst(compiler, SMUL | D(dst) | S1(src1) | ARG2(flags, src2), DR(dst))); if (!(flags & SET_FLAGS)) return SLJIT_SUCCESS;
src/c/pcre2/src/sljit/sljitNativeSPARC_common.c view
@@ -1275,16 +1275,14 @@ return label; } -static sljit_ins get_cc(sljit_s32 type)+static sljit_ins get_cc(struct sljit_compiler *compiler, sljit_s32 type) { switch (type) { case SLJIT_EQUAL:- case SLJIT_MUL_NOT_OVERFLOW: case SLJIT_NOT_EQUAL_F64: /* Unordered. */ return DA(0x1); case SLJIT_NOT_EQUAL:- case SLJIT_MUL_OVERFLOW: case SLJIT_EQUAL_F64: return DA(0x9); @@ -1317,10 +1315,16 @@ return DA(0x2); case SLJIT_OVERFLOW:+ if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB))+ return DA(0x9);+ case SLJIT_UNORDERED_F64: return DA(0x7); case SLJIT_NOT_OVERFLOW:+ if (!(compiler->status_flags_state & SLJIT_CURRENT_FLAGS_ADD_SUB))+ return DA(0x1);+ case SLJIT_ORDERED_F64: return DA(0xf); @@ -1347,7 +1351,7 @@ if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & ICC_IS_SET)) jump->flags |= IS_MOVABLE; #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)- PTR_FAIL_IF(push_inst(compiler, BICC | get_cc(type ^ 1) | 5, UNMOVABLE_INS));+ PTR_FAIL_IF(push_inst(compiler, BICC | get_cc(compiler, type ^ 1) | 5, UNMOVABLE_INS)); #else #error "Implementation required" #endif@@ -1357,7 +1361,7 @@ if (((compiler->delay_slot & DST_INS_MASK) != UNMOVABLE_INS) && !(compiler->delay_slot & FCC_IS_SET)) jump->flags |= IS_MOVABLE; #if (defined SLJIT_CONFIG_SPARC_32 && SLJIT_CONFIG_SPARC_32)- PTR_FAIL_IF(push_inst(compiler, FBFCC | get_cc(type ^ 1) | 5, UNMOVABLE_INS));+ PTR_FAIL_IF(push_inst(compiler, FBFCC | get_cc(compiler, type ^ 1) | 5, UNMOVABLE_INS)); #else #error "Implementation required" #endif@@ -1474,9 +1478,9 @@ type &= 0xff; if (type < SLJIT_EQUAL_F64)- FAIL_IF(push_inst(compiler, BICC | get_cc(type) | 3, UNMOVABLE_INS));+ FAIL_IF(push_inst(compiler, BICC | get_cc(compiler, type) | 3, UNMOVABLE_INS)); else- FAIL_IF(push_inst(compiler, FBFCC | get_cc(type) | 3, UNMOVABLE_INS));+ FAIL_IF(push_inst(compiler, FBFCC | get_cc(compiler, type) | 3, UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(1), UNMOVABLE_INS)); FAIL_IF(push_inst(compiler, OR | D(reg) | S1(0) | IMM(0), UNMOVABLE_INS));
src/c/pcre2/src/sljit/sljitNativeX86_common.c view
@@ -411,11 +411,9 @@ return 0x8e /* jle */; case SLJIT_OVERFLOW:- case SLJIT_MUL_OVERFLOW: return 0x80 /* jo */; case SLJIT_NOT_OVERFLOW:- case SLJIT_MUL_NOT_OVERFLOW: return 0x81 /* jno */; case SLJIT_UNORDERED_F64:
src/hs/Text/Regex/Pcre2/Internal.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE ExistentialQuantification #-}-{-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE RankNTypes #-}@@ -16,7 +15,7 @@ import Data.Foldable (foldl', toList) import Data.Functor.Identity (Identity(..)) import Data.IORef-import Data.IntMap.Strict (IntMap, (!?))+import Data.IntMap.Strict (IntMap) import qualified Data.IntMap.Strict as IM import Data.List.NonEmpty (NonEmpty(..)) import Data.Maybe (fromMaybe)@@ -28,7 +27,7 @@ import Data.Typeable (cast) import Data.Void (Void, absurd) import Foreign-import Foreign.C.Types+import Foreign.C.Types (CInt(..), CUInt(..), CUShort) import qualified Foreign.Concurrent as Conc import Lens.Micro import Lens.Micro.Extras (preview, view)@@ -117,14 +116,14 @@ | Text.length substring > Text.length text `div` 2 = substring | otherwise = Text.copy substring --- | Probably unnecessary, but unrestricted 'castPtr' feels dangerous.-class CastCUs a b | a -> b where- castCUs :: Ptr a -> Ptr b- castCUs = castPtr- {-# INLINE castCUs #-}-instance CastCUs CUShort Word16-instance CastCUs Word16 CUShort+-- | Safe, type-restricted `castPtr`.+fromCUs :: Ptr CUShort -> Ptr Word16+fromCUs = castPtr +-- | Safe, type-restricted `castPtr`.+toCUs :: Ptr Word16 -> Ptr CUShort+toCUs = castPtr+ -- ** Lens utilities -- | A more general `toListOf` that collects targets into any `Alternative`.@@ -139,9 +138,9 @@ -- | A @FreeT@-style stream that can short-circuit. data Stream b m a = StreamPure a- | StreamYield b (Stream b m a) -- ^ yield a value and keep going- | StreamEffect (m (Stream b m a)) -- ^ have an effect and keep going- | StreamStop -- ^ short-circuit+ | StreamYield b (Stream b m a) -- ^ Yield a value and keep going.+ | StreamEffect (m (Stream b m a)) -- ^ Have an effect and keep going.+ | StreamStop -- ^ Short-circuit. deriving (Functor) instance (Functor m) => Applicative (Stream b m) where@@ -323,7 +322,7 @@ -- argument. Returning @False@ aborts pattern compilation with an -- exception. Multiples of this option before the rightmost are ignored. --- -- /NOTE: Currently (PCRE2 version 10\.37) patterns seem to be compiled in/+ -- /NOTE: Currently (PCRE2 version 10\.39) patterns seem to be compiled in/ -- /two passes, both times triggering the recursion guard. Also, it is/ -- /triggered at the beginning of the pattern, passing 0. None of this is/ -- /documented; expect the unexpected in the presence of side effects!/@@ -593,36 +592,33 @@ xtraOpts <- bitOr <$> extractOptsOf _CompileExtraOption recGuard <- preview _last <$> extractOptsOf _CompileRecGuardOption - compileEnvCtx <- sequence $ do- guard $ not $ null ctxUpds && xtraOpts == 0 && null recGuard- Just $ liftIO $ do+ if null ctxUpds && xtraOpts == 0 && null recGuard+ then return CompileEnv{+ compileEnvCtx = Nothing,+ compileEnvERef = Nothing}++ else liftIO $ do ctx <- mkForeignPtr pcre2_compile_context_free $ pcre2_compile_context_create nullPtr forM_ ctxUpds $ \update -> update ctx+ when (xtraOpts /= 0) $ withForeignPtr ctx $ \ctxPtr -> pcre2_set_compile_extra_options ctxPtr xtraOpts >>= check (== 0) - return ctx-- compileEnvERef <- sequence $ do- ctx <- compileEnvCtx- f <- recGuard- Just $ liftIO $ do- eRef <- newIORef Nothing- funPtr <- mkFunPtr ctx $ mkRecursionGuard $ \depth _ -> do- resultOrE <- try $ f (fromIntegral depth) >>= evaluate- case resultOrE of- Right success -> return $ if success then 0 else 1- Left e -> writeIORef eRef (Just e) >> return 1-- withForeignPtr ctx $ \ctxPtr ->- pcre2_set_compile_recursion_guard ctxPtr funPtr nullPtr >>=- check (== 0)-- return eRef+ compileEnvERef <- forM recGuard $ \f -> do+ eRef <- newIORef Nothing+ funPtr <- mkFunPtr ctx $ mkRecursionGuard $ \depth _ -> do+ resultOrE <- try $ f (fromIntegral depth) >>= evaluate+ case resultOrE of+ Right success -> return $ if success then 0 else 1+ Left e -> writeIORef eRef (Just e) >> return 1+ withForeignPtr ctx $ \ctxPtr ->+ pcre2_set_compile_recursion_guard ctxPtr funPtr nullPtr >>=+ check (== 0)+ return eRef - return CompileEnv{..}+ return CompileEnv{compileEnvCtx = Just ctx, ..} -- | Inputs to `Code` compilation besides the pattern. data CompileEnv = CompileEnv{@@ -642,7 +638,7 @@ alloca $ \errorOffPtr -> withForeignOrNullPtr compileEnvCtx $ \ctxPtr -> do codePtr <- pcre2_compile- (castCUs pattPtr)+ (toCUs pattPtr) (fromIntegral pattCUs) opts errorCodePtr@@ -650,7 +646,7 @@ ctxPtr when (codePtr == nullPtr) $ do -- Re-throw exception (if any) from recursion guard (if any)- forOf_ _Just compileEnvERef $ readIORef >=> mapM_ throwIO+ forM_ compileEnvERef $ readIORef >=> mapM_ throwIO -- Otherwise throw PCRE2 error errorCode <- peek errorCodePtr offCUs <- peek errorOffPtr@@ -678,9 +674,7 @@ ctxUpds -> liftIO $ Just <$> do ctx <- mkForeignPtr pcre2_match_context_free $ pcre2_match_context_create nullPtr- forM_ ctxUpds $ \update -> update ctx- return ctx matchEnvCallout <- preview _last <$> extractOptsOf _CalloutOption@@ -710,7 +704,7 @@ result <- liftIO $ withForeignOrNullPtr matchTempEnvCtx $ \ctxPtr -> pcre2_match codePtr- (castCUs subjPtr)+ (toCUs subjPtr) (fromIntegral subjCUs) curOff matchEnvOpts@@ -776,13 +770,13 @@ run :: CUInt -> Ptr Pcre2_match_context -> PCRE2_SPTR -> IO CInt run curOpts ctxPtr outBufPtr = pcre2_substitute codePtr- (castCUs subjPtr)+ (toCUs subjPtr) (fromIntegral subjCUs) 0 (matchEnvOpts .|. curOpts) nullPtr ctxPtr- (castCUs replPtr)+ (toCUs replPtr) (fromIntegral replCUs) outBufPtr outLenPtr@@ -792,7 +786,7 @@ checkAndGetOutput result outBufPtr = do check (> 0) result outLen <- peek outLenPtr- out <- Text.fromPtr (castCUs outBufPtr) (fromIntegral outLen)+ out <- Text.fromPtr (fromCUs outBufPtr) (fromIntegral outLen) return (result, out) poke outLenPtr $ fromIntegral initOutLen@@ -818,7 +812,7 @@ -- Do not run any substitution callouts run previously. matchEnvSubCallout = fastFwd <$> matchEnvSubCallout} fastFwd f = \info ->- case subsLog !? subCalloutSubsCount info of+ case subsLog IM.!? subCalloutSubsCount info of Just result -> return result Nothing -> f info MatchTempEnv{..} <- mkMatchTempEnv finalMatchEnv subject@@ -844,20 +838,28 @@ -> Text -- ^ Callout info requires access to the original subject. -> IO MatchTempEnv mkMatchTempEnv MatchEnv{..} subject- | null matchEnvCallout && null matchEnvSubCallout = return noCallouts- | otherwise = do+ | null matchEnvCallout && null matchEnvSubCallout = return MatchTempEnv{+ matchTempEnvCtx = matchEnvCtx,+ matchTempEnvRef = Nothing}++ | otherwise = do stateRef <- newIORef CalloutState{ calloutStateException = Nothing, calloutStateSubsLog = IM.empty}- ctx <- mkForeignPtr pcre2_match_context_free ctxPtrForCallouts + ctx <- mkForeignPtr pcre2_match_context_free $ case matchEnvCtx of+ -- No pre-existing match context, so create one afresh.+ Nothing -> pcre2_match_context_create nullPtr+ -- Pre-existing match context, so copy it.+ Just ctx -> withForeignPtr ctx pcre2_match_context_copy+ -- Install C function pointers in the @pcre2_match_context@. When -- dereferenced and called, they will force the user-supplied Haskell -- callout functions and their results, catching any exceptions and -- saving them. -- Install callout, if any- forOf_ _Just matchEnvCallout $ \f -> do+ forM_ matchEnvCallout $ \f -> do funPtr <- mkFunPtr ctx $ mkCallout $ \blockPtr _ -> do info <- getCalloutInfo subject blockPtr resultOrE <- try $ f info >>= evaluate@@ -873,7 +875,7 @@ pcre2_set_callout ctxPtr funPtr nullPtr >>= check (== 0) -- Install substitution callout, if any- forOf_ _Just matchEnvSubCallout $ \f -> do+ forM_ matchEnvSubCallout $ \f -> do funPtr <- mkFunPtr ctx $ mkCallout $ \blockPtr _ -> do info <- getSubCalloutInfo subject blockPtr resultOrE <- try $ f info >>= evaluate@@ -888,24 +890,14 @@ Left e -> do modifyIORef' stateRef $ _calloutStateException ?~ e return (-1)- withForeignPtr ctx $ \ctxPtr -> do- result <- pcre2_set_substitute_callout ctxPtr funPtr nullPtr- check (== 0) result+ withForeignPtr ctx $ \ctxPtr ->+ pcre2_set_substitute_callout ctxPtr funPtr nullPtr >>=+ check (== 0) return MatchTempEnv{ matchTempEnvCtx = Just ctx, matchTempEnvRef = Just stateRef} - where- noCallouts = MatchTempEnv{- matchTempEnvCtx = matchEnvCtx,- matchTempEnvRef = Nothing}- ctxPtrForCallouts = case matchEnvCtx of- -- No pre-existing match context, so create one afresh.- Nothing -> pcre2_match_context_create nullPtr- -- Pre-existing match context, so copy it.- Just ctx -> withForeignPtr ctx pcre2_match_context_copy- -- | Per-call data for @pcre2_match()@ etc. data MatchTempEnv = MatchTempEnv{ matchTempEnvCtx :: !(Maybe MatchContext),@@ -947,7 +939,7 @@ else do -- String callout len <- pcre2_callout_block_callout_string_length blockPtr- CalloutName <$> Text.fromPtr (castCUs str) (fromIntegral len)+ CalloutName <$> Text.fromPtr (fromCUs str) (fromIntegral len) calloutCaptures <- do ovecPtr <- pcre2_callout_block_offset_vector blockPtr@@ -969,7 +961,7 @@ len <- fix1 0 $ \continue off -> peekElemOff ptr off >>= \case 0 -> return off _ -> continue $ off + 1- Text.fromPtr (castCUs ptr) (fromIntegral len)+ Text.fromPtr (fromCUs ptr) (fromIntegral len) flags <- pcre2_callout_block_callout_flags blockPtr let calloutIsFirst = flags .&. pcre2_CALLOUT_STARTMATCH /= 0@@ -1000,7 +992,7 @@ offsetsPtr <- pcre2_substitute_callout_block_output_offsets blockPtr [start, end] <- forM [0, 1] $ peekElemOff offsetsPtr Text.fromPtr- (castCUs $ advancePtr outPtr $ fromIntegral start)+ (fromCUs $ advancePtr outPtr $ fromIntegral start) (fromIntegral $ end - start) return SubCalloutInfo{..}@@ -1059,7 +1051,10 @@ -- -- * `Identity` when we only want the 0th; ----- * `Proxy` when we are only checking if a match succeeded.+-- * `Proxy` when we are only checking if a match succeeded;+--+-- * `[]` when we want to easily pattern match specific capture groups via+-- Template Haskell-generated @ViewPatterns@. type FromMatch t = Ptr Pcre2_match_data -> IO (t Slice) -- | Read all specifically indexed captures\' offsets from match results.@@ -1240,13 +1235,13 @@ groupNumber <- peek entryPtr groupNameLen <- lengthArray0 0 groupNamePtr groupName <- Text.fromPtr- (castCUs groupNamePtr)+ (fromCUs groupNamePtr) (fromIntegral groupNameLen) return (fromIntegral groupNumber, groupName) hiCaptNum <- getCodeInfo @CUInt codePtr pcre2_INFO_CAPTURECOUNT - return $ map (names !?) [1 .. fromIntegral hiCaptNum]+ return $ map (names IM.!?) [1 .. fromIntegral hiCaptNum] -- | Low-level access to compiled pattern info, per the docs. getCodeInfo :: (Storable a) => Ptr Pcre2_code -> CUInt -> IO a@@ -1306,7 +1301,7 @@ let bufCUs = 120 allocaBytes (bufCUs * 2) $ \bufPtr -> do cus <- pcre2_get_error_message errorCode bufPtr (fromIntegral bufCUs)- Text.fromPtr (castCUs bufPtr) (fromIntegral cus)+ Text.fromPtr (fromCUs bufPtr) (fromIntegral cus) -- | Most PCRE2 C functions return an @int@ indicating a possible error. Test -- it against a predicate, and throw an exception upon failure.
src/hs/Text/Regex/Pcre2/TH.hs view
@@ -20,7 +20,7 @@ import Data.Proxy (Proxy(..)) import Data.Text (Text) import qualified Data.Text as Text-import Data.Type.Bool (If, type (||))+import Data.Type.Bool (type (||), If) import Data.Type.Equality (type (==)) import GHC.TypeLits hiding (Text) import qualified GHC.TypeLits as TypeLits@@ -46,9 +46,6 @@ -- be written with the help of @{-\# LANGUAGE PartialTypeSignatures \#-}@. newtype Captures (info :: CapturesInfo) = Captures (NonEmpty Text) -captured :: Lens' (NonEmpty Text) (Captures info)-captured f cs = f (Captures cs) <&> \(Captures cs') -> cs'- -- | The kind of `Captures`\'s @info@. The first number is the total number of -- parenthesized captures, and the list is a lookup table from capture names to -- numbers.@@ -154,13 +151,11 @@ -- | Helper for `regex` with no parenthesized captures. matchTH :: (Alternative f) => Text -> Text -> f Text-matchTH patt = toAlternativeOf $- _gcaptures (memoMatcher patt) get0thSlice . _Identity+matchTH patt = toAlternativeOf $ _matchTH patt -- | Helper for `regex` with parenthesized captures. capturesTH :: (Alternative f) => Text -> Proxy info -> Text -> f (Captures info)-capturesTH patt _ = toAlternativeOf $- _gcaptures (memoMatcher patt) getAllSlices . captured+capturesTH patt proxy = toAlternativeOf $ _capturesTH patt proxy -- | Helper for `regex` as a guard pattern. matchesTH :: Text -> Text -> Bool@@ -177,7 +172,8 @@ -- | Helper for `_regex` with parenthesized captures. _capturesTH :: Text -> Proxy info -> Traversal' Text (Captures info)-_capturesTH patt _ = _gcaptures (memoMatcher patt) getAllSlices . captured+_capturesTH patt _ = _gcaptures (memoMatcher patt) getAllSlices . captured where+ captured f cs = f (Captures cs) <&> \(Captures cs') -> cs' -- | === As an expression --