summaryrefslogtreecommitdiff
path: root/src/stringprep
diff options
context:
space:
mode:
authorAlexey Shchepin <alexey@process-one.net>2003-10-06 20:12:11 +0000
committerAlexey Shchepin <alexey@process-one.net>2003-10-06 20:12:11 +0000
commite1de741cfc0d0e7eef18e2aa61ec7d344d08683d (patch)
tree974fc5aa27c4c272a1132b2f95c6de5fe794f0cb /src/stringprep
parent* src/stringprep/stringprep_drv.c: Added support for nameprep, (diff)
*** empty log message ***
SVN Revision: 143
Diffstat (limited to 'src/stringprep')
-rw-r--r--src/stringprep/Makefile2
-rw-r--r--src/stringprep/stringprep_drv.c121
-rw-r--r--src/stringprep/uni_data.c780
-rw-r--r--src/stringprep/uni_norm.c2231
-rw-r--r--src/stringprep/uni_parse.tcl70
-rw-r--r--src/stringprep/uni_parse2.tcl737
6 files changed, 3583 insertions, 358 deletions
diff --git a/src/stringprep/Makefile b/src/stringprep/Makefile
index 3f48c109..5ae3e8d7 100644
--- a/src/stringprep/Makefile
+++ b/src/stringprep/Makefile
@@ -27,7 +27,7 @@ $(OUTDIR)/%.beam: %.erl
#all: $(ERLSHLIBS)
# erl -s make all report "{outdir, \"..\"}" -noinput -s erlang halt
-$(ERLSHLIBS): ../%.so: %.c
+$(ERLSHLIBS): ../%.so: %.c uni_data.c uni_norm.c
gcc -Wall $(INCLUDES) $(LIBDIRS) \
$(subst ../,,$(subst .so,.c,$@)) \
-lerl_interface \
diff --git a/src/stringprep/stringprep_drv.c b/src/stringprep/stringprep_drv.c
index d74b93e5..9d9f5dfe 100644
--- a/src/stringprep/stringprep_drv.c
+++ b/src/stringprep/stringprep_drv.c
@@ -6,6 +6,7 @@
#include <iconv.h>
#include "uni_data.c"
+#include "uni_norm.c"
#define NAMEPREP_COMMAND 1
#define NODEPREP_COMMAND 2
@@ -31,12 +32,71 @@ static void stringprep_erl_stop(ErlDrvData handle)
driver_free((char*)handle);
}
+
+static int combine(int ch1, int ch2)
+{
+ int info1, info2;
+
+ info1 = GetUniCharCompInfo(ch1);
+ if(info1 != -1) {
+ if(info1 & CompSingleMask) {
+ if (ch2 == compFirstList[info1 & CompMask][0]) {
+ return compFirstList[info1 & CompMask][1];
+ } else
+ return 0;
+ }
+ } else
+ return 0;
+
+ info2 = GetUniCharCompInfo(ch2);
+ if(info2 != -1) {
+ if (info2 & CompSingleMask) {
+ if (ch1 == compSecondList[info2 & CompMask][0]) {
+ return compSecondList[info2 & CompMask][1];
+ } else
+ return 0;
+ }
+ } else
+ return 0;
+
+ return compBothList[info1][info2];
+}
+
+
+#define ADD_UCHAR(ruc) \
+ if(ruc < 0x80) { \
+ if(pos >= size) { \
+ size = 2*size + 1; \
+ rstring = driver_realloc(rstring, size); \
+ } \
+ rstring[pos] = (char) ruc; \
+ pos++; \
+ } else if(ruc < 0x7FF) { \
+ if(pos + 1 >= size) { \
+ size = 2*size + 2; \
+ rstring = driver_realloc(rstring, size); \
+ } \
+ rstring[pos] = (char) ((ruc >> 6) | 0xC0); \
+ rstring[pos+1] = (char) ((ruc | 0x80) & 0xBF); \
+ pos += 2; \
+ } else if(ruc < 0xFFFF) { \
+ if(pos + 2 >= size) { \
+ size = 2*size + 3; \
+ rstring = driver_realloc(rstring, size); \
+ } \
+ rstring[pos] = (char) ((ruc >> 12) | 0xE0); \
+ rstring[pos+1] = (char) (((ruc >> 6) | 0x80) & 0xBF); \
+ rstring[pos+2] = (char) ((ruc | 0x80) & 0xBF); \
+ pos += 3; \
+ }
+
+
static int stringprep_erl_control(ErlDrvData drv_data,
unsigned int command,
char *buf, int len,
char **rbuf, int rlen)
{
- int i, j=1;
+ int i, j, pos=1;
unsigned char c;
int bad = 0;
int uc, ruc;
@@ -44,7 +104,8 @@ static int stringprep_erl_control(ErlDrvData drv_data,
int info;
int prohibit, tolower;
char *rstring;
-
+ int *mc;
+
size = len + 1;
rstring = driver_alloc(size);
@@ -116,43 +177,41 @@ static int stringprep_erl_control(ErlDrvData drv_data,
if(!(info & B1Mask))
{
if(tolower) {
- ruc = uc + GetDelta(info);
+ if(!(info & MCMask))
+ {
+ ruc = uc + GetDelta(info);
+
+ //info = GetUniCharDecompInfo(ruc);
+ //if(info >= 0) {
+ // printf("Decomposition %x: ", ruc);
+ // for(j = 0; j < GetDecompLen(info); j++) {
+ // printf("%x ", decompList[GetDecompShift(info) + j]);
+ // }
+ // printf("\r\n");
+ //}
+
+ ADD_UCHAR(ruc);
+ } else {
+ mc = GetMC(info);
+ for(j = 1; j <= mc[0]; j++) {
+ ruc = mc[j];
+ //printf("Char %x cclass %d\r\n", ruc, GetUniCharCClass(ruc));
+ ADD_UCHAR(ruc);
+ }
+ }
} else {
ruc = uc;
- }
-
- if(ruc < 0x80) {
- if(j >= size) {
- size = 2*size + 1;
- rstring = driver_realloc(rstring, size);
- }
- rstring[j] = (char) ruc;
- j++;
- } else if(ruc < 0x7FF) {
- if(j + 1 >= size) {
- size = 2*size + 2;
- rstring = driver_realloc(rstring, size);
- }
- rstring[j] = (char) ((ruc >> 6) | 0xC0);
- rstring[j+1] = (char) ((ruc | 0x80) & 0xBF);
- j += 2;
- } else if(ruc < 0xFFFF) {
- if(j + 2 >= size) {
- size = 2*size + 3;
- rstring = driver_realloc(rstring, size);
- }
- rstring[j] = (char) ((ruc >> 12) | 0xE0);
- rstring[j+1] = (char) (((ruc >> 6) | 0x80) & 0xBF);
- rstring[j+2] = (char) ((ruc | 0x80) & 0xBF);
- j += 3;
+ ADD_UCHAR(ruc);
}
}
}
-
+
+ //printf("Combine: %x\r\n", combine(0x438, 0x301));
+
rstring[0] = 1;
*rbuf = rstring;
- return j;
+ return pos;
}
diff --git a/src/stringprep/uni_data.c b/src/stringprep/uni_data.c
index 5c94e7d1..8b8c6ec5 100644
--- a/src/stringprep/uni_data.c
+++ b/src/stringprep/uni_data.c
@@ -42,17 +42,17 @@ static unsigned char pageMap[] = {
124, 125, 126, 127, 18, 18, 128, 18, 129, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 130, 8, 8, 131, 132, 133,
- 134, 135, 18, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 51,
- 146, 147, 148, 149, 150, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
- 22, 151, 18, 152, 153, 22, 143, 4, 22, 154, 51, 22, 155, 156, 157,
- 158, 22, 22, 22, 22, 22, 22, 22, 22, 159, 22, 22, 160, 161, 4, 4, 4,
- 162, 163, 164, 165, 166, 167, 145, 168, 22, 22, 22, 22, 22, 22, 22,
+ 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 51,
+ 147, 148, 149, 150, 151, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 152, 18, 153, 154, 22, 144, 4, 22, 155, 51, 22, 156, 157, 158,
+ 159, 22, 22, 22, 22, 22, 22, 22, 22, 160, 22, 22, 161, 162, 4, 4, 4,
+ 163, 164, 165, 166, 167, 168, 146, 169, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 169, 22, 22, 170, 22, 22, 22, 22, 22, 22, 171, 4, 172,
- 173, 37, 18, 174, 175, 18, 176, 177, 178, 18, 18, 113, 128, 4, 17,
- 179, 18, 180, 181, 18, 182, 183, 184, 18, 18, 18, 185, 18, 18, 186,
- 184, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 4, 4, 4, 4, 4, 170, 22, 22, 171, 22, 22, 22, 22, 22, 22, 172, 4, 173,
+ 174, 37, 18, 175, 176, 18, 177, 178, 179, 18, 18, 113, 128, 4, 17,
+ 180, 18, 181, 182, 18, 183, 184, 185, 18, 18, 18, 186, 18, 18, 187,
+ 185, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
@@ -64,7 +64,7 @@ static unsigned char pageMap[] = {
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 187, 4, 4, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
+ 18, 18, 188, 4, 4, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
@@ -102,10 +102,10 @@ static unsigned char pageMap[] = {
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 188, 4, 4, 18, 18,
+ 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 189, 4, 4, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 189, 22, 154, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 190, 22, 155, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
@@ -128,29 +128,29 @@ static unsigned char pageMap[] = {
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 190, 4, 4, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191, 191,
- 191, 191, 191, 191, 18, 18, 18, 18, 18, 18, 18, 18, 18, 192, 18, 193,
- 4, 4, 4, 4, 194, 195, 196, 46, 46, 197, 198, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 199, 200, 46, 201, 46, 202, 203, 204, 205, 206, 207,
- 46, 46, 46, 208, 165, 209, 210, 211, 18, 184, 212, 213
+ 18, 18, 18, 18, 191, 4, 4, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 192,
+ 192, 192, 192, 192, 18, 18, 18, 18, 18, 18, 18, 18, 18, 193, 18, 194,
+ 4, 4, 4, 4, 195, 196, 197, 46, 46, 198, 199, 46, 46, 46, 46, 46, 46,
+ 46, 46, 46, 46, 200, 201, 46, 202, 46, 203, 204, 205, 206, 207, 208,
+ 46, 46, 46, 209, 166, 210, 211, 212, 18, 185, 213, 214
};
/*
@@ -169,306 +169,314 @@ static unsigned char groupMap[] = {
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 7, 2, 2, 2, 2, 2, 2, 2, 8, 2, 2,
2, 2, 5, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
+ 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, 4, 4, 4, 4, 4, 9, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5,
- 5, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
- 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9,
- 5, 9, 5, 9, 5, 5, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9,
- 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9,
- 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
- 9, 5, 9, 5, 9, 5, 9, 5, 10, 9, 5, 9, 5, 9, 5, 11, 5, 12, 9, 5, 9, 5,
- 13, 9, 5, 14, 14, 9, 5, 5, 15, 16, 17, 9, 5, 14, 18, 5, 19, 20, 9,
- 5, 5, 5, 19, 21, 5, 22, 9, 5, 9, 5, 9, 5, 23, 9, 5, 23, 5, 5, 9, 5,
- 23, 9, 5, 24, 24, 9, 5, 9, 5, 25, 9, 5, 5, 5, 9, 5, 5, 5, 5, 5, 5,
- 5, 26, 9, 5, 26, 9, 5, 26, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
- 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
- 5, 26, 9, 5, 9, 5, 27, 28, 9, 5, 9, 5, 9, 5, 9, 5, 29, 6, 9, 5, 9,
- 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5,
+ 5, 5, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 11, 5, 10, 5, 10, 5, 10, 5, 5,
+ 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 12, 10, 5,
+ 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 13, 10, 5, 10, 5, 10, 5, 14, 5, 15, 10, 5, 10, 5,
+ 16, 10, 5, 17, 17, 10, 5, 5, 18, 19, 20, 10, 5, 17, 21, 5, 22, 23,
+ 10, 5, 5, 5, 22, 24, 5, 25, 10, 5, 10, 5, 10, 5, 26, 10, 5, 26, 5,
+ 5, 10, 5, 26, 10, 5, 27, 27, 10, 5, 10, 5, 28, 10, 5, 5, 5, 10, 5,
+ 5, 5, 5, 5, 5, 5, 29, 10, 5, 29, 10, 5, 29, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 5, 10, 5, 10, 5, 10, 5, 10, 5,
+ 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 30, 29, 10, 5, 10, 5, 31, 32, 10,
+ 5, 10, 5, 10, 5, 10, 5, 33, 6, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 30, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6,
- 6, 6, 5, 6, 6, 6, 2, 6, 6, 6, 6, 6, 2, 2, 31, 2, 32, 32, 32, 6, 33,
- 6, 34, 34, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 35,
- 36, 5, 5, 5, 37, 38, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9,
- 5, 9, 5, 9, 5, 9, 5, 9, 5, 39, 40, 41, 5, 42, 43, 2, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44,
- 44, 44, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 9, 5, 5, 2, 2, 2, 2, 6, 2, 2, 9, 5, 9, 5, 9, 5, 9, 5,
- 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 9, 5, 9, 5, 9, 5, 9, 5,
- 9, 5, 9, 5, 9, 5, 6, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
- 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 6,
- 6, 9, 5, 6, 6, 6, 6, 6, 6, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
- 9, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 6, 6, 5, 5, 5,
- 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5,
- 2, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 6, 2, 2, 2, 46, 2, 46, 2, 2, 46, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 6, 6, 6, 6, 6, 46, 46,
- 46, 46, 46, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 46, 6, 6,
- 6, 46, 6, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 6, 6, 6, 6, 6, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 46, 46, 46, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 2, 2, 2, 2, 2, 2, 2, 47, 2, 2, 2, 2, 2, 2, 2, 46,
- 46, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 46, 46,
- 46, 46, 46, 6, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 6, 6, 46, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 6, 6, 6, 2,
+ 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5,
+ 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 46, 46, 46, 46, 46, 46, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 46, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 6, 6, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 2, 6,
- 6, 5, 2, 2, 2, 2, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 2, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5,
- 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 2, 6, 5, 5, 5, 2,
- 2, 2, 2, 6, 6, 5, 5, 6, 6, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6,
- 6, 6, 6, 5, 5, 6, 5, 5, 5, 2, 2, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 5, 5,
- 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6,
- 5, 5, 6, 5, 5, 6, 6, 2, 6, 5, 5, 5, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6, 2,
- 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 5, 6, 6, 6, 6,
- 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5,
- 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 2, 5, 5,
- 5, 5, 2, 2, 2, 2, 2, 6, 2, 2, 5, 6, 5, 5, 2, 6, 6, 5, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 6, 5, 5, 5, 5, 6,
- 6, 2, 5, 5, 2, 5, 2, 2, 2, 6, 6, 6, 5, 5, 6, 6, 5, 5, 2, 6, 6, 6, 6,
- 6, 6, 6, 6, 2, 5, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 2, 5, 6, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 5, 6,
- 6, 6, 5, 5, 6, 5, 6, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 5, 6, 6, 6,
- 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 6, 6, 6, 5, 5, 2, 5, 5, 6, 6,
- 6, 5, 5, 5, 6, 5, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5,
- 5, 5, 5, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5,
- 5, 5, 6, 6, 6, 6, 2, 2, 2, 5, 5, 5, 5, 6, 2, 2, 2, 6, 2, 2, 2, 2, 6,
- 6, 6, 6, 6, 6, 6, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 2, 5, 5,
- 5, 5, 5, 6, 2, 5, 5, 6, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 6,
- 6, 6, 6, 6, 6, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 2, 2, 2, 6, 6, 5,
- 5, 5, 6, 5, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 5, 5, 5,
- 5, 5, 5, 5, 6, 6, 6, 2, 6, 6, 6, 6, 5, 5, 5, 2, 2, 2, 6, 2, 6, 5, 5,
- 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6,
- 2, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 6, 5, 6, 6, 5, 5, 6, 5, 6, 6,
- 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5,
- 6, 5, 6, 5, 6, 6, 5, 5, 6, 5, 5, 5, 5, 2, 5, 5, 2, 2, 2, 2, 2, 2, 6,
- 2, 2, 5, 6, 6, 5, 5, 5, 5, 5, 6, 5, 6, 2, 2, 2, 2, 2, 2, 6, 6, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5,
- 2, 5, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 5, 2, 2, 2, 2, 2, 5, 2, 2, 5, 5, 5, 5, 6, 6, 6, 6, 2, 2, 2,
- 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 5, 5, 5,
- 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 2, 2,
- 2, 2, 5, 2, 6, 6, 6, 2, 2, 5, 2, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 6, 6, 6,
- 6, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 5, 5,
+ 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 34, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6, 6, 6, 5, 6, 6, 6, 2,
+ 6, 6, 6, 6, 6, 2, 2, 35, 2, 36, 36, 36, 6, 37, 6, 38, 38, 39, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 5, 5, 5, 5, 40, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 41, 42, 5, 5, 5, 43,
+ 44, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 45, 46, 47, 5, 48, 49, 2, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50,
+ 50, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 10, 5, 5, 2, 2, 2, 2, 6, 2, 2, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 5, 10, 5, 10, 5,
+ 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, 6, 10, 5, 6, 6, 6, 6, 6, 6, 10, 5,
+ 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51,
+ 51, 51, 51, 51, 51, 51, 51, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 52, 6, 5, 2, 6, 6, 6, 6, 6, 6,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 53,
+ 2, 53, 2, 2, 53, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 6, 6, 6, 6, 6, 53, 53, 53, 53, 53, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 53, 6, 6, 6, 53, 6, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 6, 6, 6, 6, 6, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 53, 53, 53, 2, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 2, 2, 2, 2, 2, 2, 2, 54, 2, 2, 2, 2, 2, 2, 2, 53, 53, 2, 2, 2, 2, 2,
+ 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 6, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 6, 6, 53, 2, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 53, 53, 53, 53,
+ 53, 53, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 53, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
- 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5,
- 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5,
- 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5,
- 6, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6,
- 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 2, 5, 5,
+ 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 2, 6, 6, 5, 2, 2, 2, 2, 6,
+ 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 5,
+ 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6,
+ 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 2, 6, 5, 5, 5, 2, 2, 2, 2, 6, 6, 5, 5,
+ 6, 6, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 5, 5, 6, 5,
+ 5, 5, 2, 2, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5,
+ 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 2, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, 6,
+ 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 5, 6, 5, 5, 6, 6,
+ 2, 6, 5, 5, 5, 2, 2, 6, 6, 6, 6, 2, 2, 6, 6, 2, 2, 2, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 2, 2, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 5, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 2, 5, 5, 5, 5, 2, 2, 2, 2, 2,
+ 6, 2, 2, 5, 6, 5, 5, 2, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5,
+ 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 6, 5, 5, 5, 5, 6, 6, 2, 5, 5, 2, 5, 2,
+ 2, 2, 6, 6, 6, 5, 5, 6, 6, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 6,
+ 6, 6, 6, 5, 5, 6, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 6, 5, 5,
+ 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 5, 6, 6, 6, 5, 5, 6, 5, 6,
+ 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 5, 5, 5, 6, 6, 6, 6, 5, 5, 2, 5, 5, 6, 6, 6, 5, 5, 5, 6, 5, 5,
+ 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5,
6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 2, 2, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2,
- 2, 2, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 2, 2, 6, 6, 6, 6,
+ 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 2,
+ 2, 2, 5, 5, 5, 5, 6, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 2,
+ 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5,
+ 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 2, 5, 5, 5, 5, 5, 6, 2, 5, 5,
+ 6, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 6,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 2, 2, 2, 6, 6, 5, 5, 5, 6, 5, 5, 5, 2,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 6,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
+ 2, 6, 6, 6, 6, 5, 5, 5, 2, 2, 2, 6, 2, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5,
- 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5,
- 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2,
- 7, 7, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5,
+ 5, 5, 2, 5, 5, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 5, 5, 5, 5, 5, 5,
+ 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
+ 6, 6, 6, 6, 5, 5, 6, 5, 6, 6, 5, 5, 6, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6,
+ 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 5, 6, 5, 6, 6, 5,
+ 5, 6, 5, 5, 5, 5, 2, 5, 5, 2, 2, 2, 2, 2, 2, 6, 2, 2, 5, 6, 6, 5, 5,
+ 5, 5, 5, 6, 5, 6, 2, 2, 2, 2, 2, 2, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 6, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 5, 2, 2, 2, 2, 2,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
- 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 9, 5, 9, 5, 9, 5, 9,
- 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 5, 5, 5, 5, 5, 48, 6,
- 6, 6, 6, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5, 9, 5,
- 9, 5, 9, 5, 9, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 49, 49,
- 49, 49, 49, 49, 49, 49, 5, 5, 5, 5, 5, 5, 6, 6, 49, 49, 49, 49, 49,
- 49, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 49, 49, 49, 49, 49, 49, 49, 49, 5,
- 5, 5, 5, 5, 5, 5, 5, 49, 49, 49, 49, 49, 49, 49, 49, 5, 5, 5, 5, 5,
- 5, 6, 6, 49, 49, 49, 49, 49, 49, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 6, 49,
- 6, 49, 6, 49, 6, 49, 5, 5, 5, 5, 5, 5, 5, 5, 49, 49, 49, 49, 49, 49,
- 49, 49, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 49, 49,
- 50, 50, 5, 2, 51, 2, 2, 2, 5, 5, 5, 6, 5, 5, 52, 52, 52, 52, 5, 2,
- 2, 2, 5, 5, 5, 5, 6, 6, 5, 5, 49, 49, 53, 53, 6, 2, 2, 2, 5, 5, 5,
- 5, 5, 5, 5, 5, 49, 49, 54, 54, 55, 2, 2, 2, 6, 6, 5, 5, 5, 6, 5, 5,
- 56, 56, 57, 57, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 58, 58,
- 58, 59, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2,
+ 2, 2, 5, 2, 2, 5, 5, 5, 5, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 6, 6, 6, 6, 2, 6, 6, 6, 6, 6, 6, 6, 6, 58, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 5, 2, 60,
- 2, 5, 2, 61, 62, 5, 5, 2, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, 6, 6,
- 5, 5, 5, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 63,
- 63, 63, 63, 63, 63, 63, 63, 63, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5,
+ 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 5, 5, 6, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5, 2, 2, 2, 2, 5, 2, 6, 6, 6,
+ 2, 2, 5, 2, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5,
+ 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 64, 64, 64, 64, 64, 64, 64, 64, 64,
- 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
+ 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5,
+ 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,
- 6, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5,
+ 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5,
+ 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6,
+ 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6,
+ 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5,
+ 6, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 6,
+ 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 5, 5, 5, 5, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 5, 5, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 6, 5, 5, 5, 6, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 2, 5, 6, 6, 6, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 7, 2, 2, 2, 2, 7, 7, 7, 6, 6, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5,
+ 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 55, 56, 57, 58, 59, 60, 6, 6, 6,
+ 6, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10, 5, 10,
+ 5, 10, 5, 10, 5, 10, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 61,
+ 61, 61, 61, 61, 61, 61, 61, 5, 5, 5, 5, 5, 5, 6, 6, 61, 61, 61, 61,
+ 61, 61, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 61, 61, 61, 61, 61, 61, 61, 61,
+ 5, 5, 5, 5, 5, 5, 5, 5, 61, 61, 61, 61, 61, 61, 61, 61, 5, 5, 5, 5,
+ 5, 5, 6, 6, 61, 61, 61, 61, 61, 61, 6, 6, 62, 5, 63, 5, 64, 5, 65,
+ 5, 6, 61, 6, 61, 6, 61, 6, 61, 5, 5, 5, 5, 5, 5, 5, 5, 61, 61, 61,
+ 61, 61, 61, 61, 61, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
+ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
+ 5, 5, 114, 115, 116, 6, 117, 118, 61, 61, 119, 119, 120, 2, 121, 2,
+ 2, 2, 122, 123, 124, 6, 125, 126, 127, 127, 127, 127, 128, 2, 2, 2,
+ 5, 5, 129, 130, 6, 6, 131, 132, 61, 61, 133, 133, 6, 2, 2, 2, 5, 5,
+ 134, 135, 136, 5, 137, 138, 61, 61, 139, 139, 140, 2, 2, 2, 6, 6, 141,
+ 142, 143, 6, 144, 145, 146, 146, 147, 147, 148, 2, 2, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 149, 149, 149, 150, 54, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6,
6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 2, 2, 2, 6, 6, 6,
- 2, 6, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 6, 6, 6, 6, 6,
+ 6, 6, 6, 149, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 5, 6,
+ 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2,
+ 2, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5,
+ 5, 2, 2, 2, 2, 2, 2, 5, 2, 151, 2, 5, 2, 152, 153, 5, 5, 2, 5, 5, 5,
+ 2, 5, 5, 5, 5, 5, 5, 5, 2, 6, 6, 5, 5, 5, 2, 2, 2, 2, 2, 5, 5, 5, 5,
+ 5, 2, 2, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154, 154,
+ 154, 154, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, 155,
+ 155, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 2, 2, 2, 2, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, 2, 2, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
- 6, 2, 2, 2, 2, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 2, 6, 6, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 6, 2, 2, 2, 2, 6,
+ 6, 6, 2, 6, 2, 2, 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, 2,
+ 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 6, 6, 2, 2, 2, 2, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 5,
- 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 2, 5, 5, 5, 5, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 6, 6, 6, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6,
- 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
- 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 46, 2, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 6, 46, 46, 46, 46, 46, 6, 46, 6, 46, 46, 6, 46, 46, 6, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 6, 6, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 5, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 156, 157, 158,
+ 159, 160, 161, 162, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 163, 164, 165,
+ 166, 167, 6, 6, 6, 6, 6, 53, 2, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 6, 53, 53,
+ 53, 53, 53, 6, 53, 6, 53, 53, 6, 53, 53, 6, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 6,
+ 6, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 6, 6,
- 46, 46, 46, 46, 46, 6, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
- 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 6, 6, 58, 2, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2,
- 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6,
- 6, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5,
- 6, 6, 5, 5, 5, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2,
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
+ 6, 6, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 6, 6, 6,
+ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 6, 6, 6, 6, 53, 53,
+ 53, 53, 53, 6, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
+ 53, 53, 53, 53, 53, 53, 53, 53, 53, 6, 6, 149, 2, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2,
+ 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 5,
+ 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6, 5, 5, 5, 5, 5, 5, 6, 6,
+ 5, 5, 5, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 6, 2, 2, 2, 2, 2, 2, 2, 6, 6,
+ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
};
/*
@@ -489,22 +497,148 @@ static unsigned char groupMap[] = {
*
* Bit 6 D.2
*
- * Bits 7-15 Reserved for future use.
+ * Bit 7 Case maps to several characters
+ *
+ * Bits 8-15 Reserved for future use.
*
* Bits 16-31 Case delta: delta for case conversions. This should be the
* highest field so we can easily sign extend.
*/
static int groups[] = {
- 4, 2, 0, 64, 2097184, 32, 1, 8, 50790432, 65568, -7929824, -17563616,
- 13762592, 13500448, 13434912, 5177376, 13238304, 13303840, 13565984,
- 13828128, 13697056, 13959200, 14024736, 14286880, 14221344, 14352416,
- 131104, -6356960, -3669984, -8519648, 7602176, 2490400, 2424864,
- 4194336, 4128800, -1966048, -1638368, -983008, -1441760, -3538912,
- -3145696, -3080160, -3932128, -4194272, 5242912, 3145760, 16,
- 17, -3801056, -524256, -4849632, -470089696, -5636064, -6553568,
- -7340000, -458720, -8388576, -8257504, 9, 33, -492634080, -549388256,
- -541458400, 1048608, 1703968
+ 4, 2, 0, 64, 2097184, 32, 1, 8, 50790432, 160, 65568, 65696, 131232,
+ -7929824, -17563616, 13762592, 13500448, 13434912, 5177376, 13238304,
+ 13303840, 13565984, 13828128, 13697056, 13959200, 14024736, 14286880,
+ 14221344, 14352416, 131104, 196768, -6356960, -3669984, -8519648,
+ 7602176, 2490400, 2424864, 4194336, 4128800, 262304, 327840, -1966048,
+ -1638368, -983008, -1441760, -3538912, -3145696, -3080160, -3932128,
+ -4194272, 5242912, 3145760, 393376, 16, 17, 458912, 524448, 589984,
+ 655520, 721056, -3801056, -524256, 786592, 852128, 917664, 983200,
+ 1048736, 1114272, 1179808, 1245344, 1310880, 1376416, 1441952,
+ 1507488, 1573024, 1638560, 1704096, 1769632, 1835168, 1900704,
+ 1966240, 2031776, 2097312, 2162848, 2228384, 2293920, 2359456,
+ 2424992, 2490528, 2556064, 2621600, 2687136, 2752672, 2818208,
+ 2883744, 2949280, 3014816, 3080352, 3145888, 3211424, 3276960,
+ 3342496, 3408032, 3473568, 3539104, 3604640, 3670176, 3735712,
+ 3801248, 3866784, 3932320, 3997856, 4063392, 4128928, 4194464,
+ 4260000, 4325536, 4391072, 4456608, -4849632, 4522144, -470089696,
+ 4587680, 4653216, 4718752, 4784288, 4849824, -5636064, 4915360,
+ 4980896, 5046432, 5111968, 5177504, -6553568, 5243040, 5308576,
+ 5374112, 5439648, 5505184, -7340000, -458720, 5570720, 5636256,
+ 5701792, 5767328, 5832864, -8388576, -8257504, 5898400, 9, 33,
+ -492634080, -549388256, -541458400, 1048608, 1703968, 5963936,
+ 6029472, 6095008, 6160544, 6226080, 6291616, 6357152, 6422688,
+ 6488224, 6553760, 6619296, 6684832
+};
+
+/*
+ * Table for characters that lowercased to multiple ones
+ */
+
+static int multiCaseTable[][4] = {
+ {2, 115, 115},
+ {2, 105, 775},
+ {2, 700, 110},
+ {2, 106, 780},
+ {3, 953, 776, 769},
+ {3, 965, 776, 769},
+ {2, 1381, 1410},
+ {2, 104, 817},
+ {2, 116, 776},
+ {2, 119, 778},
+ {2, 121, 778},
+ {2, 97, 702},
+ {2, 965, 787},
+ {3, 965, 787, 768},
+ {3, 965, 787, 769},
+ {3, 965, 787, 834},
+ {2, 7936, 953},
+ {2, 7937, 953},
+ {2, 7938, 953},
+ {2, 7939, 953},
+ {2, 7940, 953},
+ {2, 7941, 953},
+ {2, 7942, 953},
+ {2, 7943, 953},
+ {2, 7936, 953},
+ {2, 7937, 953},
+ {2, 7938, 953},
+ {2, 7939, 953},
+ {2, 7940, 953},
+ {2, 7941, 953},
+ {2, 7942, 953},
+ {2, 7943, 953},
+ {2, 7968, 953},
+ {2, 7969, 953},
+ {2, 7970, 953},
+ {2, 7971, 953},
+ {2, 7972, 953},
+ {2, 7973, 953},
+ {2, 7974, 953},
+ {2, 7975, 953},
+ {2, 7968, 953},
+ {2, 7969, 953},
+ {2, 7970, 953},
+ {2, 7971, 953},
+ {2, 7972, 953},
+ {2, 7973, 953},
+ {2, 7974, 953},
+ {2, 7975, 953},
+ {2, 8032, 953},
+ {2, 8033, 953},
+ {2, 8034, 953},
+ {2, 8035, 953},
+ {2, 8036, 953},
+ {2, 8037, 953},
+ {2, 8038, 953},
+ {2, 8039, 953},
+ {2, 8032, 953},
+ {2, 8033, 953},
+ {2, 8034, 953},
+ {2, 8035, 953},
+ {2, 8036, 953},
+ {2, 8037, 953},
+ {2, 8038, 953},
+ {2, 8039, 953},
+ {2, 8048, 953},
+ {2, 945, 953},
+ {2, 940, 953},
+ {2, 945, 834},
+ {3, 945, 834, 953},
+ {2, 945, 953},
+ {2, 8052, 953},
+ {2, 951, 953},
+ {2, 942, 953},
+ {2, 951, 834},
+ {3, 951, 834, 953},
+ {2, 951, 953},
+ {3, 953, 776, 768},
+ {3, 953, 776, 769},
+ {2, 953, 834},
+ {3, 953, 776, 834},
+ {3, 965, 776, 768},
+ {3, 965, 776, 769},
+ {2, 961, 787},
+ {2, 965, 834},
+ {3, 965, 776, 834},
+ {2, 8060, 953},
+ {2, 969, 953},
+ {2, 974, 953},
+ {2, 969, 834},
+ {3, 969, 834, 953},
+ {2, 969, 953},
+ {2, 102, 102},
+ {2, 102, 105},
+ {2, 102, 108},
+ {3, 102, 102, 105},
+ {3, 102, 102, 108},
+ {2, 115, 116},
+ {2, 115, 116},
+ {2, 1396, 1398},
+ {2, 1396, 1381},
+ {2, 1396, 1387},
+ {2, 1406, 1398},
+ {2, 1396, 1389}
};
/*
@@ -519,6 +653,7 @@ static int groups[] = {
#define D1Mask (1 << 4)
#define D2Mask (1 << 5)
#define XNPMask (1 << 6)
+#define MCMask (1 << 7)
/*
* The following macros extract the fields of the character info. The
@@ -529,6 +664,7 @@ static int groups[] = {
#define GetCaseType(info) (((info) & 0xE0) >> 5)
#define GetCategory(info) ((info) & 0x1F)
#define GetDelta(info) (((info) > 0) ? ((info) >> 16) : (~(~((info)) >> 16)))
+#define GetMC(info) (multiCaseTable[GetDelta(info)])
/*
* This macro extracts the information about a character from the
diff --git a/src/stringprep/uni_norm.c b/src/stringprep/uni_norm.c
new file mode 100644
index 00000000..1c287958
--- /dev/null
+++ b/src/stringprep/uni_norm.c
@@ -0,0 +1,2231 @@
+/*
+ * uni_norm.c --
+ *
+ * Declarations of Unicode character information tables. This file is
+ * automatically generated by the uni_parse2.tcl script. Do not
+ * modify this file by hand.
+ *
+ * Copyright (c) 1998 by Scriptics Corporation.
+ * All rights reserved.
+ *
+ * Modified for ejabberd by Alexey Shchepin
+ *
+ * RCS: @(#) $Id$
+ */
+
+/*
+ * A 16-bit Unicode character is split into two parts in order to index
+ * into the following tables. The lower CCLASS_OFFSET_BITS comprise an offset
+ * into a page of characters. The upper bits comprise the page number.
+ */
+
+#define CCLASS_OFFSET_BITS 6
+
+/*
+ * The pageMap is indexed by page number and returns an alternate page number
+ * that identifies a unique page of characters. Many Unicode characters map
+ * to the same alternate page number.
+ */
+
+static unsigned char cclassPageMap[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 4,
+ 5, 6, 7, 0, 8, 9, 10, 0, 0, 0, 0, 0, 0, 11, 12, 11, 13, 11, 13, 11,
+ 13, 11, 13, 0, 13, 0, 14, 11, 13, 0, 13, 0, 15, 16, 17, 18, 19, 20,
+ 21, 22, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, 26, 0, 0, 27, 0, 28, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30,
+ 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0,
+ 0, 0, 0, 0, 0
+};
+
+/*
+ * The groupMap is indexed by combining the alternate page number with
+ * the page offset and returns a group number that identifies a unique
+ * set of character attributes.
+ */
+
+static unsigned char cclassGroupMap[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 232, 220, 220, 220, 220, 232, 216, 220, 220, 220,
+ 220, 220, 202, 202, 220, 220, 220, 220, 202, 202, 220, 220, 220, 220,
+ 220, 220, 220, 220, 220, 220, 220, 1, 1, 1, 1, 1, 220, 220, 220, 220,
+ 230, 230, 230, 230, 230, 230, 230, 230, 240, 230, 220, 220, 220, 230,
+ 230, 230, 220, 220, 0, 230, 230, 230, 220, 220, 220, 220, 230, 0, 0,
+ 0, 0, 0, 234, 234, 233, 234, 234, 233, 230, 230, 230, 230, 230, 230,
+ 230, 230, 230, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 230,
+ 230, 230, 230, 220, 230, 230, 230, 222, 220, 230, 230, 230, 230, 230,
+ 230, 0, 220, 220, 220, 220, 220, 230, 230, 220, 230, 230, 222, 228,
+ 230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 20, 21, 22, 0, 23,
+ 0, 24, 25, 0, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 230, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 230, 230, 220,
+ 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230,
+ 230, 230, 230, 230, 230, 230, 0, 0, 230, 230, 230, 230, 220, 230, 0,
+ 0, 230, 230, 0, 220, 230, 230, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 220, 230, 230, 220, 230, 230, 220,
+ 220, 220, 230, 220, 220, 230, 220, 230, 230, 230, 220, 230, 220, 230,
+ 220, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 9, 0, 0, 0, 230, 220, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 84, 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 103, 103, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 107, 107, 107, 107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 118, 118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, 122,
+ 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 220, 0,
+ 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 129, 130, 0, 132, 0, 0, 0, 0, 0, 130,
+ 130, 130, 130, 0, 0, 130, 0, 230, 230, 9, 0, 230, 230, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 230, 220,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 230, 230,
+ 1, 1, 230, 230, 230, 230, 1, 1, 1, 230, 230, 0, 0, 0, 0, 230, 0, 0,
+ 0, 1, 1, 230, 220, 230, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 218, 228, 232, 222, 224, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 230, 230, 230, 230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/*
+ * Each group represents a unique set of character attributes. The attributes
+ * are encoded into a 32-bit value as follows:
+ *
+ * Bits 0-4 Character category: see the constants listed below.
+ *
+ * Bits 5-7 Case delta type: 000 = identity
+ * 010 = add delta for lower
+ * 011 = add delta for lower, add 1 for title
+ * 100 = sutract delta for title/upper
+ * 101 = sub delta for upper, sub 1 for title
+ * 110 = sub delta for upper, add delta for lower
+ *
+ * Bits 8-21 Reserved for future use.
+ *
+ * Bits 22-31 Case delta: delta for case conversions. This should be the
+ * highest field so we can easily sign extend.
+ */
+
+static int cclass_groups[] = {
+
+};
+
+#define GetUniCharCClass(ch) (cclassGroupMap[(cclassPageMap[(((int)(ch)) & 0xffff) >> CCLASS_OFFSET_BITS] << CCLASS_OFFSET_BITS) | ((ch) & ((1 << CCLASS_OFFSET_BITS)-1))])
+
+
+#define DECOMP_OFFSET_BITS 5
+
+/*
+ * The pageMap is indexed by page number and returns an alternate page number
+ * that identifies a unique page of characters. Many Unicode characters map
+ * to the same alternate page number.
+ */
+
+static unsigned char decompPageMap[] = {
+ 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, 11, 12, 0, 0, 0, 13,
+ 14, 15, 0, 0, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 26, 27,
+ 0, 0, 0, 0, 28, 0, 0, 0, 0, 29, 0, 30, 0, 0, 31, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, 0, 35,
+ 36, 0, 0, 0, 0, 0, 0, 0, 37, 0, 38, 0, 39, 0, 0, 0, 40, 0, 0, 0, 41,
+ 0, 0, 0, 42, 0, 0, 0, 43, 0, 0, 44, 0, 0, 0, 45, 46, 0, 47, 0, 48,
+ 49, 50, 51, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53, 54,
+ 55, 0, 0, 0, 0, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,
+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 0, 0, 78, 79, 80, 81, 82, 83, 84,
+ 0, 85, 86, 87, 88, 89, 90, 0, 91, 0, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 93, 94, 95, 96, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 98, 0, 0, 99, 0, 0, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 102, 103,
+ 104, 105, 106, 107, 108, 109, 0, 110, 111, 112, 113, 114, 115, 116,
+ 117, 0, 118, 119, 120, 121, 0, 0, 0, 122, 123, 124, 125, 126, 127,
+ 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
+ 148, 149, 0, 0, 0, 0, 150, 151, 152, 153, 154, 155, 156, 157, 158,
+ 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
+ 173, 0, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185,
+ 186, 187, 188
+};
+
+/*
+ * The groupMap is indexed by combining the alternate page number with
+ * the page offset and returns a group number that identifies a unique
+ * set of character attributes.
+ */
+
+static int decompGroupMap[] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65536,
+ -1, -1, -1, -1, -1, -1, -1, 131073, -1, 65539, -1, -1, -1, -1, 131076,
+ -1, -1, 65542, 65543, 131080, 65546, -1, -1, 131083, 65549, 65550,
+ -1, 196623, 196626, 196629, -1, 131096, 131098, 131100, 131102, 131104,
+ 131106, -1, 131108, 131110, 131112, 131114, 131116, 131118, 131120,
+ 131122, 131124, -1, 131126, 131128, 131130, 131132, 131134, 131136,
+ -1, -1, 131138, 131140, 131142, 131144, 131146, -1, -1, 131148, 131150,
+ 131152, 131154, 131156, 131158, -1, 131160, 131162, 131164, 131166,
+ 131168, 131170, 131172, 131174, 131176, -1, 131178, 131180, 131182,
+ 131184, 131186, 131188, -1, -1, 131190, 131192, 131194, 131196, 131198,
+ -1, 131200, 131202, 131204, 131206, 131208, 131210, 131212, 131214,
+ 131216, 131218, 131220, 131222, 131224, 131226, 131228, 131230, 131232,
+ -1, -1, 131234, 131236, 131238, 131240, 131242, 131244, 131246, 131248,
+ 131250, 131252, 131254, 131256, 131258, 131260, 131262, 131264, 131266,
+ 131268, 131270, 131272, -1, -1, 131274, 131276, 131278, 131280, 131282,
+ 131284, 131286, 131288, 131290, -1, 131292, 131294, 131296, 131298,
+ 131300, 131302, -1, 131304, 131306, 131308, 131310, 131312, 131314,
+ 131316, 131318, -1, -1, 131320, 131322, 131324, 131326, 131328, 131330,
+ 131332, -1, -1, 131334, 131336, 131338, 131340, 131342, 131344, -1,
+ -1, 131346, 131348, 131350, 131352, 131354, 131356, 131358, 131360,
+ 131362, 131364, 131366, 131368, 131370, 131372, 131374, 131376, 131378,
+ 131380, -1, -1, 131382, 131384, 131386, 131388, 131390, 131392, 131394,
+ 131396, 131398, 131400, 131402, 131404, 131406, 131408, 131410, 131412,
+ 131414, 131416, 131418, 131420, 131422, 131424, 131426, 65892, 131429,
+ 131431, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131433,
+ 131435, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 131437, 131439, 131441, 131443, 131445, 131447, 131449,
+ 131451, 131453, 131455, 131457, 131459, 131461, 131463, 131465, 131467,
+ 131469, 131471, 131473, 131475, 131477, 131479, 131481, 131483, 131485,
+ -1, 131487, 131489, 131491, 131493, 131495, 131497, -1, -1, 131499,
+ 131501, 131503, 131505, 131507, 131509, 131511, 131513, 131515, 131517,
+ 131519, 131521, 131523, 131525, 131527, 131529, -1, -1, 131531, 131533,
+ 131535, 131537, 131539, 131541, 131543, 131545, 131547, 131549, 131551,
+ 131553, 131555, 131557, 131559, 131561, 131563, 131565, 131567, 131569,
+ 131571, 131573, 131575, 131577, 131579, 131581, 131583, 131585, 131587,
+ 131589, 131591, 131593, 131595, 131597, 131599, 131601, -1, -1, 131603,
+ 131605, -1, -1, -1, -1, -1, -1, 131607, 131609, 131611, 131613, 131615,
+ 131617, 131619, 131621, 131623, 131625, 131627, 131629, 131631, 131633,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66099, 66100, 66101, 66102,
+ 66103, 66104, 66105, 66106, 66107, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 131644, 131646, 131648, 131650, 131652, 131654,
+ -1, -1, 66120, 66121, 65892, 66122, 66123, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 66124, 66125, -1, 66126, 131663, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 66129, -1, -1, -1, -1, -1, 131666,
+ -1, -1, -1, 66132, -1, -1, -1, -1, -1, 131080, 131669, 131671, 66137,
+ 131674, 131676, 131678, -1, 131680, -1, 131682, 131684, 131686, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 131688, 131690, 131692, 131694, 131696,
+ 131698, 131700, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131702, 131704, 131706,
+ 131708, 131710, -1, 66176, 66177, 66178, 131715, 131717, 66183, 66184,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 66185, 66186, 66187, -1, 66188, 66189,
+ -1, -1, -1, 66190, -1, -1, -1, -1, -1, -1, 131727, 131729, -1, 131731,
+ -1, -1, -1, 131733, -1, -1, -1, -1, 131735, 131737, 131739, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 131741, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 131743, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131745, 131747,
+ -1, 131749, -1, -1, -1, 131751, -1, -1, -1, -1, 131753, 131755, 131757,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 131759, 131761, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 131763, 131765, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 131767, 131769, 131771, 131773, -1, -1, 131775, 131777, -1,
+ -1, 131779, 131781, 131783, 131785, 131787, 131789, -1, -1, 131791,
+ 131793, 131795, 131797, 131799, 131801, -1, -1, 131803, 131805, 131807,
+ 131809, 131811, 131813, 131815, 131817, 131819, 131821, 131823, 131825,
+ -1, -1, 131827, 131829, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 131831, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131833, 131835,
+ 131837, 131839, 131841, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 131843, 131845, 131847, 131849, -1, -1, -1, -1, -1, -1, -1, 131851,
+ -1, 131853, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 131855, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 131857, -1, -1, -1, -1, -1, -1, -1,
+ 131859, -1, -1, 131861, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 131863, 131865, 131867, 131869, 131871,
+ 131873, 131875, 131877, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 131879, 131881, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 131883, 131885, -1, 131887, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131889, -1, -1, 131891,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 131893, 131895, 131897, -1, -1, 131899, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 131901, -1, -1, 131903, 131905, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 131907, 131909, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 131911, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 131913, 131915, 131917, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 131919, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131921, -1, -1,
+ -1, -1, -1, -1, 131923, 131925, -1, 131927, 131929, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 131931, 131933, 131935, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 131937, -1, 131939, 131941, 131943,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 131945, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 131947, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131949, 131951, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66417, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 131954, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131956, -1, -1, -1,
+ -1, 131958, -1, -1, -1, -1, 131960, -1, -1, -1, -1, 131962, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131964, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 131966, -1, 131968, 131970, 131972, 131974, 131976,
+ -1, -1, -1, -1, -1, -1, -1, 131978, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 131980, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 131982, -1, -1, -1, -1, 131984, -1, -1, -1, -1, 131986,
+ -1, -1, -1, -1, 131988, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 131990, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 131992,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 66458, 66459, 66460, -1, 66461, 66462, 66463, 66464, 66465,
+ 66466, 66467, 66468, 66469, 66470, 66471, -1, 66472, 66473, 66474,
+ 66475, 66476, 66477, 66478, 65539, 66479, 66480, 66481, 66482, 66483,
+ 66484, 66485, 66486, 66487, 66488, -1, 66489, 66490, 66491, 65550,
+ 66492, 66493, 66494, 66495, 66496, 66497, 66498, 66499, 66500, 66501,
+ 66176, 66502, 66503, 66183, 66504, 66505, 66102, 66497, 66500, 66176,
+ 66502, 66186, 66183, 66504, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 132042, 132044, 132046,
+ 132048, 132050, 132052, 132054, 132056, 132058, 132060, 132062, 132064,
+ 132066, 132068, 132070, 132072, 132074, 132076, 132078, 132080, 132082,
+ 132084, 132086, 132088, 132090, 132092, 132094, 132096, 132098, 132100,
+ 132102, 132104, 132106, 132108, 132110, 132112, 132114, 132116, 132118,
+ 132120, 132122, 132124, 132126, 132128, 132130, 132132, 132134, 132136,
+ 132138, 132140, 132142, 132144, 132146, 132148, 132150, 132152, 132154,
+ 132156, 132158, 132160, 132162, 132164, 132166, 132168, 132170, 132172,
+ 132174, 132176, 132178, 132180, 132182, 132184, 132186, 132188, 132190,
+ 132192, 132194, 132196, 132198, 132200, 132202, 132204, 132206, 132208,
+ 132210, 132212, 132214, 132216, 132218, 132220, 132222, 132224, 132226,
+ 132228, 132230, 132232, 132234, 132236, 132238, 132240, 132242, 132244,
+ 132246, 132248, 132250, 132252, 132254, 132256, 132258, 132260, 132262,
+ 132264, 132266, 132268, 132270, 132272, 132274, 132276, 132278, 132280,
+ 132282, 132284, 132286, 132288, 132290, 132292, 132294, 132296, 132298,
+ 132300, 132302, 132304, 132306, 132308, 132310, 132312, 132314, 132316,
+ 132318, 132320, 132322, 132324, 132326, 132328, 132330, 132332, 132334,
+ 132336, 132338, 132340, 132342, 132344, 132346, 132348, 132350, 132352,
+ -1, -1, -1, -1, 132354, 132356, 132358, 132360, 132362, 132364, 132366,
+ 132368, 132370, 132372, 132374, 132376, 132378, 132380, 132382, 132384,
+ 132386, 132388, 132390, 132392, 132394, 132396, 132398, 132400, 132402,
+ 132404, 132406, 132408, 132410, 132412, 132414, 132416, 132418, 132420,
+ 132422, 132424, 132426, 132428, 132430, 132432, 132434, 132436, 132438,
+ 132440, 132442, 132444, 132446, 132448, 132450, 132452, 132454, 132456,
+ 132458, 132460, 132462, 132464, 132466, 132468, 132470, 132472, 132474,
+ 132476, 132478, 132480, 132482, 132484, 132486, 132488, 132490, 132492,
+ 132494, 132496, 132498, 132500, 132502, 132504, 132506, 132508, 132510,
+ 132512, 132514, 132516, 132518, 132520, 132522, 132524, 132526, 132528,
+ 132530, 132532, -1, -1, -1, -1, -1, -1, 132534, 132536, 132538, 132540,
+ 132542, 132544, 132546, 132548, 132550, 132552, 132554, 132556, 132558,
+ 132560, 132562, 132564, 132566, 132568, 132570, 132572, 132574, 132576,
+ -1, -1, 132578, 132580, 132582, 132584, 132586, 132588, -1, -1, 132590,
+ 132592, 132594, 132596, 132598, 132600, 132602, 132604, 132606, 132608,
+ 132610, 132612, 132614, 132616, 132618, 132620, 132622, 132624, 132626,
+ 132628, 132630, 132632, 132634, 132636, 132638, 132640, 132642, 132644,
+ 132646, 132648, 132650, 132652, 132654, 132656, 132658, 132660, 132662,
+ 132664, -1, -1, 132666, 132668, 132670, 132672, 132674, 132676, -1,
+ -1, 132678, 132680, 132682, 132684, 132686, 132688, 132690, 132692,
+ -1, 132694, -1, 132696, -1, 132698, -1, 132700, 132702, 132704, 132706,
+ 132708, 132710, 132712, 132714, 132716, 132718, 132720, 132722, 132724,
+ 132726, 132728, 132730, 132732, 132734, 67200, 132737, 67203, 132740,
+ 67206, 132743, 67209, 132746, 67212, 132749, 67215, 132752, 67218,
+ -1, -1, 132755, 132757, 132759, 132761, 132763, 132765, 132767, 132769,
+ 132771, 132773, 132775, 132777, 132779, 132781, 132783, 132785, 132787,
+ 132789, 132791, 132793, 132795, 132797, 132799, 132801, 132803, 132805,
+ 132807, 132809, 132811, 132813, 132815, 132817, 132819, 132821, 132823,
+ 132825, 132827, 132829, 132831, 132833, 132835, 132837, 132839, 132841,
+ 132843, 132845, 132847, 132849, 132851, 132853, 132855, 132857, 132859,
+ -1, 132861, 132863, 132865, 132867, 132869, 67335, 132872, 132874,
+ 67340, 132874, 132877, 132879, 132881, 132883, 132885, -1, 132887,
+ 132889, 132891, 67357, 132894, 67360, 132897, 132899, 132901, 132903,
+ 132905, 132907, 132909, 67375, -1, -1, 132912, 132914, 132916, 132918,
+ 132920, 67386, -1, 132923, 132925, 132927, 132929, 132931, 132933,
+ 67399, 132936, 132938, 132940, 132942, 132944, 132946, 132948, 67414,
+ 132951, 132953, 67419, 67420, -1, -1, 132957, 132959, 132961, -1, 132963,
+ 132965, 132967, 67433, 132970, 67436, 132973, 67439, 132976, -1, 67442,
+ 67443, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536, 65536,
+ -1, -1, -1, -1, -1, -1, 67444, -1, -1, -1, -1, -1, 132981, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67447, 132984, 198522, -1,
+ -1, -1, -1, -1, -1, -1, -1, 65536, -1, -1, -1, 132989, 198527, -1,
+ 132994, 198532, -1, -1, -1, -1, 132999, -1, 133001, -1, -1, -1, -1,
+ -1, -1, -1, -1, 133003, 133005, 133007, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 264081, -1, -1, -1, -1, -1, -1, -1, 65536,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 67477,
+ 66505, -1, -1, 67478, 67479, 67480, 67481, 67482, 67483, 67484, 67485,
+ 67486, 67487, 67488, 67489, 67477, 65549, 65542, 65543, 67478, 67479,
+ 67480, 67481, 67482, 67483, 67484, 67485, 67486, 67487, 67488, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 133026, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 198564,
+ 198567, 67498, 133035, -1, 198573, 198576, 67507, -1, 133044, 66488,
+ 66465, 66465, 66465, 66099, 67510, 66466, 66466, 66469, 66121, -1,
+ 66471, 133047, -1, -1, 66474, 67513, 66475, 66475, 66475, -1, -1, 133050,
+ 198588, 133055, -1, 67521, -1, 67522, -1, 67521, -1, 66468, 67523,
+ 66460, 67498, -1, 66484, 66462, 67524, -1, 66470, 65550, 67525, 67526,
+ 67527, 67528, 66505, -1, 198601, -1, 66502, 67532, 67533, 67534, -1,
+ -1, -1, -1, 66461, 66483, 66484, 66505, 66101, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 198607, 198610, 198613, 198616, 198619, 198622, 198625,
+ 198628, 198631, 198634, 198637, 198640, 133107, 66466, 133109, 198647,
+ 133114, 67580, 133117, 198655, 264194, 133126, 67592, 133129, 198667,
+ 66469, 67498, 66461, 66470, 66505, 133134, 198672, 133139, 66500, 133141,
+ 198679, 264218, 133150, 66122, 133152, 198690, 66121, 67621, 66483,
+ 66490, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133158, 133160, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133162,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133164, 133166,
+ 133168, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 133170, -1, -1, -1, -1, 133172, -1, -1, 133174,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 133176, -1, 133178, -1, -1, -1, -1, -1, 133180,
+ 198718, -1, 133185, 198723, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 133190, -1, -1, 133192, -1, -1, 133194, -1,
+ 133196, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 133198, -1, 133200, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 133202, 133204, 133206, 133208, 133210, -1, -1,
+ 133212, 133214, -1, -1, 133216, 133218, -1, -1, -1, -1, -1, -1, 133220,
+ 133222, -1, -1, 133224, 133226, -1, -1, 133228, 133230, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133232, 133234,
+ 133236, 133238, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 133240, 133242, 133244, 133246, -1, -1, -1, -1, -1, -1,
+ 133248, 133250, 133252, 133254, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 67720, 67721, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 65549, 65542, 65543, 67478, 67479,
+ 67480, 67481, 67482, 67483, 133258, 133260, 133262, 133264, 133266,
+ 133268, 133270, 133272, 133274, 133276, 133278, 198816, 198819, 198822,
+ 198825, 198828, 198831, 198834, 198837, 198840, 264379, 264383, 264387,
+ 264391, 264395, 264399, 264403, 264407, 264411, 264415, 264419, 133351,
+ 133353, 133355, 133357, 133359, 133361, 133363, 133365, 133367, 198905,
+ 198908, 198911, 198914, 198917, 198920, 198923, 198926, 198929, 198932,
+ 198935, 198938, 198941, 198944, 198947, 198950, 198953, 198956, 198959,
+ 198962, 198965, 198968, 198971, 198974, 198977, 198980, 198983, 198986,
+ 198989, 198992, 198995, 198998, 199001, 199004, 199007, 199010, 199013,
+ 66458, 66460, 67498, 66461, 66462, 67524, 66464, 66465, 66466, 66467,
+ 66468, 66469, 66470, 66471, 66472, 66474, 67513, 66475, 67944, 66476,
+ 66477, 67580, 66478, 67592, 67945, 67521, 65539, 66482, 67621, 66483,
+ 66484, 67946, 66488, 66099, 66505, 66101, 66489, 66121, 66490, 67489,
+ 65550, 66495, 67947, 66102, 65892, 66496, 66497, 66500, 66106, 66122,
+ 66107, 67948, 67477, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 264557, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 199025, 133492, 199030,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 133497, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 67963, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 67964, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 67965, 67966, 67967, 67968, 67969, 67970, 67971,
+ 67972, 67973, 67974, 67975, 67976, 67977, 67978, 67979, 67980, 67981,
+ 67982, 67983, 67984, 67985, 67986, 67987, 67988, 67989, 67990, 67991,
+ 67992, 67993, 67994, 67995, 67996, 67997, 67998, 67999, 68000, 68001,
+ 68002, 68003, 68004, 68005, 68006, 68007, 68008, 68009, 68010, 68011,
+ 68012, 68013, 68014, 68015, 68016, 68017, 68018, 68019, 68020, 68021,
+ 68022, 68023, 68024, 68025, 68026, 68027, 68028, 68029, 68030, 68031,
+ 68032, 68033, 68034, 68035, 68036, 68037, 68038, 68039, 68040, 68041,
+ 68042, 68043, 68044, 68045, 68046, 68047, 68048, 68049, 68050, 68051,
+ 68052, 68053, 68054, 68055, 68056, 68057, 68058, 68059, 68060, 68061,
+ 68062, 68063, 68064, 68065, 68066, 68067, 68068, 68069, 68070, 68071,
+ 68072, 68073, 68074, 68075, 68076, 68077, 68078, 68079, 68080, 68081,
+ 68082, 68083, 68084, 68085, 68086, 68087, 68088, 68089, 68090, 68091,
+ 68092, 68093, 68094, 68095, 68096, 68097, 68098, 68099, 68100, 68101,
+ 68102, 68103, 68104, 68105, 68106, 68107, 68108, 68109, 68110, 68111,
+ 68112, 68113, 68114, 68115, 68116, 68117, 68118, 68119, 68120, 68121,
+ 68122, 68123, 68124, 68125, 68126, 68127, 68128, 68129, 68130, 68131,
+ 68132, 68133, 68134, 68135, 68136, 68137, 68138, 68139, 68140, 68141,
+ 68142, 68143, 68144, 68145, 68146, 68147, 68148, 68149, 68150, 68151,
+ 68152, 68153, 68154, 68155, 68156, 68157, 68158, 68159, 68160, 68161,
+ 68162, 68163, 68164, 68165, 68166, 68167, 68168, 68169, 68170, 68171,
+ 68172, 68173, 68174, 68175, 68176, 68177, 68178, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 65536, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 68179, -1, 67988, 68180, 68181,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 133718, -1, 133720, -1, 133722, -1, 133724, -1, 133726, -1, 133728,
+ -1, 133730, -1, 133732, -1, 133734, -1, 133736, -1, 133738, -1, 133740,
+ -1, -1, 133742, -1, 133744, -1, 133746, -1, -1, -1, -1, -1, -1, 133748,
+ 133750, -1, 133752, 133754, -1, 133756, 133758, -1, 133760, 133762,
+ -1, 133764, 133766, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 133768, -1, -1, -1, -1, -1,
+ -1, 133770, 133772, -1, 133774, 133776, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 133778, -1, 133780, -1, 133782, -1, 133784, -1,
+ 133786, -1, 133788, -1, 133790, -1, 133792, -1, 133794, -1, 133796,
+ -1, 133798, -1, 133800, -1, -1, 133802, -1, 133804, -1, 133806, -1,
+ -1, -1, -1, -1, -1, 133808, 133810, -1, 133812, 133814, -1, 133816,
+ 133818, -1, 133820, 133822, -1, 133824, 133826, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 133828, -1, -1, 133830, 133832, 133834, 133836, -1, -1, -1, 133838,
+ 133840, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 68306, 68307, 68308, 68309, 68310, 68311, 68312, 68313, 68314,
+ 68315, 68316, 68317, 68318, 68319, 68320, 68321, 68322, 68323, 68324,
+ 68325, 68326, 68327, 68328, 68329, 68330, 68331, 68332, 68333, 68334,
+ 68335, 68336, 68337, 68338, 68339, 68340, 68341, 68342, 68343, 68344,
+ 68345, 68346, 68347, 68348, 68349, 68350, 68351, 68352, 68353, 68354,
+ 68355, 68356, 68357, 68358, 68359, 68360, 68361, 68362, 68363, 68364,
+ 68365, 68366, 68367, 68368, 68369, 68370, 68371, 68372, 68373, 68374,
+ 68375, 68376, 68377, 68378, 68379, 68380, 68381, 68382, 68383, 68384,
+ 68385, 68386, 68387, 68388, 68389, 68390, 68391, 68392, 68393, 68394,
+ 68395, 68396, 68397, 68398, 68399, -1, -1, -1, 67965, 67971, 68400,
+ 68401, 68402, 68403, 68404, 68405, 67969, 68406, 68407, 68408, 68409,
+ 67973, 199482, 199485, 199488, 199491, 199494, 199497, 199500, 199503,
+ 199506, 199509, 199512, 199515, 199518, 199521, 265060, 265064, 265068,
+ 265072, 265076, 265080, 265084, 265088, 265092, 265096, 265100, 265104,
+ 265108, 265112, 265116, 461728, 396199, -1, 199597, 199600, 199603,
+ 199606, 199609, 199612, 199615, 199618, 199621, 199624, 199627, 199630,
+ 199633, 199636, 199639, 199642, 199645, 199648, 199651, 199654, 199657,
+ 199660, 199663, 199666, 199669, 199672, 199675, 199678, 199681, 199684,
+ 199687, 199690, 199693, 199696, 199699, 199702, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 199705, 134172, 134174, 134176, 134178,
+ 134180, 134182, 134184, 134186, 134188, 134190, 134192, 134194, 134196,
+ 134198, 134200, 68306, 68309, 68312, 68314, 68322, 68323, 68326, 68328,
+ 68329, 68331, 68332, 68333, 68334, 68335, 134202, 134204, 134206, 134208,
+ 134210, 134212, 134214, 134216, 134218, 134220, 134222, 134224, 134226,
+ 134228, 330838, 265307, -1, -1, 67965, 67971, 68400, 68401, 68703,
+ 68704, 68705, 67976, 68706, 67988, 68038, 68050, 68049, 68039, 68131,
+ 67996, 68036, 68707, 68708, 68709, 68710, 68711, 68712, 68713, 68714,
+ 68715, 68716, 68002, 68717, 68718, 68719, 68720, 68721, 68722, 68723,
+ 68724, 68402, 68403, 68404, 68725, 68726, 68727, 68728, 68729, 68730,
+ 68731, 68732, 68733, 68734, 134271, 134273, 134275, 134277, 134279,
+ 134281, 134283, 134285, 134287, 134289, 134291, 134293, 134295, 134297,
+ 134299, 134301, 134303, 134305, 134307, 134309, 134311, 134313, 134315,
+ 134317, 199855, 199858, 199861, 134328, 199866, 134333, 199871, 68802,
+ 68803, 68804, 68805, 68806, 68807, 68808, 68809, 68810, 68811, 68812,
+ 68813, 68814, 68815, 68816, 68817, 68818, 68819, 68820, 68821, 68822,
+ 68823, 68824, 68825, 68826, 68827, 68828, 68829, 68830, 68831, 68832,
+ 68833, 68834, 68835, 68836, 68837, 68838, 68839, 68840, 68841, 68842,
+ 68843, 68844, 68845, 68846, 68847, 68848, -1, 265457, 265461, 265465,
+ 199933, 265472, 199940, 199943, 331018, 265487, 199955, 199958, 199961,
+ 265500, 265504, 199972, 199975, 134442, 199980, 265519, 265523, 134455,
+ 331065, 396606, 331076, 200009, 331084, 331089, 265558, 200026, 200029,
+ 200032, 265571, 331111, 265580, 200048, 200051, 200054, 134521, 134523,
+ 134525, 134527, 200065, 200068, 331143, 200076, 265615, 331155, 200088,
+ 134555, 134557, 331167, 265636, 331176, 200109, 331184, 134581, 200119,
+ 200122, 200125, 200128, 200131, 265670, 200138, 134605, 200143, 200146,
+ 200149, 265688, 200156, 200159, 200162, 331237, 265706, 134638, 331248,
+ 134645, 265719, 265723, 200191, 200194, 200197, 265736, 134668, 200206,
+ 265745, 134677, 331287, 200220, 134687, 134689, 134691, 134693, 134695,
+ 134697, 134699, 134701, 134703, 134705, 200243, 200246, 200249, 200252,
+ 200255, 200258, 200261, 200264, 200267, 200270, 200273, 200276, 200279,
+ 200282, 200285, 200288, 134755, 134757, 200295, 134762, 134764, 134766,
+ 200304, 200307, 134774, 134776, 134778, 134780, 134782, 265856, 134788,
+ 134790, 134792, 134794, 134796, 134798, 134800, 134802, 200340, 265879,
+ 134811, 134813, 134815, 134817, 134819, 134821, 134823, 200361, 200364,
+ 200367, 200370, 134837, 134839, 134841, 134843, 134845, 134847, 134849,
+ 134851, 134853, 134855, 200393, 200396, 134863, 200401, 200404, 200407,
+ 134874, 200412, 200415, 265954, 134886, 200424, 200427, 200430, 200433,
+ 331508, 397049, 134911, 134913, 134915, 134917, 134919, 134921, 134923,
+ 134925, 134927, 134929, 134931, 134933, 134935, 134937, 134939, 134941,
+ 134943, 134945, 266019, 134951, 134953, 134955, 266029, 200497, 134964,
+ 134966, 134968, 134970, 134972, 134974, 134976, 134978, 134980, 134982,
+ 200520, 134987, 134989, 200527, 200530, 134997, 266071, 200539, 135006,
+ 135008, 135010, 135012, 200550, 200553, 135020, 135022, 135024, 135026,
+ 135028, 135030, 135032, 135034, 135036, 200574, 200577, 200580, 200583,
+ 200586, 200589, 200592, 200595, 200598, 200601, 200604, 200607, 200610,
+ 200613, 200616, 200619, 200622, 200625, 200628, 200631, 200634, 200637,
+ 200640, 69571, 69572, 68123, 69573, 69574, 69575, 69576, 68177, 68177,
+ 69577, 68131, 69578, 69579, 69580, 69581, 69582, 69583, 69584, 69585,
+ 69586, 69587, 69588, 69589, 69590, 69591, 69592, 69593, 69594, 69595,
+ 69596, 69597, 69598, 69599, 69600, 69601, 69602, 69603, 69604, 69605,
+ 69606, 69607, 69608, 69609, 69610, 69611, 69612, 69613, 69614, 69615,
+ 69616, 69617, 69618, 68089, 69619, 69620, 69621, 69622, 69623, 69624,
+ 69625, 69626, 69627, 69628, 69629, 68162, 69630, 69631, 69632, 69633,
+ 69634, 69635, 69636, 69637, 69638, 69639, 69640, 69641, 69642, 69643,
+ 69644, 69645, 69646, 69647, 69648, 69649, 69650, 69651, 69652, 69653,
+ 69654, 69655, 69656, 69587, 69657, 69658, 69659, 69660, 69661, 69662,
+ 69663, 69664, 69665, 69666, 69667, 69668, 69669, 69670, 69671, 69672,
+ 69673, 69674, 69675, 69676, 68125, 69677, 69678, 69679, 69680, 69681,
+ 69682, 69683, 69684, 69685, 69686, 69687, 69688, 69689, 69690, 69691,
+ 68002, 69692, 69693, 69694, 69695, 69696, 69697, 69698, 69699, 67983,
+ 69700, 69701, 69702, 69703, 69704, 69705, 69706, 69707, 69708, 69709,
+ 69710, 69711, 69712, 69713, 69714, 69715, 69716, 69717, 69718, 69719,
+ 69720, 69721, 69675, 69722, 69723, 69724, 69725, 69726, 69727, 69728,
+ 69729, 69659, 69730, 69731, 69732, 69733, 69734, 69735, 69736, 69737,
+ 69738, 69739, 69740, 69741, 69742, 69743, 69744, 69745, 69746, 69747,
+ 69748, 69749, 69587, 69750, 69751, 69752, 69753, 68176, 69754, 69755,
+ 69756, 69757, 69758, 69759, 69760, 69761, 69762, 69763, 69764, 69765,
+ 68704, 69766, 69767, 69768, 69769, 69770, 69771, 69772, 69773, 69774,
+ 69661, 69775, 69776, 69777, 69778, 69779, 69780, 69781, 69782, 69783,
+ 69784, 69785, 69786, 69787, 68130, 69788, 69789, 69790, 69791, 69792,
+ 69793, 69794, 69795, 69796, 69797, 69798, 69799, 69800, 68081, 69801,
+ 69802, 69803, 69804, 69805, 69806, 69807, 69808, 69809, 69810, 69811,
+ 69812, 69813, 69814, 69815, 69816, 68108, 69817, 68111, 69818, 69819,
+ 69820, -1, -1, 69821, -1, 69822, -1, -1, 69823, 69824, 69825, 69826,
+ 69827, 69828, 69829, 69830, 69831, 68088, -1, 69832, -1, 69833, -1,
+ -1, 69834, 69835, -1, -1, -1, 69836, 69837, 69838, 69839, -1, -1, 69840,
+ 69841, 69842, 69843, 69844, 69845, 69846, 69847, 69848, 69849, 69850,
+ 69851, 68009, 69852, 69853, 69854, 69855, 69856, 69857, 69858, 69859,
+ 69860, 69861, 69862, 69863, 69864, 69865, 69866, 68709, 69867, 69868,
+ 69869, 69870, 68713, 69871, 69872, 69873, 69874, 69875, 69711, 69876,
+ 69877, 69878, 69879, 69880, 69881, 69881, 69882, 69883, 69884, 69885,
+ 69886, 69887, 69888, 69889, 69834, 69890, 69891, 69892, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 135429, 135431, 135433, 200971, 200974, 135441, 135443, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 135445, 135447, 135449, 135451,
+ 135453, -1, -1, -1, -1, -1, 135455, -1, 135457, 69923, 67525, 67528,
+ 69924, 69925, 69926, 69927, 69928, 69929, 67484, 135466, 135468, 135470,
+ 135472, 135474, 135476, 135478, 135480, 135482, 135484, 135486, 135488,
+ 135490, -1, 135492, 135494, 135496, 135498, 135500, -1, 135502, -1,
+ 135504, 135506, -1, 135508, 135510, -1, 135512, 135514, 135516, 135518,
+ 135520, 135522, 135524, 135526, 135528, 135530, 69996, 69996, 69997,
+ 69997, 69997, 69997, 69998, 69998, 69998, 69998, 69999, 69999, 69999,
+ 69999, 70000, 70000, 70000, 70000, 70001, 70001, 70001, 70001, 70002,
+ 70002, 70002, 70002, 70003, 70003, 70003, 70003, 70004, 70004, 70004,
+ 70004, 70005, 70005, 70005, 70005, 70006, 70006, 70006, 70006, 70007,
+ 70007, 70007, 70007, 70008, 70008, 70008, 70008, 70009, 70009, 70010,
+ 70010, 70011, 70011, 70012, 70012, 70013, 70013, 70014, 70014, 70015,
+ 70015, 70015, 70015, 70016, 70016, 70016, 70016, 70017, 70017, 70017,
+ 70017, 70018, 70018, 70018, 70018, 70019, 70019, 70020, 70020, 70020,
+ 70020, 70021, 70021, 70022, 70022, 70022, 70022, 70023, 70023, 70023,
+ 70023, 70024, 70024, 70025, 70025, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 70026, 70026, 70026, 70026, 70027,
+ 70027, 70028, 70028, 70029, 70029, 70030, 70031, 70031, 70032, 70032,
+ 70033, 70033, 70034, 70034, 70034, 70034, 70035, 70035, 135572, 135572,
+ 135574, 135574, 135576, 135576, 135578, 135578, 135580, 135580, 135582,
+ 135582, 135584, 135584, 135584, 135586, 135586, 135586, 70052, 70052,
+ 70052, 70052, 135589, 135591, 135593, 135586, 135595, 135597, 135599,
+ 135601, 135603, 135605, 135607, 135609, 135611, 135613, 135615, 135617,
+ 135619, 135621, 135623, 135625, 135627, 135629, 135631, 135633, 135635,
+ 135637, 135639, 135641, 135643, 135645, 135647, 135649, 135651, 135653,
+ 135655, 135657, 135659, 135661, 135663, 135665, 135667, 135669, 135671,
+ 135673, 135675, 135677, 135679, 135681, 135683, 135685, 135687, 135689,
+ 135691, 135693, 135695, 135697, 135699, 135701, 135703, 135705, 135707,
+ 135709, 135711, 135713, 135715, 135717, 135719, 135721, 135723, 135725,
+ 135727, 135729, 135731, 135733, 135735, 135737, 135739, 135741, 135743,
+ 135745, 135747, 135749, 135751, 135753, 135755, 135757, 135759, 135761,
+ 135763, 135765, 135767, 135769, 135771, 135773, 201311, 201314, 201317,
+ 201320, 201323, 201326, 135793, 135795, 135593, 135797, 135586, 135595,
+ 135799, 135801, 135603, 135803, 135605, 135607, 135805, 135807, 135615,
+ 135809, 135617, 135619, 135811, 135813, 135623, 135815, 135625, 135627,
+ 135685, 135687, 135693, 135695, 135697, 135705, 135707, 135709, 135711,
+ 135719, 135721, 135723, 135817, 135731, 135819, 135821, 135743, 135823,
+ 135745, 135747, 135773, 135825, 135827, 135763, 135829, 135765, 135767,
+ 135589, 135591, 135831, 135593, 135833, 135597, 135599, 135601, 135603,
+ 135835, 135609, 135611, 135613, 135615, 135837, 135623, 135629, 135631,
+ 135633, 135635, 135637, 135641, 135643, 135645, 135647, 135649, 135651,
+ 135839, 135653, 135655, 135657, 135659, 135661, 135663, 135667, 135669,
+ 135671, 135673, 135675, 135677, 135679, 135681, 135683, 135689, 135691,
+ 135699, 135701, 135703, 135705, 135707, 135713, 135715, 135717, 135719,
+ 135841, 135725, 135727, 135729, 135731, 135737, 135739, 135741, 135743,
+ 135843, 135749, 135751, 135845, 135757, 135759, 135761, 135763, 135847,
+ 135593, 135833, 135603, 135835, 135615, 135837, 135623, 135849, 135649,
+ 135851, 135853, 135855, 135705, 135707, 135719, 135743, 135843, 135763,
+ 135847, 201393, 201396, 201399, 135866, 135868, 135870, 135872, 135874,
+ 135876, 135878, 135880, 135882, 135884, 135886, 135888, 135890, 135892,
+ 135894, 135896, 135898, 135900, 135902, 135904, 135906, 135908, 135910,
+ 135853, 135912, 135914, 135916, 135918, 135866, 135868, 135870, 135872,
+ 135874, 135876, 135878, 135880, 135882, 135884, 135886, 135888, 135890,
+ 135892, 135894, 135896, 135898, 135900, 135902, 135904, 135906, 135908,
+ 135910, 135853, 135912, 135914, 135916, 135918, 135906, 135908, 135910,
+ 135853, 135851, 135855, 135665, 135643, 135645, 135647, 135906, 135908,
+ 135910, 135665, 135667, 135920, 135920, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 201458, 201461, 201461,
+ 201464, 201467, 201470, 201473, 201476, 201479, 201479, 201482, 201485,
+ 201488, 201491, 201494, 201497, 201497, 201500, 201503, 201503, 201506,
+ 201506, 201509, 201512, 201512, 201515, 201518, 201518, 201521, 201521,
+ 201524, 201527, 201527, 201530, 201530, 201533, 201536, 201539, 201542,
+ 201542, 201545, 201548, 201551, 201554, 201557, 201557, 201560, 201563,
+ 201566, 201569, 201572, 201575, 201575, 201578, 201578, 201581, 201581,
+ 201584, 201587, 201590, 201593, 201596, 201599, 201602, -1, -1, 201605,
+ 201608, 201611, 201614, 201617, 201620, 201620, 201623, 201626, 201629,
+ 201632, 201632, 201635, 201638, 201641, 201644, 201647, 201650, 201653,
+ 201656, 201659, 201662, 201665, 201668, 201671, 201674, 201677, 201680,
+ 201683, 201686, 201689, 201692, 201695, 201698, 201560, 201566, 201701,
+ 201704, 201707, 201710, 201713, 201716, 201713, 201707, 201719, 201722,
+ 201725, 201728, 201731, 201716, 201539, 201509, 201734, 201737, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 201740, 201743, 267282, 267286, 267290, 267294,
+ 267298, 267302, 267306, 201774, 1184817, 529475, 267339, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 70735,
+ 70736, 70737, 70738, 70738, 67487, 67488, 70739, 70740, 70741, 70742,
+ 70743, 70744, 70745, 70746, 67720, 67721, 70747, 70748, 70749, 70750,
+ -1, -1, 70751, 70752, 70753, 70753, 70753, 70753, 70738, 70738, 70738,
+ 70754, 70755, 67447, -1, 66132, 70756, 70757, 70758, 70736, 67487,
+ 67488, 70739, 70740, 70741, 70742, 70759, 70760, 70761, 67484, 70762,
+ 70763, 70764, 67486, -1, 70765, 70766, 70767, 70768, -1, -1, -1, -1,
+ 136305, 136307, 136309, -1, 136311, -1, 136313, 136315, 136317, 136319,
+ 136321, 136323, 136325, 136327, 136329, 136331, 70797, 70798, 70798,
+ 70799, 70799, 70800, 70800, 70801, 70801, 70802, 70802, 70802, 70802,
+ 70803, 70803, 70804, 70804, 70804, 70804, 70805, 70805, 70806, 70806,
+ 70806, 70806, 70807, 70807, 70807, 70807, 70808, 70808, 70808, 70808,
+ 70809, 70809, 70809, 70809, 70810, 70810, 70810, 70810, 70811, 70811,
+ 70812, 70812, 70813, 70813, 70814, 70814, 70815, 70815, 70815, 70815,
+ 70816, 70816, 70816, 70816, 70817, 70817, 70817, 70817, 70818, 70818,
+ 70818, 70818, 70819, 70819, 70819, 70819, 70820, 70820, 70820, 70820,
+ 70821, 70821, 70821, 70821, 70822, 70822, 70822, 70822, 70823, 70823,
+ 70823, 70823, 70824, 70824, 70824, 70824, 70825, 70825, 70825, 70825,
+ 70826, 70826, 70826, 70826, 70827, 70827, 70827, 70827, 70828, 70828,
+ 70828, 70828, 70829, 70829, 70829, 70829, 70830, 70830, 70035, 70035,
+ 70831, 70831, 70831, 70831, 136368, 136368, 136370, 136370, 136372,
+ 136372, 136374, 136374, -1, -1, -1, -1, 70758, 70840, 70759, 70766,
+ 70767, 70760, 70841, 67487, 67488, 70761, 67484, 70754, 70762, 67447,
+ 70842, 67477, 65549, 65542, 65543, 67478, 67479, 67480, 67481, 67482,
+ 67483, 70756, 66132, 70763, 67486, 70764, 70757, 70768, 66458, 66460,
+ 67498, 66461, 66462, 67524, 66464, 66465, 66466, 66467, 66468, 66469,
+ 66470, 66471, 66472, 66474, 67513, 66475, 67944, 66476, 66477, 67580,
+ 66478, 67592, 67945, 67521, 70751, 70765, 70752, 70843, 70738, 67420,
+ 65539, 66482, 67621, 66483, 66484, 67946, 66488, 66099, 66505, 66101,
+ 66489, 66121, 66490, 67489, 65550, 66495, 67947, 66102, 65892, 66496,
+ 66497, 66500, 66106, 66122, 66107, 67948, 70739, 70844, 70740, 70845,
+ 70846, 70847, 70848, 70747, 70748, 70755, 70849, 68848, 70850, 70851,
+ 70852, 70853, 70854, 70855, 70856, 70857, 70858, 70859, 68802, 68803,
+ 68804, 68805, 68806, 68807, 68808, 68809, 68810, 68811, 68812, 68813,
+ 68814, 68815, 68816, 68817, 68818, 68819, 68820, 68821, 68822, 68823,
+ 68824, 68825, 68826, 68827, 68828, 68829, 68830, 68831, 68832, 68833,
+ 68834, 68835, 68836, 68837, 68838, 68839, 68840, 68841, 68842, 68843,
+ 68844, 68845, 70860, 70861, 70862, 70863, 70864, 70865, 70866, 70867,
+ 70868, 70869, 70870, 70871, 70872, 70873, 70874, 70875, 70876, 70877,
+ 70878, 70879, 70880, 70881, 70882, 70883, 70884, 70885, 70886, 70887,
+ 70888, 70889, 70890, 70891, 70892, 70893, -1, -1, -1, 70894, 70895,
+ 70896, 70897, 70898, 70899, -1, -1, 70900, 70901, 70902, 70903, 70904,
+ 70905, -1, -1, 70906, 70907, 70908, 70909, 70910, 70911, -1, -1, 70912,
+ 70913, 70914, -1, -1, -1, 70915, 70916, 70917, 70918, 70919, 70920,
+ 70921, -1, 70922, 70923, 70924, 70925, 70926, 70927, 70928, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+};
+
+/*
+ * Each group represents a unique set of character attributes. The attributes...
+ */
+
+static int decompList[] = {
+ 32, 32, 776, 97, 32, 772, 50, 51, 32, 769, 956, 32, 807, 49, 111, 49,
+ 8260, 52, 49, 8260, 50, 51, 8260, 52, 65, 768, 65, 769, 65, 770, 65,
+ 771, 65, 776, 65, 778, 67, 807, 69, 768, 69, 769, 69, 770, 69, 776,
+ 73, 768, 73, 769, 73, 770, 73, 776, 78, 771, 79, 768, 79, 769, 79,
+ 770, 79, 771, 79, 776, 85, 768, 85, 769, 85, 770, 85, 776, 89, 769,
+ 97, 768, 97, 769, 97, 770, 97, 771, 97, 776, 97, 778, 99, 807, 101,
+ 768, 101, 769, 101, 770, 101, 776, 105, 768, 105, 769, 105, 770, 105,
+ 776, 110, 771, 111, 768, 111, 769, 111, 770, 111, 771, 111, 776, 117,
+ 768, 117, 769, 117, 770, 117, 776, 121, 769, 121, 776, 65, 772, 97,
+ 772, 65, 774, 97, 774, 65, 808, 97, 808, 67, 769, 99, 769, 67, 770,
+ 99, 770, 67, 775, 99, 775, 67, 780, 99, 780, 68, 780, 100, 780, 69,
+ 772, 101, 772, 69, 774, 101, 774, 69, 775, 101, 775, 69, 808, 101,
+ 808, 69, 780, 101, 780, 71, 770, 103, 770, 71, 774, 103, 774, 71, 775,
+ 103, 775, 71, 807, 103, 807, 72, 770, 104, 770, 73, 771, 105, 771,
+ 73, 772, 105, 772, 73, 774, 105, 774, 73, 808, 105, 808, 73, 775, 73,
+ 74, 105, 106, 74, 770, 106, 770, 75, 807, 107, 807, 76, 769, 108, 769,
+ 76, 807, 108, 807, 76, 780, 108, 780, 76, 183, 108, 183, 78, 769, 110,
+ 769, 78, 807, 110, 807, 78, 780, 110, 780, 700, 110, 79, 772, 111,
+ 772, 79, 774, 111, 774, 79, 779, 111, 779, 82, 769, 114, 769, 82, 807,
+ 114, 807, 82, 780, 114, 780, 83, 769, 115, 769, 83, 770, 115, 770,
+ 83, 807, 115, 807, 83, 780, 115, 780, 84, 807, 116, 807, 84, 780, 116,
+ 780, 85, 771, 117, 771, 85, 772, 117, 772, 85, 774, 117, 774, 85, 778,
+ 117, 778, 85, 779, 117, 779, 85, 808, 117, 808, 87, 770, 119, 770,
+ 89, 770, 121, 770, 89, 776, 90, 769, 122, 769, 90, 775, 122, 775, 90,
+ 780, 122, 780, 115, 79, 795, 111, 795, 85, 795, 117, 795, 68, 381,
+ 68, 382, 100, 382, 76, 74, 76, 106, 108, 106, 78, 74, 78, 106, 110,
+ 106, 65, 780, 97, 780, 73, 780, 105, 780, 79, 780, 111, 780, 85, 780,
+ 117, 780, 220, 772, 252, 772, 220, 769, 252, 769, 220, 780, 252, 780,
+ 220, 768, 252, 768, 196, 772, 228, 772, 550, 772, 551, 772, 198, 772,
+ 230, 772, 71, 780, 103, 780, 75, 780, 107, 780, 79, 808, 111, 808,
+ 490, 772, 491, 772, 439, 780, 658, 780, 106, 780, 68, 90, 68, 122,
+ 100, 122, 71, 769, 103, 769, 78, 768, 110, 768, 197, 769, 229, 769,
+ 198, 769, 230, 769, 216, 769, 248, 769, 65, 783, 97, 783, 65, 785,
+ 97, 785, 69, 783, 101, 783, 69, 785, 101, 785, 73, 783, 105, 783, 73,
+ 785, 105, 785, 79, 783, 111, 783, 79, 785, 111, 785, 82, 783, 114,
+ 783, 82, 785, 114, 785, 85, 783, 117, 783, 85, 785, 117, 785, 83, 806,
+ 115, 806, 84, 806, 116, 806, 72, 780, 104, 780, 65, 775, 97, 775, 69,
+ 807, 101, 807, 214, 772, 246, 772, 213, 772, 245, 772, 79, 775, 111,
+ 775, 558, 772, 559, 772, 89, 772, 121, 772, 104, 614, 106, 114, 633,
+ 635, 641, 119, 121, 32, 774, 32, 775, 32, 778, 32, 808, 32, 771, 32,
+ 779, 611, 108, 120, 661, 768, 769, 787, 776, 769, 697, 32, 837, 59,
+ 168, 769, 913, 769, 183, 917, 769, 919, 769, 921, 769, 927, 769, 933,
+ 769, 937, 769, 970, 769, 921, 776, 933, 776, 945, 769, 949, 769, 951,
+ 769, 953, 769, 971, 769, 953, 776, 965, 776, 959, 769, 965, 769, 969,
+ 769, 946, 952, 933, 978, 769, 978, 776, 966, 960, 954, 961, 962, 920,
+ 949, 931, 1045, 768, 1045, 776, 1043, 769, 1030, 776, 1050, 769, 1048,
+ 768, 1059, 774, 1048, 774, 1080, 774, 1077, 768, 1077, 776, 1075, 769,
+ 1110, 776, 1082, 769, 1080, 768, 1091, 774, 1140, 783, 1141, 783, 1046,
+ 774, 1078, 774, 1040, 774, 1072, 774, 1040, 776, 1072, 776, 1045, 774,
+ 1077, 774, 1240, 776, 1241, 776, 1046, 776, 1078, 776, 1047, 776, 1079,
+ 776, 1048, 772, 1080, 772, 1048, 776, 1080, 776, 1054, 776, 1086, 776,
+ 1256, 776, 1257, 776, 1069, 776, 1101, 776, 1059, 772, 1091, 772, 1059,
+ 776, 1091, 776, 1059, 779, 1091, 779, 1063, 776, 1095, 776, 1067, 776,
+ 1099, 776, 1381, 1410, 1575, 1619, 1575, 1620, 1608, 1620, 1575, 1621,
+ 1610, 1620, 1575, 1652, 1608, 1652, 1735, 1652, 1610, 1652, 1749, 1620,
+ 1729, 1620, 1746, 1620, 2344, 2364, 2352, 2364, 2355, 2364, 2325, 2364,
+ 2326, 2364, 2327, 2364, 2332, 2364, 2337, 2364, 2338, 2364, 2347, 2364,
+ 2351, 2364, 2503, 2494, 2503, 2519, 2465, 2492, 2466, 2492, 2479, 2492,
+ 2610, 2620, 2616, 2620, 2582, 2620, 2583, 2620, 2588, 2620, 2603, 2620,
+ 2887, 2902, 2887, 2878, 2887, 2903, 2849, 2876, 2850, 2876, 2962, 3031,
+ 3014, 3006, 3015, 3006, 3014, 3031, 3142, 3158, 3263, 3285, 3270, 3285,
+ 3270, 3286, 3270, 3266, 3274, 3285, 3398, 3390, 3399, 3390, 3398, 3415,
+ 3545, 3530, 3545, 3535, 3548, 3530, 3545, 3551, 3661, 3634, 3789, 3762,
+ 3755, 3737, 3755, 3745, 3851, 3906, 4023, 3916, 4023, 3921, 4023, 3926,
+ 4023, 3931, 4023, 3904, 4021, 3953, 3954, 3953, 3956, 4018, 3968, 4018,
+ 3969, 4019, 3968, 4019, 3969, 3953, 3968, 3986, 4023, 3996, 4023, 4001,
+ 4023, 4006, 4023, 4011, 4023, 3984, 4021, 4133, 4142, 65, 198, 66,
+ 68, 69, 398, 71, 72, 73, 74, 75, 76, 77, 78, 79, 546, 80, 82, 84, 85,
+ 87, 592, 593, 7426, 98, 100, 101, 601, 603, 604, 103, 107, 109, 331,
+ 596, 7446, 7447, 112, 116, 117, 7453, 623, 118, 7461, 947, 948, 967,
+ 105, 65, 805, 97, 805, 66, 775, 98, 775, 66, 803, 98, 803, 66, 817,
+ 98, 817, 199, 769, 231, 769, 68, 775, 100, 775, 68, 803, 100, 803,
+ 68, 817, 100, 817, 68, 807, 100, 807, 68, 813, 100, 813, 274, 768,
+ 275, 768, 274, 769, 275, 769, 69, 813, 101, 813, 69, 816, 101, 816,
+ 552, 774, 553, 774, 70, 775, 102, 775, 71, 772, 103, 772, 72, 775,
+ 104, 775, 72, 803, 104, 803, 72, 776, 104, 776, 72, 807, 104, 807,
+ 72, 814, 104, 814, 73, 816, 105, 816, 207, 769, 239, 769, 75, 769,
+ 107, 769, 75, 803, 107, 803, 75, 817, 107, 817, 76, 803, 108, 803,
+ 7734, 772, 7735, 772, 76, 817, 108, 817, 76, 813, 108, 813, 77, 769,
+ 109, 769, 77, 775, 109, 775, 77, 803, 109, 803, 78, 775, 110, 775,
+ 78, 803, 110, 803, 78, 817, 110, 817, 78, 813, 110, 813, 213, 769,
+ 245, 769, 213, 776, 245, 776, 332, 768, 333, 768, 332, 769, 333, 769,
+ 80, 769, 112, 769, 80, 775, 112, 775, 82, 775, 114, 775, 82, 803, 114,
+ 803, 7770, 772, 7771, 772, 82, 817, 114, 817, 83, 775, 115, 775, 83,
+ 803, 115, 803, 346, 775, 347, 775, 352, 775, 353, 775, 7778, 775, 7779,
+ 775, 84, 775, 116, 775, 84, 803, 116, 803, 84, 817, 116, 817, 84, 813,
+ 116, 813, 85, 804, 117, 804, 85, 816, 117, 816, 85, 813, 117, 813,
+ 360, 769, 361, 769, 362, 776, 363, 776, 86, 771, 118, 771, 86, 803,
+ 118, 803, 87, 768, 119, 768, 87, 769, 119, 769, 87, 776, 119, 776,
+ 87, 775, 119, 775, 87, 803, 119, 803, 88, 775, 120, 775, 88, 776, 120,
+ 776, 89, 775, 121, 775, 90, 770, 122, 770, 90, 803, 122, 803, 90, 817,
+ 122, 817, 104, 817, 116, 776, 119, 778, 121, 778, 97, 702, 383, 775,
+ 65, 803, 97, 803, 65, 777, 97, 777, 194, 769, 226, 769, 194, 768, 226,
+ 768, 194, 777, 226, 777, 194, 771, 226, 771, 7840, 770, 7841, 770,
+ 258, 769, 259, 769, 258, 768, 259, 768, 258, 777, 259, 777, 258, 771,
+ 259, 771, 7840, 774, 7841, 774, 69, 803, 101, 803, 69, 777, 101, 777,
+ 69, 771, 101, 771, 202, 769, 234, 769, 202, 768, 234, 768, 202, 777,
+ 234, 777, 202, 771, 234, 771, 7864, 770, 7865, 770, 73, 777, 105, 777,
+ 73, 803, 105, 803, 79, 803, 111, 803, 79, 777, 111, 777, 212, 769,
+ 244, 769, 212, 768, 244, 768, 212, 777, 244, 777, 212, 771, 244, 771,
+ 7884, 770, 7885, 770, 416, 769, 417, 769, 416, 768, 417, 768, 416,
+ 777, 417, 777, 416, 771, 417, 771, 416, 803, 417, 803, 85, 803, 117,
+ 803, 85, 777, 117, 777, 431, 769, 432, 769, 431, 768, 432, 768, 431,
+ 777, 432, 777, 431, 771, 432, 771, 431, 803, 432, 803, 89, 768, 121,
+ 768, 89, 803, 121, 803, 89, 777, 121, 777, 89, 771, 121, 771, 945,
+ 787, 945, 788, 7936, 768, 7937, 768, 7936, 769, 7937, 769, 7936, 834,
+ 7937, 834, 913, 787, 913, 788, 7944, 768, 7945, 768, 7944, 769, 7945,
+ 769, 7944, 834, 7945, 834, 949, 787, 949, 788, 7952, 768, 7953, 768,
+ 7952, 769, 7953, 769, 917, 787, 917, 788, 7960, 768, 7961, 768, 7960,
+ 769, 7961, 769, 951, 787, 951, 788, 7968, 768, 7969, 768, 7968, 769,
+ 7969, 769, 7968, 834, 7969, 834, 919, 787, 919, 788, 7976, 768, 7977,
+ 768, 7976, 769, 7977, 769, 7976, 834, 7977, 834, 953, 787, 953, 788,
+ 7984, 768, 7985, 768, 7984, 769, 7985, 769, 7984, 834, 7985, 834, 921,
+ 787, 921, 788, 7992, 768, 7993, 768, 7992, 769, 7993, 769, 7992, 834,
+ 7993, 834, 959, 787, 959, 788, 8000, 768, 8001, 768, 8000, 769, 8001,
+ 769, 927, 787, 927, 788, 8008, 768, 8009, 768, 8008, 769, 8009, 769,
+ 965, 787, 965, 788, 8016, 768, 8017, 768, 8016, 769, 8017, 769, 8016,
+ 834, 8017, 834, 933, 788, 8025, 768, 8025, 769, 8025, 834, 969, 787,
+ 969, 788, 8032, 768, 8033, 768, 8032, 769, 8033, 769, 8032, 834, 8033,
+ 834, 937, 787, 937, 788, 8040, 768, 8041, 768, 8040, 769, 8041, 769,
+ 8040, 834, 8041, 834, 945, 768, 940, 949, 768, 941, 951, 768, 942,
+ 953, 768, 943, 959, 768, 972, 965, 768, 973, 969, 768, 974, 7936, 837,
+ 7937, 837, 7938, 837, 7939, 837, 7940, 837, 7941, 837, 7942, 837, 7943,
+ 837, 7944, 837, 7945, 837, 7946, 837, 7947, 837, 7948, 837, 7949, 837,
+ 7950, 837, 7951, 837, 7968, 837, 7969, 837, 7970, 837, 7971, 837, 7972,
+ 837, 7973, 837, 7974, 837, 7975, 837, 7976, 837, 7977, 837, 7978, 837,
+ 7979, 837, 7980, 837, 7981, 837, 7982, 837, 7983, 837, 8032, 837, 8033,
+ 837, 8034, 837, 8035, 837, 8036, 837, 8037, 837, 8038, 837, 8039, 837,
+ 8040, 837, 8041, 837, 8042, 837, 8043, 837, 8044, 837, 8045, 837, 8046,
+ 837, 8047, 837, 945, 774, 945, 772, 8048, 837, 945, 837, 940, 837,
+ 945, 834, 8118, 837, 913, 774, 913, 772, 913, 768, 902, 913, 837, 32,
+ 787, 953, 32, 834, 168, 834, 8052, 837, 951, 837, 942, 837, 951, 834,
+ 8134, 837, 917, 768, 904, 919, 768, 905, 919, 837, 8127, 768, 8127,
+ 769, 8127, 834, 953, 774, 953, 772, 970, 768, 912, 953, 834, 970, 834,
+ 921, 774, 921, 772, 921, 768, 906, 8190, 768, 8190, 769, 8190, 834,
+ 965, 774, 965, 772, 971, 768, 944, 961, 787, 961, 788, 965, 834, 971,
+ 834, 933, 774, 933, 772, 933, 768, 910, 929, 788, 168, 768, 901, 96,
+ 8060, 837, 969, 837, 974, 837, 969, 834, 8182, 837, 927, 768, 908,
+ 937, 768, 911, 937, 837, 180, 32, 788, 8194, 8195, 8208, 32, 819, 46,
+ 46, 46, 46, 46, 46, 8242, 8242, 8242, 8242, 8242, 8245, 8245, 8245,
+ 8245, 8245, 33, 33, 32, 773, 63, 63, 63, 33, 33, 63, 8242, 8242, 8242,
+ 8242, 48, 52, 53, 54, 55, 56, 57, 43, 8722, 61, 40, 41, 110, 82, 115,
+ 97, 47, 99, 97, 47, 115, 67, 176, 67, 99, 47, 111, 99, 47, 117, 400,
+ 176, 70, 295, 78, 111, 81, 83, 77, 84, 69, 76, 84, 77, 90, 937, 197,
+ 70, 1488, 1489, 1490, 1491, 70, 65, 88, 915, 928, 8721, 49, 8260, 51,
+ 50, 8260, 51, 49, 8260, 53, 50, 8260, 53, 51, 8260, 53, 52, 8260, 53,
+ 49, 8260, 54, 53, 8260, 54, 49, 8260, 56, 51, 8260, 56, 53, 8260, 56,
+ 55, 8260, 56, 49, 8260, 73, 73, 73, 73, 73, 73, 86, 86, 86, 73, 86,
+ 73, 73, 86, 73, 73, 73, 73, 88, 88, 88, 73, 88, 73, 73, 105, 105, 105,
+ 105, 105, 105, 118, 118, 105, 118, 105, 105, 118, 105, 105, 105, 105,
+ 120, 120, 105, 120, 105, 105, 99, 8592, 824, 8594, 824, 8596, 824,
+ 8656, 824, 8660, 824, 8658, 824, 8707, 824, 8712, 824, 8715, 824, 8739,
+ 824, 8741, 824, 8747, 8747, 8747, 8747, 8747, 8750, 8750, 8750, 8750,
+ 8750, 8764, 824, 8771, 824, 8773, 824, 8776, 824, 61, 824, 8801, 824,
+ 8781, 824, 60, 824, 62, 824, 8804, 824, 8805, 824, 8818, 824, 8819,
+ 824, 8822, 824, 8823, 824, 8826, 824, 8827, 824, 8834, 824, 8835, 824,
+ 8838, 824, 8839, 824, 8866, 824, 8872, 824, 8873, 824, 8875, 824, 8828,
+ 824, 8829, 824, 8849, 824, 8850, 824, 8882, 824, 8883, 824, 8884, 824,
+ 8885, 824, 12296, 12297, 49, 48, 49, 49, 49, 50, 49, 51, 49, 52, 49,
+ 53, 49, 54, 49, 55, 49, 56, 49, 57, 50, 48, 40, 49, 41, 40, 50, 41,
+ 40, 51, 41, 40, 52, 41, 40, 53, 41, 40, 54, 41, 40, 55, 41, 40, 56,
+ 41, 40, 57, 41, 40, 49, 48, 41, 40, 49, 49, 41, 40, 49, 50, 41, 40,
+ 49, 51, 41, 40, 49, 52, 41, 40, 49, 53, 41, 40, 49, 54, 41, 40, 49,
+ 55, 41, 40, 49, 56, 41, 40, 49, 57, 41, 40, 50, 48, 41, 49, 46, 50,
+ 46, 51, 46, 52, 46, 53, 46, 54, 46, 55, 46, 56, 46, 57, 46, 49, 48,
+ 46, 49, 49, 46, 49, 50, 46, 49, 51, 46, 49, 52, 46, 49, 53, 46, 49,
+ 54, 46, 49, 55, 46, 49, 56, 46, 49, 57, 46, 50, 48, 46, 40, 97, 41,
+ 40, 98, 41, 40, 99, 41, 40, 100, 41, 40, 101, 41, 40, 102, 41, 40,
+ 103, 41, 40, 104, 41, 40, 105, 41, 40, 106, 41, 40, 107, 41, 40, 108,
+ 41, 40, 109, 41, 40, 110, 41, 40, 111, 41, 40, 112, 41, 40, 113, 41,
+ 40, 114, 41, 40, 115, 41, 40, 116, 41, 40, 117, 41, 40, 118, 41, 40,
+ 119, 41, 40, 120, 41, 40, 121, 41, 40, 122, 41, 83, 89, 102, 113, 122,
+ 8747, 8747, 8747, 8747, 58, 58, 61, 61, 61, 61, 61, 61, 10973, 824,
+ 27597, 40863, 19968, 20008, 20022, 20031, 20057, 20101, 20108, 20128,
+ 20154, 20799, 20837, 20843, 20866, 20886, 20907, 20960, 20981, 20992,
+ 21147, 21241, 21269, 21274, 21304, 21313, 21340, 21353, 21378, 21430,
+ 21448, 21475, 22231, 22303, 22763, 22786, 22794, 22805, 22823, 22899,
+ 23376, 23424, 23544, 23567, 23586, 23608, 23662, 23665, 24027, 24037,
+ 24049, 24062, 24178, 24186, 24191, 24308, 24318, 24331, 24339, 24400,
+ 24417, 24435, 24515, 25096, 25142, 25163, 25903, 25908, 25991, 26007,
+ 26020, 26041, 26080, 26085, 26352, 26376, 26408, 27424, 27490, 27513,
+ 27571, 27595, 27604, 27611, 27663, 27668, 27700, 28779, 29226, 29238,
+ 29243, 29247, 29255, 29273, 29275, 29356, 29572, 29577, 29916, 29926,
+ 29976, 29983, 29992, 30000, 30091, 30098, 30326, 30333, 30382, 30399,
+ 30446, 30683, 30690, 30707, 31034, 31160, 31166, 31348, 31435, 31481,
+ 31859, 31992, 32566, 32593, 32650, 32701, 32769, 32780, 32786, 32819,
+ 32895, 32905, 33251, 33258, 33267, 33276, 33292, 33307, 33311, 33390,
+ 33394, 33400, 34381, 34411, 34880, 34892, 34915, 35198, 35211, 35282,
+ 35328, 35895, 35910, 35925, 35960, 35997, 36196, 36208, 36275, 36523,
+ 36554, 36763, 36784, 36789, 37009, 37193, 37318, 37324, 37329, 38263,
+ 38272, 38428, 38582, 38585, 38632, 38737, 38750, 38754, 38761, 38859,
+ 38893, 38899, 38913, 39080, 39131, 39135, 39318, 39321, 39340, 39592,
+ 39640, 39647, 39717, 39727, 39730, 39740, 39770, 40165, 40565, 40575,
+ 40613, 40635, 40643, 40653, 40657, 40697, 40701, 40718, 40723, 40736,
+ 40763, 40778, 40786, 40845, 40860, 40864, 12306, 21316, 21317, 12363,
+ 12441, 12365, 12441, 12367, 12441, 12369, 12441, 12371, 12441, 12373,
+ 12441, 12375, 12441, 12377, 12441, 12379, 12441, 12381, 12441, 12383,
+ 12441, 12385, 12441, 12388, 12441, 12390, 12441, 12392, 12441, 12399,
+ 12441, 12399, 12442, 12402, 12441, 12402, 12442, 12405, 12441, 12405,
+ 12442, 12408, 12441, 12408, 12442, 12411, 12441, 12411, 12442, 12358,
+ 12441, 32, 12441, 32, 12442, 12445, 12441, 12424, 12426, 12459, 12441,
+ 12461, 12441, 12463, 12441, 12465, 12441, 12467, 12441, 12469, 12441,
+ 12471, 12441, 12473, 12441, 12475, 12441, 12477, 12441, 12479, 12441,
+ 12481, 12441, 12484, 12441, 12486, 12441, 12488, 12441, 12495, 12441,
+ 12495, 12442, 12498, 12441, 12498, 12442, 12501, 12441, 12501, 12442,
+ 12504, 12441, 12504, 12442, 12507, 12441, 12507, 12442, 12454, 12441,
+ 12527, 12441, 12528, 12441, 12529, 12441, 12530, 12441, 12541, 12441,
+ 12467, 12488, 4352, 4353, 4522, 4354, 4524, 4525, 4355, 4356, 4357,
+ 4528, 4529, 4530, 4531, 4532, 4533, 4378, 4358, 4359, 4360, 4385, 4361,
+ 4362, 4363, 4364, 4365, 4366, 4367, 4368, 4369, 4370, 4449, 4450, 4451,
+ 4452, 4453, 4454, 4455, 4456, 4457, 4458, 4459, 4460, 4461, 4462, 4463,
+ 4464, 4465, 4466, 4467, 4468, 4469, 4448, 4372, 4373, 4551, 4552, 4556,
+ 4558, 4563, 4567, 4569, 4380, 4573, 4575, 4381, 4382, 4384, 4386, 4387,
+ 4391, 4393, 4395, 4396, 4397, 4398, 4399, 4402, 4406, 4416, 4423, 4428,
+ 4593, 4594, 4439, 4440, 4441, 4484, 4485, 4488, 4497, 4498, 4500, 4510,
+ 4513, 19977, 22235, 19978, 20013, 19979, 30002, 19993, 19969, 22825,
+ 22320, 40, 4352, 41, 40, 4354, 41, 40, 4355, 41, 40, 4357, 41, 40,
+ 4358, 41, 40, 4359, 41, 40, 4361, 41, 40, 4363, 41, 40, 4364, 41, 40,
+ 4366, 41, 40, 4367, 41, 40, 4368, 41, 40, 4369, 41, 40, 4370, 41, 40,
+ 4352, 4449, 41, 40, 4354, 4449, 41, 40, 4355, 4449, 41, 40, 4357, 4449,
+ 41, 40, 4358, 4449, 41, 40, 4359, 4449, 41, 40, 4361, 4449, 41, 40,
+ 4363, 4449, 41, 40, 4364, 4449, 41, 40, 4366, 4449, 41, 40, 4367, 4449,
+ 41, 40, 4368, 4449, 41, 40, 4369, 4449, 41, 40, 4370, 4449, 41, 40,
+ 4364, 4462, 41, 40, 4363, 4457, 4364, 4453, 4523, 41, 40, 4363, 4457,
+ 4370, 4462, 41, 40, 19968, 41, 40, 20108, 41, 40, 19977, 41, 40, 22235,
+ 41, 40, 20116, 41, 40, 20845, 41, 40, 19971, 41, 40, 20843, 41, 40,
+ 20061, 41, 40, 21313, 41, 40, 26376, 41, 40, 28779, 41, 40, 27700,
+ 41, 40, 26408, 41, 40, 37329, 41, 40, 22303, 41, 40, 26085, 41, 40,
+ 26666, 41, 40, 26377, 41, 40, 31038, 41, 40, 21517, 41, 40, 29305,
+ 41, 40, 36001, 41, 40, 31069, 41, 40, 21172, 41, 40, 20195, 41, 40,
+ 21628, 41, 40, 23398, 41, 40, 30435, 41, 40, 20225, 41, 40, 36039,
+ 41, 40, 21332, 41, 40, 31085, 41, 40, 20241, 41, 40, 33258, 41, 40,
+ 33267, 41, 80, 84, 69, 50, 49, 50, 50, 50, 51, 50, 52, 50, 53, 50,
+ 54, 50, 55, 50, 56, 50, 57, 51, 48, 51, 49, 51, 50, 51, 51, 51, 52,
+ 51, 53, 4352, 4449, 4354, 4449, 4355, 4449, 4357, 4449, 4358, 4449,
+ 4359, 4449, 4361, 4449, 4363, 4449, 4364, 4449, 4366, 4449, 4367, 4449,
+ 4368, 4449, 4369, 4449, 4370, 4449, 4366, 4449, 4535, 4352, 4457, 4364,
+ 4462, 4363, 4468, 20116, 20845, 19971, 20061, 26666, 26377, 31038,
+ 21517, 29305, 36001, 31069, 21172, 31192, 30007, 36969, 20778, 21360,
+ 27880, 38917, 20241, 20889, 27491, 24038, 21491, 21307, 23447, 23398,
+ 30435, 20225, 36039, 21332, 22812, 51, 54, 51, 55, 51, 56, 51, 57,
+ 52, 48, 52, 49, 52, 50, 52, 51, 52, 52, 52, 53, 52, 54, 52, 55, 52,
+ 56, 52, 57, 53, 48, 49, 26376, 50, 26376, 51, 26376, 52, 26376, 53,
+ 26376, 54, 26376, 55, 26376, 56, 26376, 57, 26376, 49, 48, 26376, 49,
+ 49, 26376, 49, 50, 26376, 72, 103, 101, 114, 103, 101, 86, 76, 84,
+ 68, 12450, 12452, 12454, 12456, 12458, 12459, 12461, 12463, 12465,
+ 12467, 12469, 12471, 12473, 12475, 12477, 12479, 12481, 12484, 12486,
+ 12488, 12490, 12491, 12492, 12493, 12494, 12495, 12498, 12501, 12504,
+ 12507, 12510, 12511, 12512, 12513, 12514, 12516, 12518, 12520, 12521,
+ 12522, 12523, 12524, 12525, 12527, 12528, 12529, 12530, 12450, 12497,
+ 12540, 12488, 12450, 12523, 12501, 12449, 12450, 12531, 12506, 12450,
+ 12450, 12540, 12523, 12452, 12491, 12531, 12464, 12452, 12531, 12481,
+ 12454, 12457, 12531, 12456, 12473, 12463, 12540, 12489, 12456, 12540,
+ 12459, 12540, 12458, 12531, 12473, 12458, 12540, 12512, 12459, 12452,
+ 12522, 12459, 12521, 12483, 12488, 12459, 12525, 12522, 12540, 12460,
+ 12525, 12531, 12460, 12531, 12510, 12462, 12460, 12462, 12491, 12540,
+ 12461, 12517, 12522, 12540, 12462, 12523, 12480, 12540, 12461, 12525,
+ 12461, 12525, 12464, 12521, 12512, 12461, 12525, 12513, 12540, 12488,
+ 12523, 12461, 12525, 12527, 12483, 12488, 12464, 12521, 12512, 12464,
+ 12521, 12512, 12488, 12531, 12463, 12523, 12476, 12452, 12525, 12463,
+ 12525, 12540, 12493, 12465, 12540, 12473, 12467, 12523, 12490, 12467,
+ 12540, 12509, 12469, 12452, 12463, 12523, 12469, 12531, 12481, 12540,
+ 12512, 12471, 12522, 12531, 12464, 12475, 12531, 12481, 12475, 12531,
+ 12488, 12480, 12540, 12473, 12487, 12471, 12489, 12523, 12488, 12531,
+ 12490, 12494, 12494, 12483, 12488, 12495, 12452, 12484, 12497, 12540,
+ 12475, 12531, 12488, 12497, 12540, 12484, 12496, 12540, 12524, 12523,
+ 12500, 12450, 12473, 12488, 12523, 12500, 12463, 12523, 12500, 12467,
+ 12499, 12523, 12501, 12449, 12521, 12483, 12489, 12501, 12451, 12540,
+ 12488, 12502, 12483, 12471, 12455, 12523, 12501, 12521, 12531, 12504,
+ 12463, 12479, 12540, 12523, 12506, 12477, 12506, 12491, 12498, 12504,
+ 12523, 12484, 12506, 12531, 12473, 12506, 12540, 12472, 12505, 12540,
+ 12479, 12509, 12452, 12531, 12488, 12508, 12523, 12488, 12507, 12531,
+ 12509, 12531, 12489, 12507, 12540, 12523, 12507, 12540, 12531, 12510,
+ 12452, 12463, 12525, 12510, 12452, 12523, 12510, 12483, 12495, 12510,
+ 12523, 12463, 12510, 12531, 12471, 12519, 12531, 12511, 12463, 12525,
+ 12531, 12511, 12522, 12511, 12522, 12496, 12540, 12523, 12513, 12460,
+ 12513, 12460, 12488, 12531, 12513, 12540, 12488, 12523, 12516, 12540,
+ 12489, 12516, 12540, 12523, 12518, 12450, 12531, 12522, 12483, 12488,
+ 12523, 12522, 12521, 12523, 12500, 12540, 12523, 12540, 12502, 12523,
+ 12524, 12512, 12524, 12531, 12488, 12466, 12531, 12527, 12483, 12488,
+ 48, 28857, 49, 28857, 50, 28857, 51, 28857, 52, 28857, 53, 28857, 54,
+ 28857, 55, 28857, 56, 28857, 57, 28857, 49, 48, 28857, 49, 49, 28857,
+ 49, 50, 28857, 49, 51, 28857, 49, 52, 28857, 49, 53, 28857, 49, 54,
+ 28857, 49, 55, 28857, 49, 56, 28857, 49, 57, 28857, 50, 48, 28857,
+ 50, 49, 28857, 50, 50, 28857, 50, 51, 28857, 50, 52, 28857, 104, 80,
+ 97, 100, 97, 65, 85, 98, 97, 114, 111, 86, 112, 99, 100, 109, 100,
+ 109, 178, 100, 109, 179, 73, 85, 24179, 25104, 26157, 21644, 22823,
+ 27491, 26126, 27835, 26666, 24335, 20250, 31038, 112, 65, 110, 65,
+ 956, 65, 109, 65, 107, 65, 75, 66, 77, 66, 71, 66, 99, 97, 108, 107,
+ 99, 97, 108, 112, 70, 110, 70, 956, 70, 956, 103, 109, 103, 107, 103,
+ 72, 122, 107, 72, 122, 77, 72, 122, 71, 72, 122, 84, 72, 122, 956,
+ 8467, 109, 8467, 100, 8467, 107, 8467, 102, 109, 110, 109, 956, 109,
+ 109, 109, 99, 109, 107, 109, 109, 109, 178, 99, 109, 178, 109, 178,
+ 107, 109, 178, 109, 109, 179, 99, 109, 179, 109, 179, 107, 109, 179,
+ 109, 8725, 115, 109, 8725, 115, 178, 80, 97, 107, 80, 97, 77, 80, 97,
+ 71, 80, 97, 114, 97, 100, 114, 97, 100, 8725, 115, 114, 97, 100, 8725,
+ 115, 178, 112, 115, 110, 115, 956, 115, 109, 115, 112, 86, 110, 86,
+ 956, 86, 109, 86, 107, 86, 77, 86, 112, 87, 110, 87, 956, 87, 109,
+ 87, 107, 87, 77, 87, 107, 937, 77, 937, 97, 46, 109, 46, 66, 113, 99,
+ 99, 99, 100, 67, 8725, 107, 103, 67, 111, 46, 100, 66, 71, 121, 104,
+ 97, 72, 80, 105, 110, 75, 75, 75, 77, 107, 116, 108, 109, 108, 110,
+ 108, 111, 103, 108, 120, 109, 98, 109, 105, 108, 109, 111, 108, 80,
+ 72, 112, 46, 109, 46, 80, 80, 77, 80, 82, 115, 114, 83, 118, 87, 98,
+ 86, 8725, 109, 65, 8725, 109, 49, 26085, 50, 26085, 51, 26085, 52,
+ 26085, 53, 26085, 54, 26085, 55, 26085, 56, 26085, 57, 26085, 49, 48,
+ 26085, 49, 49, 26085, 49, 50, 26085, 49, 51, 26085, 49, 52, 26085,
+ 49, 53, 26085, 49, 54, 26085, 49, 55, 26085, 49, 56, 26085, 49, 57,
+ 26085, 50, 48, 26085, 50, 49, 26085, 50, 50, 26085, 50, 51, 26085,
+ 50, 52, 26085, 50, 53, 26085, 50, 54, 26085, 50, 55, 26085, 50, 56,
+ 26085, 50, 57, 26085, 51, 48, 26085, 51, 49, 26085, 103, 97, 108, 35912,
+ 26356, 36040, 28369, 20018, 21477, 22865, 21895, 22856, 25078, 30313,
+ 32645, 34367, 34746, 35064, 37007, 27138, 27931, 28889, 29662, 33853,
+ 37226, 39409, 20098, 21365, 27396, 29211, 34349, 40478, 23888, 28651,
+ 34253, 35172, 25289, 33240, 34847, 24266, 26391, 28010, 29436, 37070,
+ 20358, 20919, 21214, 25796, 27347, 29200, 30439, 34310, 34396, 36335,
+ 38706, 39791, 40442, 30860, 31103, 32160, 33737, 37636, 35542, 22751,
+ 24324, 31840, 32894, 29282, 30922, 36034, 38647, 22744, 23650, 27155,
+ 28122, 28431, 32047, 32311, 38475, 21202, 32907, 20956, 20940, 31260,
+ 32190, 33777, 38517, 35712, 25295, 35582, 20025, 23527, 24594, 29575,
+ 30064, 21271, 30971, 20415, 24489, 19981, 27852, 25976, 32034, 21443,
+ 22622, 30465, 33865, 35498, 27578, 27784, 25342, 33509, 25504, 30053,
+ 20142, 20841, 20937, 26753, 31975, 33391, 35538, 37327, 21237, 21570,
+ 24300, 26053, 28670, 31018, 38317, 39530, 40599, 40654, 26310, 27511,
+ 36706, 24180, 24976, 25088, 25754, 28451, 29001, 29833, 31178, 32244,
+ 32879, 36646, 34030, 36899, 37706, 21015, 21155, 21693, 28872, 35010,
+ 24265, 24565, 25467, 27566, 31806, 29557, 20196, 22265, 23994, 24604,
+ 29618, 29801, 32666, 32838, 37428, 38646, 38728, 38936, 20363, 31150,
+ 37300, 38584, 24801, 20102, 20698, 23534, 23615, 26009, 29134, 30274,
+ 34044, 36988, 26248, 38446, 21129, 26491, 26611, 27969, 28316, 29705,
+ 30041, 30827, 32016, 39006, 25134, 38520, 20523, 23833, 28138, 36650,
+ 24459, 24900, 26647, 38534, 21033, 21519, 23653, 26131, 26446, 26792,
+ 27877, 29702, 30178, 32633, 35023, 35041, 38626, 21311, 28346, 21533,
+ 29136, 29848, 34298, 38563, 40023, 40607, 26519, 28107, 33256, 31520,
+ 31890, 29376, 28825, 35672, 20160, 33590, 21050, 20999, 24230, 25299,
+ 31958, 23429, 27934, 26292, 36667, 38477, 24275, 20800, 21952, 22618,
+ 26228, 20958, 29482, 30410, 31036, 31070, 31077, 31119, 38742, 31934,
+ 34322, 35576, 36920, 37117, 39151, 39164, 39208, 40372, 20398, 20711,
+ 20813, 21193, 21220, 21329, 21917, 22022, 22120, 22592, 22696, 23652,
+ 24724, 24936, 24974, 25074, 25935, 26082, 26257, 26757, 28023, 28186,
+ 28450, 29038, 29227, 29730, 30865, 31049, 31048, 31056, 31062, 31117,
+ 31118, 31296, 31361, 31680, 32265, 32321, 32626, 32773, 33261, 33401,
+ 33879, 35088, 35222, 35585, 35641, 36051, 36104, 36790, 38627, 38911,
+ 38971, 102, 102, 102, 105, 102, 108, 102, 102, 105, 102, 102, 108,
+ 383, 116, 115, 116, 1396, 1398, 1396, 1381, 1396, 1387, 1406, 1398,
+ 1396, 1389, 1497, 1460, 1522, 1463, 1506, 1492, 1499, 1500, 1501, 1512,
+ 1514, 1513, 1473, 1513, 1474, 64329, 1473, 64329, 1474, 1488, 1463,
+ 1488, 1464, 1488, 1468, 1489, 1468, 1490, 1468, 1491, 1468, 1492, 1468,
+ 1493, 1468, 1494, 1468, 1496, 1468, 1497, 1468, 1498, 1468, 1499, 1468,
+ 1500, 1468, 1502, 1468, 1504, 1468, 1505, 1468, 1507, 1468, 1508, 1468,
+ 1510, 1468, 1511, 1468, 1512, 1468, 1513, 1468, 1514, 1468, 1493, 1465,
+ 1489, 1471, 1499, 1471, 1508, 1471, 1488, 1500, 1649, 1659, 1662, 1664,
+ 1658, 1663, 1657, 1700, 1702, 1668, 1667, 1670, 1671, 1677, 1676, 1678,
+ 1672, 1688, 1681, 1705, 1711, 1715, 1713, 1722, 1723, 1728, 1729, 1726,
+ 1746, 1747, 1709, 1735, 1734, 1736, 1655, 1739, 1733, 1737, 1744, 1609,
+ 1574, 1575, 1574, 1749, 1574, 1608, 1574, 1735, 1574, 1734, 1574, 1736,
+ 1574, 1744, 1574, 1609, 1740, 1574, 1580, 1574, 1581, 1574, 1605, 1574,
+ 1610, 1576, 1580, 1576, 1581, 1576, 1582, 1576, 1605, 1576, 1609, 1576,
+ 1610, 1578, 1580, 1578, 1581, 1578, 1582, 1578, 1605, 1578, 1609, 1578,
+ 1610, 1579, 1580, 1579, 1605, 1579, 1609, 1579, 1610, 1580, 1581, 1580,
+ 1605, 1581, 1580, 1581, 1605, 1582, 1580, 1582, 1581, 1582, 1605, 1587,
+ 1580, 1587, 1581, 1587, 1582, 1587, 1605, 1589, 1581, 1589, 1605, 1590,
+ 1580, 1590, 1581, 1590, 1582, 1590, 1605, 1591, 1581, 1591, 1605, 1592,
+ 1605, 1593, 1580, 1593, 1605, 1594, 1580, 1594, 1605, 1601, 1580, 1601,
+ 1581, 1601, 1582, 1601, 1605, 1601, 1609, 1601, 1610, 1602, 1581, 1602,
+ 1605, 1602, 1609, 1602, 1610, 1603, 1575, 1603, 1580, 1603, 1581, 1603,
+ 1582, 1603, 1604, 1603, 1605, 1603, 1609, 1603, 1610, 1604, 1580, 1604,
+ 1581, 1604, 1582, 1604, 1605, 1604, 1609, 1604, 1610, 1605, 1580, 1605,
+ 1581, 1605, 1582, 1605, 1605, 1605, 1609, 1605, 1610, 1606, 1580, 1606,
+ 1581, 1606, 1582, 1606, 1605, 1606, 1609, 1606, 1610, 1607, 1580, 1607,
+ 1605, 1607, 1609, 1607, 1610, 1610, 1580, 1610, 1581, 1610, 1582, 1610,
+ 1605, 1610, 1609, 1610, 1610, 1584, 1648, 1585, 1648, 1609, 1648, 32,
+ 1612, 1617, 32, 1613, 1617, 32, 1614, 1617, 32, 1615, 1617, 32, 1616,
+ 1617, 32, 1617, 1648, 1574, 1585, 1574, 1586, 1574, 1606, 1576, 1585,
+ 1576, 1586, 1576, 1606, 1578, 1585, 1578, 1586, 1578, 1606, 1579, 1585,
+ 1579, 1586, 1579, 1606, 1605, 1575, 1606, 1585, 1606, 1586, 1606, 1606,
+ 1610, 1585, 1610, 1586, 1610, 1606, 1574, 1582, 1574, 1607, 1576, 1607,
+ 1578, 1607, 1589, 1582, 1604, 1607, 1606, 1607, 1607, 1648, 1610, 1607,
+ 1579, 1607, 1587, 1607, 1588, 1605, 1588, 1607, 1600, 1614, 1617, 1600,
+ 1615, 1617, 1600, 1616, 1617, 1591, 1609, 1591, 1610, 1593, 1609, 1593,
+ 1610, 1594, 1609, 1594, 1610, 1587, 1609, 1587, 1610, 1588, 1609, 1588,
+ 1610, 1581, 1609, 1581, 1610, 1580, 1609, 1580, 1610, 1582, 1609, 1582,
+ 1610, 1589, 1609, 1589, 1610, 1590, 1609, 1590, 1610, 1588, 1580, 1588,
+ 1581, 1588, 1582, 1588, 1585, 1587, 1585, 1589, 1585, 1590, 1585, 1575,
+ 1611, 1578, 1580, 1605, 1578, 1581, 1580, 1578, 1581, 1605, 1578, 1582,
+ 1605, 1578, 1605, 1580, 1578, 1605, 1581, 1578, 1605, 1582, 1580, 1605,
+ 1581, 1581, 1605, 1610, 1581, 1605, 1609, 1587, 1581, 1580, 1587, 1580,
+ 1581, 1587, 1580, 1609, 1587, 1605, 1581, 1587, 1605, 1580, 1587, 1605,
+ 1605, 1589, 1581, 1581, 1589, 1605, 1605, 1588, 1581, 1605, 1588, 1580,
+ 1610, 1588, 1605, 1582, 1588, 1605, 1605, 1590, 1581, 1609, 1590, 1582,
+ 1605, 1591, 1605, 1581, 1591, 1605, 1605, 1591, 1605, 1610, 1593, 1580,
+ 1605, 1593, 1605, 1605, 1593, 1605, 1609, 1594, 1605, 1605, 1594, 1605,
+ 1610, 1594, 1605, 1609, 1601, 1582, 1605, 1602, 1605, 1581, 1602, 1605,
+ 1605, 1604, 1581, 1605, 1604, 1581, 1610, 1604, 1581, 1609, 1604, 1580,
+ 1580, 1604, 1582, 1605, 1604, 1605, 1581, 1605, 1581, 1580, 1605, 1581,
+ 1605, 1605, 1581, 1610, 1605, 1580, 1581, 1605, 1580, 1605, 1605, 1582,
+ 1580, 1605, 1582, 1605, 1605, 1580, 1582, 1607, 1605, 1580, 1607, 1605,
+ 1605, 1606, 1581, 1605, 1606, 1581, 1609, 1606, 1580, 1605, 1606, 1580,
+ 1609, 1606, 1605, 1610, 1606, 1605, 1609, 1610, 1605, 1605, 1576, 1582,
+ 1610, 1578, 1580, 1610, 1578, 1580, 1609, 1578, 1582, 1610, 1578, 1582,
+ 1609, 1578, 1605, 1610, 1578, 1605, 1609, 1580, 1605, 1610, 1580, 1581,
+ 1609, 1580, 1605, 1609, 1587, 1582, 1609, 1589, 1581, 1610, 1588, 1581,
+ 1610, 1590, 1581, 1610, 1604, 1580, 1610, 1604, 1605, 1610, 1610, 1581,
+ 1610, 1610, 1580, 1610, 1610, 1605, 1610, 1605, 1605, 1610, 1602, 1605,
+ 1610, 1606, 1581, 1610, 1593, 1605, 1610, 1603, 1605, 1610, 1606, 1580,
+ 1581, 1605, 1582, 1610, 1604, 1580, 1605, 1603, 1605, 1605, 1580, 1581,
+ 1610, 1581, 1580, 1610, 1605, 1580, 1610, 1601, 1605, 1610, 1576, 1581,
+ 1610, 1587, 1582, 1610, 1606, 1580, 1610, 1589, 1604, 1746, 1602, 1604,
+ 1746, 1575, 1604, 1604, 1607, 1575, 1603, 1576, 1585, 1605, 1581, 1605,
+ 1583, 1589, 1604, 1593, 1605, 1585, 1587, 1608, 1604, 1593, 1604, 1610,
+ 1607, 1608, 1587, 1604, 1605, 1589, 1604, 1609, 1589, 1604, 1609, 32,
+ 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587,
+ 1604, 1605, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1585, 1740,
+ 1575, 1604, 8229, 8212, 8211, 95, 123, 125, 12308, 12309, 12304, 12305,
+ 12298, 12299, 12300, 12301, 12302, 12303, 91, 93, 8254, 44, 12289,
+ 58, 63, 33, 35, 38, 42, 45, 60, 62, 92, 36, 37, 64, 32, 1611, 1600,
+ 1611, 32, 1612, 32, 1613, 32, 1614, 1600, 1614, 32, 1615, 1600, 1615,
+ 32, 1616, 1600, 1616, 32, 1617, 1600, 1617, 32, 1618, 1600, 1618, 1569,
+ 1570, 1571, 1572, 1573, 1574, 1575, 1576, 1577, 1578, 1579, 1580, 1581,
+ 1582, 1583, 1584, 1585, 1586, 1587, 1588, 1589, 1590, 1591, 1592, 1593,
+ 1594, 1601, 1602, 1603, 1604, 1605, 1606, 1607, 1608, 1610, 1604, 1570,
+ 1604, 1571, 1604, 1573, 1604, 1575, 34, 39, 47, 94, 124, 126, 10629,
+ 10630, 12290, 12539, 12449, 12451, 12453, 12455, 12457, 12515, 12517,
+ 12519, 12483, 12540, 12531, 12441, 12442, 12644, 12593, 12594, 12595,
+ 12596, 12597, 12598, 12599, 12600, 12601, 12602, 12603, 12604, 12605,
+ 12606, 12607, 12608, 12609, 12610, 12611, 12612, 12613, 12614, 12615,
+ 12616, 12617, 12618, 12619, 12620, 12621, 12622, 12623, 12624, 12625,
+ 12626, 12627, 12628, 12629, 12630, 12631, 12632, 12633, 12634, 12635,
+ 12636, 12637, 12638, 12639, 12640, 12641, 12642, 12643, 162, 163, 172,
+ 175, 166, 165, 8361, 9474, 8592, 8593, 8594, 8595, 9632, 9675
+};
+
+
+/*
+ * This macro extracts the information about a character from the
+ * Unicode character tables.
+ */
+
+//#define GetUniCharInfo(ch) (groups[groupMap[(pageMap[(((int)(ch)) & 0xffff) >> CCLASS_OFFSET_BITS] << CCLASS_OFFSET_BITS) | ((ch) & ((1 << CCLASS_OFFSET_BITS)-1))]])
+
+#define GetUniCharDecompInfo(ch) (decompGroupMap[(decompPageMap[(((int)(ch)) & 0xffff) >> DECOMP_OFFSET_BITS] << DECOMP_OFFSET_BITS) | ((ch) & ((1 << DECOMP_OFFSET_BITS)-1))])
+
+#define GetDecompShift(info) ((info) & 0xffff)
+#define GetDecompLen(info) ((info) >> 16)
+
+
+#define COMP_OFFSET_BITS 5
+
+/*
+ * The pageMap is indexed by page number and returns an alternate page number
+ * that identifies a unique page of characters. Many Unicode characters map
+ * to the same alternate page number.
+ */
+
+static unsigned char compPageMap[] = {
+ 0, 1, 2, 3, 0, 4, 5, 6, 7, 0, 8, 9, 0, 10, 0, 11, 0, 12, 0, 0, 13,
+ 0, 0, 0, 14, 15, 16, 0, 17, 18, 19, 0, 20, 21, 22, 23, 0, 0, 24, 25,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 27, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 30, 31, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 32, 33, 0, 34, 35, 36, 0, 0, 0, 37, 0, 0, 38, 39, 0,
+ 0, 40, 41, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 44, 45, 46, 0, 47, 48, 0, 49, 50, 51, 52, 0, 53, 54, 55, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 57, 0, 58, 59, 60, 61, 62, 63, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 65, 66, 67, 68, 69,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+
+};
+
+/*
+ * The groupMap is indexed by combining the alternate page number with
+ * the page offset and returns a group number that identifies a unique
+ * set of character attributes.
+ */
+
+static int compGroupMap[] = {
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 65564, 65640, 65738, -1, -1, 30,
+ 91, 141, 65, 121, 65701, 38, 94, 1, 65604, 124, 44, 100, 12, 76, 77,
+ -1, 48, 105, 17, 84, 136, 54, 113, 23, 24, -1, -1, -1, -1, -1, -1,
+ 140, 64, 120, 71, 123, 65573, 99, 10, 75, 129, 47, 104, 16, 15, 83,
+ 135, -1, 110, 22, 86, 137, 59, 117, 118, 28, 89, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 102, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 6, -1, 65713, 65575, 101, 65550, -1, -1, 42, -1, -1, -1, -1, 65576,
+ -1, -1, -1, -1, 130, 50, 65678, -1, 65628, -1, -1, -1, 115, -1, -1,
+ -1, -1, -1, 32, -1, 65742, 65600, 67, 65704, -1, -1, 5, -1, -1, -1,
+ -1, 65549, -1, -1, -1, -1, 107, 20, 65626, -1, 65587, -1, -1, -1, 87,
+ -1, -1, -1, -1, -1, 142, 66, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 106, 18, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, 93, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65624, 65722, -1, -1, -1, -1,
+ 65632, 65730, -1, -1, -1, -1, -1, -1, 65597, 65699, 65567, 65649, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 65728, 81, 131, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 119, 33, -1, -1, -1, -1, -1, -1, 65546, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65593, 65696, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 65675, 65554, 65625, 65724, -1, -1, -1,
+ -1, 65731, 65590, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 65729, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 1, 2, 3, 5, 7, -1, 8, 10, 11, 12, 26, 30, 13, -1, -1, 14, -1,
+ 15, -1, 4, 6, -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, -1,
+ 16, 32, 29, 25, 20, 17, -1, -1, -1, -1, 22, 21, -1, 18, 23, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 19, -1, -1,
+ 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, 122, -1, 96,
+ -1, 8, -1, -1, -1, -1, -1, 80, -1, 65586, -1, -1, -1, 85, -1, -1, -1,
+ 26, -1, -1, 65539, -1, 65707, -1, -1, 2, -1, -1, -1, 95, -1, 7, -1,
+ 125, -1, -1, -1, -1, -1, 51, -1, 111, -1, -1, -1, 56, -1, -1, -1, 0,
+ 138, 62, -1, -1, 65664, -1, -1, -1, 39, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65736, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 97, -1, -1, 65714, -1, 103, 14, 65622, 132,
+ -1, 65581, -1, -1, -1, 65727, -1, -1, -1, -1, 139, -1, -1, -1, 65566,
+ -1, -1, -1, 65706, -1, 65663, -1, -1, 72, -1, -1, 65670, -1, 79, 133,
+ 65582, 52, -1, 65556, -1, -1, -1, 65687, -1, -1, -1, -1, 63, -1, -1,
+ -1, 65744, -1, -1, -1, 65659, -1, 65595, -1, -1, -1, -1, -1, -1, -1,
+ -1, 65658, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65661,
+ 65545, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 65651, 65542, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 65682, 65559, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 143, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65733,
+ -1, 65657, -1, -1, -1, -1, -1, -1, -1, -1, 65546, 36, 65547, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 65618, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65612, -1, -1, 65611, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65734,
+ -1, -1, -1, -1, -1, -1, -1, 65656, -1, -1, 65655, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 65539, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65540, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 65541, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 65542, 65543, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 65577, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1,
+ -1, -1, -1, -1, -1, -1, 98, 65584, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 65578, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65716, -1, -1, 65544,
+ -1, -1, -1, 127, -1, -1, -1, 65630, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 35, 65545, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1,
+ -1, 19, 65695, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, 65538, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, 65536, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, 3, -1, -1, 65538, -1, -1, 65537, -1, -1, -1, -1, -1, 65616,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65679, 65557,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 65685, 65561, -1, -1, -1, -1, -1, -1, 65743, 65601, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 114, 25, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65673, 65553,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, 65540, 65605, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, 82, 134, 65591, 65692, 65693, 65565, 65641, 65739,
+ 58, 116, 65568, 65652, 65543, 65609, 65610, 65710, 36, 92, -1, -1,
+ -1, -1, -1, -1, 9, 73, -1, -1, -1, -1, -1, -1, 53, 108, 65690, 65563,
+ 65639, 65737, 65598, 65700, 27, 88, 65541, 65606, 65607, 65709, 65572,
+ 65667, 11, 69, -1, -1, -1, -1, -1, -1, 126, 45, -1, -1, -1, -1, -1,
+ -1, 13, 78, -1, -1, -1, -1, -1, -1, 55, 112, -1, -1, -1, -1, -1, -1,
+ 29, 90, -1, -1, -1, -1, -1, -1, -1, 70, -1, -1, -1, -1, -1, -1, 128,
+ 46, 65683, 65560, 65635, 65732, 65592, 65694, 109, 21, 65642, 65740,
+ 65599, 65702, 65569, 65653, 65544, -1, -1, -1, 65574, -1, -1, -1, -1,
+ -1, -1, -1, 65552, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65537, -1, -1,
+ -1, -1, -1, -1, -1, -1, 40, -1, -1, -1, -1, -1, -1, 65680, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65570, -1, -1, -1, -1,
+ -1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 65705, -1, 65660, -1, 65614, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, 65698, -1, 65644, -1, 65741, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 65711, -1, -1, -1, -1, 65619, -1, -1,
+ 65676, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 65668, -1, 65548, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 65648, -1, -1, -1, -1, -1, -1, 65547, -1, 65715, -1, -1, 65551, -1,
+ -1, -1, -1, 65681, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, 65596, -1, -1, 65647, 65536, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, 65721, 65583, -1, -1, 65558, 65631,
+ -1, -1, 65688, 65562, 65637, 65735, -1, -1, -1, -1, 65646, 65745, -1,
+ -1, 65571, 65662, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65580, 65579,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 65602,
+ -1, -1, -1, -1, -1, 65613, 65712, -1, 65669, -1, -1, -1, -1, -1, -1,
+ 65555, 65629, 65725, 65588, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, 65718, -1, -1, -1, -1, 65708, -1, 65703, -1,
+ 65697, -1, 65686, -1, 65684, -1, 65677, -1, 65671, -1, 65665, -1, 65650,
+ -1, 65645, -1, 65638, -1, 65633, -1, -1, 65623, -1, 65620, -1, 65615,
+ -1, -1, -1, -1, -1, -1, 60, -1, -1, 74, -1, -1, 68, -1, -1, 61, -1,
+ -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 27, 28, -1,
+ -1, 65717, -1, -1, -1, -1, -1, -1, -1, -1, 65691, -1, -1, -1, -1, 65674,
+ -1, 65672, -1, 65666, -1, 65654, -1, 65643, -1, 65636, -1, 65634, -1,
+ 65627, -1, 65621, -1, 65617, -1, 65608, -1, 65603, -1, -1, 65594, -1,
+ 65589, -1, 65585, -1, -1, -1, -1, -1, -1, 41, -1, -1, 31, -1, -1, 49,
+ -1, -1, 43, -1, -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 65726, 65723, 65720, 65719, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, 65689, -1, -1
+};
+
+/*
+ * ...
+ */
+
+static int compFirstList[][2] = {
+ {824, 8817}, {837, 8119}, {3530, 3549}, {837, 8116}, {770, 7896},
+ {837, 8090}, {776, 1243}, {837, 8076}, {837, 8114}, {783, 1143},
+ {780, 494}, {824, 8772}, {824, 8742}, {769, 7727}, {769, 7688},
+ {824, 8777}, {837, 8178}, {770, 7879}, {772, 481}, {824, 8938},
+ {769, 1116}, {772, 7737}, {824, 8824}, {776, 1259}, {837, 8099},
+ {772, 7773}, {824, 8833}, {837, 8083}, {824, 8814}, {837, 8069},
+ {776, 1268}, {776, 7802}, {837, 8074}, {837, 8110}, {837, 8183},
+ {824, 8840}, {837, 8094}, {775, 7711}, {837, 8130}, {769, 506},
+ {769, 7726}, {3031, 2964}, {3158, 3144}, {824, 8931}, {824, 8930},
+ {769, 1036}, {776, 1247}, {824, 8821}, {3006, 3019}, {12441, 12489},
+ {788, 8172}, {769, 511}, {824, 8941}, {12441, 12487}, {772, 561},
+ {837, 8066}, {837, 8102}, {772, 492}, {12441, 12485}, {776, 1261},
+ {824, 8802}, {769, 7800}, {837, 8086}, {837, 8108}, {769, 507},
+ {775, 7785}, {824, 8876}, {12441, 12482}, {770, 308}, {770, 7897},
+ {837, 8091}, {837, 8092}, {12441, 12480}, {837, 8077}, {837, 8078},
+ {1620, 1728}, {1620, 1747}, {824, 8877}, {824, 8622}, {12441, 12393},
+ {4142, 4134}, {12441, 12478}, {1620, 1730}, {824, 8713},
+ {12441, 12391}, {12441, 12476}, {776, 1246}, {12441, 12389},
+ {775, 7780}, {774, 7708}, {772, 555}, {12441, 12474}, {769, 510},
+ {824, 8939}, {3285, 3275}, {824, 8825}, {775, 7782}, {12441, 12386},
+ {12441, 12472}, {837, 8100}, {12441, 12470}, {824, 8928},
+ {12441, 12384}, {837, 8084}, {824, 8800}, {837, 8070}, {837, 8106},
+ {12441, 12468}, {824, 8655}, {12441, 12382}, {824, 8836},
+ {824, 8816}, {824, 8769}, {776, 7803}, {12441, 12380}, {776, 1242},
+ {837, 8075}, {837, 8111}, {12441, 12466}, {2364, 2356}, {2364, 2353},
+ {1620, 1574}, {776, 1111}, {776, 1273}, {824, 8603}, {783, 1142},
+ {824, 8841}, {776, 1260}, {837, 8180}, {12441, 12378}, {12441, 12464},
+ {837, 8095}, {824, 8740}, {824, 8879}, {769, 1107}, {12441, 12376},
+ {12441, 12462}, {770, 7878}, {12441, 12460}, {772, 480},
+ {824, 8716}, {12441, 12374}, {772, 554}, {772, 7736}, {837, 8135},
+ {824, 8813}, {776, 1258}, {837, 8098}, {12441, 12372}, {772, 7772},
+ {12441, 12370}, {776, 1255}, {824, 8832}, {12441, 12542},
+ {837, 8082}, {12441, 12532}, {837, 8067}, {837, 8068}, {837, 8103},
+ {3390, 3403}, {772, 493}, {12441, 12368}, {824, 8653}, {769, 7801},
+ {837, 8087}, {775, 7710}, {837, 8109}, {12441, 12366}, {769, 7689},
+ {824, 8602}, {776, 1272}, {837, 8132}, {12441, 12364}, {837, 8093},
+ {837, 8079}, {824, 8708}, {824, 8878}, {772, 478}, {769, 1027},
+ {824, 8775}, {3285, 3264}, {12441, 12446}, {12441, 12436},
+ {12441, 12538}, {12441, 12537}, {824, 8820}, {775, 7781},
+ {12441, 12536}, {774, 7709}, {824, 8940}, {12441, 12535},
+ {776, 1254}, {775, 7835}, {780, 495}, {775, 7783}, {772, 560},
+ {837, 8101}, {1620, 1572}, {2364, 2345}, {824, 8929}, {776, 1031},
+ {837, 8085}, {824, 8815}, {837, 8071}, {837, 8107}, {824, 8654},
+ {772, 479}, {775, 7784}, {776, 1269}, {824, 8837}
+};
+
+static int compSecondList[][2] = {
+ {3545, 3548}, {3545, 3550}, {3398, 3404}, {2503, 2507}, {2503, 2508},
+ {2887, 2891}, {2887, 2888}, {2887, 2892}, {3270, 3274}, {3270, 3272},
+ {1575, 1570}, {1575, 1573}
+};
+
+static int compBothList[144][37] = {
+ {
+ 8179, 8060, 974, 0, 8032, 0, 8033, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 204, 205, 206, 0, 296, 0, 298, 300, 0, 304, 207, 7880, 463,
+ 520, 522, 7882, 302, 7724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8115, 8048, 940, 0, 7936, 0, 7937, 8113, 8112, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 8118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 3546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8157, 8158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7873, 7871, 0, 0, 7877, 0, 0, 0, 0, 0, 0, 7875, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7846, 7844, 0, 0, 7850, 0, 0, 0, 0, 0, 0, 7848, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8131, 8052, 942, 0, 7968, 0, 7969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 8134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8154, 906, 0, 7992, 0, 7993, 8153, 8152, 0, 0, 938, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+ },
+ {
+ 0, 7962, 7964, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 293, 0, 0, 0, 0, 0, 0, 7715, 7719, 0, 543, 0, 0, 7717,
+ 0, 0, 0, 7721, 7723, 0, 7830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
+ },
+ {
+ 0, 7986, 7988, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7990, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 504, 323, 0, 0, 209, 0, 0, 0, 0, 7748, 0, 0, 327, 0, 0, 7750,
+ 0, 0, 0, 325, 0, 7754, 7752, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+ },
+ {
+ 0, 8002, 8004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 1217, 0, 0, 1244, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 505, 324, 0, 0, 241, 0, 0, 0, 0, 7749, 0, 0, 328, 0, 0, 7751,
+ 0, 0, 0, 326, 0, 7755, 7753, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+ },
+ {
+ 0, 0, 7743, 0, 0, 0, 0, 0, 0, 0, 7745, 0, 0, 0, 0, 0, 7747, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7786, 0, 0, 356, 0, 0, 7788, 0, 0,
+ 0, 354, 0, 7792, 7790, 0, 538, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7701, 7703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3402, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 7757, 0, 0, 0, 0, 557, 0, 0, 0, 7759, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8105, 8043, 8045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8047, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 347, 349, 0, 0, 0, 0, 0, 0, 7777, 0, 0, 353, 0, 0, 7779,
+ 0, 0, 0, 351, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7922, 221, 374, 0, 7928, 0, 562, 0, 0, 7822, 376, 7926, 0, 0,
+ 0, 7924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
+ },
+ {
+ 0, 0, 377, 7824, 0, 0, 0, 0, 0, 0, 379, 0, 0, 381, 0, 0, 7826,
+ 0, 0, 0, 0, 0, 0, 7828, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 7853, 0, 0, 0, 0, 7863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8188, 8186, 911, 0, 8040, 0, 8041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8088, 7978, 7980, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7923, 253, 375, 0, 7929, 0, 563, 0, 0, 7823, 255, 7927, 0, 0,
+ 0, 7925, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7833, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0
+ },
+ {
+ 0, 8018, 8020, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8022, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 192, 193, 194, 0, 195, 0, 256, 258, 0, 550, 196, 7842, 461,
+ 512, 514, 7840, 260, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 7680, 0,
+ 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12499, 12500, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7847, 7845, 0, 0, 7851, 0, 0, 0, 0, 0, 0, 7849, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7915, 7913, 0, 0, 7919, 0, 0, 0, 0, 0, 0, 7917, 0, 0, 0, 7921,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8124, 8122, 902, 0, 7944, 0, 7945, 8121, 8120, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12508, 12509, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7954, 7956, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7760, 7762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 500, 284, 0, 0, 0, 7712, 286, 0, 288, 0, 0, 486, 0, 0, 0,
+ 0, 0, 0, 290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 979, 0, 0, 0, 0, 0, 0, 0, 0, 980, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8141, 8142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12496, 12497, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7872, 7870, 0, 0, 7876, 0, 0, 0, 0, 0, 0, 7874, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12505, 12506, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, 0, 7734, 0, 0,
+ 0, 315, 0, 7740, 7738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7995, 7997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8097, 8035, 8037, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 7729, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, 0, 7731, 0, 0,
+ 0, 311, 0, 0, 7733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 7768, 0, 0, 344, 528, 530, 7770,
+ 0, 0, 0, 342, 0, 0, 7774, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12502, 12503, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 7756, 0, 0, 0, 0, 556, 0, 0, 0, 7758, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8056, 972, 0, 8000, 0, 8001, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 1117, 0, 0, 0, 0, 0, 1251, 1081, 0, 0, 1253, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8080, 7970, 7972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7808, 7810, 372, 0, 0, 0, 0, 0, 0, 7814, 7812, 0, 0, 0, 0, 7816,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8010, 8012, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8058, 973, 0, 8016, 0, 8017, 8161, 8160, 0, 0, 971, 0, 0, 0,
+ 0, 0, 0, 0, 8166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12412, 12413, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8072, 7946, 7948, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7950, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 7805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7807, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12400, 12401, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12409, 12410, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8162, 944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8167,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 1263, 1118, 0, 0, 1265, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1267, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7683, 0, 0, 0, 0, 0, 7685, 0, 0,
+ 0, 0, 0, 0, 7687, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7690, 0, 0, 270, 0, 0, 7692, 0, 0,
+ 0, 7696, 0, 7698, 7694, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7857, 7855, 0, 0, 7861, 0, 0, 0, 0, 0, 0, 7859, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 509, 0, 0, 0, 0, 483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12406, 12407, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7987, 7989, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8027, 8029, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7691, 0, 0, 271, 0, 0, 7693, 0, 0,
+ 0, 7697, 0, 7699, 7695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 1233, 0, 0, 1235, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7963, 7965, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 12403, 12404, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 236, 237, 238, 0, 297, 0, 299, 301, 0, 0, 239, 7881, 464, 521,
+ 523, 7883, 303, 7725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0
+ },
+ {
+ 0, 210, 211, 212, 0, 213, 0, 332, 334, 0, 558, 214, 7886, 465,
+ 524, 526, 7884, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, 416,
+ 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 7764, 0, 0, 0, 0, 0, 0, 0, 7766, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8003, 8005, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 1104, 0, 0, 0, 0, 0, 0, 1239, 0, 0, 1105, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8184, 908, 0, 8008, 0, 8009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7900, 7898, 0, 0, 7904, 0, 0, 0, 0, 0, 0, 7902, 0, 0, 0, 7906,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8064, 7938, 7940, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7942, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 242, 243, 244, 0, 245, 0, 333, 335, 0, 559, 246, 7887, 466,
+ 525, 527, 7885, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 417,
+ 0, 0, 0, 0, 0
+ },
+ {
+ 0, 217, 218, 219, 0, 360, 0, 362, 364, 0, 0, 220, 7910, 467, 532,
+ 534, 7908, 370, 7796, 0, 0, 0, 7798, 0, 0, 0, 366, 0, 0, 0, 368,
+ 431, 7794, 0, 0, 0, 0
+ },
+ {
+ 0, 8170, 910, 0, 0, 0, 8025, 8169, 8168, 0, 0, 939, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7787, 7831, 0, 357, 0, 0, 7789, 0,
+ 0, 0, 355, 0, 7793, 7791, 0, 539, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+ },
+ {
+ 0, 476, 472, 0, 0, 0, 0, 470, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8089, 7979, 7981, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 378, 7825, 0, 0, 0, 0, 0, 0, 380, 0, 0, 382, 0, 0, 7827,
+ 0, 0, 0, 0, 0, 0, 7829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8019, 8021, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 8023, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7682, 0, 0, 0, 0, 0, 7684, 0, 0,
+ 0, 0, 0, 0, 7686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7955, 7957, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7761, 7763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 7714, 7718, 0, 542, 0, 0, 7716,
+ 0, 0, 0, 7720, 7722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0
+ },
+ {
+ 0, 8050, 941, 0, 7952, 0, 7953, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8140, 8138, 905, 0, 7976, 0, 7977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 1232, 0, 0, 1234, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3018, 3020, 0, 0
+ },
+ {
+ 0, 0, 501, 285, 0, 0, 0, 7713, 287, 0, 289, 0, 0, 487, 0, 0, 0,
+ 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 7742, 0, 0, 0, 0, 0, 0, 0, 7744, 0, 0, 0, 0, 0, 7746, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 508, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8173, 901, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8129,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 1024, 0, 0, 0, 0, 0, 0, 1238, 0, 0, 1025, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 7735, 0, 0,
+ 0, 316, 0, 7741, 7739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 346, 348, 0, 0, 0, 0, 0, 0, 7776, 0, 0, 352, 0, 0, 7778,
+ 0, 0, 0, 350, 0, 0, 0, 0, 536, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7700, 7702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7891, 7889, 0, 0, 7895, 0, 0, 0, 0, 0, 0, 7893, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8081, 7971, 7973, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8104, 8042, 8044, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8046, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 7769, 0, 0, 345, 529, 531, 7771,
+ 0, 0, 0, 343, 0, 0, 7775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+
+ },
+ {
+ 0, 0, 0, 0, 8164, 0, 8165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8011, 8013, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7818, 7820, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 7852, 0, 0, 0, 0, 7862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 475, 471, 0, 0, 0, 0, 469, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8073, 7947, 7949, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7951, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7809, 7811, 373, 0, 0, 0, 0, 0, 0, 7815, 7813, 0, 0, 0, 0, 7817,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 7832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7819, 7821, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7914, 7912, 0, 0, 7918, 0, 0, 0, 0, 0, 0, 7916, 0, 0, 0, 7920,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 263, 265, 0, 0, 0, 0, 0, 0, 267, 0, 0, 269, 0, 0, 0, 0, 0,
+ 0, 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 200, 201, 202, 0, 7868, 0, 274, 276, 0, 278, 203, 7866, 282,
+ 516, 518, 7864, 280, 7706, 0, 552, 0, 7704, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8136, 904, 0, 7960, 0, 7961, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 232, 233, 234, 0, 7869, 0, 275, 277, 0, 279, 235, 7867, 283,
+ 517, 519, 7865, 281, 7707, 0, 553, 0, 7705, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 7728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 488, 0, 0, 7730, 0, 0,
+ 0, 310, 0, 0, 7732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 8054, 943, 0, 7984, 0, 7985, 8145, 8144, 0, 0, 970, 0, 0, 0,
+ 0, 0, 0, 0, 8150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0
+ },
+ {
+ 0, 7994, 7996, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 7998, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3271, 0
+ },
+ {
+ 8096, 8034, 8036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 8038, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 496, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7890, 7888, 0, 0, 7894, 0, 0, 0, 0, 0, 0, 7892, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7901, 7899, 0, 0, 7905, 0, 0, 0, 0, 0, 0, 7903, 0, 0, 0, 7907,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 1037, 0, 0, 0, 0, 0, 1250, 1049, 0, 0, 1252, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 1218, 0, 0, 1245, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 8065, 7939, 7941, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 7943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 7765, 0, 0, 0, 0, 0, 0, 0, 7767, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 7804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7806, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 249, 250, 251, 0, 361, 0, 363, 365, 0, 0, 252, 7911, 468, 533,
+ 535, 7909, 371, 7797, 0, 0, 0, 7799, 0, 0, 0, 367, 0, 0, 0, 369,
+ 432, 7795, 0, 0, 0, 0
+ },
+ {
+ 0, 8146, 912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8151,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 1262, 1038, 0, 0, 1264, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1266, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 224, 225, 226, 0, 227, 0, 257, 259, 0, 551, 228, 7843, 462,
+ 513, 515, 7841, 261, 0, 0, 0, 0, 0, 0, 0, 0, 229, 0, 0, 7681, 0,
+ 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 262, 264, 0, 0, 0, 0, 0, 0, 266, 0, 0, 268, 0, 0, 0, 0, 0,
+ 0, 199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 7856, 7854, 0, 0, 7860, 0, 0, 0, 0, 0, 0, 7858, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1571
+ },
+};
+
+
+#define GetUniCharCompInfo(ch) (compGroupMap[(compPageMap[(((int)(ch)) & 0xffff) >> COMP_OFFSET_BITS] << COMP_OFFSET_BITS) | ((ch) & ((1 << COMP_OFFSET_BITS)-1))])
+
+#define CompSingleMask (1 << 16)
+#define CompMask ((1 << 16) - 1)
+
diff --git a/src/stringprep/uni_parse.tcl b/src/stringprep/uni_parse.tcl
index 7d6458f2..08eced10 100644
--- a/src/stringprep/uni_parse.tcl
+++ b/src/stringprep/uni_parse.tcl
@@ -28,7 +28,20 @@ namespace eval uni {
# unassigned character group
}
-proc uni::getValue {tables delta} {
+proc uni::getValue {i} {
+ variable casemap
+ variable casemap2
+ variable tablemap
+
+ set tables $tablemap($i)
+ if {[info exists casemap2($i)]} {
+ set multicase 1
+ set delta $casemap2($i)
+ } else {
+ set multicase 0
+ set delta $casemap($i)
+ }
+
set ac 0
set c11 0
set c21 0
@@ -57,6 +70,7 @@ proc uni::getValue {tables delta} {
($d1 << 4) |
($d2 << 5) |
($xnp << 6) |
+ ($multicase << 7) |
($delta << 16)}]
return $val
@@ -88,6 +102,8 @@ proc uni::addPage {info} {
proc uni::load_tables {data} {
variable casemap
+ variable casemap2
+ variable multicasemap
variable tablemap
for {set i 0} {$i <= 0xffff} {incr i} {
@@ -95,6 +111,7 @@ proc uni::load_tables {data} {
set tablemap($i) {}
}
+ set multicasemap {}
set table ""
foreach line [split $data \n] {
@@ -122,8 +139,30 @@ proc uni::load_tables {data} {
if {$from <= 0xffff && $to <= 0xffff} {
set casemap($from) [expr {$to - $from}]
}
+ } elseif {[regexp {^ ([[:xdigit:]]+); ([[:xdigit:]]+) ([[:xdigit:]]+);} $line \
+ temp from to1 to2]} {
+ scan $from %x from
+ scan $to1 %x to1
+ scan $to2 %x to2
+ if {$from <= 0xffff && \
+ $to1 <= 0xffff && $to2 <= 0xffff} {
+ set casemap2($from) [llength $multicasemap]
+ lappend multicasemap [list $to1 $to2]
+ }
+ } elseif {[regexp {^ ([[:xdigit:]]+); ([[:xdigit:]]+) ([[:xdigit:]]+) ([[:xdigit:]]+);} $line \
+ temp from to1 to2 to3]} {
+ scan $from %x from
+ scan $to1 %x to1
+ scan $to2 %x to2
+ scan $to3 %x to3
+ if {$from <= 0xffff && \
+ $to1 <= 0xffff && $to2 <= 0xffff && \
+ $to3 <= 0xffff} {
+ set casemap2($from) [llength $multicasemap]
+ lappend multicasemap [list $to1 $to2 $to3]
+ }
} else {
- # TODO
+ #puts "missed: $line"
}
} elseif {$table != "B.2"} {
@@ -169,7 +208,7 @@ proc uni::buildTables {} {
set next 0
for {set i 0} {$i <= 0xffff} {incr i} {
- set gIndex [getGroup [getValue $tablemap($i) $casemap($i)]]
+ set gIndex [getGroup [getValue $i]]
# Split character index into offset and page number
set offset [expr {$i & $mask}]
@@ -193,6 +232,7 @@ proc uni::main {} {
variable pages
variable groups
variable shift
+ variable multicasemap
if {$argc != 2} {
puts stderr "\nusage: $argv0 <datafile> <outdir>\n"
@@ -299,7 +339,9 @@ static unsigned char groupMap\[\] = {"
*
* Bit 6 D.2
*
- * Bits 7-15 Reserved for future use.
+ * Bit 7 Case maps to several characters
+ *
+ * Bits 8-15 Reserved for future use.
*
* Bits 16-31 Case delta: delta for case conversions. This should be the
* highest field so we can easily sign extend.
@@ -324,6 +366,24 @@ static int groups\[\] = {"
puts $f "};
/*
+ * Table for characters that lowercased to multiple ones
+ */
+
+static int multiCaseTable\[\]\[4\] = {"
+ set last [expr {[llength $multicasemap] - 1}]
+ for {set i 0} {$i <= $last} {incr i} {
+ set val [lindex $multicasemap $i]
+
+ set line " "
+ append line [format "{%d, %s}" [llength $val] [join $val ", "]]
+ if {$i != $last} {
+ append line ", "
+ }
+ puts $f $line
+ }
+ puts $f "};
+
+/*
* The following constants are used to determine the category of a
* Unicode character.
*/
@@ -335,6 +395,7 @@ static int groups\[\] = {"
#define D1Mask (1 << 4)
#define D2Mask (1 << 5)
#define XNPMask (1 << 6)
+#define MCMask (1 << 7)
/*
* The following macros extract the fields of the character info. The
@@ -345,6 +406,7 @@ static int groups\[\] = {"
#define GetCaseType(info) (((info) & 0xE0) >> 5)
#define GetCategory(info) ((info) & 0x1F)
#define GetDelta(info) (((info) > 0) ? ((info) >> 16) : (~(~((info)) >> 16)))
+#define GetMC(info) (multiCaseTable\[GetDelta(info)\])
/*
* This macro extracts the information about a character from the
diff --git a/src/stringprep/uni_parse2.tcl b/src/stringprep/uni_parse2.tcl
new file mode 100644
index 00000000..456b9d13
--- /dev/null
+++ b/src/stringprep/uni_parse2.tcl
@@ -0,0 +1,737 @@
+# uni_parse2.tcl --
+#
+# This program parses the UnicodeData file and generates the
+# corresponding uni_norm.c file with compressed character
+# data tables. The input to this program should be the latest
+# UnicodeData.txt and CompositionExclusions.txt files from:
+# ftp://ftp.unicode.org/Public/UNIDATA/
+#
+# Copyright (c) 1998-1999 by Scriptics Corporation.
+# All rights reserved.
+#
+# Modified for ejabberd by Alexey Shchepin
+#
+# RCS: @(#) $Id$
+
+
+namespace eval uni {
+ set cclass_shift 6
+ set decomp_shift 5
+ set comp_shift 5
+ set shift 5; # number of bits of data within a page
+ # This value can be adjusted to find the
+ # best split to minimize table size
+
+ variable pMap; # map from page to page index, each entry is
+ # an index into the pages table, indexed by
+ # page number
+ variable pages; # map from page index to page info, each
+ # entry is a list of indices into the groups
+ # table, the list is indexed by the offset
+ variable groups; # list of character info values, indexed by
+ # group number, initialized with the
+ # unassigned character group
+
+ variable categories {
+ Cn Lu Ll Lt Lm Lo Mn Me Mc Nd Nl No Zs Zl Zp
+ Cc Cf Co Cs Pc Pd Ps Pe Pi Pf Po Sm Sc Sk So
+ }; # Ordered list of character categories, must
+ # match the enumeration in the header file.
+
+ variable titleCount 0; # Count of the number of title case
+ # characters. This value is used in the
+ # regular expression code to allocate enough
+ # space for the title case variants.
+}
+
+proc uni::getValue {items index} {
+ variable categories
+ variable titleCount
+
+ # Extract character info
+
+ set category [lindex $items 2]
+ if {[scan [lindex $items 12] %4x toupper] == 1} {
+ set toupper [expr {$index - $toupper}]
+ } else {
+ set toupper {}
+ }
+ if {[scan [lindex $items 13] %4x tolower] == 1} {
+ set tolower [expr {$tolower - $index}]
+ } else {
+ set tolower {}
+ }
+ if {[scan [lindex $items 14] %4x totitle] == 1} {
+ set totitle [expr {$index - $totitle}]
+ } else {
+ set totitle {}
+ }
+
+ set categoryIndex [lsearch -exact $categories $category]
+ if {$categoryIndex < 0} {
+ puts "Unexpected character category: $index($category)"
+ set categoryIndex 0
+ } elseif {$category == "Lt"} {
+ incr titleCount
+ }
+
+ return "$categoryIndex,$toupper,$tolower,$totitle"
+}
+
+proc uni::getGroup {value} {
+ variable groups
+
+ set gIndex [lsearch -exact $groups $value]
+ if {$gIndex == -1} {
+ set gIndex [llength $groups]
+ lappend groups $value
+ }
+ return $gIndex
+}
+
+proc uni::addPage {info} {
+ variable pMap
+ variable pages
+
+ set pIndex [lsearch -exact $pages $info]
+ if {$pIndex == -1} {
+ set pIndex [llength $pages]
+ lappend pages $info
+ }
+ lappend pMap $pIndex
+ return
+}
+
+proc uni::addPage {map_var pages_var info} {
+ variable $map_var
+ variable $pages_var
+
+ set pIndex [lsearch -exact [set $pages_var] $info]
+ if {$pIndex == -1} {
+ set pIndex [llength [set $pages_var]]
+ lappend $pages_var $info
+ }
+ lappend $map_var $pIndex
+ return
+}
+
+proc uni::load_exclusions {data} {
+ variable exclusions
+
+ foreach line [split $data \n] {
+ if {$line == ""} continue
+
+ set items [split $line " "]
+
+ if {[lindex $items 0] == "#"} continue
+
+ scan [lindex $items 0] %x index
+
+ set exclusions($index) ""
+ }
+}
+
+proc uni::load_tables {data} {
+ variable cclass_map
+ variable decomp_map
+ variable comp_map
+ variable comp_first
+ variable comp_second
+ variable exclusions
+
+ foreach line [split $data \n] {
+ if {$line == ""} continue
+
+ set items [split $line \;]
+
+ scan [lindex $items 0] %x index
+ set cclass [lindex $items 3]
+ set decomp [lindex $items 5]
+
+ set cclass_map($index) $cclass
+ #set decomp_map($index) $cclass
+
+ if {$decomp != ""} {
+ if {[string index [lindex $decomp 0] 0] == "<"} {
+ set decomp1 [lreplace $decomp 0 0]
+ set decomp {}
+ foreach ch $decomp1 {
+ scan $ch %x ch
+ lappend decomp $ch
+ }
+ set decomp_map($index) $decomp
+ } else {
+ switch -- [llength $decomp] {
+ 1 {
+ scan $decomp %x ch
+ set decomp_map($index) $ch
+ }
+ 2 {
+ scan $decomp "%x %x" ch1 ch2
+ set decomp [list $ch1 $ch2]
+ set decomp_map($index) $decomp
+ # hackish
+ if {(![info exists cclass_map($ch1)] || \
+ $cclass_map($ch1) == 0) && \
+ ![info exists exclusions($index)]} {
+ if {[info exists comp_first($ch1)]} {
+ incr comp_first($ch1)
+ } else {
+ set comp_first($ch1) 1
+ }
+ if {[info exists comp_second($ch2)]} {
+ incr comp_second($ch2)
+ } else {
+ set comp_second($ch2) 1
+ }
+ set comp_map($decomp) $index
+ } else {
+ puts "Excluded $index"
+ }
+ }
+ default {
+ puts "Bad canonical decomposition: $line"
+ }
+ }
+ }
+
+ #puts "[format 0x%0.4x $index]\t$cclass\t$decomp_map($index)"
+ }
+ }
+ #puts [array get comp_first]
+ #puts [array get comp_second]
+}
+
+proc uni::buildTables {} {
+ variable cclass_shift
+ variable decomp_shift
+ variable comp_shift
+
+ variable cclass_map
+ variable cclass_pmap {}
+ variable cclass_pages {}
+ variable decomp_map
+ variable decomp_pmap {}
+ variable decomp_pages {}
+ variable decomp_list {}
+ variable comp_map
+ variable comp_pmap {}
+ variable comp_pages {}
+ variable comp_first
+ variable comp_second
+ variable comp_first_list {}
+ variable comp_second_list {}
+ variable comp_x_list {}
+ variable comp_y_list {}
+ variable comp_both_map {}
+
+ set cclass_info {}
+ set decomp_info {}
+ set comp_info {}
+
+ set cclass_mask [expr {(1 << $cclass_shift) - 1}]
+ set decomp_mask [expr {(1 << $decomp_shift) - 1}]
+ set comp_mask [expr {(1 << $comp_shift) - 1}]
+
+ foreach comp [array names comp_map] {
+ set ch1 [lindex $comp 0]
+ set ch2 [lindex $comp 1]
+
+ if {$comp_first($ch1) == 1} {
+ set i [llength $comp_first_list]
+ lappend comp_first_list [list $ch2 $comp_map($comp)]
+ set comp_info_map($ch1) [expr {$i | (1 << 16)}]
+ } elseif {$comp_second($ch2) == 1} {
+ set i [llength $comp_second_list]
+ lappend comp_second_list [list $ch1 $comp_map($comp)]
+ set comp_info_map($ch2) [expr {$i | (1 << 16)}]
+ } else {
+ if {[lsearch -exact $comp_x_list $ch1] < 0} {
+ set i [llength $comp_x_list]
+ lappend comp_x_list $ch1
+ set comp_info_map($ch1) $i
+ }
+ if {[lsearch -exact $comp_y_list $ch2] < 0} {
+ set i [llength $comp_y_list]
+ lappend comp_y_list $ch2
+ set comp_info_map($ch2) $i
+ }
+ }
+ }
+
+ set next 0
+
+ for {set i 0} {$i <= 0xffff} {incr i} {
+ #set gIndex [getGroup [getValue $i]]
+
+ set cclass_offset [expr {$i & $cclass_mask}]
+
+ if {[info exists cclass_map($i)]} {
+ set cclass $cclass_map($i)
+ } else {
+ set cclass 0
+ }
+ lappend cclass_info $cclass
+
+ if {$cclass_offset == $cclass_mask} {
+ addPage cclass_pmap cclass_pages $cclass_info
+ set cclass_info {}
+ }
+
+
+ set decomp_offset [expr {$i & $decomp_mask}]
+
+ if {[info exists decomp_map($i)]} {
+ set decomp $decomp_map($i)
+ if {[info exists decomp_used($decomp)]} {
+ lappend decomp_info $decomp_used($decomp)
+ } else {
+ set val [expr {([llength $decomp] << 16) + \
+ [llength $decomp_list]}]
+ #set val [expr {[llength $decomp_list]}]
+ lappend decomp_info $val
+ set decomp_used($decomp) $val
+ #puts "$val $decomp"
+ foreach d $decomp {
+ lappend decomp_list $d
+ }
+ }
+ } else {
+ lappend decomp_info -1
+ }
+
+ if {$decomp_offset == $decomp_mask} {
+ addPage decomp_pmap decomp_pages $decomp_info
+ set decomp_info {}
+ }
+
+
+ set comp_offset [expr {$i & $comp_mask}]
+
+ if {[info exists comp_info_map($i)]} {
+ set comp $comp_info_map($i)
+ } else {
+ set comp -1
+ }
+ lappend comp_info $comp
+
+ if {$comp_offset == $comp_mask} {
+ addPage comp_pmap comp_pages $comp_info
+ set comp_info {}
+ }
+ }
+
+ #puts [array get decomp_map]
+ #puts $decomp_list
+
+ return
+}
+
+proc uni::main {} {
+ global argc argv0 argv
+ variable cclass_shift
+ variable cclass_pmap
+ variable cclass_pages
+ variable decomp_shift
+ variable decomp_pmap
+ variable decomp_pages
+ variable decomp_list
+ variable comp_shift
+ variable comp_map
+ variable comp_pmap
+ variable comp_pages
+ variable comp_first_list
+ variable comp_second_list
+ variable comp_x_list
+ variable comp_y_list
+ variable pages
+ variable groups {}
+ variable titleCount
+
+ if {$argc != 3} {
+ puts stderr "\nusage: $argv0 <datafile> <exclusionsfile> <outdir>\n"
+ exit 1
+ }
+ set f [open [lindex $argv 1] r]
+ set data [read $f]
+ close $f
+
+ load_exclusions $data
+
+ set f [open [lindex $argv 0] r]
+ set data [read $f]
+ close $f
+
+ load_tables $data
+ buildTables
+ #puts "X = [llength $pMap] Y= [llength $pages] A= [llength $groups]"
+ #set size [expr {[llength $pMap] + [llength $pages]*(1<<$shift)}]
+ #puts "shift = 6, space = $size"
+ #puts "title case count = $titleCount"
+
+ set f [open [file join [lindex $argv 2] uni_norm.c] w]
+ fconfigure $f -translation lf
+ puts $f "/*
+ * uni_norm.c --
+ *
+ * Declarations of Unicode character information tables. This file is
+ * automatically generated by the uni_parse2.tcl script. Do not
+ * modify this file by hand.
+ *
+ * Copyright (c) 1998 by Scriptics Corporation.
+ * All rights reserved.
+ *
+ * Modified for ejabberd by Alexey Shchepin
+ *
+ * RCS: @(#) \$Id\$
+ */
+
+/*
+ * A 16-bit Unicode character is split into two parts in order to index
+ * into the following tables. The lower CCLASS_OFFSET_BITS comprise an offset
+ * into a page of characters. The upper bits comprise the page number.
+ */
+
+#define CCLASS_OFFSET_BITS $cclass_shift
+
+/*
+ * The pageMap is indexed by page number and returns an alternate page number
+ * that identifies a unique page of characters. Many Unicode characters map
+ * to the same alternate page number.
+ */
+
+static unsigned char cclassPageMap\[\] = {"
+ set line " "
+ set last [expr {[llength $cclass_pmap] - 1}]
+ for {set i 0} {$i <= $last} {incr i} {
+ append line [lindex $cclass_pmap $i]
+ if {$i != $last} {
+ append line ", "
+ }
+ if {[string length $line] > 70} {
+ puts $f $line
+ set line " "
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+/*
+ * The groupMap is indexed by combining the alternate page number with
+ * the page offset and returns a group number that identifies a unique
+ * set of character attributes.
+ */
+
+static unsigned char cclassGroupMap\[\] = {"
+ set line " "
+ set lasti [expr {[llength $cclass_pages] - 1}]
+ for {set i 0} {$i <= $lasti} {incr i} {
+ set page [lindex $cclass_pages $i]
+ set lastj [expr {[llength $page] - 1}]
+ for {set j 0} {$j <= $lastj} {incr j} {
+ append line [lindex $page $j]
+ if {$j != $lastj || $i != $lasti} {
+ append line ", "
+ }
+ if {[string length $line] > 70} {
+ puts $f $line
+ set line " "
+ }
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+/*
+ * Each group represents a unique set of character attributes. The attributes
+ * are encoded into a 32-bit value as follows:
+ *
+ * Bits 0-4 Character category: see the constants listed below.
+ *
+ * Bits 5-7 Case delta type: 000 = identity
+ * 010 = add delta for lower
+ * 011 = add delta for lower, add 1 for title
+ * 100 = sutract delta for title/upper
+ * 101 = sub delta for upper, sub 1 for title
+ * 110 = sub delta for upper, add delta for lower
+ *
+ * Bits 8-21 Reserved for future use.
+ *
+ * Bits 22-31 Case delta: delta for case conversions. This should be the
+ * highest field so we can easily sign extend.
+ */
+
+static int cclass_groups\[\] = {"
+ set line " "
+ set last [expr {[llength $groups] - 1}]
+ for {set i 0} {$i <= $last} {incr i} {
+ foreach {type toupper tolower totitle} [split [lindex $groups $i] ,] {}
+
+ # Compute the case conversion type and delta
+
+ if {$totitle != ""} {
+ if {$totitle == $toupper} {
+ # subtract delta for title or upper
+ set case 4
+ set delta $toupper
+ } elseif {$toupper != ""} {
+ # subtract delta for upper, subtract 1 for title
+ set case 5
+ set delta $toupper
+ } else {
+ # add delta for lower, add 1 for title
+ set case 3
+ set delta $tolower
+ }
+ } elseif {$toupper != ""} {
+ # subtract delta for upper, add delta for lower
+ set case 6
+ set delta $toupper
+ } elseif {$tolower != ""} {
+ # add delta for lower
+ set case 2
+ set delta $tolower
+ } else {
+ # noop
+ set case 0
+ set delta 0
+ }
+
+ set val [expr {($delta << 22) | ($case << 5) | $type}]
+
+ append line [format "%d" $val]
+ if {$i != $last} {
+ append line ", "
+ }
+ if {[string length $line] > 65} {
+ puts $f $line
+ set line " "
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+#define GetUniCharCClass(ch) (cclassGroupMap\[(cclassPageMap\[(((int)(ch)) & 0xffff) >> CCLASS_OFFSET_BITS\] << CCLASS_OFFSET_BITS) | ((ch) & ((1 << CCLASS_OFFSET_BITS)-1))\])
+
+
+#define DECOMP_OFFSET_BITS $decomp_shift
+
+/*
+ * The pageMap is indexed by page number and returns an alternate page number
+ * that identifies a unique page of characters. Many Unicode characters map
+ * to the same alternate page number.
+ */
+
+static unsigned char decompPageMap\[\] = {"
+ set line " "
+ set last [expr {[llength $decomp_pmap] - 1}]
+ for {set i 0} {$i <= $last} {incr i} {
+ append line [lindex $decomp_pmap $i]
+ if {$i != $last} {
+ append line ", "
+ }
+ if {[string length $line] > 70} {
+ puts $f $line
+ set line " "
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+/*
+ * The groupMap is indexed by combining the alternate page number with
+ * the page offset and returns a group number that identifies a unique
+ * set of character attributes.
+ */
+
+static int decompGroupMap\[\] = {"
+ set line " "
+ set lasti [expr {[llength $decomp_pages] - 1}]
+ for {set i 0} {$i <= $lasti} {incr i} {
+ set page [lindex $decomp_pages $i]
+ set lastj [expr {[llength $page] - 1}]
+ for {set j 0} {$j <= $lastj} {incr j} {
+ append line [lindex $page $j]
+ if {$j != $lastj || $i != $lasti} {
+ append line ", "
+ }
+ if {[string length $line] > 70} {
+ puts $f $line
+ set line " "
+ }
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+/*
+ * Each group represents a unique set of character attributes. The attributes...
+ */
+
+static int decompList\[\] = {"
+ set line " "
+ set last [expr {[llength $decomp_list] - 1}]
+ for {set i 0} {$i <= $last} {incr i} {
+ set val [lindex $decomp_list $i]
+
+ append line [format "%d" $val]
+ if {$i != $last} {
+ append line ", "
+ }
+ if {[string length $line] > 70} {
+ puts $f $line
+ set line " "
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+
+/*
+ * This macro extracts the information about a character from the
+ * Unicode character tables.
+ */
+
+//#define GetUniCharInfo(ch) (groups\[groupMap\[(pageMap\[(((int)(ch)) & 0xffff) >> CCLASS_OFFSET_BITS\] << CCLASS_OFFSET_BITS) | ((ch) & ((1 << CCLASS_OFFSET_BITS)-1))\]\])
+
+#define GetUniCharDecompInfo(ch) (decompGroupMap\[(decompPageMap\[(((int)(ch)) & 0xffff) >> DECOMP_OFFSET_BITS\] << DECOMP_OFFSET_BITS) | ((ch) & ((1 << DECOMP_OFFSET_BITS)-1))\])
+
+#define GetDecompShift(info) ((info) & 0xffff)
+#define GetDecompLen(info) ((info) >> 16)
+
+
+#define COMP_OFFSET_BITS $comp_shift
+
+/*
+ * The pageMap is indexed by page number and returns an alternate page number
+ * that identifies a unique page of characters. Many Unicode characters map
+ * to the same alternate page number.
+ */
+
+static unsigned char compPageMap\[\] = {"
+ set line " "
+ set last [expr {[llength $comp_pmap] - 1}]
+ for {set i 0} {$i <= $last} {incr i} {
+ append line [lindex $comp_pmap $i]
+ if {$i != $last} {
+ append line ", "
+ }
+ if {[string length $line] > 70} {
+ puts $f $line
+ set line " "
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+/*
+ * The groupMap is indexed by combining the alternate page number with
+ * the page offset and returns a group number that identifies a unique
+ * set of character attributes.
+ */
+
+static int compGroupMap\[\] = {"
+ set line " "
+ set lasti [expr {[llength $comp_pages] - 1}]
+ for {set i 0} {$i <= $lasti} {incr i} {
+ set page [lindex $comp_pages $i]
+ set lastj [expr {[llength $page] - 1}]
+ for {set j 0} {$j <= $lastj} {incr j} {
+ append line [lindex $page $j]
+ if {$j != $lastj || $i != $lasti} {
+ append line ", "
+ }
+ if {[string length $line] > 70} {
+ puts $f $line
+ set line " "
+ }
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+/*
+ * ...
+ */
+
+static int compFirstList\[\]\[2\] = {"
+ set line " "
+ set last [expr {[llength $comp_first_list] - 1}]
+ for {set i 0} {$i <= $last} {incr i} {
+ set val [lindex $comp_first_list $i]
+
+ append line [format "{%d, %d}" [lindex $val 0] [lindex $val 1]]
+ if {$i != $last} {
+ append line ", "
+ }
+ if {[string length $line] > 60} {
+ puts $f $line
+ set line " "
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+static int compSecondList\[\]\[2\] = {"
+ set line " "
+ set last [expr {[llength $comp_second_list] - 1}]
+ for {set i 0} {$i <= $last} {incr i} {
+ set val [lindex $comp_second_list $i]
+
+ append line [format "{%d, %d}" [lindex $val 0] [lindex $val 1]]
+ if {$i != $last} {
+ append line ", "
+ }
+ if {[string length $line] > 60} {
+ puts $f $line
+ set line " "
+ }
+ }
+ puts $f $line
+ puts $f "};
+
+static int compBothList\[[llength $comp_x_list]\]\[[llength $comp_y_list]\] = {"
+ set lastx [expr {[llength $comp_x_list] - 1}]
+ set lasty [expr {[llength $comp_y_list] - 1}]
+ for {set i 0} {$i <= $lastx} {incr i} {
+ puts $f " \{"
+ set line " "
+ for {set j 0} {$j <= $lasty} {incr j} {
+ set comp [list [lindex $comp_x_list $i] [lindex $comp_y_list $j]]
+ if {[info exists comp_map($comp)]} {
+ set val $comp_map($comp)
+ } else {
+ set val 0
+ }
+
+ append line [format "%d" $val]
+ if {$j != $lasty} {
+ append line ", "
+ }
+ if {[string length $line] > 70} {
+ puts $f $line
+ set line " "
+ }
+ }
+ puts $f $line
+ if {$j != $lasty} {
+ puts $f " \},"
+ } else {
+ puts $f " \}"
+ }
+ }
+ puts $f "};
+
+
+#define GetUniCharCompInfo(ch) (compGroupMap\[(compPageMap\[(((int)(ch)) & 0xffff) >> COMP_OFFSET_BITS\] << COMP_OFFSET_BITS) | ((ch) & ((1 << COMP_OFFSET_BITS)-1))\])
+
+#define CompSingleMask (1 << 16)
+#define CompMask ((1 << 16) - 1)
+"
+
+ close $f
+}
+
+uni::main
+
+return