summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--Makefile.am1
-rw-r--r--NON-AUTOTOOLS-BUILD1
-rw-r--r--README1
-rw-r--r--doc/html/NON-AUTOTOOLS-BUILD.txt1
-rw-r--r--doc/html/README.txt1
-rwxr-xr-xmaint/GenerateUtt.py3
-rwxr-xr-xmaint/MultiStage2.py69
-rw-r--r--maint/ucptest.c1
-rwxr-xr-xperltest.sh17
-rw-r--r--src/pcre2.h.in1
-rw-r--r--src/pcre2_auto_possess.c10
-rw-r--r--src/pcre2_compile.c226
-rw-r--r--src/pcre2_dfa_match.c2
-rw-r--r--src/pcre2_error.c1
-rw-r--r--src/pcre2_internal.h83
-rw-r--r--src/pcre2_match.c9
-rw-r--r--src/pcre2_printint.c1
-rw-r--r--src/pcre2_script_run.c228
-rw-r--r--src/pcre2_study.c2
-rw-r--r--src/pcre2_tables.c29
-rw-r--r--src/pcre2_ucd.c1741
-rw-r--r--src/pcre2_ucp.h1
-rw-r--r--testdata/testinput1211
-rw-r--r--testdata/testinput491
-rw-r--r--testdata/testinput523
-rw-r--r--testdata/testoutput12-1615
-rw-r--r--testdata/testoutput12-3216
-rw-r--r--testdata/testoutput4149
-rw-r--r--testdata/testoutput559
30 files changed, 1786 insertions, 1011 deletions
diff --git a/ChangeLog b/ChangeLog
index fb265f4..d7b9e51 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -30,6 +30,10 @@ new "is lower case letter" bit. At the same time, the now unused "is
hexadecimal digit" bit was removed. The default tables in
src/pcre2_chartables.c.dist are updated.
+8. Implement the new Perl "script run" features (*script_run:...) and
+(*atomic_script_run:...) aka (*sr:...) and (*asr:...). At present, this is
+incomplete and not yet documented.
+
Version 10.32 10-September-2018
-------------------------------
diff --git a/Makefile.am b/Makefile.am
index 998e12b..bc40c8c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -364,6 +364,7 @@ COMMON_SOURCES = \
src/pcre2_newline.c \
src/pcre2_ord2utf.c \
src/pcre2_pattern_info.c \
+ src/pcre2_script_run.c \
src/pcre2_serialize.c \
src/pcre2_string_utils.c \
src/pcre2_study.c \
diff --git a/NON-AUTOTOOLS-BUILD b/NON-AUTOTOOLS-BUILD
index b742ed3..c6f674f 100644
--- a/NON-AUTOTOOLS-BUILD
+++ b/NON-AUTOTOOLS-BUILD
@@ -104,6 +104,7 @@ can skip ahead to the CMake section.
pcre2_newline.c
pcre2_ord2utf.c
pcre2_pattern_info.c
+ pcre2_script_run.c
pcre2_serialize.c
pcre2_string_utils.c
pcre2_study.c
diff --git a/README b/README
index ae8adf8..7acb9ff 100644
--- a/README
+++ b/README
@@ -788,6 +788,7 @@ The distribution should contain the files listed below.
src/pcre2_newline.c )
src/pcre2_ord2utf.c )
src/pcre2_pattern_info.c )
+ src/pcre2_script_run.c )
src/pcre2_serialize.c )
src/pcre2_string_utils.c )
src/pcre2_study.c )
diff --git a/doc/html/NON-AUTOTOOLS-BUILD.txt b/doc/html/NON-AUTOTOOLS-BUILD.txt
index b742ed3..c6f674f 100644
--- a/doc/html/NON-AUTOTOOLS-BUILD.txt
+++ b/doc/html/NON-AUTOTOOLS-BUILD.txt
@@ -104,6 +104,7 @@ can skip ahead to the CMake section.
pcre2_newline.c
pcre2_ord2utf.c
pcre2_pattern_info.c
+ pcre2_script_run.c
pcre2_serialize.c
pcre2_string_utils.c
pcre2_study.c
diff --git a/doc/html/README.txt b/doc/html/README.txt
index ae8adf8..7acb9ff 100644
--- a/doc/html/README.txt
+++ b/doc/html/README.txt
@@ -788,6 +788,7 @@ The distribution should contain the files listed below.
src/pcre2_newline.c )
src/pcre2_ord2utf.c )
src/pcre2_pattern_info.c )
+ src/pcre2_script_run.c )
src/pcre2_serialize.c )
src/pcre2_string_utils.c )
src/pcre2_study.c )
diff --git a/maint/GenerateUtt.py b/maint/GenerateUtt.py
index 54a72e0..5d097f7 100755
--- a/maint/GenerateUtt.py
+++ b/maint/GenerateUtt.py
@@ -25,8 +25,9 @@
# Added script names for Unicode 8.0.0, 19-June-2015.
# Added script names for Unicode 10.0.0, 02-July-2017.
# Added script names for Unicode 11.0.0, 03-July-2018.
+# Added 'Unknown' script, 01-October-2018.
-script_names = ['Arabic', 'Armenian', 'Bengali', 'Bopomofo', 'Braille', 'Buginese', 'Buhid', 'Canadian_Aboriginal', \
+script_names = ['Unknown', 'Arabic', 'Armenian', 'Bengali', 'Bopomofo', 'Braille', 'Buginese', 'Buhid', 'Canadian_Aboriginal', \
'Cherokee', 'Common', 'Coptic', 'Cypriot', 'Cyrillic', 'Deseret', 'Devanagari', 'Ethiopic', 'Georgian', \
'Glagolitic', 'Gothic', 'Greek', 'Gujarati', 'Gurmukhi', 'Han', 'Hangul', 'Hanunoo', 'Hebrew', 'Hiragana', \
'Inherited', 'Kannada', 'Katakana', 'Kharoshthi', 'Khmer', 'Lao', 'Latin', 'Limbu', 'Linear_B', 'Malayalam', \
diff --git a/maint/MultiStage2.py b/maint/MultiStage2.py
index e9ed694..cdb021a 100755
--- a/maint/MultiStage2.py
+++ b/maint/MultiStage2.py
@@ -143,6 +143,7 @@
# 03-July-2018: Updated for Unicode 11.0.0
# 07-July-2018: Added code to scan emoji-data.txt for the Extended
# Pictographic property.
+# 01-October-2018: Added the 'Unknown' script name
##############################################################################
@@ -300,7 +301,7 @@ def get_record_size_struct(records):
slice_type, slice_size = get_type_size(record_slice)
size = (size + slice_size - 1) & -slice_size
- structure += '} ucd_record;\n*/\n\n'
+ structure += '} ucd_record;\n*/\n'
return size, structure
def test_record_size():
@@ -329,7 +330,7 @@ def print_records(records, record_size):
print((' {' + '%6d, ' * len(record[0]) + '}, /* %3d */') % (record[0] + (i,)))
print('};\n')
-script_names = ['Arabic', 'Armenian', 'Bengali', 'Bopomofo', 'Braille', 'Buginese', 'Buhid', 'Canadian_Aboriginal', \
+script_names = ['Unknown', 'Arabic', 'Armenian', 'Bengali', 'Bopomofo', 'Braille', 'Buginese', 'Buhid', 'Canadian_Aboriginal', \
'Cherokee', 'Common', 'Coptic', 'Cypriot', 'Cyrillic', 'Deseret', 'Devanagari', 'Ethiopic', 'Georgian', \
'Glagolitic', 'Gothic', 'Greek', 'Gujarati', 'Gurmukhi', 'Han', 'Hangul', 'Hanunoo', 'Hebrew', 'Hiragana', \
'Inherited', 'Kannada', 'Katakana', 'Kharoshthi', 'Khmer', 'Lao', 'Latin', 'Limbu', 'Linear_B', 'Malayalam', \
@@ -380,7 +381,7 @@ break_property_names = ['CR', 'LF', 'Control', 'Extend', 'Prepend',
test_record_size()
unicode_version = ""
-script = read_table('Unicode.tables/Scripts.txt', make_get_names(script_names), script_names.index('Common'))
+script = read_table('Unicode.tables/Scripts.txt', make_get_names(script_names), script_names.index('Unknown'))
category = read_table('Unicode.tables/DerivedGeneralCategory.txt', make_get_names(category_names), category_names.index('Cn'))
break_props = read_table('Unicode.tables/GraphemeBreakProperty.txt', make_get_names(break_property_names), break_property_names.index('Other'))
other_case = read_table('Unicode.tables/CaseFolding.txt', get_other_case, 0)
@@ -553,11 +554,11 @@ print("special record. */")
print()
print("#if PCRE2_CODE_UNIT_WIDTH == 32")
print("const ucd_record PRIV(dummy_ucd_record)[] = {{")
-print(" ucp_Common, /* script */")
-print(" ucp_Cn, /* type unassigned */")
-print(" ucp_gbOther, /* grapheme break property */")
-print(" 0, /* case set */")
-print(" 0, /* other case */")
+print(" ucp_Unknown, /* script */")
+print(" ucp_Cn, /* type unassigned */")
+print(" ucp_gbOther, /* grapheme break property */")
+print(" 0, /* case set */")
+print(" 0, /* other case */")
print(" }};")
print("#endif")
print()
@@ -565,6 +566,9 @@ print(record_struct)
# --- Added by PH: output the table of caseless character sets ---
+print("/* This table contains lists of characters that are caseless sets of")
+print("more than one character. Each list is terminated by NOTACHAR. */\n")
+
print("const uint32_t PRIV(ucd_caseless_sets)[] = {")
print(" NOTACHAR,")
for s in sets:
@@ -577,10 +581,53 @@ print()
# ------
-print("/* When #included in pcre2test, we don't need this large table. */")
+print("/* When #included in pcre2test, we don't need the table of digit")
+print("sets, nor the the large main UCD tables. */")
print()
print("#ifndef PCRE2_PCRE2TEST")
print()
+
+# --- Added by PH: read Scripts.txt again for the sets of 10 digits. ---
+
+digitsets = []
+file = open('Unicode.tables/Scripts.txt', 'r', encoding='utf-8')
+
+for line in file:
+ m = re.match(r'([0-9a-fA-F]+)\.\.([0-9a-fA-F]+)\s+;\s+\S+\s+#\s+Nd\s+', line)
+ if m is None:
+ continue
+ first = int(m.group(1),16)
+ last = int(m.group(2),16)
+ if ((last - first + 1) % 10) != 0:
+ print("ERROR: %04x..%04x does not contain a multiple of 10 characters" % (first, last),
+ file=sys.stderr)
+ while first < last:
+ digitsets.append(first + 9)
+ first += 10
+file.close()
+digitsets.sort()
+
+print("/* This table lists the code points for the '9' characters in each")
+print("set of decimal digits. It is used to ensure that all the digits in")
+print("a script run come from the same set. */")
+print()
+print("const uint32_t PRIV(ucd_digit_sets)[] = {")
+
+print(" %d, /* Number of subsequent values */" % len(digitsets), end='')
+count = 8
+for d in digitsets:
+ if count == 8:
+ print("\n ", end='')
+ count = 0
+ print(" 0x%05x," % d, end='')
+ count += 1
+print("\n};")
+print()
+
+# Output the main UCD tables.
+
+print("/* These are the main two-stage UCD tables. */\n")
+
print_records(records, record_size)
print_table(min_stage1, 'PRIV(ucd_stage1)')
print_table(min_stage2, 'PRIV(ucd_stage2)', min_block_size)
@@ -591,6 +638,10 @@ print("#endif /* SUPPORT_UNICODE */")
print()
print("#endif /* PCRE2_PCRE2TEST */")
+
+# This code was part of the original contribution, but is commented out as it
+# was never used. A two-stage table has sufficed.
+
"""
# Three-stage tables:
diff --git a/maint/ucptest.c b/maint/ucptest.c
index a3dfd26..dbcf7d9 100644
--- a/maint/ucptest.c
+++ b/maint/ucptest.c
@@ -134,6 +134,7 @@ switch(gbprop)
switch(script)
{
+ case ucp_Unknown: scriptname = US"Unknown"; break;
case ucp_Arabic: scriptname = US"Arabic"; break;
case ucp_Armenian: scriptname = US"Armenian"; break;
case ucp_Balinese: scriptname = US"Balinese"; break;
diff --git a/perltest.sh b/perltest.sh
index ef0b8a3..4806f8d 100755
--- a/perltest.sh
+++ b/perltest.sh
@@ -1,8 +1,10 @@
#! /bin/sh
# Script for testing regular expressions with perl to check that PCRE2 handles
-# them the same. If the first argument to this script is "-w", Perl is also
-# called with "-w", which turns on its warning mode.
+# them the same. For testing with different versions of Perl, if the first
+# argument is -perl then the second is taken as the Perl command to use, and
+# both are then removed. If the next argument is "-w", Perl is called with
+# "-w", which turns on its warning mode.
#
# The Perl code has to have "use utf8" and "require Encode" at the start when
# running UTF-8 tests, but *not* for non-utf8 tests. (The "require" would
@@ -10,8 +12,8 @@
# the script will always run for these tests.)
#
# The desired effect is achieved by making this a shell script that passes the
-# Perl script to Perl through a pipe. If the first argument (possibly after
-# removing "-w") is "-utf8", a suitable prefix is set up.
+# Perl script to Perl through a pipe. If the next argument is "-utf8", a
+# suitable prefix is set up.
#
# The remaining arguments, if any, are passed to Perl. They are an input file
# and an output file. If there is one argument, the output is written to
@@ -23,6 +25,12 @@ perl=perl
perlarg=''
prefix=''
+if [ $# -gt 1 -a "$1" = "-perl" ] ; then
+ shift
+ perl=$1
+ shift
+fi
+
if [ $# -gt 0 -a "$1" = "-w" ] ; then
perlarg="-w"
shift
@@ -78,6 +86,7 @@ fi
# The alpha assertions currently give warnings even when -w is not specified.
no warnings "experimental::alpha_assertions";
+no warnings "experimental::script_run";
# Function for turning a string into a string of printing chars.
diff --git a/src/pcre2.h.in b/src/pcre2.h.in
index dc1360f..68e7768 100644
--- a/src/pcre2.h.in
+++ b/src/pcre2.h.in
@@ -321,6 +321,7 @@ pcre2_pattern_convert(). */
#define PCRE2_ERROR_SUPPORTED_ONLY_IN_UNICODE 193
#define PCRE2_ERROR_INVALID_HYPHEN_IN_OPTIONS 194
#define PCRE2_ERROR_ALPHA_ASSERTION_UNKNOWN 195
+#define PCRE2_ERROR_SCRIPT_RUN_NOT_AVAILABLE 196
/* "Expected" matching error codes: no match and partial match. */
diff --git a/src/pcre2_auto_possess.c b/src/pcre2_auto_possess.c
index 2ce152e..5a19f53 100644
--- a/src/pcre2_auto_possess.c
+++ b/src/pcre2_auto_possess.c
@@ -604,6 +604,15 @@ for(;;)
case OP_SCBRAPOS:
if (cb->had_recurse) return FALSE;
break;
+
+ /* A script run might have to backtrack if the iterated item can match
+ characters from more than one script. So give up unless repeating an
+ explicit character. */
+
+ case OP_SCRIPT_RUN:
+ if (base_list[0] != OP_CHAR && base_list[0] != OP_CHARI)
+ return FALSE;
+ break;
/* Atomic sub-patterns and assertions can always auto-possessify their
last iterator. However, if the group was entered as a result of checking
@@ -614,7 +623,6 @@ for(;;)
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
case OP_ONCE:
-
return !entered_a_group;
}
diff --git a/src/pcre2_compile.c b/src/pcre2_compile.c
index 358c708..88e581f 100644
--- a/src/pcre2_compile.c
+++ b/src/pcre2_compile.c
@@ -240,49 +240,57 @@ code (meta_extra_lengths, just below) must be updated to remain in step. */
#define META_RANGE_LITERAL 0x801f0000u /* range defined literally */
#define META_RECURSE 0x80200000u /* Recursion */
#define META_RECURSE_BYNAME 0x80210000u /* (?&name) */
+#define META_SCRIPT_RUN 0x80220000u /* (*script_run:...) */
/* These must be kept together to make it easy to check that an assertion
is present where expected in a conditional group. */
-#define META_LOOKAHEAD 0x80220000u /* (?= */
-#define META_LOOKAHEADNOT 0x80230000u /* (?! */
-#define META_LOOKBEHIND 0x80240000u /* (?<= */
-#define META_LOOKBEHINDNOT 0x80250000u /* (?<! */
+#define META_LOOKAHEAD 0x80230000u /* (?= */
+#define META_LOOKAHEADNOT 0x80240000u /* (?! */
+#define META_LOOKBEHIND 0x80250000u /* (?<= */
+#define META_LOOKBEHINDNOT 0x80260000u /* (?<! */
/* These must be kept in this order, with consecutive values, and the _ARG
versions of COMMIT, PRUNE, SKIP, and THEN immediately after their non-argument
versions. */
-#define META_MARK 0x80260000u /* (*MARK) */
-#define META_ACCEPT 0x80270000u /* (*ACCEPT) */
-#define META_FAIL 0x80280000u /* (*FAIL) */
-#define META_COMMIT 0x80290000u /* These */
-#define META_COMMIT_ARG 0x802a0000u /* pairs */
-#define META_PRUNE 0x802b0000u /* must */
-#define META_PRUNE_ARG 0x802c0000u /* be */
-#define META_SKIP 0x802d0000u /* kept */
-#define META_SKIP_ARG 0x802e0000u /* in */
-#define META_THEN 0x802f0000u /* this */
-#define META_THEN_ARG 0x80300000u /* order */
+#define META_MARK 0x80270000u /* (*MARK) */
+#define META_ACCEPT 0x80280000u /* (*ACCEPT) */
+#define META_FAIL 0x80290000u /* (*FAIL) */
+#define META_COMMIT 0x802a0000u /* These */
+#define META_COMMIT_ARG 0x802b0000u /* pairs */
+#define META_PRUNE 0x802c0000u /* must */
+#define META_PRUNE_ARG 0x802d0000u /* be */
+#define META_SKIP 0x802e0000u /* kept */
+#define META_SKIP_ARG 0x802f0000u /* in */
+#define META_THEN 0x80300000u /* this */
+#define META_THEN_ARG 0x80310000u /* order */
/* These must be kept in groups of adjacent 3 values, and all together. */
-#define META_ASTERISK 0x80310000u /* * */
-#define META_ASTERISK_PLUS 0x80320000u /* *+ */
-#define META_ASTERISK_QUERY 0x80330000u /* *? */
-#define META_PLUS 0x80340000u /* + */
-#define META_PLUS_PLUS 0x80350000u /* ++ */
-#define META_PLUS_QUERY 0x80360000u /* +? */
-#define META_QUERY 0x80370000u /* ? */
-#define META_QUERY_PLUS 0x80380000u /* ?+ */
-#define META_QUERY_QUERY 0x80390000u /* ?? */
-#define META_MINMAX 0x803a0000u /* {n,m} repeat */
-#define META_MINMAX_PLUS 0x803b0000u /* {n,m}+ repeat */
-#define META_MINMAX_QUERY 0x803c0000u /* {n,m}? repeat */
+#define META_ASTERISK 0x80320000u /* * */
+#define META_ASTERISK_PLUS 0x80330000u /* *+ */
+#define META_ASTERISK_QUERY 0x80340000u /* *? */
+#define META_PLUS 0x80350000u /* + */
+#define META_PLUS_PLUS 0x80360000u /* ++ */
+#define META_PLUS_QUERY 0x80370000u /* +? */
+#define META_QUERY 0x80380000u /* ? */
+#define META_QUERY_PLUS 0x80390000u /* ?+ */
+#define META_QUERY_QUERY 0x803a0000u /* ?? */
+#define META_MINMAX 0x803b0000u /* {n,m} repeat */
+#define META_MINMAX_PLUS 0x803c0000u /* {n,m}+ repeat */
+#define META_MINMAX_QUERY 0x803d0000u /* {n,m}? repeat */
#define META_FIRST_QUANTIFIER META_ASTERISK
#define META_LAST_QUANTIFIER META_MINMAX_QUERY
+/* This is a special "meta code" that is used only to distinguish (*asr: from
+(*sr in the table of aphabetic assertions. It is never stored in the parsed
+pattern because (*asr: is turned into (*sr:(*atomic: at that stage. There is
+therefore no need for it to have a length entry, so use a high value. */
+
+#define META_ATOMIC_SCRIPT_RUN 0x8fff0000u
+
/* Table of extra lengths for each of the meta codes. Must be kept in step with
the definitions above. For some items these values are a basic length to which
a variable amount has to be added. */
@@ -322,6 +330,7 @@ static unsigned char meta_extra_lengths[] = {
0, /* META_RANGE_LITERAL */
SIZEOFFSET, /* META_RECURSE */
1+SIZEOFFSET, /* META_RECURSE_BYNAME */
+ 0, /* META_SCRIPT_RUN */
0, /* META_LOOKAHEAD */
0, /* META_LOOKAHEADNOT */
SIZEOFFSET, /* META_LOOKBEHIND */
@@ -638,19 +647,19 @@ static const char alasnames[] =
STRING_atomic_script_run;
static const alasitem alasmeta[] = {
- { 3, META_LOOKAHEAD },
- { 3, META_LOOKBEHIND },
- { 3, META_LOOKAHEADNOT },
- { 3, META_LOOKBEHINDNOT },
- { 18, META_LOOKAHEAD },
- { 19, META_LOOKBEHIND },
- { 18, META_LOOKAHEADNOT },
- { 19, META_LOOKBEHINDNOT },
- { 6, META_ATOMIC },
- { 2, 0 }, /* sr = script run */
- { 3, 0 }, /* asr = atomic script run */
- { 10, 0 }, /* script run */
- { 17, 0 } /* atomic script run */
+ { 3, META_LOOKAHEAD },
+ { 3, META_LOOKBEHIND },
+ { 3, META_LOOKAHEADNOT },
+ { 3, META_LOOKBEHINDNOT },
+ { 18, META_LOOKAHEAD },
+ { 19, META_LOOKBEHIND },
+ { 18, META_LOOKAHEADNOT },
+ { 19, META_LOOKBEHINDNOT },
+ { 6, META_ATOMIC },
+ { 2, META_SCRIPT_RUN }, /* sr = script run */
+ { 3, META_ATOMIC_SCRIPT_RUN }, /* asr = atomic script run */
+ { 10, META_SCRIPT_RUN }, /* script run */
+ { 17, META_ATOMIC_SCRIPT_RUN } /* atomic script run */
};
static const int alascount = sizeof(alasmeta)/sizeof(alasitem);
@@ -772,7 +781,7 @@ enum { ERR0 = COMPILE_ERROR_BASE,
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 };
+ ERR91, ERR92, ERR93, ERR94, ERR95, ERR96 };
/* 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
@@ -1003,6 +1012,7 @@ for (;;)
case META_NOCAPTURE: fprintf(stderr, "META (?:"); break;
case META_LOOKAHEAD: fprintf(stderr, "META (?="); break;
case META_LOOKAHEADNOT: fprintf(stderr, "META (?!"); break;
+ case META_SCRIPT_RUN: fprintf(stderr, "META (*sr:"); break;
case META_KET: fprintf(stderr, "META )"); break;
case META_ALT: fprintf(stderr, "META | %d", meta_arg); break;
@@ -2210,15 +2220,15 @@ if (++ptr >= ptrend) /* No characters in name */
ERR60; /* Verb not recognized or malformed */
goto FAILED;
}
-
-/* A group name must not start with a digit. If either of the others start with
-a digit it just won't be recognized. */
-
+
+/* A group name must not start with a digit. If either of the others start with
+a digit it just won't be recognized. */
+
if (is_group && IS_DIGIT(*ptr))
{
*errorcodeptr = ERR44;
goto FAILED;
- }
+ }
*nameptr = ptr;
*offsetptr = (PCRE2_SIZE)(ptr - cb->start_pattern);
@@ -2345,6 +2355,7 @@ typedef struct nest_save {
#define NSF_RESET 0x0001u
#define NSF_CONDASSERT 0x0002u
+#define NSF_ATOMICSR 0x0004u
/* Options that are changeable within the pattern must be tracked during
parsing. Some (e.g. PCRE2_EXTENDED) are implemented entirely during parsing,
@@ -2707,19 +2718,19 @@ while (ptr < ptrend)
case CHAR_C:
ok = expect_cond_assert == 2;
break;
-
+
case CHAR_EQUALS_SIGN:
case CHAR_EXCLAMATION_MARK:
break;
-
+
case CHAR_LESS_THAN_SIGN:
ok = ptr[2] == CHAR_EQUALS_SIGN || ptr[2] == CHAR_EXCLAMATION_MARK;
break;
-
+
default:
ok = FALSE;
}
- }
+ }
if (!ok)
{
@@ -3533,13 +3544,13 @@ while (ptr < ptrend)
/* Handle "alpha assertions" such as (*pla:...). Most of these are
synonyms for the historical symbolic assertions, but the script run ones
are new. They are distinguished by starting with a lower case letter.
- Checking both ends of the alphabet makes this work in all character
+ Checking both ends of the alphabet makes this work in all character
codes. */
else if (CHMAX_255(c) && (cb->ctypes[c] & ctype_lcletter) != 0)
{
uint32_t meta;
-
+
vn = alasnames;
if (!read_name(&ptr, ptrend, 0, &offset, &name, &namelen, &errorcode,
cb)) goto FAILED;
@@ -3550,7 +3561,7 @@ while (ptr < ptrend)
}
/* Scan the table of alpha assertion names */
-
+
for (i = 0; i < alascount; i++)
{
if (namelen == alasmeta[i].len &&
@@ -3564,42 +3575,72 @@ while (ptr < ptrend)
errorcode = ERR95; /* Alpha assertion not recognized */
goto FAILED;
}
-
- /* Check for expecting an assertion condition. If so, only lookaround
+
+ /* Check for expecting an assertion condition. If so, only lookaround
assertions are valid. */
-
+
meta = alasmeta[i].meta;
- if (prev_expect_cond_assert > 0 &&
+ if (prev_expect_cond_assert > 0 &&
(meta < META_LOOKAHEAD || meta > META_LOOKBEHINDNOT))
{
errorcode = ERR28; /* Assertion expected */
- goto FAILED;
- }
+ goto FAILED;
+ }
+
+ /* The lookaround alphabetic synonyms can be almost entirely handled by
+ jumping to the code that handles the traditional symbolic forms. */
switch(meta)
{
+ default:
+ errorcode = ERR89; /* Unknown code; should never occur because */
+ goto FAILED; /* the meta values come from a table above. */
+
case META_ATOMIC:
- goto ATOMIC_GROUP;
+ goto ATOMIC_GROUP;
case META_LOOKAHEAD:
goto POSITIVE_LOOK_AHEAD;
-
+
case META_LOOKAHEADNOT:
goto NEGATIVE_LOOK_AHEAD;
-
+
case META_LOOKBEHIND:
- case META_LOOKBEHINDNOT:
- *parsed_pattern++ = meta;
+ case META_LOOKBEHINDNOT:
+ *parsed_pattern++ = meta;
ptr--;
- goto LOOKBEHIND;
-
- /* FIXME: Script Run stuff ... */
-
-
-
-
-
- }
+ goto POST_LOOKBEHIND;
+
+ /* The script run facilities are handled here. Unicode support is
+ required (give an error if not, as this is a security issue). Always
+ record a META_SCRIPT_RUN item. Then, for the atomic version, insert
+ META_ATOMIC and remember that we need two META_KETs at the end. */
+
+ case META_SCRIPT_RUN:
+ case META_ATOMIC_SCRIPT_RUN:
+#ifdef SUPPORT_UNICODE
+ *parsed_pattern++ = META_SCRIPT_RUN;
+ nest_depth++;
+ ptr++;
+ if (meta == META_ATOMIC_SCRIPT_RUN)
+ {
+ *parsed_pattern++ = META_ATOMIC;
+ if (top_nest == NULL) top_nest = (nest_save *)(cb->start_workspace);
+ else if (++top_nest >= end_nests)
+ {
+ errorcode = ERR84;
+ goto FAILED;
+ }
+ top_nest->nest_depth = nest_depth;
+ top_nest->flags = NSF_ATOMICSR;
+ top_nest->options = options & PARSE_TRACKED_OPTIONS;
+ }
+ break;
+#else /* SUPPORT_UNICODE */
+ errorcode = ERR96;
+ goto FAILED;
+#endif
+ }
}
@@ -4262,8 +4303,8 @@ while (ptr < ptrend)
}
*parsed_pattern++ = (ptr[1] == CHAR_EQUALS_SIGN)?
META_LOOKBEHIND : META_LOOKBEHINDNOT;
-
- LOOKBEHIND: /* Come from (*plb: and (*nlb: */
+
+ POST_LOOKBEHIND: /* Come from (*plb: and (*nlb: */
*has_lookbehind = TRUE;
offset = (PCRE2_SIZE)(ptr - cb->start_pattern - 2);
PUTOFFSET(offset, parsed_pattern);
@@ -4425,6 +4466,14 @@ while (ptr < ptrend)
cb->bracount = top_nest->max_group;
if ((top_nest->flags & NSF_CONDASSERT) != 0)
okquantifier = FALSE;
+
+ if ((top_nest->flags & NSF_ATOMICSR) != 0)
+ {
+ *parsed_pattern++ = META_KET;
+ }
+
+
+
if (top_nest == (nest_save *)(cb->start_workspace)) top_nest = NULL;
else top_nest--;
}
@@ -6142,6 +6191,10 @@ for (;; pptr++)
bravalue = OP_ONCE;
goto GROUP_PROCESS_NOTE_EMPTY;
+ case META_SCRIPT_RUN:
+ bravalue = OP_SCRIPT_RUN;
+ goto GROUP_PROCESS_NOTE_EMPTY;
+
case META_NOCAPTURE:
bravalue = OP_BRA;
/* Fall through */
@@ -6777,6 +6830,7 @@ for (;; pptr++)
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_BRA:
case OP_CBRA:
case OP_COND:
@@ -6989,16 +7043,16 @@ for (;; pptr++)
}
/* If the maximum is unlimited, set a repeater in the final copy. For
- ONCE brackets, that's all we need to do. However, possessively repeated
- ONCE brackets can be converted into non-capturing brackets, as the
- behaviour of (?:xx)++ is the same as (?>xx)++ and this saves having to
- deal with possessive ONCEs specially.
+ SCRIPT_RUN and ONCE brackets, that's all we need to do. However,
+ possessively repeated ONCE brackets can be converted into non-capturing
+ brackets, as the behaviour of (?:xx)++ is the same as (?>xx)++ and this
+ saves having to deal with possessive ONCEs specially.
Otherwise, when we are doing the actual compile phase, check to see
whether this group is one that could match an empty string. If so,
convert the initial operator to the S form (e.g. OP_BRA -> OP_SBRA) so
that runtime checking can be done. [This check is also applied to ONCE
- groups at runtime, but in a different way.]
+ and SCRIPT_RUN groups at runtime, but in a different way.]
Then, if the quantifier was possessive and the bracket is not a
conditional, we convert the BRA code to the POS form, and the KET code to
@@ -7022,13 +7076,14 @@ for (;; pptr++)
if (*bracode == OP_ONCE && possessive_quantifier) *bracode = OP_BRA;
- /* For non-possessive ONCE brackets, all we need to do is to
- set the KET. */
+ /* For non-possessive ONCE and for SCRIPT_RUN brackets, all we need
+ to do is to set the KET. */
- if (*bracode == OP_ONCE) *ketcode = OP_KETRMAX + repeat_type;
+ if (*bracode == OP_ONCE || *bracode == OP_SCRIPT_RUN)
+ *ketcode = OP_KETRMAX + repeat_type;
- /* Handle non-ONCE brackets and possessive ONCEs (which have been
- converted to non-capturing above). */
+ /* Handle non-SCRIPT_RUN and non-ONCE brackets and possessive ONCEs
+ (which have been converted to non-capturing above). */
else
{
@@ -8385,6 +8440,7 @@ do {
case OP_SCBRAPOS:
case OP_ASSERT:
case OP_ONCE:
+ case OP_SCRIPT_RUN:
d = find_firstassertedcu(scode, &dflags, inassert + ((op==OP_ASSERT)?1:0));
if (dflags < 0)
return 0;
diff --git a/src/pcre2_dfa_match.c b/src/pcre2_dfa_match.c
index 9b43237..2db8f96 100644
--- a/src/pcre2_dfa_match.c
+++ b/src/pcre2_dfa_match.c
@@ -173,6 +173,7 @@ static const uint8_t coptable[] = {
0, /* Assert behind */
0, /* Assert behind not */
0, /* ONCE */
+ 0, /* SCRIPT_RUN */
0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */
0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */
0, 0, /* CREF, DNCREF */
@@ -247,6 +248,7 @@ static const uint8_t poptable[] = {
0, /* Assert behind */
0, /* Assert behind not */
0, /* ONCE */
+ 0, /* SCRIPT_RUN */
0, 0, 0, 0, 0, /* BRA, BRAPOS, CBRA, CBRAPOS, COND */
0, 0, 0, 0, 0, /* SBRA, SBRAPOS, SCBRA, SCBRAPOS, SCOND */
0, 0, /* CREF, DNCREF */
diff --git a/src/pcre2_error.c b/src/pcre2_error.c
index 044ce65..1aefe7b 100644
--- a/src/pcre2_error.c
+++ b/src/pcre2_error.c
@@ -183,6 +183,7 @@ static const unsigned char compile_error_texts[] =
"invalid hyphen in option setting\0"
/* 95 */
"(*alpha_assertion) not recognized\0"
+ "script runs require Unicode support, which this version of PCRE2 does not have\0"
;
/* Match-time and UTF error texts are in the same format. */
diff --git a/src/pcre2_internal.h b/src/pcre2_internal.h
index ce3f4a6..3940f15 100644
--- a/src/pcre2_internal.h
+++ b/src/pcre2_internal.h
@@ -1513,70 +1513,71 @@ enum {
OP_ASSERTBACK, /* 128 Positive lookbehind */
OP_ASSERTBACK_NOT, /* 129 Negative lookbehind */
- /* ONCE, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come immediately after the
- assertions, with ONCE first, as there's a test for >= ONCE for a subpattern
- that isn't an assertion. The POS versions must immediately follow the non-POS
- versions in each case. */
+ /* ONCE, SCRIPT_RUN, BRA, BRAPOS, CBRA, CBRAPOS, and COND must come
+ immediately after the assertions, with ONCE first, as there's a test for >=
+ ONCE for a subpattern that isn't an assertion. The POS versions must
+ immediately follow the non-POS versions in each case. */
OP_ONCE, /* 130 Atomic group, contains captures */
- OP_BRA, /* 131 Start of non-capturing bracket */
- OP_BRAPOS, /* 132 Ditto, with unlimited, possessive repeat */
- OP_CBRA, /* 133 Start of capturing bracket */
- OP_CBRAPOS, /* 134 Ditto, with unlimited, possessive repeat */
- OP_COND, /* 135 Conditional group */
+ OP_SCRIPT_RUN, /* 131 Non-capture, but check characters' scripts */
+ OP_BRA, /* 132 Start of non-capturing bracket */
+ OP_BRAPOS, /* 133 Ditto, with unlimited, possessive repeat */
+ OP_CBRA, /* 134 Start of capturing bracket */
+ OP_CBRAPOS, /* 135 Ditto, with unlimited, possessive repeat */
+ OP_COND, /* 136 Conditional group */
/* These five must follow the previous five, in the same order. There's a
check for >= SBRA to distinguish the two sets. */
- OP_SBRA, /* 136 Start of non-capturing bracket, check empty */
- OP_SBRAPOS, /* 137 Ditto, with unlimited, possessive repeat */
- OP_SCBRA, /* 138 Start of capturing bracket, check empty */
- OP_SCBRAPOS, /* 139 Ditto, with unlimited, possessive repeat */
- OP_SCOND, /* 140 Conditional group, check empty */
+ OP_SBRA, /* 137 Start of non-capturing bracket, check empty */
+ OP_SBRAPOS, /* 138 Ditto, with unlimited, possessive repeat */
+ OP_SCBRA, /* 139 Start of capturing bracket, check empty */
+ OP_SCBRAPOS, /* 140 Ditto, with unlimited, possessive repeat */
+ OP_SCOND, /* 141 Conditional group, check empty */
/* The next two pairs must (respectively) be kept together. */
- OP_CREF, /* 141 Used to hold a capture number as condition */
- OP_DNCREF, /* 142 Used to point to duplicate names as a condition */
- OP_RREF, /* 143 Used to hold a recursion number as condition */
- OP_DNRREF, /* 144 Used to point to duplicate names as a condition */
- OP_FALSE, /* 145 Always false (used by DEFINE and VERSION) */
- OP_TRUE, /* 146 Always true (used by VERSION) */
+ OP_CREF, /* 142 Used to hold a capture number as condition */
+ OP_DNCREF, /* 143 Used to point to duplicate names as a condition */
+ OP_RREF, /* 144 Used to hold a recursion number as condition */
+ OP_DNRREF, /* 145 Used to point to duplicate names as a condition */
+ OP_FALSE, /* 146 Always false (used by DEFINE and VERSION) */
+ OP_TRUE, /* 147 Always true (used by VERSION) */
- OP_BRAZERO, /* 147 These two must remain together and in this */
- OP_BRAMINZERO, /* 148 order. */
- OP_BRAPOSZERO, /* 149 */
+ OP_BRAZERO, /* 148 These two must remain together and in this */
+ OP_BRAMINZERO, /* 149 order. */
+ OP_BRAPOSZERO, /* 150 */
/* These are backtracking control verbs */
- OP_MARK, /* 150 always has an argument */
- OP_PRUNE, /* 151 */
- OP_PRUNE_ARG, /* 152 same, but with argument */
- OP_SKIP, /* 153 */
- OP_SKIP_ARG, /* 154 same, but with argument */
- OP_THEN, /* 155 */
- OP_THEN_ARG, /* 156 same, but with argument */
- OP_COMMIT, /* 157 */
- OP_COMMIT_ARG, /* 158 same, but with argument */
+ OP_MARK, /* 151 always has an argument */
+ OP_PRUNE, /* 152 */
+ OP_PRUNE_ARG, /* 153 same, but with argument */
+ OP_SKIP, /* 154 */
+ OP_SKIP_ARG, /* 155 same, but with argument */
+ OP_THEN, /* 156 */
+ OP_THEN_ARG, /* 157 same, but with argument */
+ OP_COMMIT, /* 158 */
+ OP_COMMIT_ARG, /* 159 same, but with argument */
/* These are forced failure and success verbs. FAIL and ACCEPT do accept an
argument, but these cases can be compiled as, for example, (*MARK:X)(*FAIL)
without the need for a special opcode. */
- OP_FAIL, /* 159 */
- OP_ACCEPT, /* 160 */
- OP_ASSERT_ACCEPT, /* 161 Used inside assertions */
- OP_CLOSE, /* 162 Used before OP_ACCEPT to close open captures */
+ OP_FAIL, /* 160 */
+ OP_ACCEPT, /* 161 */
+ OP_ASSERT_ACCEPT, /* 162 Used inside assertions */
+ OP_CLOSE, /* 163 Used before OP_ACCEPT to close open captures */
/* This is used to skip a subpattern with a {0} quantifier */
- OP_SKIPZERO, /* 163 */
+ OP_SKIPZERO, /* 164 */
/* This is used to identify a DEFINE group during compilation so that it can
be checked for having only one branch. It is changed to OP_FALSE before
compilation finishes. */
- OP_DEFINE, /* 164 */
+ OP_DEFINE, /* 165 */
/* This is not an opcode, but is used to check that tables indexed by opcode
are the correct length, in order to catch updating errors - there have been
@@ -1624,6 +1625,7 @@ some cases doesn't actually use these names at all). */
"Alt", "Ket", "KetRmax", "KetRmin", "KetRpos", \
"Reverse", "Assert", "Assert not", "AssertB", "AssertB not", \
"Once", \
+ "Script run", \
"Bra", "BraPos", "CBra", "CBraPos", \
"Cond", \
"SBra", "SBraPos", "SCBra", "SCBraPos", \
@@ -1707,6 +1709,7 @@ in UTF-8 mode. The code that uses this table must know about such things. */
1+LINK_SIZE, /* Assert behind */ \
1+LINK_SIZE, /* Assert behind not */ \
1+LINK_SIZE, /* ONCE */ \
+ 1+LINK_SIZE, /* SCRIPT_RUN */ \
1+LINK_SIZE, /* BRA */ \
1+LINK_SIZE, /* BRAPOS */ \
1+LINK_SIZE+IMM2_SIZE, /* CBRA */ \
@@ -1854,6 +1857,7 @@ extern const uint8_t PRIV(utf8_table4)[];
#define _pcre2_hspace_list PCRE2_SUFFIX(_pcre2_hspace_list_)
#define _pcre2_vspace_list PCRE2_SUFFIX(_pcre2_vspace_list_)
#define _pcre2_ucd_caseless_sets PCRE2_SUFFIX(_pcre2_ucd_caseless_sets_)
+#define _pcre2_ucd_digit_sets PCRE2_SUFFIX(_pcre2_ucd_digit_sets_)
#define _pcre2_ucd_records PCRE2_SUFFIX(_pcre2_ucd_records_)
#define _pcre2_ucd_stage1 PCRE2_SUFFIX(_pcre2_ucd_stage1_)
#define _pcre2_ucd_stage2 PCRE2_SUFFIX(_pcre2_ucd_stage2_)
@@ -1875,6 +1879,7 @@ extern const uint8_t PRIV(default_tables)[];
extern const uint32_t PRIV(hspace_list)[];
extern const uint32_t PRIV(vspace_list)[];
extern const uint32_t PRIV(ucd_caseless_sets)[];
+extern const uint32_t PRIV(ucd_digit_sets)[];
extern const ucd_record PRIV(ucd_records)[];
#if PCRE2_CODE_UNIT_WIDTH == 32
extern const ucd_record PRIV(dummy_ucd_record)[];
@@ -1922,6 +1927,7 @@ is available. */
#define _pcre2_jit_get_target PCRE2_SUFFIX(_pcre2_jit_get_target_)
#define _pcre2_memctl_malloc PCRE2_SUFFIX(_pcre2_memctl_malloc_)
#define _pcre2_ord2utf PCRE2_SUFFIX(_pcre2_ord2utf_)
+#define _pcre2_script_run PCRE2_SUFFIX(_pcre2_script_run_)
#define _pcre2_strcmp PCRE2_SUFFIX(_pcre2_strcmp_)
#define _pcre2_strcmp_c8 PCRE2_SUFFIX(_pcre2_strcmp_c8_)
#define _pcre2_strcpy_c8 PCRE2_SUFFIX(_pcre2_strcpy_c8_)
@@ -1948,6 +1954,7 @@ extern size_t _pcre2_jit_get_size(void *);
const char * _pcre2_jit_get_target(void);
extern void * _pcre2_memctl_malloc(size_t, pcre2_memctl *);
extern unsigned int _pcre2_ord2utf(uint32_t, PCRE2_UCHAR *);
+extern BOOL _pcre2_script_run(PCRE2_SPTR, PCRE2_SPTR, BOOL);
extern int _pcre2_strcmp(PCRE2_SPTR, PCRE2_SPTR);
extern int _pcre2_strcmp_c8(PCRE2_SPTR, const char *);
extern PCRE2_SIZE _pcre2_strcpy_c8(PCRE2_UCHAR *, const char *);
diff --git a/src/pcre2_match.c b/src/pcre2_match.c
index 8741e14..8700592 100644
--- a/src/pcre2_match.c
+++ b/src/pcre2_match.c
@@ -5014,6 +5014,7 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
must record a backtracking point and also set up a chained frame. */
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_SBRA:
Lframe_type = GF_NOCAPTURE | Fop;
@@ -5525,6 +5526,14 @@ fprintf(stderr, "++ op=%d\n", *Fecode);
case OP_ASSERT_NOT:
case OP_ASSERTBACK_NOT:
RRETURN(MATCH_MATCH);
+
+ /* At the end of a script run, apply the script-checking rules. This code
+ will never by exercised if Unicode support it not compiled, because in
+ that environment script runs cause an error at compile time. */
+
+ case OP_SCRIPT_RUN:
+ if (!PRIV(script_run)(P->eptr, Feptr, utf)) RRETURN(MATCH_NOMATCH);
+ break;
/* Whole-pattern recursion is coded as a recurse into group 0, so it
won't be picked up here. Instead, we catch it when the OP_END is reached.
diff --git a/src/pcre2_printint.c b/src/pcre2_printint.c
index bd10c6b..03a18db 100644
--- a/src/pcre2_printint.c
+++ b/src/pcre2_printint.c
@@ -393,6 +393,7 @@ for(;;)
case OP_ASSERTBACK:
case OP_ASSERTBACK_NOT:
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_COND:
case OP_SCOND:
case OP_REVERSE:
diff --git a/src/pcre2_script_run.c b/src/pcre2_script_run.c
new file mode 100644
index 0000000..479cb31
--- /dev/null
+++ b/src/pcre2_script_run.c
@@ -0,0 +1,228 @@
+/*************************************************
+* Perl-Compatible Regular Expressions *
+*************************************************/
+
+/* PCRE is a library of functions to support regular expressions whose syntax
+and semantics are as close as possible to those of the Perl 5 language.
+
+ Written by Philip Hazel
+ Original API code Copyright (c) 1997-2012 University of Cambridge
+ New API code Copyright (c) 2016-2018 University of Cambridge
+
+-----------------------------------------------------------------------------
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ * Neither the name of the University of Cambridge nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+-----------------------------------------------------------------------------
+*/
+
+/* This module contains the function for checking a script run. */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "pcre2_internal.h"
+
+
+/*************************************************
+* Check script run *
+*************************************************/
+
+/* A script run is conceptually a sequence of characters all in the same
+Unicode script. However, it isn't quite that simple. There are special rules
+for scripts that are commonly used together, and also special rules for digits.
+This function implements the appropriate checks, which is possible only when
+PCRE2 is compiled with Unicode support. The function returns TRUE if there is
+no Unicode support; however, it should never be called in that circumstance
+because an error is given by pcre2_compile() if a script run is called for in a
+version of PCRE2 compiled without Unicode support.
+
+Arguments:
+ pgr point to the first character
+ endptr point after the last character
+ utf TRUE if in UTF mode
+
+Returns: TRUE if this is a valid script run
+*/
+
+#define SCRIPT_UNSET (-1)
+#define SCRIPT_HANPENDING (-2)
+#define SCRIPT_HANHIRAKATA (-3)
+#define SCRIPT_HANBOPOMOFO (-4)
+#define SCRIPT_HANHANGUL (-5)
+
+BOOL
+PRIV(script_run)(PCRE2_SPTR ptr, PCRE2_SPTR endptr, BOOL utf)
+{
+#ifdef SUPPORT_UNICODE
+int require_script = SCRIPT_UNSET;
+uint32_t require_digitset = 0;
+uint32_t c;
+
+#if PCRE2_CODE_UNIT_WIDTH == 32
+(void)utf; /* Avoid compiler warning */
+#endif
+
+/* Any string containing fewer than 2 characters is a valid script run. */
+
+if (ptr >= endptr) return TRUE;
+GETCHARINCTEST(c, ptr);
+if (ptr >= endptr) return TRUE;
+
+/* Scan strings of two or more characters, checking the Unicode characteristics
+of each code point. */
+
+for (;;)
+ {
+ const ucd_record *ucd = GET_UCD(c);
+ uint32_t script = ucd->script;
+
+ /* If the script is Unknown, the string is not a valid script run. Such
+ characters can only form script runs of length one. */
+
+ if (script == ucp_Unknown) return FALSE;
+
+ /* A character whose script is Inherited is always accepted, and plays no
+ further part. A character whose script is Common is always accepted, but must
+ still be tested for a digit below. Otherwise, the character must match the
+ script of the first non-Inherited, non-Common character encountered. For most
+ scripts, the test is for the same script. However, the Han Chinese script may
+ be used in conjunction with four other scripts in these combinations:
+
+ . Han with Hiragana and Katakana is allowed (for Japanese).
+
+ . Han with Bopomofo is allowed (for Taiwanese Mandarin).
+
+ . Han with Hangul is allowed (for Korean).
+
+ If the first significant character's script is one of the four, the required
+ script type is immediately known. However, if the first significant
+ character's script is Han, we have to keep checking for a non-Han character.
+ Hence the SCRIPT_HANPENDING state. */
+
+ if (script != ucp_Inherited)
+ {
+ if (script != ucp_Common) switch(require_script)
+ {
+ default:
+ if (script != (unsigned int)require_script) return FALSE;
+ break;
+
+ case SCRIPT_UNSET:
+ case SCRIPT_HANPENDING:
+ switch(script)
+ {
+ case ucp_Han:
+ require_script = SCRIPT_HANPENDING;
+ break;
+
+ case ucp_Hiragana:
+ case ucp_Katakana:
+ require_script = SCRIPT_HANHIRAKATA;
+ break;
+
+ case ucp_Bopomofo:
+ require_script = SCRIPT_HANBOPOMOFO;
+ break;
+
+ case ucp_Hangul:
+ require_script = SCRIPT_HANHANGUL;
+ break;
+
+ default:
+ if (require_script == SCRIPT_HANPENDING) return FALSE;
+ require_script = script;
+ break;
+ }
+ break;
+
+ case SCRIPT_HANHIRAKATA:
+ if (script != ucp_Han && script != ucp_Hiragana && script != ucp_Katakana)
+ return FALSE;
+ break;
+
+ case SCRIPT_HANBOPOMOFO:
+ if (script != ucp_Han && script != ucp_Bopomofo) return FALSE;
+ break;
+
+ case SCRIPT_HANHANGUL:
+ if (script != ucp_Han && script != ucp_Hangul) return FALSE;
+ break;
+ }
+
+ /* The character is in an acceptable script. We must now ensure that all
+ decimal digits in the string come from the same set. Some scripts (e.g.
+ Common, Arabic) have more than one set of decimal digits. This code does
+ not allow mixing sets, even within the same script. The vector called
+ PRIV(ucd_digit_sets)[] contains, in its first element, the number of
+ following elements, and then, in ascending order, the code points of the
+ '9' characters in every set of 10 digits. Each set is identified by the
+ offset in the vector of its '9' character. An initial check of the first
+ value picks up ASCII digits quickly. Otherwise, a binary chop is used. */
+
+ if (ucd->chartype == ucp_Nd)
+ {
+ uint32_t digitset;
+
+ if (c <= PRIV(ucd_digit_sets)[1]) digitset = 1; else
+ {
+ int mid;
+ int bot = 1;
+ int top = PRIV(ucd_digit_sets)[0];
+ for (;;)
+ {
+ if (top <= bot + 1) /* <= rather than == is paranoia */
+ {
+ digitset = top;
+ break;
+ }
+ mid = (top + bot) / 2;
+ if (c <= PRIV(ucd_digit_sets)[mid]) top = mid; else bot = mid;
+ }
+ }
+
+ /* A required value of 0 means "unset". */
+
+ if (require_digitset == 0) require_digitset = digitset;
+ else if (digitset != require_digitset) return FALSE;
+ } /* End digit handling */
+ } /* End checking non-Inherited character */
+
+ /* If we haven't yet got to the end, pick up the next character. */
+
+ if (ptr >= endptr) return TRUE;
+ GETCHARINCTEST(c, ptr);
+ } /* End checking loop */
+
+#else /* NOT SUPPORT_UNICODE */
+(void)ptr;
+(void)endptr;
+(void)utf;
+return TRUE;
+#endif /* SUPPORT_UNICODE */
+}
+
+/* End of pcre2_script_run.c */
diff --git a/src/pcre2_study.c b/src/pcre2_study.c
index acbf98b..8d9eb9d 100644
--- a/src/pcre2_study.c
+++ b/src/pcre2_study.c
@@ -171,6 +171,7 @@ for (;;)
/* Fall through */
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_SBRA:
case OP_BRAPOS:
case OP_SBRAPOS:
@@ -1075,6 +1076,7 @@ do
case OP_CBRAPOS:
case OP_SCBRAPOS:
case OP_ONCE:
+ case OP_SCRIPT_RUN:
case OP_ASSERT:
rc = set_start_bits(re, tcode, utf);
if (rc == SSB_FAIL || rc == SSB_UNKNOWN) return rc;
diff --git a/src/pcre2_tables.c b/src/pcre2_tables.c
index 83d6f9d..3633294 100644
--- a/src/pcre2_tables.c
+++ b/src/pcre2_tables.c
@@ -417,6 +417,7 @@ strings to make sure that UTF-8 support works on EBCDIC platforms. */
#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_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_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"
@@ -611,6 +612,7 @@ const char PRIV(utt_names)[] =
STRING_Tifinagh0
STRING_Tirhuta0
STRING_Ugaritic0
+ STRING_Unknown0
STRING_Vai0
STRING_Warang_Citi0
STRING_Xan0
@@ -805,19 +807,20 @@ const ucp_type_table PRIV(utt)[] = {
{ 1424, PT_SC, ucp_Tifinagh },
{ 1433, PT_SC, ucp_Tirhuta },
{ 1441, PT_SC, ucp_Ugaritic },
- { 1450, PT_SC, ucp_Vai },
- { 1454, PT_SC, ucp_Warang_Citi },
- { 1466, PT_ALNUM, 0 },
- { 1470, PT_PXSPACE, 0 },
- { 1474, PT_SPACE, 0 },
- { 1478, PT_UCNC, 0 },
- { 1482, PT_WORD, 0 },
- { 1486, PT_SC, ucp_Yi },
- { 1489, PT_GC, ucp_Z },
- { 1491, PT_SC, ucp_Zanabazar_Square },
- { 1508, PT_PC, ucp_Zl },
- { 1511, PT_PC, ucp_Zp },
- { 1514, PT_PC, ucp_Zs }
+ { 1450, PT_SC, ucp_Unknown },
+ { 1458, PT_SC, ucp_Vai },
+ { 1462, PT_SC, ucp_Warang_Citi },
+ { 1474, PT_ALNUM, 0 },
+ { 1478, PT_PXSPACE, 0 },
+ { 1482, PT_SPACE, 0 },
+ { 1486, PT_UCNC, 0 },
+ { 1490, PT_WORD, 0 },
+ { 1494, PT_SC, ucp_Yi },
+ { 1497, PT_GC, ucp_Z },
+ { 1499, PT_SC, ucp_Zanabazar_Square },
+ { 1516, PT_PC, ucp_Zl },
+ { 1519, PT_PC, ucp_Zp },
+ { 1522, PT_PC, ucp_Zs }
};
const size_t PRIV(utt_size) = sizeof(PRIV(utt)) / sizeof(ucp_type_table);
diff --git a/src/pcre2_ucd.c b/src/pcre2_ucd.c
index 275a4be..02c6e87 100644
--- a/src/pcre2_ucd.c
+++ b/src/pcre2_ucd.c
@@ -47,11 +47,11 @@ special record. */
#if PCRE2_CODE_UNIT_WIDTH == 32
const ucd_record PRIV(dummy_ucd_record)[] = {{
- ucp_Common, /* script */
- ucp_Cn, /* type unassigned */
- ucp_gbOther, /* grapheme break property */
- 0, /* case set */
- 0, /* other case */
+ ucp_Unknown, /* script */
+ ucp_Cn, /* type unassigned */
+ ucp_gbOther, /* grapheme break property */
+ 0, /* case set */
+ 0, /* other case */
}};
#endif
@@ -68,6 +68,8 @@ pcre_int32 property_4;
} 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,
@@ -100,865 +102,884 @@ const uint32_t PRIV(ucd_caseless_sets)[] = {
0x1c88, 0xa64a, 0xa64b, NOTACHAR,
};
-/* When #included in pcre2test, we don't need this large table. */
+/* 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)[] = {
+ 61, /* 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, 0x11c59, 0x11d59, 0x11da9, 0x16a69, 0x16b59, 0x1d7d7,
+ 0x1d7e1, 0x1d7eb, 0x1d7f5, 0x1d7ff, 0x1e959,
+};
+
+/* These are the main two-stage UCD tables. */
+
const ucd_record PRIV(ucd_records)[] = { /* 6832 bytes, record size 8 */
- { 9, 0, 2, 0, 0, }, /* 0 */
- { 9, 0, 1, 0, 0, }, /* 1 */
- { 9, 0, 0, 0, 0, }, /* 2 */
- { 9, 29, 12, 0, 0, }, /* 3 */
- { 9, 21, 12, 0, 0, }, /* 4 */
- { 9, 23, 12, 0, 0, }, /* 5 */
- { 9, 22, 12, 0, 0, }, /* 6 */
- { 9, 18, 12, 0, 0, }, /* 7 */
- { 9, 25, 12, 0, 0, }, /* 8 */
- { 9, 17, 12, 0, 0, }, /* 9 */
- { 9, 13, 12, 0, 0, }, /* 10 */
- { 33, 9, 12, 0, 32, }, /* 11 */
- { 33, 9, 12, 100, 32, }, /* 12 */
- { 33, 9, 12, 1, 32, }, /* 13 */
- { 9, 24, 12, 0, 0, }, /* 14 */
- { 9, 16, 12, 0, 0, }, /* 15 */
- { 33, 5, 12, 0, -32, }, /* 16 */
- { 33, 5, 12, 100, -32, }, /* 17 */
- { 33, 5, 12, 1, -32, }, /* 18 */
- { 9, 26, 12, 0, 0, }, /* 19 */
- { 9, 26, 14, 0, 0, }, /* 20 */
- { 33, 7, 12, 0, 0, }, /* 21 */
- { 9, 20, 12, 0, 0, }, /* 22 */
- { 9, 1, 2, 0, 0, }, /* 23 */
- { 9, 15, 12, 0, 0, }, /* 24 */
- { 9, 5, 12, 26, 775, }, /* 25 */
- { 9, 19, 12, 0, 0, }, /* 26 */
- { 33, 9, 12, 104, 32, }, /* 27 */
- { 33, 5, 12, 0, 7615, }, /* 28 */
- { 33, 5, 12, 104, -32, }, /* 29 */
- { 33, 5, 12, 0, 121, }, /* 30 */
- { 33, 9, 12, 0, 1, }, /* 31 */
- { 33, 5, 12, 0, -1, }, /* 32 */
- { 33, 9, 12, 0, 0, }, /* 33 */
- { 33, 5, 12, 0, 0, }, /* 34 */
- { 33, 9, 12, 0, -121, }, /* 35 */
- { 33, 5, 12, 1, -268, }, /* 36 */
- { 33, 5, 12, 0, 195, }, /* 37 */
- { 33, 9, 12, 0, 210, }, /* 38 */
- { 33, 9, 12, 0, 206, }, /* 39 */
- { 33, 9, 12, 0, 205, }, /* 40 */
- { 33, 9, 12, 0, 79, }, /* 41 */
- { 33, 9, 12, 0, 202, }, /* 42 */
- { 33, 9, 12, 0, 203, }, /* 43 */
- { 33, 9, 12, 0, 207, }, /* 44 */
- { 33, 5, 12, 0, 97, }, /* 45 */
- { 33, 9, 12, 0, 211, }, /* 46 */
- { 33, 9, 12, 0, 209, }, /* 47 */
- { 33, 5, 12, 0, 163, }, /* 48 */
- { 33, 9, 12, 0, 213, }, /* 49 */
- { 33, 5, 12, 0, 130, }, /* 50 */
- { 33, 9, 12, 0, 214, }, /* 51 */
- { 33, 9, 12, 0, 218, }, /* 52 */
- { 33, 9, 12, 0, 217, }, /* 53 */
- { 33, 9, 12, 0, 219, }, /* 54 */
- { 33, 5, 12, 0, 56, }, /* 55 */
- { 33, 9, 12, 5, 2, }, /* 56 */
- { 33, 8, 12, 5, 1, }, /* 57 */
- { 33, 5, 12, 5, -2, }, /* 58 */
- { 33, 9, 12, 9, 2, }, /* 59 */
- { 33, 8, 12, 9, 1, }, /* 60 */
- { 33, 5, 12, 9, -2, }, /* 61 */
- { 33, 9, 12, 13, 2, }, /* 62 */
- { 33, 8, 12, 13, 1, }, /* 63 */
- { 33, 5, 12, 13, -2, }, /* 64 */
- { 33, 5, 12, 0, -79, }, /* 65 */
- { 33, 9, 12, 17, 2, }, /* 66 */
- { 33, 8, 12, 17, 1, }, /* 67 */
- { 33, 5, 12, 17, -2, }, /* 68 */
- { 33, 9, 12, 0, -97, }, /* 69 */
- { 33, 9, 12, 0, -56, }, /* 70 */
- { 33, 9, 12, 0, -130, }, /* 71 */
- { 33, 9, 12, 0, 10795, }, /* 72 */
- { 33, 9, 12, 0, -163, }, /* 73 */
- { 33, 9, 12, 0, 10792, }, /* 74 */
- { 33, 5, 12, 0, 10815, }, /* 75 */
- { 33, 9, 12, 0, -195, }, /* 76 */
- { 33, 9, 12, 0, 69, }, /* 77 */
- { 33, 9, 12, 0, 71, }, /* 78 */
- { 33, 5, 12, 0, 10783, }, /* 79 */
- { 33, 5, 12, 0, 10780, }, /* 80 */
- { 33, 5, 12, 0, 10782, }, /* 81 */
- { 33, 5, 12, 0, -210, }, /* 82 */
- { 33, 5, 12, 0, -206, }, /* 83 */
- { 33, 5, 12, 0, -205, }, /* 84 */
- { 33, 5, 12, 0, -202, }, /* 85 */
- { 33, 5, 12, 0, -203, }, /* 86 */
- { 33, 5, 12, 0, 42319, }, /* 87 */
- { 33, 5, 12, 0, 42315, }, /* 88 */
- { 33, 5, 12, 0, -207, }, /* 89 */
- { 33, 5, 12, 0, 42280, }, /* 90 */
- { 33, 5, 12, 0, 42308, }, /* 91 */
- { 33, 5, 12, 0, -209, }, /* 92 */
- { 33, 5, 12, 0, -211, }, /* 93 */
- { 33, 5, 12, 0, 10743, }, /* 94 */
- { 33, 5, 12, 0, 42305, }, /* 95 */
- { 33, 5, 12, 0, 10749, }, /* 96 */
- { 33, 5, 12, 0, -213, }, /* 97 */
- { 33, 5, 12, 0, -214, }, /* 98 */
- { 33, 5, 12, 0, 10727, }, /* 99 */
- { 33, 5, 12, 0, -218, }, /* 100 */
- { 33, 5, 12, 0, 42282, }, /* 101 */
- { 33, 5, 12, 0, -69, }, /* 102 */
- { 33, 5, 12, 0, -217, }, /* 103 */
- { 33, 5, 12, 0, -71, }, /* 104 */
- { 33, 5, 12, 0, -219, }, /* 105 */
- { 33, 5, 12, 0, 42261, }, /* 106 */
- { 33, 5, 12, 0, 42258, }, /* 107 */
- { 33, 6, 12, 0, 0, }, /* 108 */
- { 9, 6, 12, 0, 0, }, /* 109 */
- { 3, 24, 12, 0, 0, }, /* 110 */
- { 27, 12, 3, 0, 0, }, /* 111 */
- { 27, 12, 3, 21, 116, }, /* 112 */
- { 19, 9, 12, 0, 1, }, /* 113 */
- { 19, 5, 12, 0, -1, }, /* 114 */
- { 19, 24, 12, 0, 0, }, /* 115 */
- { 9, 2, 12, 0, 0, }, /* 116 */
- { 19, 6, 12, 0, 0, }, /* 117 */
- { 19, 5, 12, 0, 130, }, /* 118 */
- { 19, 9, 12, 0, 116, }, /* 119 */
- { 19, 9, 12, 0, 38, }, /* 120 */
- { 19, 9, 12, 0, 37, }, /* 121 */
- { 19, 9, 12, 0, 64, }, /* 122 */
- { 19, 9, 12, 0, 63, }, /* 123 */
- { 19, 5, 12, 0, 0, }, /* 124 */
- { 19, 9, 12, 0, 32, }, /* 125 */
- { 19, 9, 12, 34, 32, }, /* 126 */
- { 19, 9, 12, 59, 32, }, /* 127 */
- { 19, 9, 12, 38, 32, }, /* 128 */
- { 19, 9, 12, 21, 32, }, /* 129 */
- { 19, 9, 12, 51, 32, }, /* 130 */
- { 19, 9, 12, 26, 32, }, /* 131 */
- { 19, 9, 12, 47, 32, }, /* 132 */
- { 19, 9, 12, 55, 32, }, /* 133 */
- { 19, 9, 12, 30, 32, }, /* 134 */
- { 19, 9, 12, 43, 32, }, /* 135 */
- { 19, 9, 12, 96, 32, }, /* 136 */
- { 19, 5, 12, 0, -38, }, /* 137 */
- { 19, 5, 12, 0, -37, }, /* 138 */
- { 19, 5, 12, 0, -32, }, /* 139 */
- { 19, 5, 12, 34, -32, }, /* 140 */
- { 19, 5, 12, 59, -32, }, /* 141 */
- { 19, 5, 12, 38, -32, }, /* 142 */
- { 19, 5, 12, 21, -116, }, /* 143 */
- { 19, 5, 12, 51, -32, }, /* 144 */
- { 19, 5, 12, 26, -775, }, /* 145 */
- { 19, 5, 12, 47, -32, }, /* 146 */
- { 19, 5, 12, 55, -32, }, /* 147 */
- { 19, 5, 12, 30, 1, }, /* 148 */
- { 19, 5, 12, 30, -32, }, /* 149 */
- { 19, 5, 12, 43, -32, }, /* 150 */
- { 19, 5, 12, 96, -32, }, /* 151 */
- { 19, 5, 12, 0, -64, }, /* 152 */
- { 19, 5, 12, 0, -63, }, /* 153 */
- { 19, 9, 12, 0, 8, }, /* 154 */
- { 19, 5, 12, 34, -30, }, /* 155 */
- { 19, 5, 12, 38, -25, }, /* 156 */
- { 19, 9, 12, 0, 0, }, /* 157 */
- { 19, 5, 12, 43, -15, }, /* 158 */
- { 19, 5, 12, 47, -22, }, /* 159 */
- { 19, 5, 12, 0, -8, }, /* 160 */
- { 10, 9, 12, 0, 1, }, /* 161 */
- { 10, 5, 12, 0, -1, }, /* 162 */
- { 19, 5, 12, 51, -54, }, /* 163 */
- { 19, 5, 12, 55, -48, }, /* 164 */
- { 19, 5, 12, 0, 7, }, /* 165 */
- { 19, 5, 12, 0, -116, }, /* 166 */
- { 19, 9, 12, 38, -60, }, /* 167 */
- { 19, 5, 12, 59, -64, }, /* 168 */
- { 19, 25, 12, 0, 0, }, /* 169 */
- { 19, 9, 12, 0, -7, }, /* 170 */
- { 19, 9, 12, 0, -130, }, /* 171 */
- { 12, 9, 12, 0, 80, }, /* 172 */
- { 12, 9, 12, 0, 32, }, /* 173 */
- { 12, 9, 12, 63, 32, }, /* 174 */
- { 12, 9, 12, 67, 32, }, /* 175 */
- { 12, 9, 12, 71, 32, }, /* 176 */
- { 12, 9, 12, 75, 32, }, /* 177 */
- { 12, 9, 12, 79, 32, }, /* 178 */
- { 12, 9, 12, 84, 32, }, /* 179 */
- { 12, 5, 12, 0, -32, }, /* 180 */
- { 12, 5, 12, 63, -32, }, /* 181 */
- { 12, 5, 12, 67, -32, }, /* 182 */
- { 12, 5, 12, 71, -32, }, /* 183 */
- { 12, 5, 12, 75, -32, }, /* 184 */
- { 12, 5, 12, 79, -32, }, /* 185 */
- { 12, 5, 12, 84, -32, }, /* 186 */
- { 12, 5, 12, 0, -80, }, /* 187 */
- { 12, 9, 12, 0, 1, }, /* 188 */
- { 12, 5, 12, 0, -1, }, /* 189 */
- { 12, 9, 12, 88, 1, }, /* 190 */
- { 12, 5, 12, 88, -1, }, /* 191 */
- { 12, 26, 12, 0, 0, }, /* 192 */
- { 12, 12, 3, 0, 0, }, /* 193 */
- { 12, 11, 3, 0, 0, }, /* 194 */
- { 12, 9, 12, 0, 15, }, /* 195 */
- { 12, 5, 12, 0, -15, }, /* 196 */
- { 1, 9, 12, 0, 48, }, /* 197 */
- { 1, 6, 12, 0, 0, }, /* 198 */
- { 1, 21, 12, 0, 0, }, /* 199 */
- { 1, 5, 12, 0, 0, }, /* 200 */
- { 1, 5, 12, 0, -48, }, /* 201 */
- { 1, 17, 12, 0, 0, }, /* 202 */
- { 1, 26, 12, 0, 0, }, /* 203 */
- { 1, 23, 12, 0, 0, }, /* 204 */
- { 25, 12, 3, 0, 0, }, /* 205 */
- { 25, 17, 12, 0, 0, }, /* 206 */
- { 25, 21, 12, 0, 0, }, /* 207 */
- { 25, 7, 12, 0, 0, }, /* 208 */
- { 0, 1, 4, 0, 0, }, /* 209 */
- { 9, 1, 4, 0, 0, }, /* 210 */
- { 0, 25, 12, 0, 0, }, /* 211 */
- { 0, 21, 12, 0, 0, }, /* 212 */
- { 0, 23, 12, 0, 0, }, /* 213 */
- { 0, 26, 12, 0, 0, }, /* 214 */
- { 0, 12, 3, 0, 0, }, /* 215 */
- { 0, 1, 2, 0, 0, }, /* 216 */
- { 0, 7, 12, 0, 0, }, /* 217 */
- { 0, 13, 12, 0, 0, }, /* 218 */
- { 0, 6, 12, 0, 0, }, /* 219 */
- { 49, 21, 12, 0, 0, }, /* 220 */
- { 49, 1, 4, 0, 0, }, /* 221 */
- { 49, 7, 12, 0, 0, }, /* 222 */
- { 49, 12, 3, 0, 0, }, /* 223 */
- { 55, 7, 12, 0, 0, }, /* 224 */
- { 55, 12, 3, 0, 0, }, /* 225 */
- { 63, 13, 12, 0, 0, }, /* 226 */
- { 63, 7, 12, 0, 0, }, /* 227 */
- { 63, 12, 3, 0, 0, }, /* 228 */
- { 63, 6, 12, 0, 0, }, /* 229 */
- { 63, 26, 12, 0, 0, }, /* 230 */
- { 63, 21, 12, 0, 0, }, /* 231 */
- { 63, 23, 12, 0, 0, }, /* 232 */
- { 89, 7, 12, 0, 0, }, /* 233 */
- { 89, 12, 3, 0, 0, }, /* 234 */
- { 89, 6, 12, 0, 0, }, /* 235 */
- { 89, 21, 12, 0, 0, }, /* 236 */
- { 94, 7, 12, 0, 0, }, /* 237 */
- { 94, 12, 3, 0, 0, }, /* 238 */
- { 94, 21, 12, 0, 0, }, /* 239 */
- { 14, 12, 3, 0, 0, }, /* 240 */
- { 14, 10, 5, 0, 0, }, /* 241 */
- { 14, 7, 12, 0, 0, }, /* 242 */
- { 14, 13, 12, 0, 0, }, /* 243 */
- { 14, 21, 12, 0, 0, }, /* 244 */
- { 14, 6, 12, 0, 0, }, /* 245 */
- { 2, 7, 12, 0, 0, }, /* 246 */
- { 2, 12, 3, 0, 0, }, /* 247 */
- { 2, 10, 5, 0, 0, }, /* 248 */
- { 2, 10, 3, 0, 0, }, /* 249 */
- { 2, 13, 12, 0, 0, }, /* 250 */
- { 2, 23, 12, 0, 0, }, /* 251 */
- { 2, 15, 12, 0, 0, }, /* 252 */
- { 2, 26, 12, 0, 0, }, /* 253 */
- { 2, 21, 12, 0, 0, }, /* 254 */
- { 21, 12, 3, 0, 0, }, /* 255 */
- { 21, 10, 5, 0, 0, }, /* 256 */
- { 21, 7, 12, 0, 0, }, /* 257 */
- { 21, 13, 12, 0, 0, }, /* 258 */
- { 21, 21, 12, 0, 0, }, /* 259 */
- { 20, 12, 3, 0, 0, }, /* 260 */
- { 20, 10, 5, 0, 0, }, /* 261 */
- { 20, 7, 12, 0, 0, }, /* 262 */
- { 20, 13, 12, 0, 0, }, /* 263 */
- { 20, 21, 12, 0, 0, }, /* 264 */
- { 20, 23, 12, 0, 0, }, /* 265 */
- { 43, 12, 3, 0, 0, }, /* 266 */
- { 43, 10, 5, 0, 0, }, /* 267 */
- { 43, 7, 12, 0, 0, }, /* 268 */
- { 43, 10, 3, 0, 0, }, /* 269 */
- { 43, 13, 12, 0, 0, }, /* 270 */
- { 43, 26, 12, 0, 0, }, /* 271 */
- { 43, 15, 12, 0, 0, }, /* 272 */
- { 53, 12, 3, 0, 0, }, /* 273 */
- { 53, 7, 12, 0, 0, }, /* 274 */
- { 53, 10, 3, 0, 0, }, /* 275 */
- { 53, 10, 5, 0, 0, }, /* 276 */
- { 53, 13, 12, 0, 0, }, /* 277 */
- { 53, 15, 12, 0, 0, }, /* 278 */
- { 53, 26, 12, 0, 0, }, /* 279 */
- { 53, 23, 12, 0, 0, }, /* 280 */
- { 54, 12, 3, 0, 0, }, /* 281 */
- { 54, 10, 5, 0, 0, }, /* 282 */
- { 54, 7, 12, 0, 0, }, /* 283 */
- { 54, 13, 12, 0, 0, }, /* 284 */
- { 54, 15, 12, 0, 0, }, /* 285 */
- { 54, 26, 12, 0, 0, }, /* 286 */
- { 28, 7, 12, 0, 0, }, /* 287 */
- { 28, 12, 3, 0, 0, }, /* 288 */
- { 28, 10, 5, 0, 0, }, /* 289 */
- { 28, 21, 12, 0, 0, }, /* 290 */
- { 28, 10, 3, 0, 0, }, /* 291 */
- { 28, 13, 12, 0, 0, }, /* 292 */
- { 36, 12, 3, 0, 0, }, /* 293 */
- { 36, 10, 5, 0, 0, }, /* 294 */
- { 36, 7, 12, 0, 0, }, /* 295 */
- { 36, 10, 3, 0, 0, }, /* 296 */
- { 36, 7, 4, 0, 0, }, /* 297 */
- { 36, 26, 12, 0, 0, }, /* 298 */
- { 36, 15, 12, 0, 0, }, /* 299 */
- { 36, 13, 12, 0, 0, }, /* 300 */
- { 47, 10, 5, 0, 0, }, /* 301 */
- { 47, 7, 12, 0, 0, }, /* 302 */
- { 47, 12, 3, 0, 0, }, /* 303 */
- { 47, 10, 3, 0, 0, }, /* 304 */
- { 47, 13, 12, 0, 0, }, /* 305 */
- { 47, 21, 12, 0, 0, }, /* 306 */
- { 56, 7, 12, 0, 0, }, /* 307 */
- { 56, 12, 3, 0, 0, }, /* 308 */
- { 56, 7, 5, 0, 0, }, /* 309 */
- { 56, 6, 12, 0, 0, }, /* 310 */
- { 56, 21, 12, 0, 0, }, /* 311 */
- { 56, 13, 12, 0, 0, }, /* 312 */
- { 32, 7, 12, 0, 0, }, /* 313 */
- { 32, 12, 3, 0, 0, }, /* 314 */
- { 32, 7, 5, 0, 0, }, /* 315 */
- { 32, 6, 12, 0, 0, }, /* 316 */
- { 32, 13, 12, 0, 0, }, /* 317 */
- { 57, 7, 12, 0, 0, }, /* 318 */
- { 57, 26, 12, 0, 0, }, /* 319 */
- { 57, 21, 12, 0, 0, }, /* 320 */
- { 57, 12, 3, 0, 0, }, /* 321 */
- { 57, 13, 12, 0, 0, }, /* 322 */
- { 57, 15, 12, 0, 0, }, /* 323 */
- { 57, 22, 12, 0, 0, }, /* 324 */
- { 57, 18, 12, 0, 0, }, /* 325 */
- { 57, 10, 5, 0, 0, }, /* 326 */
- { 38, 7, 12, 0, 0, }, /* 327 */
- { 38, 10, 12, 0, 0, }, /* 328 */
- { 38, 12, 3, 0, 0, }, /* 329 */
- { 38, 10, 5, 0, 0, }, /* 330 */
- { 38, 13, 12, 0, 0, }, /* 331 */
- { 38, 21, 12, 0, 0, }, /* 332 */
- { 38, 26, 12, 0, 0, }, /* 333 */
- { 16, 9, 12, 0, 7264, }, /* 334 */
- { 16, 5, 12, 0, 3008, }, /* 335 */
- { 16, 6, 12, 0, 0, }, /* 336 */
- { 23, 7, 6, 0, 0, }, /* 337 */
- { 23, 7, 7, 0, 0, }, /* 338 */
- { 23, 7, 8, 0, 0, }, /* 339 */
- { 15, 7, 12, 0, 0, }, /* 340 */
- { 15, 12, 3, 0, 0, }, /* 341 */
- { 15, 21, 12, 0, 0, }, /* 342 */
- { 15, 15, 12, 0, 0, }, /* 343 */
- { 15, 26, 12, 0, 0, }, /* 344 */
- { 8, 9, 12, 0, 38864, }, /* 345 */
- { 8, 9, 12, 0, 8, }, /* 346 */
- { 8, 5, 12, 0, -8, }, /* 347 */
- { 7, 17, 12, 0, 0, }, /* 348 */
- { 7, 7, 12, 0, 0, }, /* 349 */
- { 7, 21, 12, 0, 0, }, /* 350 */
- { 40, 29, 12, 0, 0, }, /* 351 */
- { 40, 7, 12, 0, 0, }, /* 352 */
- { 40, 22, 12, 0, 0, }, /* 353 */
- { 40, 18, 12, 0, 0, }, /* 354 */
- { 45, 7, 12, 0, 0, }, /* 355 */
- { 45, 14, 12, 0, 0, }, /* 356 */
- { 50, 7, 12, 0, 0, }, /* 357 */
- { 50, 12, 3, 0, 0, }, /* 358 */
- { 24, 7, 12, 0, 0, }, /* 359 */
- { 24, 12, 3, 0, 0, }, /* 360 */
- { 6, 7, 12, 0, 0, }, /* 361 */
- { 6, 12, 3, 0, 0, }, /* 362 */
- { 51, 7, 12, 0, 0, }, /* 363 */
- { 51, 12, 3, 0, 0, }, /* 364 */
- { 31, 7, 12, 0, 0, }, /* 365 */
- { 31, 12, 3, 0, 0, }, /* 366 */
- { 31, 10, 5, 0, 0, }, /* 367 */
- { 31, 21, 12, 0, 0, }, /* 368 */
- { 31, 6, 12, 0, 0, }, /* 369 */
- { 31, 23, 12, 0, 0, }, /* 370 */
- { 31, 13, 12, 0, 0, }, /* 371 */
- { 31, 15, 12, 0, 0, }, /* 372 */
- { 37, 21, 12, 0, 0, }, /* 373 */
- { 37, 17, 12, 0, 0, }, /* 374 */
- { 37, 12, 3, 0, 0, }, /* 375 */
- { 37, 1, 2, 0, 0, }, /* 376 */
- { 37, 13, 12, 0, 0, }, /* 377 */
- { 37, 7, 12, 0, 0, }, /* 378 */
- { 37, 6, 12, 0, 0, }, /* 379 */
- { 34, 7, 12, 0, 0, }, /* 380 */
- { 34, 12, 3, 0, 0, }, /* 381 */
- { 34, 10, 5, 0, 0, }, /* 382 */
- { 34, 26, 12, 0, 0, }, /* 383 */
- { 34, 21, 12, 0, 0, }, /* 384 */
- { 34, 13, 12, 0, 0, }, /* 385 */
- { 52, 7, 12, 0, 0, }, /* 386 */
- { 39, 7, 12, 0, 0, }, /* 387 */
- { 39, 13, 12, 0, 0, }, /* 388 */
- { 39, 15, 12, 0, 0, }, /* 389 */
- { 39, 26, 12, 0, 0, }, /* 390 */
- { 31, 26, 12, 0, 0, }, /* 391 */
- { 5, 7, 12, 0, 0, }, /* 392 */
- { 5, 12, 3, 0, 0, }, /* 393 */
- { 5, 10, 5, 0, 0, }, /* 394 */
- { 5, 21, 12, 0, 0, }, /* 395 */
- { 90, 7, 12, 0, 0, }, /* 396 */
- { 90, 10, 5, 0, 0, }, /* 397 */
- { 90, 12, 3, 0, 0, }, /* 398 */
- { 90, 10, 12, 0, 0, }, /* 399 */
- { 90, 13, 12, 0, 0, }, /* 400 */
- { 90, 21, 12, 0, 0, }, /* 401 */
- { 90, 6, 12, 0, 0, }, /* 402 */
- { 27, 11, 3, 0, 0, }, /* 403 */
- { 61, 12, 3, 0, 0, }, /* 404 */
- { 61, 10, 5, 0, 0, }, /* 405 */
- { 61, 7, 12, 0, 0, }, /* 406 */
- { 61, 13, 12, 0, 0, }, /* 407 */
- { 61, 21, 12, 0, 0, }, /* 408 */
- { 61, 26, 12, 0, 0, }, /* 409 */
- { 75, 12, 3, 0, 0, }, /* 410 */
- { 75, 10, 5, 0, 0, }, /* 411 */
- { 75, 7, 12, 0, 0, }, /* 412 */
- { 75, 13, 12, 0, 0, }, /* 413 */
- { 92, 7, 12, 0, 0, }, /* 414 */
- { 92, 12, 3, 0, 0, }, /* 415 */
- { 92, 10, 5, 0, 0, }, /* 416 */
- { 92, 21, 12, 0, 0, }, /* 417 */
- { 69, 7, 12, 0, 0, }, /* 418 */
- { 69, 10, 5, 0, 0, }, /* 419 */
- { 69, 12, 3, 0, 0, }, /* 420 */
- { 69, 21, 12, 0, 0, }, /* 421 */
- { 69, 13, 12, 0, 0, }, /* 422 */
- { 72, 13, 12, 0, 0, }, /* 423 */
- { 72, 7, 12, 0, 0, }, /* 424 */
- { 72, 6, 12, 0, 0, }, /* 425 */
- { 72, 21, 12, 0, 0, }, /* 426 */
- { 12, 5, 12, 63, -6222, }, /* 427 */
- { 12, 5, 12, 67, -6221, }, /* 428 */
- { 12, 5, 12, 71, -6212, }, /* 429 */
- { 12, 5, 12, 75, -6210, }, /* 430 */
- { 12, 5, 12, 79, -6210, }, /* 431 */
- { 12, 5, 12, 79, -6211, }, /* 432 */
- { 12, 5, 12, 84, -6204, }, /* 433 */
- { 12, 5, 12, 88, -6180, }, /* 434 */
- { 12, 5, 12, 108, 35267, }, /* 435 */
- { 16, 9, 12, 0, -3008, }, /* 436 */
- { 75, 21, 12, 0, 0, }, /* 437 */
- { 9, 10, 5, 0, 0, }, /* 438 */
- { 9, 7, 12, 0, 0, }, /* 439 */
- { 12, 5, 12, 0, 0, }, /* 440 */
- { 12, 6, 12, 0, 0, }, /* 441 */
- { 33, 5, 12, 0, 35332, }, /* 442 */
- { 33, 5, 12, 0, 3814, }, /* 443 */
- { 33, 9, 12, 92, 1, }, /* 444 */
- { 33, 5, 12, 92, -1, }, /* 445 */
- { 33, 5, 12, 92, -58, }, /* 446 */
- { 33, 9, 12, 0, -7615, }, /* 447 */
- { 19, 5, 12, 0, 8, }, /* 448 */
- { 19, 9, 12, 0, -8, }, /* 449 */
- { 19, 5, 12, 0, 74, }, /* 450 */
- { 19, 5, 12, 0, 86, }, /* 451 */
- { 19, 5, 12, 0, 100, }, /* 452 */
- { 19, 5, 12, 0, 128, }, /* 453 */
- { 19, 5, 12, 0, 112, }, /* 454 */
- { 19, 5, 12, 0, 126, }, /* 455 */
- { 19, 8, 12, 0, -8, }, /* 456 */
- { 19, 5, 12, 0, 9, }, /* 457 */
- { 19, 9, 12, 0, -74, }, /* 458 */
- { 19, 8, 12, 0, -9, }, /* 459 */
- { 19, 5, 12, 21, -7173, }, /* 460 */
- { 19, 9, 12, 0, -86, }, /* 461 */
- { 19, 9, 12, 0, -100, }, /* 462 */
- { 19, 9, 12, 0, -112, }, /* 463 */
- { 19, 9, 12, 0, -128, }, /* 464 */
- { 19, 9, 12, 0, -126, }, /* 465 */
- { 27, 1, 3, 0, 0, }, /* 466 */
- { 27, 1, 13, 0, 0, }, /* 467 */
- { 9, 27, 2, 0, 0, }, /* 468 */
- { 9, 28, 2, 0, 0, }, /* 469 */
- { 9, 21, 14, 0, 0, }, /* 470 */
- { 9, 2, 2, 0, 0, }, /* 471 */
- { 9, 9, 12, 0, 0, }, /* 472 */
- { 9, 5, 12, 0, 0, }, /* 473 */
- { 19, 9, 12, 96, -7517, }, /* 474 */
- { 33, 9, 12, 100, -8383, }, /* 475 */
- { 33, 9, 12, 104, -8262, }, /* 476 */
- { 33, 9, 12, 0, 28, }, /* 477 */
- { 9, 5, 14, 0, 0, }, /* 478 */
- { 33, 5, 12, 0, -28, }, /* 479 */
- { 33, 14, 12, 0, 16, }, /* 480 */
- { 33, 14, 12, 0, -16, }, /* 481 */
- { 33, 14, 12, 0, 0, }, /* 482 */
- { 9, 25, 14, 0, 0, }, /* 483 */
- { 9, 26, 12, 0, 26, }, /* 484 */
- { 9, 26, 14, 0, 26, }, /* 485 */
- { 9, 26, 12, 0, -26, }, /* 486 */
- { 4, 26, 12, 0, 0, }, /* 487 */
- { 17, 9, 12, 0, 48, }, /* 488 */
- { 17, 5, 12, 0, -48, }, /* 489 */
- { 33, 9, 12, 0, -10743, }, /* 490 */
- { 33, 9, 12, 0, -3814, }, /* 491 */
- { 33, 9, 12, 0, -10727, }, /* 492 */
- { 33, 5, 12, 0, -10795, }, /* 493 */
- { 33, 5, 12, 0, -10792, }, /* 494 */
- { 33, 9, 12, 0, -10780, }, /* 495 */
- { 33, 9, 12, 0, -10749, }, /* 496 */
- { 33, 9, 12, 0, -10783, }, /* 497 */
- { 33, 9, 12, 0, -10782, }, /* 498 */
- { 33, 9, 12, 0, -10815, }, /* 499 */
- { 10, 5, 12, 0, 0, }, /* 500 */
- { 10, 26, 12, 0, 0, }, /* 501 */
- { 10, 12, 3, 0, 0, }, /* 502 */
- { 10, 21, 12, 0, 0, }, /* 503 */
- { 10, 15, 12, 0, 0, }, /* 504 */
- { 16, 5, 12, 0, -7264, }, /* 505 */
- { 58, 7, 12, 0, 0, }, /* 506 */
- { 58, 6, 12, 0, 0, }, /* 507 */
- { 58, 21, 12, 0, 0, }, /* 508 */
- { 58, 12, 3, 0, 0, }, /* 509 */
- { 22, 26, 12, 0, 0, }, /* 510 */
- { 22, 6, 12, 0, 0, }, /* 511 */
- { 22, 14, 12, 0, 0, }, /* 512 */
- { 23, 10, 3, 0, 0, }, /* 513 */
- { 9, 17, 14, 0, 0, }, /* 514 */
- { 26, 7, 12, 0, 0, }, /* 515 */
- { 26, 6, 12, 0, 0, }, /* 516 */
- { 29, 7, 12, 0, 0, }, /* 517 */
- { 29, 6, 12, 0, 0, }, /* 518 */
- { 3, 7, 12, 0, 0, }, /* 519 */
- { 23, 7, 12, 0, 0, }, /* 520 */
- { 23, 26, 12, 0, 0, }, /* 521 */
- { 29, 26, 12, 0, 0, }, /* 522 */
- { 22, 7, 12, 0, 0, }, /* 523 */
- { 60, 7, 12, 0, 0, }, /* 524 */
- { 60, 6, 12, 0, 0, }, /* 525 */
- { 60, 26, 12, 0, 0, }, /* 526 */
- { 85, 7, 12, 0, 0, }, /* 527 */
- { 85, 6, 12, 0, 0, }, /* 528 */
- { 85, 21, 12, 0, 0, }, /* 529 */
- { 76, 7, 12, 0, 0, }, /* 530 */
- { 76, 6, 12, 0, 0, }, /* 531 */
- { 76, 21, 12, 0, 0, }, /* 532 */
- { 76, 13, 12, 0, 0, }, /* 533 */
- { 12, 9, 12, 108, 1, }, /* 534 */
- { 12, 5, 12, 108, -35267, }, /* 535 */
- { 12, 7, 12, 0, 0, }, /* 536 */
- { 12, 21, 12, 0, 0, }, /* 537 */
- { 78, 7, 12, 0, 0, }, /* 538 */
- { 78, 14, 12, 0, 0, }, /* 539 */
- { 78, 12, 3, 0, 0, }, /* 540 */
- { 78, 21, 12, 0, 0, }, /* 541 */
- { 33, 9, 12, 0, -35332, }, /* 542 */
- { 33, 9, 12, 0, -42280, }, /* 543 */
- { 33, 9, 12, 0, -42308, }, /* 544 */
- { 33, 9, 12, 0, -42319, }, /* 545 */
- { 33, 9, 12, 0, -42315, }, /* 546 */
- { 33, 9, 12, 0, -42305, }, /* 547 */
- { 33, 9, 12, 0, -42258, }, /* 548 */
- { 33, 9, 12, 0, -42282, }, /* 549 */
- { 33, 9, 12, 0, -42261, }, /* 550 */
- { 33, 9, 12, 0, 928, }, /* 551 */
- { 48, 7, 12, 0, 0, }, /* 552 */
- { 48, 12, 3, 0, 0, }, /* 553 */
- { 48, 10, 5, 0, 0, }, /* 554 */
- { 48, 26, 12, 0, 0, }, /* 555 */
- { 64, 7, 12, 0, 0, }, /* 556 */
- { 64, 21, 12, 0, 0, }, /* 557 */
- { 74, 10, 5, 0, 0, }, /* 558 */
- { 74, 7, 12, 0, 0, }, /* 559 */
- { 74, 12, 3, 0, 0, }, /* 560 */
- { 74, 21, 12, 0, 0, }, /* 561 */
- { 74, 13, 12, 0, 0, }, /* 562 */
- { 68, 13, 12, 0, 0, }, /* 563 */
- { 68, 7, 12, 0, 0, }, /* 564 */
- { 68, 12, 3, 0, 0, }, /* 565 */
- { 68, 21, 12, 0, 0, }, /* 566 */
- { 73, 7, 12, 0, 0, }, /* 567 */
- { 73, 12, 3, 0, 0, }, /* 568 */
- { 73, 10, 5, 0, 0, }, /* 569 */
- { 73, 21, 12, 0, 0, }, /* 570 */
- { 83, 12, 3, 0, 0, }, /* 571 */
- { 83, 10, 5, 0, 0, }, /* 572 */
- { 83, 7, 12, 0, 0, }, /* 573 */
- { 83, 21, 12, 0, 0, }, /* 574 */
- { 83, 13, 12, 0, 0, }, /* 575 */
- { 38, 6, 12, 0, 0, }, /* 576 */
- { 67, 7, 12, 0, 0, }, /* 577 */
- { 67, 12, 3, 0, 0, }, /* 578 */
- { 67, 10, 5, 0, 0, }, /* 579 */
- { 67, 13, 12, 0, 0, }, /* 580 */
- { 67, 21, 12, 0, 0, }, /* 581 */
- { 91, 7, 12, 0, 0, }, /* 582 */
- { 91, 12, 3, 0, 0, }, /* 583 */
- { 91, 6, 12, 0, 0, }, /* 584 */
- { 91, 21, 12, 0, 0, }, /* 585 */
- { 86, 7, 12, 0, 0, }, /* 586 */
- { 86, 10, 5, 0, 0, }, /* 587 */
- { 86, 12, 3, 0, 0, }, /* 588 */
- { 86, 21, 12, 0, 0, }, /* 589 */
- { 86, 6, 12, 0, 0, }, /* 590 */
- { 33, 5, 12, 0, -928, }, /* 591 */
- { 8, 5, 12, 0, -38864, }, /* 592 */
- { 86, 13, 12, 0, 0, }, /* 593 */
- { 23, 7, 9, 0, 0, }, /* 594 */
- { 23, 7, 10, 0, 0, }, /* 595 */
- { 9, 4, 2, 0, 0, }, /* 596 */
- { 9, 3, 12, 0, 0, }, /* 597 */
- { 25, 25, 12, 0, 0, }, /* 598 */
- { 0, 24, 12, 0, 0, }, /* 599 */
- { 9, 6, 3, 0, 0, }, /* 600 */
- { 35, 7, 12, 0, 0, }, /* 601 */
- { 19, 14, 12, 0, 0, }, /* 602 */
- { 19, 15, 12, 0, 0, }, /* 603 */
- { 19, 26, 12, 0, 0, }, /* 604 */
- { 70, 7, 12, 0, 0, }, /* 605 */
- { 66, 7, 12, 0, 0, }, /* 606 */
- { 41, 7, 12, 0, 0, }, /* 607 */
- { 41, 15, 12, 0, 0, }, /* 608 */
- { 18, 7, 12, 0, 0, }, /* 609 */
- { 18, 14, 12, 0, 0, }, /* 610 */
- { 117, 7, 12, 0, 0, }, /* 611 */
- { 117, 12, 3, 0, 0, }, /* 612 */
- { 59, 7, 12, 0, 0, }, /* 613 */
- { 59, 21, 12, 0, 0, }, /* 614 */
- { 42, 7, 12, 0, 0, }, /* 615 */
- { 42, 21, 12, 0, 0, }, /* 616 */
- { 42, 14, 12, 0, 0, }, /* 617 */
- { 13, 9, 12, 0, 40, }, /* 618 */
- { 13, 5, 12, 0, -40, }, /* 619 */
- { 46, 7, 12, 0, 0, }, /* 620 */
- { 44, 7, 12, 0, 0, }, /* 621 */
- { 44, 13, 12, 0, 0, }, /* 622 */
- { 135, 9, 12, 0, 40, }, /* 623 */
- { 135, 5, 12, 0, -40, }, /* 624 */
- { 105, 7, 12, 0, 0, }, /* 625 */
- { 103, 7, 12, 0, 0, }, /* 626 */
- { 103, 21, 12, 0, 0, }, /* 627 */
- { 109, 7, 12, 0, 0, }, /* 628 */
- { 11, 7, 12, 0, 0, }, /* 629 */
- { 80, 7, 12, 0, 0, }, /* 630 */
- { 80, 21, 12, 0, 0, }, /* 631 */
- { 80, 15, 12, 0, 0, }, /* 632 */
- { 119, 7, 12, 0, 0, }, /* 633 */
- { 119, 26, 12, 0, 0, }, /* 634 */
- { 119, 15, 12, 0, 0, }, /* 635 */
- { 115, 7, 12, 0, 0, }, /* 636 */
- { 115, 15, 12, 0, 0, }, /* 637 */
- { 127, 7, 12, 0, 0, }, /* 638 */
- { 127, 15, 12, 0, 0, }, /* 639 */
- { 65, 7, 12, 0, 0, }, /* 640 */
- { 65, 15, 12, 0, 0, }, /* 641 */
- { 65, 21, 12, 0, 0, }, /* 642 */
- { 71, 7, 12, 0, 0, }, /* 643 */
- { 71, 21, 12, 0, 0, }, /* 644 */
- { 97, 7, 12, 0, 0, }, /* 645 */
- { 96, 7, 12, 0, 0, }, /* 646 */
- { 96, 15, 12, 0, 0, }, /* 647 */
- { 30, 7, 12, 0, 0, }, /* 648 */
- { 30, 12, 3, 0, 0, }, /* 649 */
- { 30, 15, 12, 0, 0, }, /* 650 */
- { 30, 21, 12, 0, 0, }, /* 651 */
- { 87, 7, 12, 0, 0, }, /* 652 */
- { 87, 15, 12, 0, 0, }, /* 653 */
- { 87, 21, 12, 0, 0, }, /* 654 */
- { 116, 7, 12, 0, 0, }, /* 655 */
- { 116, 15, 12, 0, 0, }, /* 656 */
- { 111, 7, 12, 0, 0, }, /* 657 */
- { 111, 26, 12, 0, 0, }, /* 658 */
- { 111, 12, 3, 0, 0, }, /* 659 */
- { 111, 15, 12, 0, 0, }, /* 660 */
- { 111, 21, 12, 0, 0, }, /* 661 */
- { 77, 7, 12, 0, 0, }, /* 662 */
- { 77, 21, 12, 0, 0, }, /* 663 */
- { 82, 7, 12, 0, 0, }, /* 664 */
- { 82, 15, 12, 0, 0, }, /* 665 */
- { 81, 7, 12, 0, 0, }, /* 666 */
- { 81, 15, 12, 0, 0, }, /* 667 */
- { 120, 7, 12, 0, 0, }, /* 668 */
- { 120, 21, 12, 0, 0, }, /* 669 */
- { 120, 15, 12, 0, 0, }, /* 670 */
- { 88, 7, 12, 0, 0, }, /* 671 */
- { 129, 9, 12, 0, 64, }, /* 672 */
- { 129, 5, 12, 0, -64, }, /* 673 */
- { 129, 15, 12, 0, 0, }, /* 674 */
- { 143, 7, 12, 0, 0, }, /* 675 */
- { 143, 12, 3, 0, 0, }, /* 676 */
- { 143, 13, 12, 0, 0, }, /* 677 */
- { 0, 15, 12, 0, 0, }, /* 678 */
- { 146, 7, 12, 0, 0, }, /* 679 */
- { 146, 15, 12, 0, 0, }, /* 680 */
- { 147, 7, 12, 0, 0, }, /* 681 */
- { 147, 12, 3, 0, 0, }, /* 682 */
- { 147, 15, 12, 0, 0, }, /* 683 */
- { 147, 21, 12, 0, 0, }, /* 684 */
- { 93, 10, 5, 0, 0, }, /* 685 */
- { 93, 12, 3, 0, 0, }, /* 686 */
- { 93, 7, 12, 0, 0, }, /* 687 */
- { 93, 21, 12, 0, 0, }, /* 688 */
- { 93, 15, 12, 0, 0, }, /* 689 */
- { 93, 13, 12, 0, 0, }, /* 690 */
- { 84, 12, 3, 0, 0, }, /* 691 */
- { 84, 10, 5, 0, 0, }, /* 692 */
- { 84, 7, 12, 0, 0, }, /* 693 */
- { 84, 21, 12, 0, 0, }, /* 694 */
- { 84, 1, 4, 0, 0, }, /* 695 */
- { 100, 7, 12, 0, 0, }, /* 696 */
- { 100, 13, 12, 0, 0, }, /* 697 */
- { 95, 12, 3, 0, 0, }, /* 698 */
- { 95, 7, 12, 0, 0, }, /* 699 */
- { 95, 10, 5, 0, 0, }, /* 700 */
- { 95, 13, 12, 0, 0, }, /* 701 */
- { 95, 21, 12, 0, 0, }, /* 702 */
- { 110, 7, 12, 0, 0, }, /* 703 */
- { 110, 12, 3, 0, 0, }, /* 704 */
- { 110, 21, 12, 0, 0, }, /* 705 */
- { 99, 12, 3, 0, 0, }, /* 706 */
- { 99, 10, 5, 0, 0, }, /* 707 */
- { 99, 7, 12, 0, 0, }, /* 708 */
- { 99, 7, 4, 0, 0, }, /* 709 */
- { 99, 21, 12, 0, 0, }, /* 710 */
- { 99, 13, 12, 0, 0, }, /* 711 */
- { 47, 15, 12, 0, 0, }, /* 712 */
- { 107, 7, 12, 0, 0, }, /* 713 */
- { 107, 10, 5, 0, 0, }, /* 714 */
- { 107, 12, 3, 0, 0, }, /* 715 */
- { 107, 21, 12, 0, 0, }, /* 716 */
- { 128, 7, 12, 0, 0, }, /* 717 */
- { 128, 21, 12, 0, 0, }, /* 718 */
- { 108, 7, 12, 0, 0, }, /* 719 */
- { 108, 12, 3, 0, 0, }, /* 720 */
- { 108, 10, 5, 0, 0, }, /* 721 */
- { 108, 13, 12, 0, 0, }, /* 722 */
- { 106, 12, 3, 0, 0, }, /* 723 */
- { 106, 10, 5, 0, 0, }, /* 724 */
- { 106, 7, 12, 0, 0, }, /* 725 */
- { 106, 10, 3, 0, 0, }, /* 726 */
- { 134, 7, 12, 0, 0, }, /* 727 */
- { 134, 10, 5, 0, 0, }, /* 728 */
- { 134, 12, 3, 0, 0, }, /* 729 */
- { 134, 21, 12, 0, 0, }, /* 730 */
- { 134, 13, 12, 0, 0, }, /* 731 */
- { 123, 7, 12, 0, 0, }, /* 732 */
- { 123, 10, 3, 0, 0, }, /* 733 */
- { 123, 10, 5, 0, 0, }, /* 734 */
- { 123, 12, 3, 0, 0, }, /* 735 */
- { 123, 21, 12, 0, 0, }, /* 736 */
- { 123, 13, 12, 0, 0, }, /* 737 */
- { 122, 7, 12, 0, 0, }, /* 738 */
- { 122, 10, 3, 0, 0, }, /* 739 */
- { 122, 10, 5, 0, 0, }, /* 740 */
- { 122, 12, 3, 0, 0, }, /* 741 */
- { 122, 21, 12, 0, 0, }, /* 742 */
- { 113, 7, 12, 0, 0, }, /* 743 */
- { 113, 10, 5, 0, 0, }, /* 744 */
- { 113, 12, 3, 0, 0, }, /* 745 */
- { 113, 21, 12, 0, 0, }, /* 746 */
- { 113, 13, 12, 0, 0, }, /* 747 */
- { 101, 7, 12, 0, 0, }, /* 748 */
- { 101, 12, 3, 0, 0, }, /* 749 */
- { 101, 10, 5, 0, 0, }, /* 750 */
- { 101, 13, 12, 0, 0, }, /* 751 */
- { 125, 7, 12, 0, 0, }, /* 752 */
- { 125, 12, 3, 0, 0, }, /* 753 */
- { 125, 10, 5, 0, 0, }, /* 754 */
- { 125, 13, 12, 0, 0, }, /* 755 */
- { 125, 15, 12, 0, 0, }, /* 756 */
- { 125, 21, 12, 0, 0, }, /* 757 */
- { 125, 26, 12, 0, 0, }, /* 758 */
- { 141, 7, 12, 0, 0, }, /* 759 */
- { 141, 10, 5, 0, 0, }, /* 760 */
- { 141, 12, 3, 0, 0, }, /* 761 */
- { 141, 21, 12, 0, 0, }, /* 762 */
- { 124, 9, 12, 0, 32, }, /* 763 */
- { 124, 5, 12, 0, -32, }, /* 764 */
- { 124, 13, 12, 0, 0, }, /* 765 */
- { 124, 15, 12, 0, 0, }, /* 766 */
- { 124, 7, 12, 0, 0, }, /* 767 */
- { 140, 7, 12, 0, 0, }, /* 768 */
- { 140, 12, 3, 0, 0, }, /* 769 */
- { 140, 10, 5, 0, 0, }, /* 770 */
- { 140, 7, 4, 0, 0, }, /* 771 */
- { 140, 21, 12, 0, 0, }, /* 772 */
- { 139, 7, 12, 0, 0, }, /* 773 */
- { 139, 12, 3, 0, 0, }, /* 774 */
- { 139, 10, 5, 0, 0, }, /* 775 */
- { 139, 7, 4, 0, 0, }, /* 776 */
- { 139, 21, 12, 0, 0, }, /* 777 */
- { 121, 7, 12, 0, 0, }, /* 778 */
- { 132, 7, 12, 0, 0, }, /* 779 */
- { 132, 10, 5, 0, 0, }, /* 780 */
- { 132, 12, 3, 0, 0, }, /* 781 */
- { 132, 21, 12, 0, 0, }, /* 782 */
- { 132, 13, 12, 0, 0, }, /* 783 */
- { 132, 15, 12, 0, 0, }, /* 784 */
- { 133, 21, 12, 0, 0, }, /* 785 */
- { 133, 7, 12, 0, 0, }, /* 786 */
- { 133, 12, 3, 0, 0, }, /* 787 */
- { 133, 10, 5, 0, 0, }, /* 788 */
- { 137, 7, 12, 0, 0, }, /* 789 */
- { 137, 12, 3, 0, 0, }, /* 790 */
- { 137, 7, 4, 0, 0, }, /* 791 */
- { 137, 13, 12, 0, 0, }, /* 792 */
- { 142, 7, 12, 0, 0, }, /* 793 */
- { 142, 10, 5, 0, 0, }, /* 794 */
- { 142, 12, 3, 0, 0, }, /* 795 */
- { 142, 13, 12, 0, 0, }, /* 796 */
- { 144, 7, 12, 0, 0, }, /* 797 */
- { 144, 12, 3, 0, 0, }, /* 798 */
- { 144, 10, 5, 0, 0, }, /* 799 */
- { 144, 21, 12, 0, 0, }, /* 800 */
- { 62, 7, 12, 0, 0, }, /* 801 */
- { 62, 14, 12, 0, 0, }, /* 802 */
- { 62, 21, 12, 0, 0, }, /* 803 */
- { 79, 7, 12, 0, 0, }, /* 804 */
- { 126, 7, 12, 0, 0, }, /* 805 */
- { 114, 7, 12, 0, 0, }, /* 806 */
- { 114, 13, 12, 0, 0, }, /* 807 */
- { 114, 21, 12, 0, 0, }, /* 808 */
- { 102, 7, 12, 0, 0, }, /* 809 */
- { 102, 12, 3, 0, 0, }, /* 810 */
- { 102, 21, 12, 0, 0, }, /* 811 */
- { 118, 7, 12, 0, 0, }, /* 812 */
- { 118, 12, 3, 0, 0, }, /* 813 */
- { 118, 21, 12, 0, 0, }, /* 814 */
- { 118, 26, 12, 0, 0, }, /* 815 */
- { 118, 6, 12, 0, 0, }, /* 816 */
- { 118, 13, 12, 0, 0, }, /* 817 */
- { 118, 15, 12, 0, 0, }, /* 818 */
- { 145, 9, 12, 0, 32, }, /* 819 */
- { 145, 5, 12, 0, -32, }, /* 820 */
- { 145, 15, 12, 0, 0, }, /* 821 */
- { 145, 21, 12, 0, 0, }, /* 822 */
- { 98, 7, 12, 0, 0, }, /* 823 */
- { 98, 10, 5, 0, 0, }, /* 824 */
- { 98, 12, 3, 0, 0, }, /* 825 */
- { 98, 6, 12, 0, 0, }, /* 826 */
- { 136, 6, 12, 0, 0, }, /* 827 */
- { 138, 6, 12, 0, 0, }, /* 828 */
- { 136, 7, 12, 0, 0, }, /* 829 */
- { 138, 7, 12, 0, 0, }, /* 830 */
- { 104, 7, 12, 0, 0, }, /* 831 */
- { 104, 26, 12, 0, 0, }, /* 832 */
- { 104, 12, 3, 0, 0, }, /* 833 */
- { 104, 21, 12, 0, 0, }, /* 834 */
- { 9, 10, 3, 0, 0, }, /* 835 */
- { 19, 12, 3, 0, 0, }, /* 836 */
- { 130, 26, 12, 0, 0, }, /* 837 */
- { 130, 12, 3, 0, 0, }, /* 838 */
- { 130, 21, 12, 0, 0, }, /* 839 */
- { 17, 12, 3, 0, 0, }, /* 840 */
- { 112, 7, 12, 0, 0, }, /* 841 */
- { 112, 15, 12, 0, 0, }, /* 842 */
- { 112, 12, 3, 0, 0, }, /* 843 */
- { 131, 9, 12, 0, 34, }, /* 844 */
- { 131, 5, 12, 0, -34, }, /* 845 */
- { 131, 12, 3, 0, 0, }, /* 846 */
- { 131, 13, 12, 0, 0, }, /* 847 */
- { 131, 21, 12, 0, 0, }, /* 848 */
- { 9, 2, 14, 0, 0, }, /* 849 */
- { 9, 26, 11, 0, 0, }, /* 850 */
- { 26, 26, 12, 0, 0, }, /* 851 */
- { 9, 24, 3, 0, 0, }, /* 852 */
- { 9, 1, 3, 0, 0, }, /* 853 */
+ { 10, 0, 2, 0, 0, }, /* 0 */
+ { 10, 0, 1, 0, 0, }, /* 1 */
+ { 10, 0, 0, 0, 0, }, /* 2 */
+ { 10, 29, 12, 0, 0, }, /* 3 */
+ { 10, 21, 12, 0, 0, }, /* 4 */
+ { 10, 23, 12, 0, 0, }, /* 5 */
+ { 10, 22, 12, 0, 0, }, /* 6 */
+ { 10, 18, 12, 0, 0, }, /* 7 */
+ { 10, 25, 12, 0, 0, }, /* 8 */
+ { 10, 17, 12, 0, 0, }, /* 9 */
+ { 10, 13, 12, 0, 0, }, /* 10 */
+ { 34, 9, 12, 0, 32, }, /* 11 */
+ { 34, 9, 12, 100, 32, }, /* 12 */
+ { 34, 9, 12, 1, 32, }, /* 13 */
+ { 10, 24, 12, 0, 0, }, /* 14 */
+ { 10, 16, 12, 0, 0, }, /* 15 */
+ { 34, 5, 12, 0, -32, }, /* 16 */
+ { 34, 5, 12, 100, -32, }, /* 17 */
+ { 34, 5, 12, 1, -32, }, /* 18 */
+ { 10, 26, 12, 0, 0, }, /* 19 */
+ { 10, 26, 14, 0, 0, }, /* 20 */
+ { 34, 7, 12, 0, 0, }, /* 21 */
+ { 10, 20, 12, 0, 0, }, /* 22 */
+ { 10, 1, 2, 0, 0, }, /* 23 */
+ { 10, 15, 12, 0, 0, }, /* 24 */
+ { 10, 5, 12, 26, 775, }, /* 25 */
+ { 10, 19, 12, 0, 0, }, /* 26 */
+ { 34, 9, 12, 104, 32, }, /* 27 */
+ { 34, 5, 12, 0, 7615, }, /* 28 */
+ { 34, 5, 12, 104, -32, }, /* 29 */
+ { 34, 5, 12, 0, 121, }, /* 30 */
+ { 34, 9, 12, 0, 1, }, /* 31 */
+ { 34, 5, 12, 0, -1, }, /* 32 */
+ { 34, 9, 12, 0, 0, }, /* 33 */
+ { 34, 5, 12, 0, 0, }, /* 34 */
+ { 34, 9, 12, 0, -121, }, /* 35 */
+ { 34, 5, 12, 1, -268, }, /* 36 */
+ { 34, 5, 12, 0, 195, }, /* 37 */
+ { 34, 9, 12, 0, 210, }, /* 38 */
+ { 34, 9, 12, 0, 206, }, /* 39 */
+ { 34, 9, 12, 0, 205, }, /* 40 */
+ { 34, 9, 12, 0, 79, }, /* 41 */
+ { 34, 9, 12, 0, 202, }, /* 42 */
+ { 34, 9, 12, 0, 203, }, /* 43 */
+ { 34, 9, 12, 0, 207, }, /* 44 */
+ { 34, 5, 12, 0, 97, }, /* 45 */
+ { 34, 9, 12, 0, 211, }, /* 46 */
+ { 34, 9, 12, 0, 209, }, /* 47 */
+ { 34, 5, 12, 0, 163, }, /* 48 */
+ { 34, 9, 12, 0, 213, }, /* 49 */
+ { 34, 5, 12, 0, 130, }, /* 50 */
+ { 34, 9, 12, 0, 214, }, /* 51 */
+ { 34, 9, 12, 0, 218, }, /* 52 */
+ { 34, 9, 12, 0, 217, }, /* 53 */
+ { 34, 9, 12, 0, 219, }, /* 54 */
+ { 34, 5, 12, 0, 56, }, /* 55 */
+ { 34, 9, 12, 5, 2, }, /* 56 */
+ { 34, 8, 12, 5, 1, }, /* 57 */
+ { 34, 5, 12, 5, -2, }, /* 58 */
+ { 34, 9, 12, 9, 2, }, /* 59 */
+ { 34, 8, 12, 9, 1, }, /* 60 */
+ { 34, 5, 12, 9, -2, }, /* 61 */
+ { 34, 9, 12, 13, 2, }, /* 62 */
+ { 34, 8, 12, 13, 1, }, /* 63 */
+ { 34, 5, 12, 13, -2, }, /* 64 */
+ { 34, 5, 12, 0, -79, }, /* 65 */
+ { 34, 9, 12, 17, 2, }, /* 66 */
+ { 34, 8, 12, 17, 1, }, /* 67 */
+ { 34, 5, 12, 17, -2, }, /* 68 */
+ { 34, 9, 12, 0, -97, }, /* 69 */
+ { 34, 9, 12, 0, -56, }, /* 70 */
+ { 34, 9, 12, 0, -130, }, /* 71 */
+ { 34, 9, 12, 0, 10795, }, /* 72 */
+ { 34, 9, 12, 0, -163, }, /* 73 */
+ { 34, 9, 12, 0, 10792, }, /* 74 */
+ { 34, 5, 12, 0, 10815, }, /* 75 */
+ { 34, 9, 12, 0, -195, }, /* 76 */
+ { 34, 9, 12, 0, 69, }, /* 77 */
+ { 34, 9, 12, 0, 71, }, /* 78 */
+ { 34, 5, 12, 0, 10783, }, /* 79 */
+ { 34, 5, 12, 0, 10780, }, /* 80 */
+ { 34, 5, 12, 0, 10782, }, /* 81 */
+ { 34, 5, 12, 0, -210, }, /* 82 */
+ { 34, 5, 12, 0, -206, }, /* 83 */
+ { 34, 5, 12, 0, -205, }, /* 84 */
+ { 34, 5, 12, 0, -202, }, /* 85 */
+ { 34, 5, 12, 0, -203, }, /* 86 */
+ { 34, 5, 12, 0, 42319, }, /* 87 */
+ { 34, 5, 12, 0, 42315, }, /* 88 */
+ { 34, 5, 12, 0, -207, }, /* 89 */
+ { 34, 5, 12, 0, 42280, }, /* 90 */
+ { 34, 5, 12, 0, 42308, }, /* 91 */
+ { 34, 5, 12, 0, -209, }, /* 92 */
+ { 34, 5, 12, 0, -211, }, /* 93 */
+ { 34, 5, 12, 0, 10743, }, /* 94 */
+ { 34, 5, 12, 0, 42305, }, /* 95 */
+ { 34, 5, 12, 0, 10749, }, /* 96 */
+ { 34, 5, 12, 0, -213, }, /* 97 */
+ { 34, 5, 12, 0, -214, }, /* 98 */
+ { 34, 5, 12, 0, 10727, }, /* 99 */
+ { 34, 5, 12, 0, -218, }, /* 100 */
+ { 34, 5, 12, 0, 42282, }, /* 101 */
+ { 34, 5, 12, 0, -69, }, /* 102 */
+ { 34, 5, 12, 0, -217, }, /* 103 */
+ { 34, 5, 12, 0, -71, }, /* 104 */
+ { 34, 5, 12, 0, -219, }, /* 105 */
+ { 34, 5, 12, 0, 42261, }, /* 106 */
+ { 34, 5, 12, 0, 42258, }, /* 107 */
+ { 34, 6, 12, 0, 0, }, /* 108 */
+ { 10, 6, 12, 0, 0, }, /* 109 */
+ { 4, 24, 12, 0, 0, }, /* 110 */
+ { 28, 12, 3, 0, 0, }, /* 111 */
+ { 28, 12, 3, 21, 116, }, /* 112 */
+ { 20, 9, 12, 0, 1, }, /* 113 */
+ { 20, 5, 12, 0, -1, }, /* 114 */
+ { 20, 24, 12, 0, 0, }, /* 115 */
+ { 0, 2, 12, 0, 0, }, /* 116 */
+ { 20, 6, 12, 0, 0, }, /* 117 */
+ { 20, 5, 12, 0, 130, }, /* 118 */
+ { 20, 9, 12, 0, 116, }, /* 119 */
+ { 20, 9, 12, 0, 38, }, /* 120 */
+ { 20, 9, 12, 0, 37, }, /* 121 */
+ { 20, 9, 12, 0, 64, }, /* 122 */
+ { 20, 9, 12, 0, 63, }, /* 123 */
+ { 20, 5, 12, 0, 0, }, /* 124 */
+ { 20, 9, 12, 0, 32, }, /* 125 */
+ { 20, 9, 12, 34, 32, }, /* 126 */
+ { 20, 9, 12, 59, 32, }, /* 127 */
+ { 20, 9, 12, 38, 32, }, /* 128 */
+ { 20, 9, 12, 21, 32, }, /* 129 */
+ { 20, 9, 12, 51, 32, }, /* 130 */
+ { 20, 9, 12, 26, 32, }, /* 131 */
+ { 20, 9, 12, 47, 32, }, /* 132 */
+ { 20, 9, 12, 55, 32, }, /* 133 */
+ { 20, 9, 12, 30, 32, }, /* 134 */
+ { 20, 9, 12, 43, 32, }, /* 135 */
+ { 20, 9, 12, 96, 32, }, /* 136 */
+ { 20, 5, 12, 0, -38, }, /* 137 */
+ { 20, 5, 12, 0, -37, }, /* 138 */
+ { 20, 5, 12, 0, -32, }, /* 139 */
+ { 20, 5, 12, 34, -32, }, /* 140 */
+ { 20, 5, 12, 59, -32, }, /* 141 */
+ { 20, 5, 12, 38, -32, }, /* 142 */
+ { 20, 5, 12, 21, -116, }, /* 143 */
+ { 20, 5, 12, 51, -32, }, /* 144 */
+ { 20, 5, 12, 26, -775, }, /* 145 */
+ { 20, 5, 12, 47, -32, }, /* 146 */
+ { 20, 5, 12, 55, -32, }, /* 147 */
+ { 20, 5, 12, 30, 1, }, /* 148 */
+ { 20, 5, 12, 30, -32, }, /* 149 */
+ { 20, 5, 12, 43, -32, }, /* 150 */
+ { 20, 5, 12, 96, -32, }, /* 151 */
+ { 20, 5, 12, 0, -64, }, /* 152 */
+ { 20, 5, 12, 0, -63, }, /* 153 */
+ { 20, 9, 12, 0, 8, }, /* 154 */
+ { 20, 5, 12, 34, -30, }, /* 155 */
+ { 20, 5, 12, 38, -25, }, /* 156 */
+ { 20, 9, 12, 0, 0, }, /* 157 */
+ { 20, 5, 12, 43, -15, }, /* 158 */
+ { 20, 5, 12, 47, -22, }, /* 159 */
+ { 20, 5, 12, 0, -8, }, /* 160 */
+ { 11, 9, 12, 0, 1, }, /* 161 */
+ { 11, 5, 12, 0, -1, }, /* 162 */
+ { 20, 5, 12, 51, -54, }, /* 163 */
+ { 20, 5, 12, 55, -48, }, /* 164 */
+ { 20, 5, 12, 0, 7, }, /* 165 */
+ { 20, 5, 12, 0, -116, }, /* 166 */
+ { 20, 9, 12, 38, -60, }, /* 167 */
+ { 20, 5, 12, 59, -64, }, /* 168 */
+ { 20, 25, 12, 0, 0, }, /* 169 */
+ { 20, 9, 12, 0, -7, }, /* 170 */
+ { 20, 9, 12, 0, -130, }, /* 171 */
+ { 13, 9, 12, 0, 80, }, /* 172 */
+ { 13, 9, 12, 0, 32, }, /* 173 */
+ { 13, 9, 12, 63, 32, }, /* 174 */
+ { 13, 9, 12, 67, 32, }, /* 175 */
+ { 13, 9, 12, 71, 32, }, /* 176 */
+ { 13, 9, 12, 75, 32, }, /* 177 */
+ { 13, 9, 12, 79, 32, }, /* 178 */
+ { 13, 9, 12, 84, 32, }, /* 179 */
+ { 13, 5, 12, 0, -32, }, /* 180 */
+ { 13, 5, 12, 63, -32, }, /* 181 */
+ { 13, 5, 12, 67, -32, }, /* 182 */
+ { 13, 5, 12, 71, -32, }, /* 183 */
+ { 13, 5, 12, 75, -32, }, /* 184 */
+ { 13, 5, 12, 79, -32, }, /* 185 */
+ { 13, 5, 12, 84, -32, }, /* 186 */
+ { 13, 5, 12, 0, -80, }, /* 187 */
+ { 13, 9, 12, 0, 1, }, /* 188 */
+ { 13, 5, 12, 0, -1, }, /* 189 */
+ { 13, 9, 12, 88, 1, }, /* 190 */
+ { 13, 5, 12, 88, -1, }, /* 191 */
+ { 13, 26, 12, 0, 0, }, /* 192 */
+ { 13, 12, 3, 0, 0, }, /* 193 */
+ { 13, 11, 3, 0, 0, }, /* 194 */
+ { 13, 9, 12, 0, 15, }, /* 195 */
+ { 13, 5, 12, 0, -15, }, /* 196 */
+ { 2, 9, 12, 0, 48, }, /* 197 */
+ { 2, 6, 12, 0, 0, }, /* 198 */
+ { 2, 21, 12, 0, 0, }, /* 199 */
+ { 2, 5, 12, 0, 0, }, /* 200 */
+ { 2, 5, 12, 0, -48, }, /* 201 */
+ { 2, 17, 12, 0, 0, }, /* 202 */
+ { 2, 26, 12, 0, 0, }, /* 203 */
+ { 2, 23, 12, 0, 0, }, /* 204 */
+ { 26, 12, 3, 0, 0, }, /* 205 */
+ { 26, 17, 12, 0, 0, }, /* 206 */
+ { 26, 21, 12, 0, 0, }, /* 207 */
+ { 26, 7, 12, 0, 0, }, /* 208 */
+ { 1, 1, 4, 0, 0, }, /* 209 */
+ { 10, 1, 4, 0, 0, }, /* 210 */
+ { 1, 25, 12, 0, 0, }, /* 211 */
+ { 1, 21, 12, 0, 0, }, /* 212 */
+ { 1, 23, 12, 0, 0, }, /* 213 */
+ { 1, 26, 12, 0, 0, }, /* 214 */
+ { 1, 12, 3, 0, 0, }, /* 215 */
+ { 1, 1, 2, 0, 0, }, /* 216 */
+ { 1, 7, 12, 0, 0, }, /* 217 */
+ { 1, 13, 12, 0, 0, }, /* 218 */
+ { 1, 6, 12, 0, 0, }, /* 219 */
+ { 50, 21, 12, 0, 0, }, /* 220 */
+ { 50, 1, 4, 0, 0, }, /* 221 */
+ { 50, 7, 12, 0, 0, }, /* 222 */
+ { 50, 12, 3, 0, 0, }, /* 223 */
+ { 56, 7, 12, 0, 0, }, /* 224 */
+ { 56, 12, 3, 0, 0, }, /* 225 */
+ { 64, 13, 12, 0, 0, }, /* 226 */
+ { 64, 7, 12, 0, 0, }, /* 227 */
+ { 64, 12, 3, 0, 0, }, /* 228 */
+ { 64, 6, 12, 0, 0, }, /* 229 */
+ { 64, 26, 12, 0, 0, }, /* 230 */
+ { 64, 21, 12, 0, 0, }, /* 231 */
+ { 64, 23, 12, 0, 0, }, /* 232 */
+ { 90, 7, 12, 0, 0, }, /* 233 */
+ { 90, 12, 3, 0, 0, }, /* 234 */
+ { 90, 6, 12, 0, 0, }, /* 235 */
+ { 90, 21, 12, 0, 0, }, /* 236 */
+ { 95, 7, 12, 0, 0, }, /* 237 */
+ { 95, 12, 3, 0, 0, }, /* 238 */
+ { 95, 21, 12, 0, 0, }, /* 239 */
+ { 15, 12, 3, 0, 0, }, /* 240 */
+ { 15, 10, 5, 0, 0, }, /* 241 */
+ { 15, 7, 12, 0, 0, }, /* 242 */
+ { 15, 13, 12, 0, 0, }, /* 243 */
+ { 15, 21, 12, 0, 0, }, /* 244 */
+ { 15, 6, 12, 0, 0, }, /* 245 */
+ { 3, 7, 12, 0, 0, }, /* 246 */
+ { 3, 12, 3, 0, 0, }, /* 247 */
+ { 3, 10, 5, 0, 0, }, /* 248 */
+ { 3, 10, 3, 0, 0, }, /* 249 */
+ { 3, 13, 12, 0, 0, }, /* 250 */
+ { 3, 23, 12, 0, 0, }, /* 251 */
+ { 3, 15, 12, 0, 0, }, /* 252 */
+ { 3, 26, 12, 0, 0, }, /* 253 */
+ { 3, 21, 12, 0, 0, }, /* 254 */
+ { 22, 12, 3, 0, 0, }, /* 255 */
+ { 22, 10, 5, 0, 0, }, /* 256 */
+ { 22, 7, 12, 0, 0, }, /* 257 */
+ { 22, 13, 12, 0, 0, }, /* 258 */
+ { 22, 21, 12, 0, 0, }, /* 259 */
+ { 21, 12, 3, 0, 0, }, /* 260 */
+ { 21, 10, 5, 0, 0, }, /* 261 */
+ { 21, 7, 12, 0, 0, }, /* 262 */
+ { 21, 13, 12, 0, 0, }, /* 263 */
+ { 21, 21, 12, 0, 0, }, /* 264 */
+ { 21, 23, 12, 0, 0, }, /* 265 */
+ { 44, 12, 3, 0, 0, }, /* 266 */
+ { 44, 10, 5, 0, 0, }, /* 267 */
+ { 44, 7, 12, 0, 0, }, /* 268 */
+ { 44, 10, 3, 0, 0, }, /* 269 */
+ { 44, 13, 12, 0, 0, }, /* 270 */
+ { 44, 26, 12, 0, 0, }, /* 271 */
+ { 44, 15, 12, 0, 0, }, /* 272 */
+ { 54, 12, 3, 0, 0, }, /* 273 */
+ { 54, 7, 12, 0, 0, }, /* 274 */
+ { 54, 10, 3, 0, 0, }, /* 275 */
+ { 54, 10, 5, 0, 0, }, /* 276 */
+ { 54, 13, 12, 0, 0, }, /* 277 */
+ { 54, 15, 12, 0, 0, }, /* 278 */
+ { 54, 26, 12, 0, 0, }, /* 279 */
+ { 54, 23, 12, 0, 0, }, /* 280 */
+ { 55, 12, 3, 0, 0, }, /* 281 */
+ { 55, 10, 5, 0, 0, }, /* 282 */
+ { 55, 7, 12, 0, 0, }, /* 283 */
+ { 55, 13, 12, 0, 0, }, /* 284 */
+ { 55, 15, 12, 0, 0, }, /* 285 */
+ { 55, 26, 12, 0, 0, }, /* 286 */
+ { 29, 7, 12, 0, 0, }, /* 287 */
+ { 29, 12, 3, 0, 0, }, /* 288 */
+ { 29, 10, 5, 0, 0, }, /* 289 */
+ { 29, 21, 12, 0, 0, }, /* 290 */
+ { 29, 10, 3, 0, 0, }, /* 291 */
+ { 29, 13, 12, 0, 0, }, /* 292 */
+ { 37, 12, 3, 0, 0, }, /* 293 */
+ { 37, 10, 5, 0, 0, }, /* 294 */
+ { 37, 7, 12, 0, 0, }, /* 295 */
+ { 37, 10, 3, 0, 0, }, /* 296 */
+ { 37, 7, 4, 0, 0, }, /* 297 */
+ { 37, 26, 12, 0, 0, }, /* 298 */
+ { 37, 15, 12, 0, 0, }, /* 299 */
+ { 37, 13, 12, 0, 0, }, /* 300 */
+ { 48, 10, 5, 0, 0, }, /* 301 */
+ { 48, 7, 12, 0, 0, }, /* 302 */
+ { 48, 12, 3, 0, 0, }, /* 303 */
+ { 48, 10, 3, 0, 0, }, /* 304 */
+ { 48, 13, 12, 0, 0, }, /* 305 */
+ { 48, 21, 12, 0, 0, }, /* 306 */
+ { 57, 7, 12, 0, 0, }, /* 307 */
+ { 57, 12, 3, 0, 0, }, /* 308 */
+ { 57, 7, 5, 0, 0, }, /* 309 */
+ { 57, 6, 12, 0, 0, }, /* 310 */
+ { 57, 21, 12, 0, 0, }, /* 311 */
+ { 57, 13, 12, 0, 0, }, /* 312 */
+ { 33, 7, 12, 0, 0, }, /* 313 */
+ { 33, 12, 3, 0, 0, }, /* 314 */
+ { 33, 7, 5, 0, 0, }, /* 315 */
+ { 33, 6, 12, 0, 0, }, /* 316 */
+ { 33, 13, 12, 0, 0, }, /* 317 */
+ { 58, 7, 12, 0, 0, }, /* 318 */
+ { 58, 26, 12, 0, 0, }, /* 319 */
+ { 58, 21, 12, 0, 0, }, /* 320 */
+ { 58, 12, 3, 0, 0, }, /* 321 */
+ { 58, 13, 12, 0, 0, }, /* 322 */
+ { 58, 15, 12, 0, 0, }, /* 323 */
+ { 58, 22, 12, 0, 0, }, /* 324 */
+ { 58, 18, 12, 0, 0, }, /* 325 */
+ { 58, 10, 5, 0, 0, }, /* 326 */
+ { 39, 7, 12, 0, 0, }, /* 327 */
+ { 39, 10, 12, 0, 0, }, /* 328 */
+ { 39, 12, 3, 0, 0, }, /* 329 */
+ { 39, 10, 5, 0, 0, }, /* 330 */
+ { 39, 13, 12, 0, 0, }, /* 331 */
+ { 39, 21, 12, 0, 0, }, /* 332 */
+ { 39, 26, 12, 0, 0, }, /* 333 */
+ { 17, 9, 12, 0, 7264, }, /* 334 */
+ { 17, 5, 12, 0, 3008, }, /* 335 */
+ { 17, 6, 12, 0, 0, }, /* 336 */
+ { 24, 7, 6, 0, 0, }, /* 337 */
+ { 24, 7, 7, 0, 0, }, /* 338 */
+ { 24, 7, 8, 0, 0, }, /* 339 */
+ { 16, 7, 12, 0, 0, }, /* 340 */
+ { 16, 12, 3, 0, 0, }, /* 341 */
+ { 16, 21, 12, 0, 0, }, /* 342 */
+ { 16, 15, 12, 0, 0, }, /* 343 */
+ { 16, 26, 12, 0, 0, }, /* 344 */
+ { 9, 9, 12, 0, 38864, }, /* 345 */
+ { 9, 9, 12, 0, 8, }, /* 346 */
+ { 9, 5, 12, 0, -8, }, /* 347 */
+ { 8, 17, 12, 0, 0, }, /* 348 */
+ { 8, 7, 12, 0, 0, }, /* 349 */
+ { 8, 21, 12, 0, 0, }, /* 350 */
+ { 41, 29, 12, 0, 0, }, /* 351 */
+ { 41, 7, 12, 0, 0, }, /* 352 */
+ { 41, 22, 12, 0, 0, }, /* 353 */
+ { 41, 18, 12, 0, 0, }, /* 354 */
+ { 46, 7, 12, 0, 0, }, /* 355 */
+ { 46, 14, 12, 0, 0, }, /* 356 */
+ { 51, 7, 12, 0, 0, }, /* 357 */
+ { 51, 12, 3, 0, 0, }, /* 358 */
+ { 25, 7, 12, 0, 0, }, /* 359 */
+ { 25, 12, 3, 0, 0, }, /* 360 */
+ { 7, 7, 12, 0, 0, }, /* 361 */
+ { 7, 12, 3, 0, 0, }, /* 362 */
+ { 52, 7, 12, 0, 0, }, /* 363 */
+ { 52, 12, 3, 0, 0, }, /* 364 */
+ { 32, 7, 12, 0, 0, }, /* 365 */
+ { 32, 12, 3, 0, 0, }, /* 366 */
+ { 32, 10, 5, 0, 0, }, /* 367 */
+ { 32, 21, 12, 0, 0, }, /* 368 */
+ { 32, 6, 12, 0, 0, }, /* 369 */
+ { 32, 23, 12, 0, 0, }, /* 370 */
+ { 32, 13, 12, 0, 0, }, /* 371 */
+ { 32, 15, 12, 0, 0, }, /* 372 */
+ { 38, 21, 12, 0, 0, }, /* 373 */
+ { 38, 17, 12, 0, 0, }, /* 374 */
+ { 38, 12, 3, 0, 0, }, /* 375 */
+ { 38, 1, 2, 0, 0, }, /* 376 */
+ { 38, 13, 12, 0, 0, }, /* 377 */
+ { 38, 7, 12, 0, 0, }, /* 378 */
+ { 38, 6, 12, 0, 0, }, /* 379 */
+ { 35, 7, 12, 0, 0, }, /* 380 */
+ { 35, 12, 3, 0, 0, }, /* 381 */
+ { 35, 10, 5, 0, 0, }, /* 382 */
+ { 35, 26, 12, 0, 0, }, /* 383 */
+ { 35, 21, 12, 0, 0, }, /* 384 */
+ { 35, 13, 12, 0, 0, }, /* 385 */
+ { 53, 7, 12, 0, 0, }, /* 386 */
+ { 40, 7, 12, 0, 0, }, /* 387 */
+ { 40, 13, 12, 0, 0, }, /* 388 */
+ { 40, 15, 12, 0, 0, }, /* 389 */
+ { 40, 26, 12, 0, 0, }, /* 390 */
+ { 32, 26, 12, 0, 0, }, /* 391 */
+ { 6, 7, 12, 0, 0, }, /* 392 */
+ { 6, 12, 3, 0, 0, }, /* 393 */
+ { 6, 10, 5, 0, 0, }, /* 394 */
+ { 6, 21, 12, 0, 0, }, /* 395 */
+ { 91, 7, 12, 0, 0, }, /* 396 */
+ { 91, 10, 5, 0, 0, }, /* 397 */
+ { 91, 12, 3, 0, 0, }, /* 398 */
+ { 91, 10, 12, 0, 0, }, /* 399 */
+ { 91, 13, 12, 0, 0, }, /* 400 */
+ { 91, 21, 12, 0, 0, }, /* 401 */
+ { 91, 6, 12, 0, 0, }, /* 402 */
+ { 28, 11, 3, 0, 0, }, /* 403 */
+ { 62, 12, 3, 0, 0, }, /* 404 */
+ { 62, 10, 5, 0, 0, }, /* 405 */
+ { 62, 7, 12, 0, 0, }, /* 406 */
+ { 62, 13, 12, 0, 0, }, /* 407 */
+ { 62, 21, 12, 0, 0, }, /* 408 */
+ { 62, 26, 12, 0, 0, }, /* 409 */
+ { 76, 12, 3, 0, 0, }, /* 410 */
+ { 76, 10, 5, 0, 0, }, /* 411 */
+ { 76, 7, 12, 0, 0, }, /* 412 */
+ { 76, 13, 12, 0, 0, }, /* 413 */
+ { 93, 7, 12, 0, 0, }, /* 414 */
+ { 93, 12, 3, 0, 0, }, /* 415 */
+ { 93, 10, 5, 0, 0, }, /* 416 */
+ { 93, 21, 12, 0, 0, }, /* 417 */
+ { 70, 7, 12, 0, 0, }, /* 418 */
+ { 70, 10, 5, 0, 0, }, /* 419 */
+ { 70, 12, 3, 0, 0, }, /* 420 */
+ { 70, 21, 12, 0, 0, }, /* 421 */
+ { 70, 13, 12, 0, 0, }, /* 422 */
+ { 73, 13, 12, 0, 0, }, /* 423 */
+ { 73, 7, 12, 0, 0, }, /* 424 */
+ { 73, 6, 12, 0, 0, }, /* 425 */
+ { 73, 21, 12, 0, 0, }, /* 426 */
+ { 13, 5, 12, 63, -6222, }, /* 427 */
+ { 13, 5, 12, 67, -6221, }, /* 428 */
+ { 13, 5, 12, 71, -6212, }, /* 429 */
+ { 13, 5, 12, 75, -6210, }, /* 430 */
+ { 13, 5, 12, 79, -6210, }, /* 431 */
+ { 13, 5, 12, 79, -6211, }, /* 432 */
+ { 13, 5, 12, 84, -6204, }, /* 433 */
+ { 13, 5, 12, 88, -6180, }, /* 434 */
+ { 13, 5, 12, 108, 35267, }, /* 435 */
+ { 17, 9, 12, 0, -3008, }, /* 436 */
+ { 76, 21, 12, 0, 0, }, /* 437 */
+ { 10, 10, 5, 0, 0, }, /* 438 */
+ { 10, 7, 12, 0, 0, }, /* 439 */
+ { 13, 5, 12, 0, 0, }, /* 440 */
+ { 13, 6, 12, 0, 0, }, /* 441 */
+ { 34, 5, 12, 0, 35332, }, /* 442 */
+ { 34, 5, 12, 0, 3814, }, /* 443 */
+ { 34, 9, 12, 92, 1, }, /* 444 */
+ { 34, 5, 12, 92, -1, }, /* 445 */
+ { 34, 5, 12, 92, -58, }, /* 446 */
+ { 34, 9, 12, 0, -7615, }, /* 447 */
+ { 20, 5, 12, 0, 8, }, /* 448 */
+ { 20, 9, 12, 0, -8, }, /* 449 */
+ { 20, 5, 12, 0, 74, }, /* 450 */
+ { 20, 5, 12, 0, 86, }, /* 451 */
+ { 20, 5, 12, 0, 100, }, /* 452 */
+ { 20, 5, 12, 0, 128, }, /* 453 */
+ { 20, 5, 12, 0, 112, }, /* 454 */
+ { 20, 5, 12, 0, 126, }, /* 455 */
+ { 20, 8, 12, 0, -8, }, /* 456 */
+ { 20, 5, 12, 0, 9, }, /* 457 */
+ { 20, 9, 12, 0, -74, }, /* 458 */
+ { 20, 8, 12, 0, -9, }, /* 459 */
+ { 20, 5, 12, 21, -7173, }, /* 460 */
+ { 20, 9, 12, 0, -86, }, /* 461 */
+ { 20, 9, 12, 0, -100, }, /* 462 */
+ { 20, 9, 12, 0, -112, }, /* 463 */
+ { 20, 9, 12, 0, -128, }, /* 464 */
+ { 20, 9, 12, 0, -126, }, /* 465 */
+ { 28, 1, 3, 0, 0, }, /* 466 */
+ { 28, 1, 13, 0, 0, }, /* 467 */
+ { 10, 27, 2, 0, 0, }, /* 468 */
+ { 10, 28, 2, 0, 0, }, /* 469 */
+ { 10, 21, 14, 0, 0, }, /* 470 */
+ { 0, 2, 2, 0, 0, }, /* 471 */
+ { 10, 9, 12, 0, 0, }, /* 472 */
+ { 10, 5, 12, 0, 0, }, /* 473 */
+ { 20, 9, 12, 96, -7517, }, /* 474 */
+ { 34, 9, 12, 100, -8383, }, /* 475 */
+ { 34, 9, 12, 104, -8262, }, /* 476 */
+ { 34, 9, 12, 0, 28, }, /* 477 */
+ { 10, 5, 14, 0, 0, }, /* 478 */
+ { 34, 5, 12, 0, -28, }, /* 479 */
+ { 34, 14, 12, 0, 16, }, /* 480 */
+ { 34, 14, 12, 0, -16, }, /* 481 */
+ { 34, 14, 12, 0, 0, }, /* 482 */
+ { 10, 25, 14, 0, 0, }, /* 483 */
+ { 10, 26, 12, 0, 26, }, /* 484 */
+ { 10, 26, 14, 0, 26, }, /* 485 */
+ { 10, 26, 12, 0, -26, }, /* 486 */
+ { 5, 26, 12, 0, 0, }, /* 487 */
+ { 18, 9, 12, 0, 48, }, /* 488 */
+ { 18, 5, 12, 0, -48, }, /* 489 */
+ { 34, 9, 12, 0, -10743, }, /* 490 */
+ { 34, 9, 12, 0, -3814, }, /* 491 */
+ { 34, 9, 12, 0, -10727, }, /* 492 */
+ { 34, 5, 12, 0, -10795, }, /* 493 */
+ { 34, 5, 12, 0, -10792, }, /* 494 */
+ { 34, 9, 12, 0, -10780, }, /* 495 */
+ { 34, 9, 12, 0, -10749, }, /* 496 */
+ { 34, 9, 12, 0, -10783, }, /* 497 */
+ { 34, 9, 12, 0, -10782, }, /* 498 */
+ { 34, 9, 12, 0, -10815, }, /* 499 */
+ { 11, 5, 12, 0, 0, }, /* 500 */
+ { 11, 26, 12, 0, 0, }, /* 501 */
+ { 11, 12, 3, 0, 0, }, /* 502 */
+ { 11, 21, 12, 0, 0, }, /* 503 */
+ { 11, 15, 12, 0, 0, }, /* 504 */
+ { 17, 5, 12, 0, -7264, }, /* 505 */
+ { 59, 7, 12, 0, 0, }, /* 506 */
+ { 59, 6, 12, 0, 0, }, /* 507 */
+ { 59, 21, 12, 0, 0, }, /* 508 */
+ { 59, 12, 3, 0, 0, }, /* 509 */
+ { 23, 26, 12, 0, 0, }, /* 510 */
+ { 23, 6, 12, 0, 0, }, /* 511 */
+ { 23, 14, 12, 0, 0, }, /* 512 */
+ { 24, 10, 3, 0, 0, }, /* 513 */
+ { 10, 17, 14, 0, 0, }, /* 514 */
+ { 27, 7, 12, 0, 0, }, /* 515 */
+ { 27, 6, 12, 0, 0, }, /* 516 */
+ { 30, 7, 12, 0, 0, }, /* 517 */
+ { 30, 6, 12, 0, 0, }, /* 518 */
+ { 4, 7, 12, 0, 0, }, /* 519 */
+ { 24, 7, 12, 0, 0, }, /* 520 */
+ { 24, 26, 12, 0, 0, }, /* 521 */
+ { 30, 26, 12, 0, 0, }, /* 522 */
+ { 23, 7, 12, 0, 0, }, /* 523 */
+ { 61, 7, 12, 0, 0, }, /* 524 */
+ { 61, 6, 12, 0, 0, }, /* 525 */
+ { 61, 26, 12, 0, 0, }, /* 526 */
+ { 86, 7, 12, 0, 0, }, /* 527 */
+ { 86, 6, 12, 0, 0, }, /* 528 */
+ { 86, 21, 12, 0, 0, }, /* 529 */
+ { 77, 7, 12, 0, 0, }, /* 530 */
+ { 77, 6, 12, 0, 0, }, /* 531 */
+ { 77, 21, 12, 0, 0, }, /* 532 */
+ { 77, 13, 12, 0, 0, }, /* 533 */
+ { 13, 9, 12, 108, 1, }, /* 534 */
+ { 13, 5, 12, 108, -35267, }, /* 535 */
+ { 13, 7, 12, 0, 0, }, /* 536 */
+ { 13, 21, 12, 0, 0, }, /* 537 */
+ { 79, 7, 12, 0, 0, }, /* 538 */
+ { 79, 14, 12, 0, 0, }, /* 539 */
+ { 79, 12, 3, 0, 0, }, /* 540 */
+ { 79, 21, 12, 0, 0, }, /* 541 */
+ { 34, 9, 12, 0, -35332, }, /* 542 */
+ { 34, 9, 12, 0, -42280, }, /* 543 */
+ { 34, 9, 12, 0, -42308, }, /* 544 */
+ { 34, 9, 12, 0, -42319, }, /* 545 */
+ { 34, 9, 12, 0, -42315, }, /* 546 */
+ { 34, 9, 12, 0, -42305, }, /* 547 */
+ { 34, 9, 12, 0, -42258, }, /* 548 */
+ { 34, 9, 12, 0, -42282, }, /* 549 */
+ { 34, 9, 12, 0, -42261, }, /* 550 */
+ { 34, 9, 12, 0, 928, }, /* 551 */
+ { 49, 7, 12, 0, 0, }, /* 552 */
+ { 49, 12, 3, 0, 0, }, /* 553 */
+ { 49, 10, 5, 0, 0, }, /* 554 */
+ { 49, 26, 12, 0, 0, }, /* 555 */
+ { 65, 7, 12, 0, 0, }, /* 556 */
+ { 65, 21, 12, 0, 0, }, /* 557 */
+ { 75, 10, 5, 0, 0, }, /* 558 */
+ { 75, 7, 12, 0, 0, }, /* 559 */
+ { 75, 12, 3, 0, 0, }, /* 560 */
+ { 75, 21, 12, 0, 0, }, /* 561 */
+ { 75, 13, 12, 0, 0, }, /* 562 */
+ { 69, 13, 12, 0, 0, }, /* 563 */
+ { 69, 7, 12, 0, 0, }, /* 564 */
+ { 69, 12, 3, 0, 0, }, /* 565 */
+ { 69, 21, 12, 0, 0, }, /* 566 */
+ { 74, 7, 12, 0, 0, }, /* 567 */
+ { 74, 12, 3, 0, 0, }, /* 568 */
+ { 74, 10, 5, 0, 0, }, /* 569 */
+ { 74, 21, 12, 0, 0, }, /* 570 */
+ { 84, 12, 3, 0, 0, }, /* 571 */
+ { 84, 10, 5, 0, 0, }, /* 572 */
+ { 84, 7, 12, 0, 0, }, /* 573 */
+ { 84, 21, 12, 0, 0, }, /* 574 */
+ { 84, 13, 12, 0, 0, }, /* 575 */
+ { 39, 6, 12, 0, 0, }, /* 576 */
+ { 68, 7, 12, 0, 0, }, /* 577 */
+ { 68, 12, 3, 0, 0, }, /* 578 */
+ { 68, 10, 5, 0, 0, }, /* 579 */
+ { 68, 13, 12, 0, 0, }, /* 580 */
+ { 68, 21, 12, 0, 0, }, /* 581 */
+ { 92, 7, 12, 0, 0, }, /* 582 */
+ { 92, 12, 3, 0, 0, }, /* 583 */
+ { 92, 6, 12, 0, 0, }, /* 584 */
+ { 92, 21, 12, 0, 0, }, /* 585 */
+ { 87, 7, 12, 0, 0, }, /* 586 */
+ { 87, 10, 5, 0, 0, }, /* 587 */
+ { 87, 12, 3, 0, 0, }, /* 588 */
+ { 87, 21, 12, 0, 0, }, /* 589 */
+ { 87, 6, 12, 0, 0, }, /* 590 */
+ { 34, 5, 12, 0, -928, }, /* 591 */
+ { 9, 5, 12, 0, -38864, }, /* 592 */
+ { 87, 13, 12, 0, 0, }, /* 593 */
+ { 24, 7, 9, 0, 0, }, /* 594 */
+ { 24, 7, 10, 0, 0, }, /* 595 */
+ { 0, 4, 2, 0, 0, }, /* 596 */
+ { 0, 3, 12, 0, 0, }, /* 597 */
+ { 26, 25, 12, 0, 0, }, /* 598 */
+ { 1, 24, 12, 0, 0, }, /* 599 */
+ { 10, 6, 3, 0, 0, }, /* 600 */
+ { 36, 7, 12, 0, 0, }, /* 601 */
+ { 20, 14, 12, 0, 0, }, /* 602 */
+ { 20, 15, 12, 0, 0, }, /* 603 */
+ { 20, 26, 12, 0, 0, }, /* 604 */
+ { 71, 7, 12, 0, 0, }, /* 605 */
+ { 67, 7, 12, 0, 0, }, /* 606 */
+ { 42, 7, 12, 0, 0, }, /* 607 */
+ { 42, 15, 12, 0, 0, }, /* 608 */
+ { 19, 7, 12, 0, 0, }, /* 609 */
+ { 19, 14, 12, 0, 0, }, /* 610 */
+ { 118, 7, 12, 0, 0, }, /* 611 */
+ { 118, 12, 3, 0, 0, }, /* 612 */
+ { 60, 7, 12, 0, 0, }, /* 613 */
+ { 60, 21, 12, 0, 0, }, /* 614 */
+ { 43, 7, 12, 0, 0, }, /* 615 */
+ { 43, 21, 12, 0, 0, }, /* 616 */
+ { 43, 14, 12, 0, 0, }, /* 617 */
+ { 14, 9, 12, 0, 40, }, /* 618 */
+ { 14, 5, 12, 0, -40, }, /* 619 */
+ { 47, 7, 12, 0, 0, }, /* 620 */
+ { 45, 7, 12, 0, 0, }, /* 621 */
+ { 45, 13, 12, 0, 0, }, /* 622 */
+ { 136, 9, 12, 0, 40, }, /* 623 */
+ { 136, 5, 12, 0, -40, }, /* 624 */
+ { 106, 7, 12, 0, 0, }, /* 625 */
+ { 104, 7, 12, 0, 0, }, /* 626 */
+ { 104, 21, 12, 0, 0, }, /* 627 */
+ { 110, 7, 12, 0, 0, }, /* 628 */
+ { 12, 7, 12, 0, 0, }, /* 629 */
+ { 81, 7, 12, 0, 0, }, /* 630 */
+ { 81, 21, 12, 0, 0, }, /* 631 */
+ { 81, 15, 12, 0, 0, }, /* 632 */
+ { 120, 7, 12, 0, 0, }, /* 633 */
+ { 120, 26, 12, 0, 0, }, /* 634 */
+ { 120, 15, 12, 0, 0, }, /* 635 */
+ { 116, 7, 12, 0, 0, }, /* 636 */
+ { 116, 15, 12, 0, 0, }, /* 637 */
+ { 128, 7, 12, 0, 0, }, /* 638 */
+ { 128, 15, 12, 0, 0, }, /* 639 */
+ { 66, 7, 12, 0, 0, }, /* 640 */
+ { 66, 15, 12, 0, 0, }, /* 641 */
+ { 66, 21, 12, 0, 0, }, /* 642 */
+ { 72, 7, 12, 0, 0, }, /* 643 */
+ { 72, 21, 12, 0, 0, }, /* 644 */
+ { 98, 7, 12, 0, 0, }, /* 645 */
+ { 97, 7, 12, 0, 0, }, /* 646 */
+ { 97, 15, 12, 0, 0, }, /* 647 */
+ { 31, 7, 12, 0, 0, }, /* 648 */
+ { 31, 12, 3, 0, 0, }, /* 649 */
+ { 31, 15, 12, 0, 0, }, /* 650 */
+ { 31, 21, 12, 0, 0, }, /* 651 */
+ { 88, 7, 12, 0, 0, }, /* 652 */
+ { 88, 15, 12, 0, 0, }, /* 653 */
+ { 88, 21, 12, 0, 0, }, /* 654 */
+ { 117, 7, 12, 0, 0, }, /* 655 */
+ { 117, 15, 12, 0, 0, }, /* 656 */
+ { 112, 7, 12, 0, 0, }, /* 657 */
+ { 112, 26, 12, 0, 0, }, /* 658 */
+ { 112, 12, 3, 0, 0, }, /* 659 */
+ { 112, 15, 12, 0, 0, }, /* 660 */
+ { 112, 21, 12, 0, 0, }, /* 661 */
+ { 78, 7, 12, 0, 0, }, /* 662 */
+ { 78, 21, 12, 0, 0, }, /* 663 */
+ { 83, 7, 12, 0, 0, }, /* 664 */
+ { 83, 15, 12, 0, 0, }, /* 665 */
+ { 82, 7, 12, 0, 0, }, /* 666 */
+ { 82, 15, 12, 0, 0, }, /* 667 */
+ { 121, 7, 12, 0, 0, }, /* 668 */
+ { 121, 21, 12, 0, 0, }, /* 669 */
+ { 121, 15, 12, 0, 0, }, /* 670 */
+ { 89, 7, 12, 0, 0, }, /* 671 */
+ { 130, 9, 12, 0, 64, }, /* 672 */
+ { 130, 5, 12, 0, -64, }, /* 673 */
+ { 130, 15, 12, 0, 0, }, /* 674 */
+ { 144, 7, 12, 0, 0, }, /* 675 */
+ { 144, 12, 3, 0, 0, }, /* 676 */
+ { 144, 13, 12, 0, 0, }, /* 677 */
+ { 1, 15, 12, 0, 0, }, /* 678 */
+ { 147, 7, 12, 0, 0, }, /* 679 */
+ { 147, 15, 12, 0, 0, }, /* 680 */
+ { 148, 7, 12, 0, 0, }, /* 681 */
+ { 148, 12, 3, 0, 0, }, /* 682 */
+ { 148, 15, 12, 0, 0, }, /* 683 */
+ { 148, 21, 12, 0, 0, }, /* 684 */
+ { 94, 10, 5, 0, 0, }, /* 685 */
+ { 94, 12, 3, 0, 0, }, /* 686 */
+ { 94, 7, 12, 0, 0, }, /* 687 */
+ { 94, 21, 12, 0, 0, }, /* 688 */
+ { 94, 15, 12, 0, 0, }, /* 689 */
+ { 94, 13, 12, 0, 0, }, /* 690 */
+ { 85, 12, 3, 0, 0, }, /* 691 */
+ { 85, 10, 5, 0, 0, }, /* 692 */
+ { 85, 7, 12, 0, 0, }, /* 693 */
+ { 85, 21, 12, 0, 0, }, /* 694 */
+ { 85, 1, 4, 0, 0, }, /* 695 */
+ { 101, 7, 12, 0, 0, }, /* 696 */
+ { 101, 13, 12, 0, 0, }, /* 697 */
+ { 96, 12, 3, 0, 0, }, /* 698 */
+ { 96, 7, 12, 0, 0, }, /* 699 */
+ { 96, 10, 5, 0, 0, }, /* 700 */
+ { 96, 13, 12, 0, 0, }, /* 701 */
+ { 96, 21, 12, 0, 0, }, /* 702 */
+ { 111, 7, 12, 0, 0, }, /* 703 */
+ { 111, 12, 3, 0, 0, }, /* 704 */
+ { 111, 21, 12, 0, 0, }, /* 705 */
+ { 100, 12, 3, 0, 0, }, /* 706 */
+ { 100, 10, 5, 0, 0, }, /* 707 */
+ { 100, 7, 12, 0, 0, }, /* 708 */
+ { 100, 7, 4, 0, 0, }, /* 709 */
+ { 100, 21, 12, 0, 0, }, /* 710 */
+ { 100, 13, 12, 0, 0, }, /* 711 */
+ { 48, 15, 12, 0, 0, }, /* 712 */
+ { 108, 7, 12, 0, 0, }, /* 713 */
+ { 108, 10, 5, 0, 0, }, /* 714 */
+ { 108, 12, 3, 0, 0, }, /* 715 */
+ { 108, 21, 12, 0, 0, }, /* 716 */
+ { 129, 7, 12, 0, 0, }, /* 717 */
+ { 129, 21, 12, 0, 0, }, /* 718 */
+ { 109, 7, 12, 0, 0, }, /* 719 */
+ { 109, 12, 3, 0, 0, }, /* 720 */
+ { 109, 10, 5, 0, 0, }, /* 721 */
+ { 109, 13, 12, 0, 0, }, /* 722 */
+ { 107, 12, 3, 0, 0, }, /* 723 */
+ { 107, 10, 5, 0, 0, }, /* 724 */
+ { 107, 7, 12, 0, 0, }, /* 725 */
+ { 107, 10, 3, 0, 0, }, /* 726 */
+ { 135, 7, 12, 0, 0, }, /* 727 */
+ { 135, 10, 5, 0, 0, }, /* 728 */
+ { 135, 12, 3, 0, 0, }, /* 729 */
+ { 135, 21, 12, 0, 0, }, /* 730 */
+ { 135, 13, 12, 0, 0, }, /* 731 */
+ { 124, 7, 12, 0, 0, }, /* 732 */
+ { 124, 10, 3, 0, 0, }, /* 733 */
+ { 124, 10, 5, 0, 0, }, /* 734 */
+ { 124, 12, 3, 0, 0, }, /* 735 */
+ { 124, 21, 12, 0, 0, }, /* 736 */
+ { 124, 13, 12, 0, 0, }, /* 737 */
+ { 123, 7, 12, 0, 0, }, /* 738 */
+ { 123, 10, 3, 0, 0, }, /* 739 */
+ { 123, 10, 5, 0, 0, }, /* 740 */
+ { 123, 12, 3, 0, 0, }, /* 741 */
+ { 123, 21, 12, 0, 0, }, /* 742 */
+ { 114, 7, 12, 0, 0, }, /* 743 */
+ { 114, 10, 5, 0, 0, }, /* 744 */
+ { 114, 12, 3, 0, 0, }, /* 745 */
+ { 114, 21, 12, 0, 0, }, /* 746 */
+ { 114, 13, 12, 0, 0, }, /* 747 */
+ { 102, 7, 12, 0, 0, }, /* 748 */
+ { 102, 12, 3, 0, 0, }, /* 749 */
+ { 102, 10, 5, 0, 0, }, /* 750 */
+ { 102, 13, 12, 0, 0, }, /* 751 */
+ { 126, 7, 12, 0, 0, }, /* 752 */
+ { 126, 12, 3, 0, 0, }, /* 753 */
+ { 126, 10, 5, 0, 0, }, /* 754 */
+ { 126, 13, 12, 0, 0, }, /* 755 */
+ { 126, 15, 12, 0, 0, }, /* 756 */
+ { 126, 21, 12, 0, 0, }, /* 757 */
+ { 126, 26, 12, 0, 0, }, /* 758 */
+ { 142, 7, 12, 0, 0, }, /* 759 */
+ { 142, 10, 5, 0, 0, }, /* 760 */
+ { 142, 12, 3, 0, 0, }, /* 761 */
+ { 142, 21, 12, 0, 0, }, /* 762 */
+ { 125, 9, 12, 0, 32, }, /* 763 */
+ { 125, 5, 12, 0, -32, }, /* 764 */
+ { 125, 13, 12, 0, 0, }, /* 765 */
+ { 125, 15, 12, 0, 0, }, /* 766 */
+ { 125, 7, 12, 0, 0, }, /* 767 */
+ { 141, 7, 12, 0, 0, }, /* 768 */
+ { 141, 12, 3, 0, 0, }, /* 769 */
+ { 141, 10, 5, 0, 0, }, /* 770 */
+ { 141, 7, 4, 0, 0, }, /* 771 */
+ { 141, 21, 12, 0, 0, }, /* 772 */
+ { 140, 7, 12, 0, 0, }, /* 773 */
+ { 140, 12, 3, 0, 0, }, /* 774 */
+ { 140, 10, 5, 0, 0, }, /* 775 */
+ { 140, 7, 4, 0, 0, }, /* 776 */
+ { 140, 21, 12, 0, 0, }, /* 777 */
+ { 122, 7, 12, 0, 0, }, /* 778 */
+ { 133, 7, 12, 0, 0, }, /* 779 */
+ { 133, 10, 5, 0, 0, }, /* 780 */
+ { 133, 12, 3, 0, 0, }, /* 781 */
+ { 133, 21, 12, 0, 0, }, /* 782 */
+ { 133, 13, 12, 0, 0, }, /* 783 */
+ { 133, 15, 12, 0, 0, }, /* 784 */
+ { 134, 21, 12, 0, 0, }, /* 785 */
+ { 134, 7, 12, 0, 0, }, /* 786 */
+ { 134, 12, 3, 0, 0, }, /* 787 */
+ { 134, 10, 5, 0, 0, }, /* 788 */
+ { 138, 7, 12, 0, 0, }, /* 789 */
+ { 138, 12, 3, 0, 0, }, /* 790 */
+ { 138, 7, 4, 0, 0, }, /* 791 */
+ { 138, 13, 12, 0, 0, }, /* 792 */
+ { 143, 7, 12, 0, 0, }, /* 793 */
+ { 143, 10, 5, 0, 0, }, /* 794 */
+ { 143, 12, 3, 0, 0, }, /* 795 */
+ { 143, 13, 12, 0, 0, }, /* 796 */
+ { 145, 7, 12, 0, 0, }, /* 797 */
+ { 145, 12, 3, 0, 0, }, /* 798 */
+ { 145, 10, 5, 0, 0, }, /* 799 */
+ { 145, 21, 12, 0, 0, }, /* 800 */
+ { 63, 7, 12, 0, 0, }, /* 801 */
+ { 63, 14, 12, 0, 0, }, /* 802 */
+ { 63, 21, 12, 0, 0, }, /* 803 */
+ { 80, 7, 12, 0, 0, }, /* 804 */
+ { 127, 7, 12, 0, 0, }, /* 805 */
+ { 115, 7, 12, 0, 0, }, /* 806 */
+ { 115, 13, 12, 0, 0, }, /* 807 */
+ { 115, 21, 12, 0, 0, }, /* 808 */
+ { 103, 7, 12, 0, 0, }, /* 809 */
+ { 103, 12, 3, 0, 0, }, /* 810 */
+ { 103, 21, 12, 0, 0, }, /* 811 */
+ { 119, 7, 12, 0, 0, }, /* 812 */
+ { 119, 12, 3, 0, 0, }, /* 813 */
+ { 119, 21, 12, 0, 0, }, /* 814 */
+ { 119, 26, 12, 0, 0, }, /* 815 */
+ { 119, 6, 12, 0, 0, }, /* 816 */
+ { 119, 13, 12, 0, 0, }, /* 817 */
+ { 119, 15, 12, 0, 0, }, /* 818 */
+ { 146, 9, 12, 0, 32, }, /* 819 */
+ { 146, 5, 12, 0, -32, }, /* 820 */
+ { 146, 15, 12, 0, 0, }, /* 821 */
+ { 146, 21, 12, 0, 0, }, /* 822 */
+ { 99, 7, 12, 0, 0, }, /* 823 */
+ { 99, 10, 5, 0, 0, }, /* 824 */
+ { 99, 12, 3, 0, 0, }, /* 825 */
+ { 99, 6, 12, 0, 0, }, /* 826 */
+ { 137, 6, 12, 0, 0, }, /* 827 */
+ { 139, 6, 12, 0, 0, }, /* 828 */
+ { 137, 7, 12, 0, 0, }, /* 829 */
+ { 139, 7, 12, 0, 0, }, /* 830 */
+ { 105, 7, 12, 0, 0, }, /* 831 */
+ { 105, 26, 12, 0, 0, }, /* 832 */
+ { 105, 12, 3, 0, 0, }, /* 833 */
+ { 105, 21, 12, 0, 0, }, /* 834 */
+ { 10, 10, 3, 0, 0, }, /* 835 */
+ { 20, 12, 3, 0, 0, }, /* 836 */
+ { 131, 26, 12, 0, 0, }, /* 837 */
+ { 131, 12, 3, 0, 0, }, /* 838 */
+ { 131, 21, 12, 0, 0, }, /* 839 */
+ { 18, 12, 3, 0, 0, }, /* 840 */
+ { 113, 7, 12, 0, 0, }, /* 841 */
+ { 113, 15, 12, 0, 0, }, /* 842 */
+ { 113, 12, 3, 0, 0, }, /* 843 */
+ { 132, 9, 12, 0, 34, }, /* 844 */
+ { 132, 5, 12, 0, -34, }, /* 845 */
+ { 132, 12, 3, 0, 0, }, /* 846 */
+ { 132, 13, 12, 0, 0, }, /* 847 */
+ { 132, 21, 12, 0, 0, }, /* 848 */
+ { 0, 2, 14, 0, 0, }, /* 849 */
+ { 10, 26, 11, 0, 0, }, /* 850 */
+ { 27, 26, 12, 0, 0, }, /* 851 */
+ { 10, 24, 3, 0, 0, }, /* 852 */
+ { 10, 1, 3, 0, 0, }, /* 853 */
};
const uint16_t PRIV(ucd_stage1)[] = { /* 17408 bytes */
diff --git a/src/pcre2_ucp.h b/src/pcre2_ucp.h
index 0c330ed..483abd1 100644
--- a/src/pcre2_ucp.h
+++ b/src/pcre2_ucp.h
@@ -124,6 +124,7 @@ enum {
/* These are the script identifications. */
enum {
+ ucp_Unknown,
ucp_Arabic,
ucp_Armenian,
ucp_Bengali,
diff --git a/testdata/testinput12 b/testdata/testinput12
index 6a996aa..29d1095 100644
--- a/testdata/testinput12
+++ b/testdata/testinput12
@@ -386,5 +386,16 @@
/(?<=abc)(|def)/g,utf,replace=<$0>,substitute_callout
123abcáyzabcdef789abcሴqr
+
+# A few script run tests in non-UTF mode (but they need Unicode support)
+
+/^(*script_run:.{4})/
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+
+/^(*sr:.*)/utf,allow_surrogate_escapes
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ \x{d800}\x{dfff} Surrogates (Unknown) \=no_utf_check
# End of testinput12
diff --git a/testdata/testinput4 b/testdata/testinput4
index a27b6af..eea087d 100644
--- a/testdata/testinput4
+++ b/testdata/testinput4
@@ -2317,5 +2317,96 @@
/[^\x{100}-\x{ffff}]*[\x80-\xff]/i,utf
\x{99}\x{99}\x{99}
+
+# Script run tests
+
+/^(*script_run:.{4})/utf
+ abcd Latin x4
+ \x{2e80}\x{2fa1d}\x{3041}\x{30a1} Han Han Hiragana Katakana
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+ \x{2e80}\x{3105}\x{2e80}\x{3105} Han Bopomofo Han Bopomofo
+ \x{02ea}\x{2e80}\x{2e80}\x{3105} Bopomofo-Sk Han Han Bopomofo
+ \x{3105}\x{2e80}\x{2e80}\x{3105} Bopomofo Han Han Bopomofo
+ \x{0300}cd! Inherited Latin Latin Common
+ \x{0391}12\x{03a9} Greek Common-digits Greek
+ \x{0400}12\x{fe2f} Cyrillic Common-digits Cyrillic
+ \x{0531}12\x{fb17} Armenian Common-digits Armenian
+ \x{0591}12\x{fb4f} Hebrew Common-digits Hebrew
+ \x{0600}12\x{1eef1} Arabic Common-digits Arabic
+ \x{0600}\x{0660}\x{0669}\x{1eef1} Arabic Arabic-digits Arabic
+ \x{0700}12\x{086a} Syriac Common-digits Syriac
+ \x{1200}12\x{ab2e} Ethiopic Common-digits Ethiopic
+ \x{1680}12\x{169c} Ogham Common-digits Ogham
+ \x{3041}12\x{3041} Hiragana Common-digits Hiragana
+ \x{0980}\x{09e6}\x{09e7}\x{0993} Bengali Bengali-digits Bengali
+ !cde Common Latin Latin Latin
+ A..B Latin Common Common Latin
+ 0abc Ascii-digit Latin Latin Latin
+ 1\x{0700}\x{0700}\x{0700} Ascii-digit Syriac x 3
+ \x{1A80}\x{1A80}\x{1a40}\x{1a41} Tai Tham Hora digits, letters
+\= Expect no match
+ a\x{370}bcd Latin Greek Latin Latin
+ \x{1100}\x{02ea}\x{02ea}\x{02ea} Hangul Bopomofo x3
+ \x{02ea}\x{02ea}\x{02ea}\x{1100} Bopomofo x3 Hangul
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+ \x{0391}\x{09e6}\x{09e7}\x{03a9} Greek Bengali digits Greek
+ \x{0600}7\x{0669}\x{1eef1} Arabic ascii-digit Arabic-digit Arabic
+ \x{0600}\x{0669}7\x{1eef1} Arabic Arabic-digit ascii-digit Arabic
+ A5\x{ff19}B Latin Common-ascii/notascii-digits Latin
+ \x{0300}cd\x{0391} Inherited Latin Latin Greek
+ !cd\x{0391} Common Latin Latin Greek
+ \x{1A80}\x{1A90}\x{1a40}\x{1a41} Tai Tham Hora digit, Tham digit, letters
+ A\x{1d7ce}\x{1d7ff}B Common fancy-common-2-sets-digits Common
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(*sr:.{4}|..)/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(*atomic_script_run:.{4}|..)/utf
+\= Expect no match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(*asr:.*)/utf
+\= Expect no match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(?>(*sr:.*))/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+
+/^(*sr:.*)/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ \x{10fffd}\x{10fffd}\x{10fffd} Private use (Unknown)
+
+/^(*sr:\x{2e80}*)/utf
+ \x{2e80}\x{2e80}\x{3105} Han Han Bopomofo
+
+/^(*sr:\x{2e80}*)\x{2e80}/utf
+ \x{2e80}\x{2e80}\x{3105} Han Han Bopomofo
+
+/^(*sr:.*)Test/utf
+ Test script run on an empty string
+
+/^(*sr:(.{2})){2}/utf
+ \x{0600}7\x{0669}\x{1eef1} Arabic ascii-digit Arabic-digit Arabic
+ \x{1A80}\x{1A80}\x{1a40}\x{1a41} Tai Tham Hora digits, letters
+ \x{1A80}\x{1a40}\x{1A90}\x{1a41} Tai Tham Hora digit, letter, Tham digit, letter
+\= Expect no match
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+
+# Test loop breaking for empty string match
+
+/^(*sr:A|)*BCD/utf
+ AABCD
+ ABCD
+ BCD
+
+# The use of (*ACCEPT) breaks script run checking
+
+/^(*sr:.*(*ACCEPT)ZZ)/utf
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+
+# -------
# End of testinput4
diff --git a/testdata/testinput5 b/testdata/testinput5
index 687de32..9730e0b 100644
--- a/testdata/testinput5
+++ b/testdata/testinput5
@@ -2106,5 +2106,28 @@
/(*: A‎B
C)abc/x,utf,mark,alt_verbnames
abc
+
+# Script run tests: auto-possessification
+
+/^(*sr:.*)/B,utf
+ paypаl.com A classic example of why script run checks are a good thing
+
+/^(*sr:\x{2e80}*)/B,utf
+
+/^(*sr:\x{2e80}*)\x{2e80}/B,utf
+
+# Some script run patterns are broken in Perl 5.28.0. These can be moved into
+# test 4 when a mended version of Perl is released.
+
+/^(*sr:.{4})/utf
+ \x{0980}12\x{0993} Bengali Common-digits Bengali
+ \x{0780}12\x{07b1} Thaana Common-digits Thaana
+ \x{0e01}12\x{0e5b} Thai Common-digits Thai
+ \x{1780}12\x{19ff} Khmer Common-digits Khmer
+ \x{0904}12\x{0939} Devanagari Common-digits Devanagari
+ A\x{ff10}\x{ff19}B Latin Common-notascii-digits Latin
+ A\x{1d7ce}\x{1d7cf}B Latin fancy-common-digits Latin
+
+# -------
# End of testinput5
diff --git a/testdata/testoutput12-16 b/testdata/testoutput12-16
index e29243a..72dde81 100644
--- a/testdata/testoutput12-16
+++ b/testdata/testoutput12-16
@@ -1480,5 +1480,20 @@ Old 12 12 New 14 16
Old 12 15 New 16 21
Old 21 21 New 27 29
4: 123abc<>\x{e1}yzabc<><def>789abc<>\x{1234}qr
+
+# A few script run tests in non-UTF mode (but they need Unicode support)
+
+/^(*script_run:.{4})/
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ 0: \x{3041}\x{30a1}\x{3007}\x{3007}
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ 0: \x{30a1}\x{3041}\x{3007}\x{3007}
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+ 0: \x{1100}\x{2e80}\x{2e80}\x{1101}
+
+/^(*sr:.*)/utf,allow_surrogate_escapes
+Failed: error 191 at offset 0: PCRE2_EXTRA_ALLOW_SURROGATE_ESCAPES is not allowed in UTF-16 mode
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ \x{d800}\x{dfff} Surrogates (Unknown) \=no_utf_check
# End of testinput12
diff --git a/testdata/testoutput12-32 b/testdata/testoutput12-32
index 706e0c0..d2c59e5 100644
--- a/testdata/testoutput12-32
+++ b/testdata/testoutput12-32
@@ -1477,5 +1477,21 @@ Old 12 12 New 14 16
Old 12 15 New 16 21
Old 21 21 New 27 29
4: 123abc<>\x{e1}yzabc<><def>789abc<>\x{1234}qr
+
+# A few script run tests in non-UTF mode (but they need Unicode support)
+
+/^(*script_run:.{4})/
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ 0: \x{3041}\x{30a1}\x{3007}\x{3007}
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ 0: \x{30a1}\x{3041}\x{3007}\x{3007}
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+ 0: \x{1100}\x{2e80}\x{2e80}\x{1101}
+
+/^(*sr:.*)/utf,allow_surrogate_escapes
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ 0: \x{2e80}\x{3105}\x{2e80}
+ \x{d800}\x{dfff} Surrogates (Unknown) \=no_utf_check
+ 0: \x{d800}
# End of testinput12
diff --git a/testdata/testoutput4 b/testdata/testoutput4
index ba3df37..8a53cf7 100644
--- a/testdata/testoutput4
+++ b/testdata/testoutput4
@@ -3741,5 +3741,154 @@ No match
/[^\x{100}-\x{ffff}]*[\x80-\xff]/i,utf
\x{99}\x{99}\x{99}
0: \x{99}\x{99}\x{99}
+
+# Script run tests
+
+/^(*script_run:.{4})/utf
+ abcd Latin x4
+ 0: abcd
+ \x{2e80}\x{2fa1d}\x{3041}\x{30a1} Han Han Hiragana Katakana
+ 0: \x{2e80}\x{2fa1d}\x{3041}\x{30a1}
+ \x{3041}\x{30a1}\x{3007}\x{3007} Hiragana Katakana Han Han
+ 0: \x{3041}\x{30a1}\x{3007}\x{3007}
+ \x{30a1}\x{3041}\x{3007}\x{3007} Katakana Hiragana Han Han
+ 0: \x{30a1}\x{3041}\x{3007}\x{3007}
+ \x{1100}\x{2e80}\x{2e80}\x{1101} Hangul Han Han Hangul
+ 0: \x{1100}\x{2e80}\x{2e80}\x{1101}
+ \x{2e80}\x{3105}\x{2e80}\x{3105} Han Bopomofo Han Bopomofo
+ 0: \x{2e80}\x{3105}\x{2e80}\x{3105}
+ \x{02ea}\x{2e80}\x{2e80}\x{3105} Bopomofo-Sk Han Han Bopomofo
+ 0: \x{2ea}\x{2e80}\x{2e80}\x{3105}
+ \x{3105}\x{2e80}\x{2e80}\x{3105} Bopomofo Han Han Bopomofo
+ 0: \x{3105}\x{2e80}\x{2e80}\x{3105}
+ \x{0300}cd! Inherited Latin Latin Common
+ 0: \x{300}cd!
+ \x{0391}12\x{03a9} Greek Common-digits Greek
+ 0: \x{391}12\x{3a9}
+ \x{0400}12\x{fe2f} Cyrillic Common-digits Cyrillic
+ 0: \x{400}12\x{fe2f}
+ \x{0531}12\x{fb17} Armenian Common-digits Armenian
+ 0: \x{531}12\x{fb17}
+ \x{0591}12\x{fb4f} Hebrew Common-digits Hebrew
+ 0: \x{591}12\x{fb4f}
+ \x{0600}12\x{1eef1} Arabic Common-digits Arabic
+ 0: \x{600}12\x{1eef1}
+ \x{0600}\x{0660}\x{0669}\x{1eef1} Arabic Arabic-digits Arabic
+ 0: \x{600}\x{660}\x{669}\x{1eef1}
+ \x{0700}12\x{086a} Syriac Common-digits Syriac
+ 0: \x{700}12\x{86a}
+ \x{1200}12\x{ab2e} Ethiopic Common-digits Ethiopic
+ 0: \x{1200}12\x{ab2e}
+ \x{1680}12\x{169c} Ogham Common-digits Ogham
+ 0: \x{1680}12\x{169c}
+ \x{3041}12\x{3041} Hiragana Common-digits Hiragana
+ 0: \x{3041}12\x{3041}
+ \x{0980}\x{09e6}\x{09e7}\x{0993} Bengali Bengali-digits Bengali
+ 0: \x{980}\x{9e6}\x{9e7}\x{993}
+ !cde Common Latin Latin Latin
+ 0: !cde
+ A..B Latin Common Common Latin
+ 0: A..B
+ 0abc Ascii-digit Latin Latin Latin
+ 0: 0abc
+ 1\x{0700}\x{0700}\x{0700} Ascii-digit Syriac x 3
+ 0: 1\x{700}\x{700}\x{700}
+ \x{1A80}\x{1A80}\x{1a40}\x{1a41} Tai Tham Hora digits, letters
+ 0: \x{1a80}\x{1a80}\x{1a40}\x{1a41}
+\= Expect no match
+ a\x{370}bcd Latin Greek Latin Latin
+No match
+ \x{1100}\x{02ea}\x{02ea}\x{02ea} Hangul Bopomofo x3
+No match
+ \x{02ea}\x{02ea}\x{02ea}\x{1100} Bopomofo x3 Hangul
+No match
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+No match
+ \x{0391}\x{09e6}\x{09e7}\x{03a9} Greek Bengali digits Greek
+No match
+ \x{0600}7\x{0669}\x{1eef1} Arabic ascii-digit Arabic-digit Arabic
+No match
+ \x{0600}\x{0669}7\x{1eef1} Arabic Arabic-digit ascii-digit Arabic
+No match
+ A5\x{ff19}B Latin Common-ascii/notascii-digits Latin
+No match
+ \x{0300}cd\x{0391} Inherited Latin Latin Greek
+No match
+ !cd\x{0391} Common Latin Latin Greek
+No match
+ \x{1A80}\x{1A90}\x{1a40}\x{1a41} Tai Tham Hora digit, Tham digit, letters
+No match
+ A\x{1d7ce}\x{1d7ff}B Common fancy-common-2-sets-digits Common
+No match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+No match
+
+/^(*sr:.{4}|..)/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ 0: \x{2e80}\x{3105}
+
+/^(*atomic_script_run:.{4}|..)/utf
+\= Expect no match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+No match
+
+/^(*asr:.*)/utf
+\= Expect no match
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+No match
+
+/^(?>(*sr:.*))/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ 0: \x{2e80}\x{3105}\x{2e80}
+
+/^(*sr:.*)/utf
+ \x{2e80}\x{3105}\x{2e80}\x{30a1} Han Bopomofo Han Katakana
+ 0: \x{2e80}\x{3105}\x{2e80}
+ \x{10fffd}\x{10fffd}\x{10fffd} Private use (Unknown)
+ 0: \x{10fffd}
+
+/^(*sr:\x{2e80}*)/utf
+ \x{2e80}\x{2e80}\x{3105} Han Han Bopomofo
+ 0: \x{2e80}\x{2e80}
+
+/^(*sr:\x{2e80}*)\x{2e80}/utf
+ \x{2e80}\x{2e80}\x{3105} Han Han Bopomofo
+ 0: \x{2e80}\x{2e80}
+
+/^(*sr:.*)Test/utf
+ Test script run on an empty string
+ 0: Test
+
+/^(*sr:(.{2})){2}/utf
+ \x{0600}7\x{0669}\x{1eef1} Arabic ascii-digit Arabic-digit Arabic
+ 0: \x{600}7\x{669}\x{1eef1}
+ 1: \x{669}\x{1eef1}
+ \x{1A80}\x{1A80}\x{1a40}\x{1a41} Tai Tham Hora digits, letters
+ 0: \x{1a80}\x{1a80}\x{1a40}\x{1a41}
+ 1: \x{1a40}\x{1a41}
+ \x{1A80}\x{1a40}\x{1A90}\x{1a41} Tai Tham Hora digit, letter, Tham digit, letter
+ 0: \x{1a80}\x{1a40}\x{1a90}\x{1a41}
+ 1: \x{1a90}\x{1a41}
+\= Expect no match
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+No match
+
+# Test loop breaking for empty string match
+
+/^(*sr:A|)*BCD/utf
+ AABCD
+ 0: AABCD
+ ABCD
+ 0: ABCD
+ BCD
+ 0: BCD
+
+# The use of (*ACCEPT) breaks script run checking
+
+/^(*sr:.*(*ACCEPT)ZZ)/utf
+ \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+ 0: \x{1100}\x{2e80}\x{3041}\x{1101} Hangul Han Hiragana Hangul
+
+# -------
# End of testinput4
diff --git a/testdata/testoutput5 b/testdata/testoutput5
index 51caa18..406db22 100644
--- a/testdata/testoutput5
+++ b/testdata/testoutput5
@@ -4775,5 +4775,64 @@ Failed: error 137 at offset 2: PCRE2 does not support \F, \L, \l, \N{name}, \U,
abc
0: abc
MK: ABC
+
+# Script run tests: auto-possessification
+
+/^(*sr:.*)/B,utf
+------------------------------------------------------------------
+ Bra
+ ^
+ Script run
+ Any*
+ Ket
+ Ket
+ End
+------------------------------------------------------------------
+ paypаl.com A classic example of why script run checks are a good thing
+ 0: payp
+
+/^(*sr:\x{2e80}*)/B,utf
+------------------------------------------------------------------
+ Bra
+ ^
+ Script run
+ \x{2e80}*+
+ Ket
+ Ket
+ End
+------------------------------------------------------------------
+
+/^(*sr:\x{2e80}*)\x{2e80}/B,utf
+------------------------------------------------------------------
+ Bra
+ ^
+ Script run
+ \x{2e80}*
+ Ket
+ \x{2e80}
+ Ket
+ End
+------------------------------------------------------------------
+
+# Some script run patterns are broken in Perl 5.28.0. These can be moved into
+# test 4 when a mended version of Perl is released.
+
+/^(*sr:.{4})/utf
+ \x{0980}12\x{0993} Bengali Common-digits Bengali
+ 0: \x{980}12\x{993}
+ \x{0780}12\x{07b1} Thaana Common-digits Thaana
+ 0: \x{780}12\x{7b1}
+ \x{0e01}12\x{0e5b} Thai Common-digits Thai
+ 0: \x{e01}12\x{e5b}
+ \x{1780}12\x{19ff} Khmer Common-digits Khmer
+ 0: \x{1780}12\x{19ff}
+ \x{0904}12\x{0939} Devanagari Common-digits Devanagari
+ 0: \x{904}12\x{939}
+ A\x{ff10}\x{ff19}B Latin Common-notascii-digits Latin
+ 0: A\x{ff10}\x{ff19}B
+ A\x{1d7ce}\x{1d7cf}B Latin fancy-common-digits Latin
+ 0: A\x{1d7ce}\x{1d7cf}B
+
+# -------
# End of testinput5