[PATCH 2/3] libs/port/compose.c: Implement canonical composition for use in normalization.

Sergio Gómez Del Real sdelreal at codeweavers.com
Sat Mar 24 18:25:12 CDT 2018


Signed-off-by: Sergio Gómez Del Real <sdelreal at codeweavers.com>
---
 libs/port/compose.c   |   60 ++
 libs/port/decompose.c | 1476 +++++++++++++++++++++++++++++++++++++++++++++++++
 tools/make_unicode    |  306 +++++++++-
 3 files changed, 1841 insertions(+), 1 deletion(-)

diff --git a/libs/port/compose.c b/libs/port/compose.c
index 71589f47c1..77ad4026ee 100644
--- a/libs/port/compose.c
+++ b/libs/port/compose.c
@@ -380,6 +380,8 @@ static const WCHAR table[0x85e] =
     0x30d8, 0x30da, 0x30db, 0x30dd
 };
 
+#include "decompose.c"
+
 static inline int binary_search( WCHAR ch, int low, int high )
 {
     while (low <= high)
@@ -403,3 +405,61 @@ WCHAR DECLSPEC_HIDDEN wine_compose( const WCHAR *str )
         count = table[2 * pos + 3];
     }
 }
+
+static inline int is_blocked(WCHAR *ptr1, WCHAR *ptr2)
+{
+    if (ptr1 >= ptr2) return -1;
+
+    while (++ptr1 < ptr2)
+    {
+        const WCHAR *map1, *map2;
+        map1 = unicode_table_lookup( *ptr1, 0, idx1_comb, 8, idx2_comb, 4,
+                                     offsets_comb, 4, data_comb, 0 );
+        map2 = unicode_table_lookup( *ptr2, 0, idx1_comb, 8, idx2_comb, 4,
+                                     offsets_comb, 4, data_comb, 0 );
+        if (*map1 == 0 || *map2 <= *map1) return 1;
+    }
+    return 0;
+}
+
+static inline int is_fullexcl(WCHAR ch)
+{
+    const WCHAR *map;
+    map = unicode_table_lookup( ch, 0, idx1_fullcomp, 8, idx2_fullcomp, 4,
+                                offsets_fullcomp, 4, data_fullcomp, 0 );
+    return (int)*map;
+}
+
+UINT unicode_canonical_composition( WCHAR *str, UINT strlen )
+{
+    int i, j;
+    WCHAR dum[3] = {0};
+
+    if (strlen == 0) strlen = strlenW( str );
+
+    for (i = 1; i <= strlen; i++)
+    {
+        WCHAR *scratch = str+i, comp;
+        if (*scratch == 0) break;
+        for (scratch = str+i; scratch - str > 0; --scratch)
+        {
+            if (is_starter(*scratch)) break;
+        }
+        if (!is_starter(*scratch)) continue;
+        if (is_blocked( scratch, str+i )) continue;
+        dum[0] = *scratch;
+        dum[1] = str[i];
+        comp = wine_compose( dum );
+        if (comp == 0) continue;
+        if (is_fullexcl( comp )) continue;
+        *scratch = comp; // replace
+        for (j = i; j < strlen-1; j++)
+        {
+            str[j] = str[j+1];
+        }
+        strlen--;
+        i--;
+    }
+
+    return strlen;
+}
diff --git a/libs/port/decompose.c b/libs/port/decompose.c
index 9f77802c88..de237d16b1 100644
--- a/libs/port/decompose.c
+++ b/libs/port/decompose.c
@@ -3994,6 +3994,1434 @@ static const USHORT offsets_decomp[15296] =
     0x118e, 0x118e, 0x28c4, 0x28c4, 0x0000, 0x0000, 0x0000, 0x0000
 };
 
+static const WCHAR data_comb[827] =
+{
+    0x0000, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0232, 0x0220,
+    0x0220, 0x0220, 0x0220, 0x0232, 0x0216, 0x0220, 0x0220, 0x0220,
+    0x0220, 0x0220, 0x0202, 0x0202, 0x0220, 0x0220, 0x0220, 0x0220,
+    0x0202, 0x0202, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220,
+    0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0220, 0x0220, 0x0220, 0x0220, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0240, 0x0230,
+    0x0220, 0x0220, 0x0220, 0x0230, 0x0230, 0x0230, 0x0220, 0x0220,
+    0x0230, 0x0230, 0x0230, 0x0220, 0x0220, 0x0220, 0x0220, 0x0230,
+    0x0232, 0x0220, 0x0220, 0x0230, 0x0233, 0x0234, 0x0234, 0x0233,
+    0x0234, 0x0234, 0x0233, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0230, 0x0222, 0x0220,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0220,
+    0x0220, 0x0220, 0x0220, 0x0220, 0x0230, 0x0230, 0x0220, 0x0230,
+    0x0230, 0x0222, 0x0228, 0x0230, 0x0010, 0x0011, 0x0012, 0x0013,
+    0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x0019, 0x0020,
+    0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0230, 0x0220, 0x0018,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0030, 0x0031, 0x0032, 0x0027, 0x0028, 0x0029, 0x0030, 0x0031,
+    0x0032, 0x0033, 0x0034, 0x0230, 0x0230, 0x0220, 0x0220, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0220,
+    0x0035, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0230,
+    0x0220, 0x0230, 0x0230, 0x0220, 0x0036, 0x0230, 0x0220, 0x0230,
+    0x0230, 0x0220, 0x0230, 0x0230, 0x0220, 0x0220, 0x0220, 0x0230,
+    0x0220, 0x0220, 0x0230, 0x0220, 0x0230, 0x0230, 0x0230, 0x0220,
+    0x0230, 0x0220, 0x0230, 0x0220, 0x0230, 0x0220, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0220,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0220,
+    0x0220, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0220,
+    0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0220, 0x0230, 0x0230,
+    0x0230, 0x0220, 0x0220, 0x0220, 0x0027, 0x0028, 0x0029, 0x0230,
+    0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0220, 0x0220, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0007, 0x0009, 0x0230, 0x0220,
+    0x0230, 0x0230, 0x0007, 0x0009, 0x0007, 0x0009, 0x0007, 0x0009,
+    0x0007, 0x0009, 0x0009, 0x0009, 0x0084, 0x0091, 0x0007, 0x0009,
+    0x0009, 0x0009, 0x0009, 0x0009, 0x0103, 0x0103, 0x0009, 0x0107,
+    0x0107, 0x0107, 0x0107, 0x0118, 0x0118, 0x0122, 0x0122, 0x0122,
+    0x0122, 0x0220, 0x0220, 0x0220, 0x0220, 0x0216, 0x0129, 0x0130,
+    0x0132, 0x0130, 0x0130, 0x0130, 0x0130, 0x0130, 0x0230, 0x0230,
+    0x0009, 0x0230, 0x0230, 0x0220, 0x0007, 0x0009, 0x0009, 0x0220,
+    0x0230, 0x0230, 0x0230, 0x0009, 0x0009, 0x0009, 0x0230, 0x0228,
+    0x0222, 0x0230, 0x0220, 0x0230, 0x0220, 0x0009, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0220, 0x0220, 0x0220,
+    0x0220, 0x0220, 0x0230, 0x0230, 0x0220, 0x0007, 0x0009, 0x0230,
+    0x0220, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0009, 0x0009, 0x0007, 0x0009, 0x0009, 0x0007, 0x0230, 0x0230,
+    0x0230, 0x0001, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0230,
+    0x0230, 0x0220, 0x0220, 0x0220, 0x0220, 0x0230, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0220, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0234, 0x0214,
+    0x0220, 0x0202, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0232,
+    0x0228, 0x0228, 0x0220, 0x0230, 0x0233, 0x0220, 0x0230, 0x0220,
+    0x0230, 0x0230, 0x0001, 0x0001, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0001, 0x0001, 0x0001, 0x0230, 0x0230, 0x0230, 0x0001, 0x0001,
+    0x0230, 0x0220, 0x0230, 0x0001, 0x0001, 0x0220, 0x0220, 0x0220,
+    0x0220, 0x0230, 0x0230, 0x0230, 0x0230, 0x0009, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0218, 0x0228,
+    0x0232, 0x0222, 0x0224, 0x0224, 0x0008, 0x0008, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0009, 0x0009, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0220, 0x0220, 0x0220, 0x0009, 0x0007, 0x0009, 0x0230,
+    0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0009, 0x0009, 0x0026, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220,
+    0x0220, 0x0230, 0x0230, 0x0220, 0x0220, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0220, 0x0230, 0x0230, 0x0001, 0x0220, 0x0009,
+    0x0230, 0x0220, 0x0009, 0x0009, 0x0009, 0x0007, 0x0230, 0x0230,
+    0x0230, 0x0009, 0x0009, 0x0007, 0x0009, 0x0007, 0x0009, 0x0007,
+    0x0007, 0x0009, 0x0007, 0x0009, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0009, 0x0007, 0x0009, 0x0007, 0x0009, 0x0007, 0x0009, 0x0009,
+    0x0007, 0x0009, 0x0009, 0x0009, 0x0009, 0x0009, 0x0007, 0x0009,
+    0x0009, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0001, 0x0216, 0x0216,
+    0x0001, 0x0001, 0x0001, 0x0226, 0x0216, 0x0216, 0x0216, 0x0216,
+    0x0216, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220, 0x0220,
+    0x0220, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0220,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0230, 0x0230, 0x0230, 0x0220, 0x0220, 0x0220,
+    0x0220, 0x0220, 0x0220, 0x0220, 0x0230, 0x0230, 0x0230, 0x0230,
+    0x0230, 0x0230, 0x0007
+};
+
+static const BYTE idx1_comb[490] =
+{
+    0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,
+    0x0e, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x10,
+    0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x00, 0x00,
+    0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x18, 0x19, 0x00, 0x00,
+    0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00,
+    0x1c, 0x1d, 0x1e, 0x1f, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x21, 0x00,
+    0x00, 0x22, 0x23, 0x24, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d,
+    0x00, 0x00, 0x2e, 0x00, 0x2f, 0x30, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x31, 0x32, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x37, 0x38
+};
+
+static const USHORT idx2_comb[912] =
+{
+    /* all-zero 256-char blocks get mapped to here */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x01 */
+    0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x02 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x03 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0009, 0x000a, 0x000b, 0x000c, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x04 */
+    0x0000, 0x000d, 0x0000, 0x0000, 0x000e, 0x000f, 0x0000, 0x0010,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0011, 0x0012, 0x0000,
+    /* sub-index 0x05 */
+    0x0000, 0x0013, 0x0000, 0x0014, 0x0015, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0016, 0x0017,
+    /* sub-index 0x06 */
+    0x0000, 0x0018, 0x0019, 0x0000, 0x0000, 0x001a, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001b, 0x001c, 0x001d,
+    /* sub-index 0x07 */
+    0x0000, 0x0000, 0x0000, 0x001e, 0x001f, 0x0020, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0021, 0x0022, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x08 */
+    0x0000, 0x0000, 0x0000, 0x0023, 0x0024, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0025, 0x0026, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x09 */
+    0x0000, 0x0000, 0x0000, 0x0027, 0x0028, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0029, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0a */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x002a, 0x002b, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x002c, 0x002d, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0b */
+    0x0000, 0x0000, 0x0000, 0x002e, 0x002f, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0030, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0c */
+    0x0000, 0x0000, 0x0000, 0x0031, 0x0032, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0033, 0x0034, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0d */
+    0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0000, 0x0000, 0x0037,
+    0x0038, 0x0000, 0x0000, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0e */
+    0x0000, 0x0000, 0x0000, 0x003a, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x003b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003c, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x10 */
+    0x0000, 0x003d, 0x0000, 0x003e, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003f, 0x0000, 0x0000,
+    /* sub-index 0x11 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0040, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x12 */
+    0x0000, 0x0000, 0x0000, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x13 */
+    0x0000, 0x0042, 0x0000, 0x0000, 0x0000, 0x0000, 0x0043, 0x0044,
+    0x0000, 0x0000, 0x0000, 0x0045, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x14 */
+    0x0000, 0x0000, 0x0000, 0x0046, 0x0047, 0x0000, 0x0048, 0x0049,
+    0x0000, 0x0000, 0x004a, 0x0000, 0x0000, 0x0000, 0x004b, 0x004c,
+    /* sub-index 0x15 */
+    0x0000, 0x0000, 0x0000, 0x004d, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x004e, 0x004f, 0x0050,
+    /* sub-index 0x16 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0051, 0x0052, 0x0053, 0x0054,
+    /* sub-index 0x17 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0055, 0x0056, 0x0057,
+    /* sub-index 0x18 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0058, 0x0059,
+    /* sub-index 0x19 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005a,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005b, 0x005c,
+    /* sub-index 0x1a */
+    0x0000, 0x0000, 0x005d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x005e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x1b */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x005f, 0x0060,
+    0x0000, 0x0061, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0062,
+    /* sub-index 0x1c */
+    0x0063, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0064, 0x0000, 0x0065, 0x0066,
+    /* sub-index 0x1d */
+    0x0000, 0x0000, 0x0067, 0x0000, 0x0000, 0x0068, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0069, 0x006a, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x1e */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x006b, 0x006c, 0x0000, 0x0000, 0x006d,
+    /* sub-index 0x1f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x006e, 0x0000,
+    /* sub-index 0x20 */
+    0x0000, 0x006f, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x21 */
+    0x0000, 0x0000, 0x0070, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x22 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0071,
+    /* sub-index 0x23 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0072, 0x0000,
+    /* sub-index 0x24 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0073,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x25 */
+    0x0074, 0x0000, 0x0000, 0x0075, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0076, 0x0000,
+    /* sub-index 0x26 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0077, 0x0000, 0x0000, 0x0078,
+    0x0000, 0x0000, 0x0000, 0x0079, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x27 */
+    0x007a, 0x0000, 0x0000, 0x007b, 0x0000, 0x0000, 0x0000, 0x007c,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x007d, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x28 */
+    0x0000, 0x0000, 0x0000, 0x007e, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x007f, 0x0000,
+    /* sub-index 0x29 */
+    0x0000, 0x0000, 0x0000, 0x0080, 0x0081, 0x0000, 0x0082, 0x0083,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x2a */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0084, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0085, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x2b */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0086, 0x0087, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x2c */
+    0x0000, 0x0000, 0x0000, 0x0088, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0089, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x2d */
+    0x0000, 0x0000, 0x008a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x2e */
+    0x0000, 0x0000, 0x0000, 0x008b, 0x008c, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x008d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x2f */
+    0x0000, 0x0000, 0x0000, 0x008e, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x30 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x008f, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x31 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0090,
+    /* sub-index 0x32 */
+    0x0000, 0x0000, 0x0000, 0x0091, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x33 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0092, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x34 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0093, 0x0094,
+    0x0095, 0x0000, 0x0096, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x35 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0097, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x36 */
+    0x0098, 0x0099, 0x009a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x37 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x009b, 0x0000, 0x0000,
+    /* sub-index 0x38 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x009c, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+static const USHORT offsets_comb[2512] =
+{
+    /* all-zero 16-char blocks get mapped to here */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0300 .. 0x030f */
+    0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008,
+    0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010,
+    /* 0x0310 .. 0x031f */
+    0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018,
+    0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020,
+    /* 0x0320 .. 0x032f */
+    0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028,
+    0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030,
+    /* 0x0330 .. 0x033f */
+    0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038,
+    0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f, 0x0040,
+    /* 0x0340 .. 0x034f */
+    0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
+    0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0000,
+    /* 0x0350 .. 0x035f */
+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+    0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+    /* 0x0360 .. 0x036f */
+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+    0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+    /* 0x0480 .. 0x048f */
+    0x0000, 0x0000, 0x0000, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0590 .. 0x059f */
+    0x0000, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007a, 0x007b,
+    0x007c, 0x007d, 0x007e, 0x007f, 0x0080, 0x0081, 0x0082, 0x0083,
+    /* 0x05a0 .. 0x05af */
+    0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008a, 0x008b,
+    0x008c, 0x008d, 0x008e, 0x008f, 0x0090, 0x0091, 0x0092, 0x0093,
+    /* 0x05b0 .. 0x05bf */
+    0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009a, 0x009b,
+    0x009c, 0x009d, 0x009e, 0x009f, 0x00a0, 0x00a1, 0x0000, 0x00a2,
+    /* 0x05c0 .. 0x05cf */
+    0x0000, 0x00a3, 0x00a4, 0x0000, 0x00a5, 0x00a6, 0x0000, 0x00a7,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0610 .. 0x061f */
+    0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+    0x00b0, 0x00b1, 0x00b2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0640 .. 0x064f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+    /* 0x0650 .. 0x065f */
+    0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+    /* 0x0670 .. 0x067f */
+    0x00c8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x06d0 .. 0x06df */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00c9, 0x00ca,
+    0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, 0x0000, 0x0000, 0x00d0,
+    /* 0x06e0 .. 0x06ef */
+    0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x0000, 0x0000, 0x00d6,
+    0x00d7, 0x0000, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x0000, 0x0000,
+    /* 0x0710 .. 0x071f */
+    0x0000, 0x00dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0730 .. 0x073f */
+    0x00dd, 0x00de, 0x00df, 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4,
+    0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec,
+    /* 0x0740 .. 0x074f */
+    0x00ed, 0x00ee, 0x00ef, 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4,
+    0x00f5, 0x00f6, 0x00f7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x07e0 .. 0x07ef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc,
+    /* 0x07f0 .. 0x07ff */
+    0x00fd, 0x00fe, 0x00ff, 0x0100, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0810 .. 0x081f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0101, 0x0102,
+    0x0103, 0x0104, 0x0000, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109,
+    /* 0x0820 .. 0x082f */
+    0x010a, 0x010b, 0x010c, 0x010d, 0x0000, 0x010e, 0x010f, 0x0110,
+    0x0000, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0000, 0x0000,
+    /* 0x0850 .. 0x085f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0116, 0x0117, 0x0118, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x08d0 .. 0x08df */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0119, 0x011a, 0x011b, 0x011c,
+    0x011d, 0x011e, 0x011f, 0x0120, 0x0121, 0x0122, 0x0123, 0x0124,
+    /* 0x08e0 .. 0x08ef */
+    0x0125, 0x0126, 0x0000, 0x0127, 0x0128, 0x0129, 0x012a, 0x012b,
+    0x012c, 0x012d, 0x012e, 0x012f, 0x0130, 0x0131, 0x0132, 0x0133,
+    /* 0x08f0 .. 0x08ff */
+    0x0134, 0x0135, 0x0136, 0x0137, 0x0138, 0x0139, 0x013a, 0x013b,
+    0x013c, 0x013d, 0x013e, 0x013f, 0x0140, 0x0141, 0x0142, 0x0143,
+    /* 0x0930 .. 0x093f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0144, 0x0000, 0x0000, 0x0000,
+    /* 0x0940 .. 0x094f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0145, 0x0000, 0x0000,
+    /* 0x0950 .. 0x095f */
+    0x0000, 0x0146, 0x0147, 0x0148, 0x0149, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x09b0 .. 0x09bf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x014a, 0x0000, 0x0000, 0x0000,
+    /* 0x09c0 .. 0x09cf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x014b, 0x0000, 0x0000,
+    /* 0x0a30 .. 0x0a3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x014c, 0x0000, 0x0000, 0x0000,
+    /* 0x0a40 .. 0x0a4f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x014d, 0x0000, 0x0000,
+    /* 0x0ab0 .. 0x0abf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x014e, 0x0000, 0x0000, 0x0000,
+    /* 0x0ac0 .. 0x0acf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x014f, 0x0000, 0x0000,
+    /* 0x0b30 .. 0x0b3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0150, 0x0000, 0x0000, 0x0000,
+    /* 0x0b40 .. 0x0b4f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0151, 0x0000, 0x0000,
+    /* 0x0bc0 .. 0x0bcf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0152, 0x0000, 0x0000,
+    /* 0x0c40 .. 0x0c4f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0153, 0x0000, 0x0000,
+    /* 0x0c50 .. 0x0c5f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0154, 0x0155, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0cb0 .. 0x0cbf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0156, 0x0000, 0x0000, 0x0000,
+    /* 0x0cc0 .. 0x0ccf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0157, 0x0000, 0x0000,
+    /* 0x0d30 .. 0x0d3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0158, 0x0159, 0x0000, 0x0000, 0x0000,
+    /* 0x0d40 .. 0x0d4f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x015a, 0x0000, 0x0000,
+    /* 0x0dc0 .. 0x0dcf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x015b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0e30 .. 0x0e3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x015c, 0x015d, 0x015e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0e40 .. 0x0e4f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x015f, 0x0160, 0x0161, 0x0162, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0eb0 .. 0x0ebf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0163, 0x0164, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0ec0 .. 0x0ecf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0165, 0x0166, 0x0167, 0x0168, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0f10 .. 0x0f1f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0169, 0x016a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0f30 .. 0x0f3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x016b, 0x0000, 0x016c,
+    0x0000, 0x016d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0f70 .. 0x0f7f */
+    0x0000, 0x016e, 0x016f, 0x0000, 0x0170, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0171, 0x0172, 0x0173, 0x0174, 0x0000, 0x0000,
+    /* 0x0f80 .. 0x0f8f */
+    0x0175, 0x0000, 0x0176, 0x0177, 0x0178, 0x0000, 0x0179, 0x017a,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0fc0 .. 0x0fcf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x017b, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1030 .. 0x103f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x017c,
+    0x0000, 0x017d, 0x017e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1080 .. 0x108f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x017f, 0x0000, 0x0000,
+    /* 0x1350 .. 0x135f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0181, 0x0182,
+    /* 0x1710 .. 0x171f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0183, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1730 .. 0x173f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0184, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x17d0 .. 0x17df */
+    0x0000, 0x0000, 0x0185, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0186, 0x0000, 0x0000,
+    /* 0x18a0 .. 0x18af */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0187, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1930 .. 0x193f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0188, 0x0189, 0x018a, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1a10 .. 0x1a1f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x018b,
+    0x018c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1a60 .. 0x1a6f */
+    0x018d, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1a70 .. 0x1a7f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x018e, 0x018f, 0x0190,
+    0x0191, 0x0192, 0x0193, 0x0194, 0x0195, 0x0000, 0x0000, 0x0196,
+    /* 0x1ab0 .. 0x1abf */
+    0x0197, 0x0198, 0x0199, 0x019a, 0x019b, 0x019c, 0x019d, 0x019e,
+    0x019f, 0x01a0, 0x01a1, 0x01a2, 0x01a3, 0x01a4, 0x0000, 0x0000,
+    /* 0x1b30 .. 0x1b3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x01a5, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1b40 .. 0x1b4f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x01a6, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1b60 .. 0x1b6f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x01a7, 0x01a8, 0x01a9, 0x01aa, 0x01ab,
+    /* 0x1b70 .. 0x1b7f */
+    0x01ac, 0x01ad, 0x01ae, 0x01af, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1ba0 .. 0x1baf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x01b0, 0x01b1, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1be0 .. 0x1bef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01b2, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1bf0 .. 0x1bff */
+    0x0000, 0x0000, 0x01b3, 0x01b4, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1c30 .. 0x1c3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01b5,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1cd0 .. 0x1cdf */
+    0x01b6, 0x01b7, 0x01b8, 0x0000, 0x01b9, 0x01ba, 0x01bb, 0x01bc,
+    0x01bd, 0x01be, 0x01bf, 0x01c0, 0x01c1, 0x01c2, 0x01c3, 0x01c4,
+    /* 0x1ce0 .. 0x1cef */
+    0x01c5, 0x0000, 0x01c6, 0x01c7, 0x01c8, 0x01c9, 0x01ca, 0x01cb,
+    0x01cc, 0x0000, 0x0000, 0x0000, 0x0000, 0x01cd, 0x0000, 0x0000,
+    /* 0x1cf0 .. 0x1cff */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x01ce, 0x0000, 0x0000, 0x0000,
+    0x01cf, 0x01d0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1dc0 .. 0x1dcf */
+    0x01d1, 0x01d2, 0x01d3, 0x01d4, 0x01d5, 0x01d6, 0x01d7, 0x01d8,
+    0x01d9, 0x01da, 0x01db, 0x01dc, 0x01dd, 0x01de, 0x01df, 0x01e0,
+    /* 0x1dd0 .. 0x1ddf */
+    0x01e1, 0x01e2, 0x01e3, 0x01e4, 0x01e5, 0x01e6, 0x01e7, 0x01e8,
+    0x01e9, 0x01ea, 0x01eb, 0x01ec, 0x01ed, 0x01ee, 0x01ef, 0x01f0,
+    /* 0x1de0 .. 0x1def */
+    0x01f1, 0x01f2, 0x01f3, 0x01f4, 0x01f5, 0x01f6, 0x01f7, 0x01f8,
+    0x01f9, 0x01fa, 0x01fb, 0x01fc, 0x01fd, 0x01fe, 0x01ff, 0x0200,
+    /* 0x1df0 .. 0x1dff */
+    0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208,
+    0x0209, 0x020a, 0x0000, 0x020b, 0x020c, 0x020d, 0x020e, 0x020f,
+    /* 0x20d0 .. 0x20df */
+    0x0210, 0x0211, 0x0212, 0x0213, 0x0214, 0x0215, 0x0216, 0x0217,
+    0x0218, 0x0219, 0x021a, 0x021b, 0x021c, 0x0000, 0x0000, 0x0000,
+    /* 0x20e0 .. 0x20ef */
+    0x0000, 0x021d, 0x0000, 0x0000, 0x0000, 0x021e, 0x021f, 0x0220,
+    0x0221, 0x0222, 0x0223, 0x0224, 0x0225, 0x0226, 0x0227, 0x0228,
+    /* 0x20f0 .. 0x20ff */
+    0x0229, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2ce0 .. 0x2cef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x022a,
+    /* 0x2cf0 .. 0x2cff */
+    0x022b, 0x022c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2d70 .. 0x2d7f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x022d,
+    /* 0x2de0 .. 0x2def */
+    0x022e, 0x022f, 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, 0x0235,
+    0x0236, 0x0237, 0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x023d,
+    /* 0x2df0 .. 0x2dff */
+    0x023e, 0x023f, 0x0240, 0x0241, 0x0242, 0x0243, 0x0244, 0x0245,
+    0x0246, 0x0247, 0x0248, 0x0249, 0x024a, 0x024b, 0x024c, 0x024d,
+    /* 0x3020 .. 0x302f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x024e, 0x024f, 0x0250, 0x0251, 0x0252, 0x0253,
+    /* 0x3090 .. 0x309f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0254, 0x0255, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xa660 .. 0xa66f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0256,
+    /* 0xa670 .. 0xa67f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0257, 0x0258, 0x0259, 0x025a,
+    0x025b, 0x025c, 0x025d, 0x025e, 0x025f, 0x0260, 0x0000, 0x0000,
+    /* 0xa690 .. 0xa69f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0261, 0x0262,
+    /* 0xa6f0 .. 0xa6ff */
+    0x0263, 0x0264, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xa800 .. 0xa80f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0265, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xa8c0 .. 0xa8cf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0266, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xa8e0 .. 0xa8ef */
+    0x0267, 0x0268, 0x0269, 0x026a, 0x026b, 0x026c, 0x026d, 0x026e,
+    0x026f, 0x0270, 0x0271, 0x0272, 0x0273, 0x0274, 0x0275, 0x0276,
+    /* 0xa8f0 .. 0xa8ff */
+    0x0277, 0x0278, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xa920 .. 0xa92f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0279, 0x027a, 0x027b, 0x0000, 0x0000,
+    /* 0xa950 .. 0xa95f */
+    0x0000, 0x0000, 0x0000, 0x027c, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xa9b0 .. 0xa9bf */
+    0x0000, 0x0000, 0x0000, 0x027d, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xa9c0 .. 0xa9cf */
+    0x027e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xaab0 .. 0xaabf */
+    0x027f, 0x0000, 0x0280, 0x0281, 0x0282, 0x0000, 0x0000, 0x0283,
+    0x0284, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0285, 0x0286,
+    /* 0xaac0 .. 0xaacf */
+    0x0000, 0x0287, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xaaf0 .. 0xaaff */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0288, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xabe0 .. 0xabef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0289, 0x0000, 0x0000,
+    /* 0xfb10 .. 0xfb1f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x028a, 0x0000,
+    /* 0xfe20 .. 0xfe2f */
+    0x028b, 0x028c, 0x028d, 0x028e, 0x028f, 0x0290, 0x0291, 0x0292,
+    0x0293, 0x0294, 0x0295, 0x0296, 0x0297, 0x0298, 0x0299, 0x029a,
+    /* 0x101f0 .. 0x101ff */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x029b, 0x0000, 0x0000,
+    /* 0x102e0 .. 0x102ef */
+    0x029c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x10370 .. 0x1037f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x029d, 0x029e,
+    0x029f, 0x02a0, 0x02a1, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x10a00 .. 0x10a0f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a2, 0x0000, 0x02a3,
+    /* 0x10a30 .. 0x10a3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x02a4, 0x02a5, 0x02a6, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a7,
+    /* 0x10ae0 .. 0x10aef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02a8, 0x02a9, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11040 .. 0x1104f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02aa, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11070 .. 0x1107f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02ab,
+    /* 0x110b0 .. 0x110bf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x02ac, 0x02ad, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11100 .. 0x1110f */
+    0x02ae, 0x02af, 0x02b0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11130 .. 0x1113f */
+    0x0000, 0x0000, 0x0000, 0x02b1, 0x02b2, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11170 .. 0x1117f */
+    0x0000, 0x0000, 0x0000, 0x02b3, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x111c0 .. 0x111cf */
+    0x02b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x02b5, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11230 .. 0x1123f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02b6, 0x02b7, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x112e0 .. 0x112ef */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x02b8, 0x02b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11330 .. 0x1133f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x02ba, 0x0000, 0x0000, 0x0000,
+    /* 0x11340 .. 0x1134f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02bb, 0x0000, 0x0000,
+    /* 0x11360 .. 0x1136f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02bc, 0x02bd,
+    0x02be, 0x02bf, 0x02c0, 0x02c1, 0x02c2, 0x0000, 0x0000, 0x0000,
+    /* 0x11370 .. 0x1137f */
+    0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11440 .. 0x1144f */
+    0x0000, 0x0000, 0x02c8, 0x0000, 0x0000, 0x0000, 0x02c9, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x114c0 .. 0x114cf */
+    0x0000, 0x0000, 0x02ca, 0x02cb, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x115b0 .. 0x115bf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02cc,
+    /* 0x115c0 .. 0x115cf */
+    0x02cd, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11630 .. 0x1163f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02ce,
+    /* 0x116b0 .. 0x116bf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02cf, 0x02d0,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11720 .. 0x1172f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x02d1, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11a30 .. 0x11a3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x02d2, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11a40 .. 0x11a4f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02d3,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11a90 .. 0x11a9f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x02d4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x11c30 .. 0x11c3f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02d5,
+    /* 0x11d40 .. 0x11d4f */
+    0x0000, 0x0000, 0x02d6, 0x0000, 0x02d7, 0x02d8, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x16af0 .. 0x16aff */
+    0x02d9, 0x02da, 0x02db, 0x02dc, 0x02dd, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x16b30 .. 0x16b3f */
+    0x02de, 0x02df, 0x02e0, 0x02e1, 0x02e2, 0x02e3, 0x02e4, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1bc90 .. 0x1bc9f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02e5, 0x0000,
+    /* 0x1d160 .. 0x1d16f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x02e6, 0x02e7, 0x02e8,
+    0x02e9, 0x02ea, 0x0000, 0x0000, 0x0000, 0x02eb, 0x02ec, 0x02ed,
+    /* 0x1d170 .. 0x1d17f */
+    0x02ee, 0x02ef, 0x02f0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x02f1, 0x02f2, 0x02f3, 0x02f4, 0x02f5,
+    /* 0x1d180 .. 0x1d18f */
+    0x02f6, 0x02f7, 0x02f8, 0x0000, 0x0000, 0x02f9, 0x02fa, 0x02fb,
+    0x02fc, 0x02fd, 0x02fe, 0x02ff, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1d1a0 .. 0x1d1af */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0300, 0x0301, 0x0302, 0x0303, 0x0000, 0x0000,
+    /* 0x1d240 .. 0x1d24f */
+    0x0000, 0x0000, 0x0304, 0x0305, 0x0306, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1e000 .. 0x1e00f */
+    0x0307, 0x0308, 0x0309, 0x030a, 0x030b, 0x030c, 0x030d, 0x0000,
+    0x030e, 0x030f, 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315,
+    /* 0x1e010 .. 0x1e01f */
+    0x0316, 0x0317, 0x0318, 0x0319, 0x031a, 0x031b, 0x031c, 0x031d,
+    0x031e, 0x0000, 0x0000, 0x031f, 0x0320, 0x0321, 0x0322, 0x0323,
+    /* 0x1e020 .. 0x1e02f */
+    0x0324, 0x0325, 0x0000, 0x0326, 0x0327, 0x0000, 0x0328, 0x0329,
+    0x032a, 0x032b, 0x032c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1e8d0 .. 0x1e8df */
+    0x032d, 0x032e, 0x032f, 0x0330, 0x0331, 0x0332, 0x0333, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1e940 .. 0x1e94f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0334, 0x0335, 0x0336, 0x0337,
+    0x0338, 0x0339, 0x033a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+const WCHAR data_fullcomp[1121] =
+{
+    0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+    0x0001
+};
+
+const BYTE idx1_fullcomp[763] =
+{
+    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x05,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+    0x07, 0x08, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x0b, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x0f, 0x10, 0x11
+};
+
+const USHORT idx2_fullcomp[288] =
+{
+    /* all-zero 256-char blocks get mapped to here */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x01 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0002,
+    0x0003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x02 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0004, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000,
+    /* sub-index 0x03 */
+    0x0000, 0x0000, 0x0000, 0x0006, 0x0000, 0x0007, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x04 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x05 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x000a, 0x000b, 0x000c,
+    0x000d, 0x000e, 0x000f, 0x0010, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x06 */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0011,
+    0x0000, 0x0000, 0x0000, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016,
+    /* sub-index 0x07 */
+    0x0017, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x08 */
+    0x0000, 0x0000, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x09 */
+    0x0000, 0x0000, 0x0019, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0a */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001a, 0x0000, 0x0000,
+    /* sub-index 0x0b */
+    0x001b, 0x001c, 0x001d, 0x001e, 0x001f, 0x0020, 0x0021, 0x0022,
+    0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002a,
+    /* sub-index 0x0c */
+    0x002b, 0x002c, 0x002d, 0x002e, 0x002f, 0x0030, 0x0031, 0x0032,
+    0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0000, 0x0000,
+    /* sub-index 0x0d */
+    0x0000, 0x0039, 0x003a, 0x003b, 0x003c, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0e */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x003d, 0x003e, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x003f, 0x0040, 0x0000, 0x0000, 0x0000,
+    /* sub-index 0x0f */
+    0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048,
+    0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050,
+    /* sub-index 0x10 */
+    0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058,
+    0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f, 0x0060,
+    /* sub-index 0x11 */
+    0x0061, 0x0062, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000
+};
+
+const USHORT offsets_fullcomp[1584] =
+{
+    /* all-zero 16-char blocks get mapped to here */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0340 .. 0x034f */
+    0x0001, 0x0002, 0x0000, 0x0003, 0x0004, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0370 .. 0x037f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0005, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0006, 0x0000,
+    /* 0x0380 .. 0x038f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0950 .. 0x095f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+    /* 0x09d0 .. 0x09df */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0011, 0x0000, 0x0012,
+    /* 0x0a30 .. 0x0a3f */
+    0x0000, 0x0000, 0x0000, 0x0013, 0x0000, 0x0000, 0x0014, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0a50 .. 0x0a5f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0015, 0x0016, 0x0017, 0x0000, 0x0000, 0x0018, 0x0000,
+    /* 0x0b50 .. 0x0b5f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0019, 0x001a, 0x0000, 0x0000,
+    /* 0x0f40 .. 0x0f4f */
+    0x0000, 0x0000, 0x0000, 0x001b, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001c, 0x0000, 0x0000,
+    /* 0x0f50 .. 0x0f5f */
+    0x0000, 0x0000, 0x001d, 0x0000, 0x0000, 0x0000, 0x0000, 0x001e,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x001f, 0x0000, 0x0000, 0x0000,
+    /* 0x0f60 .. 0x0f6f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0f70 .. 0x0f7f */
+    0x0000, 0x0000, 0x0000, 0x0021, 0x0000, 0x0022, 0x0023, 0x0000,
+    0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0f80 .. 0x0f8f */
+    0x0000, 0x0025, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x0f90 .. 0x0f9f */
+    0x0000, 0x0000, 0x0000, 0x0026, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0027, 0x0000, 0x0000,
+    /* 0x0fa0 .. 0x0faf */
+    0x0000, 0x0000, 0x0028, 0x0000, 0x0000, 0x0000, 0x0000, 0x0029,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x002a, 0x0000, 0x0000, 0x0000,
+    /* 0x0fb0 .. 0x0fbf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x002b, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1f70 .. 0x1f7f */
+    0x0000, 0x002c, 0x0000, 0x002d, 0x0000, 0x002e, 0x0000, 0x002f,
+    0x0000, 0x0030, 0x0000, 0x0031, 0x0000, 0x0032, 0x0000, 0x0000,
+    /* 0x1fb0 .. 0x1fbf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0033, 0x0000, 0x0000, 0x0034, 0x0000,
+    /* 0x1fc0 .. 0x1fcf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0035, 0x0000, 0x0036, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1fd0 .. 0x1fdf */
+    0x0000, 0x0000, 0x0000, 0x0037, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0038, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1fe0 .. 0x1fef */
+    0x0000, 0x0000, 0x0000, 0x0039, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x003a, 0x0000, 0x0000, 0x003b, 0x003c,
+    /* 0x1ff0 .. 0x1fff */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x003d, 0x0000, 0x003e, 0x0000, 0x003f, 0x0000, 0x0000,
+    /* 0x2000 .. 0x200f */
+    0x0040, 0x0041, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2120 .. 0x212f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0042, 0x0000,
+    0x0000, 0x0000, 0x0043, 0x0044, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2320 .. 0x232f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0045, 0x0046, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2ad0 .. 0x2adf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0047, 0x0000, 0x0000, 0x0000,
+    /* 0xf900 .. 0xf90f */
+    0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+    /* 0xf910 .. 0xf91f */
+    0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+    0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+    /* 0xf920 .. 0xf92f */
+    0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+    0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+    /* 0xf930 .. 0xf93f */
+    0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x007f,
+    0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+    /* 0xf940 .. 0xf94f */
+    0x0088, 0x0089, 0x008a, 0x008b, 0x008c, 0x008d, 0x008e, 0x008f,
+    0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+    /* 0xf950 .. 0xf95f */
+    0x0098, 0x0099, 0x009a, 0x009b, 0x009c, 0x009d, 0x009e, 0x009f,
+    0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+    /* 0xf960 .. 0xf96f */
+    0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+    0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+    /* 0xf970 .. 0xf97f */
+    0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+    0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+    /* 0xf980 .. 0xf98f */
+    0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+    0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+    /* 0xf990 .. 0xf99f */
+    0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+    0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+    /* 0xf9a0 .. 0xf9af */
+    0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+    0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+    /* 0xf9b0 .. 0xf9bf */
+    0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff,
+    0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107,
+    /* 0xf9c0 .. 0xf9cf */
+    0x0108, 0x0109, 0x010a, 0x010b, 0x010c, 0x010d, 0x010e, 0x010f,
+    0x0110, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117,
+    /* 0xf9d0 .. 0xf9df */
+    0x0118, 0x0119, 0x011a, 0x011b, 0x011c, 0x011d, 0x011e, 0x011f,
+    0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0126, 0x0127,
+    /* 0xf9e0 .. 0xf9ef */
+    0x0128, 0x0129, 0x012a, 0x012b, 0x012c, 0x012d, 0x012e, 0x012f,
+    0x0130, 0x0131, 0x0132, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137,
+    /* 0xf9f0 .. 0xf9ff */
+    0x0138, 0x0139, 0x013a, 0x013b, 0x013c, 0x013d, 0x013e, 0x013f,
+    0x0140, 0x0141, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147,
+    /* 0xfa00 .. 0xfa0f */
+    0x0148, 0x0149, 0x014a, 0x014b, 0x014c, 0x014d, 0x014e, 0x014f,
+    0x0150, 0x0151, 0x0152, 0x0153, 0x0154, 0x0155, 0x0000, 0x0000,
+    /* 0xfa10 .. 0xfa1f */
+    0x0156, 0x0000, 0x0157, 0x0000, 0x0000, 0x0158, 0x0159, 0x015a,
+    0x015b, 0x015c, 0x015d, 0x015e, 0x015f, 0x0160, 0x0161, 0x0000,
+    /* 0xfa20 .. 0xfa2f */
+    0x0162, 0x0000, 0x0163, 0x0000, 0x0000, 0x0164, 0x0165, 0x0000,
+    0x0000, 0x0000, 0x0166, 0x0167, 0x0168, 0x0169, 0x016a, 0x016b,
+    /* 0xfa30 .. 0xfa3f */
+    0x016c, 0x016d, 0x016e, 0x016f, 0x0170, 0x0171, 0x0172, 0x0173,
+    0x0174, 0x0175, 0x0176, 0x0177, 0x0178, 0x0179, 0x017a, 0x017b,
+    /* 0xfa40 .. 0xfa4f */
+    0x017c, 0x017d, 0x017e, 0x017f, 0x0180, 0x0181, 0x0182, 0x0183,
+    0x0184, 0x0185, 0x0186, 0x0187, 0x0188, 0x0189, 0x018a, 0x018b,
+    /* 0xfa50 .. 0xfa5f */
+    0x018c, 0x018d, 0x018e, 0x018f, 0x0190, 0x0191, 0x0192, 0x0193,
+    0x0194, 0x0195, 0x0196, 0x0197, 0x0198, 0x0199, 0x019a, 0x019b,
+    /* 0xfa60 .. 0xfa6f */
+    0x019c, 0x019d, 0x019e, 0x019f, 0x01a0, 0x01a1, 0x01a2, 0x01a3,
+    0x01a4, 0x01a5, 0x01a6, 0x01a7, 0x01a8, 0x01a9, 0x0000, 0x0000,
+    /* 0xfa70 .. 0xfa7f */
+    0x01aa, 0x01ab, 0x01ac, 0x01ad, 0x01ae, 0x01af, 0x01b0, 0x01b1,
+    0x01b2, 0x01b3, 0x01b4, 0x01b5, 0x01b6, 0x01b7, 0x01b8, 0x01b9,
+    /* 0xfa80 .. 0xfa8f */
+    0x01ba, 0x01bb, 0x01bc, 0x01bd, 0x01be, 0x01bf, 0x01c0, 0x01c1,
+    0x01c2, 0x01c3, 0x01c4, 0x01c5, 0x01c6, 0x01c7, 0x01c8, 0x01c9,
+    /* 0xfa90 .. 0xfa9f */
+    0x01ca, 0x01cb, 0x01cc, 0x01cd, 0x01ce, 0x01cf, 0x01d0, 0x01d1,
+    0x01d2, 0x01d3, 0x01d4, 0x01d5, 0x01d6, 0x01d7, 0x01d8, 0x01d9,
+    /* 0xfaa0 .. 0xfaaf */
+    0x01da, 0x01db, 0x01dc, 0x01dd, 0x01de, 0x01df, 0x01e0, 0x01e1,
+    0x01e2, 0x01e3, 0x01e4, 0x01e5, 0x01e6, 0x01e7, 0x01e8, 0x01e9,
+    /* 0xfab0 .. 0xfabf */
+    0x01ea, 0x01eb, 0x01ec, 0x01ed, 0x01ee, 0x01ef, 0x01f0, 0x01f1,
+    0x01f2, 0x01f3, 0x01f4, 0x01f5, 0x01f6, 0x01f7, 0x01f8, 0x01f9,
+    /* 0xfac0 .. 0xfacf */
+    0x01fa, 0x01fb, 0x01fc, 0x01fd, 0x01fe, 0x01ff, 0x0200, 0x0201,
+    0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209,
+    /* 0xfad0 .. 0xfadf */
+    0x020a, 0x020b, 0x020c, 0x020d, 0x020e, 0x020f, 0x0210, 0x0211,
+    0x0212, 0x0213, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0xfb10 .. 0xfb1f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0214, 0x0000, 0x0215,
+    /* 0xfb20 .. 0xfb2f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0216, 0x0217, 0x0218, 0x0219, 0x021a, 0x021b,
+    /* 0xfb30 .. 0xfb3f */
+    0x021c, 0x021d, 0x021e, 0x021f, 0x0220, 0x0221, 0x0222, 0x0000,
+    0x0223, 0x0224, 0x0225, 0x0226, 0x0227, 0x0000, 0x0228, 0x0000,
+    /* 0xfb40 .. 0xfb4f */
+    0x0229, 0x022a, 0x0000, 0x022b, 0x022c, 0x0000, 0x022d, 0x022e,
+    0x022f, 0x0230, 0x0231, 0x0232, 0x0233, 0x0234, 0x0235, 0x0000,
+    /* 0x1d150 .. 0x1d15f */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0236, 0x0237,
+    /* 0x1d160 .. 0x1d16f */
+    0x0238, 0x0239, 0x023a, 0x023b, 0x023c, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x1d1b0 .. 0x1d1bf */
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x023d, 0x023e, 0x023f, 0x0240, 0x0241,
+    /* 0x1d1c0 .. 0x1d1cf */
+    0x0242, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+    /* 0x2f800 .. 0x2f80f */
+    0x0243, 0x0244, 0x0245, 0x0246, 0x0247, 0x0248, 0x0249, 0x024a,
+    0x024b, 0x024c, 0x024d, 0x024e, 0x024f, 0x0250, 0x0251, 0x0252,
+    /* 0x2f810 .. 0x2f81f */
+    0x0253, 0x0254, 0x0255, 0x0256, 0x0257, 0x0258, 0x0259, 0x025a,
+    0x025b, 0x025c, 0x025d, 0x025e, 0x025f, 0x0260, 0x0261, 0x0262,
+    /* 0x2f820 .. 0x2f82f */
+    0x0263, 0x0264, 0x0265, 0x0266, 0x0267, 0x0268, 0x0269, 0x026a,
+    0x026b, 0x026c, 0x026d, 0x026e, 0x026f, 0x0270, 0x0271, 0x0272,
+    /* 0x2f830 .. 0x2f83f */
+    0x0273, 0x0274, 0x0275, 0x0276, 0x0277, 0x0278, 0x0279, 0x027a,
+    0x027b, 0x027c, 0x027d, 0x027e, 0x027f, 0x0280, 0x0281, 0x0282,
+    /* 0x2f840 .. 0x2f84f */
+    0x0283, 0x0284, 0x0285, 0x0286, 0x0287, 0x0288, 0x0289, 0x028a,
+    0x028b, 0x028c, 0x028d, 0x028e, 0x028f, 0x0290, 0x0291, 0x0292,
+    /* 0x2f850 .. 0x2f85f */
+    0x0293, 0x0294, 0x0295, 0x0296, 0x0297, 0x0298, 0x0299, 0x029a,
+    0x029b, 0x029c, 0x029d, 0x029e, 0x029f, 0x02a0, 0x02a1, 0x02a2,
+    /* 0x2f860 .. 0x2f86f */
+    0x02a3, 0x02a4, 0x02a5, 0x02a6, 0x02a7, 0x02a8, 0x02a9, 0x02aa,
+    0x02ab, 0x02ac, 0x02ad, 0x02ae, 0x02af, 0x02b0, 0x02b1, 0x02b2,
+    /* 0x2f870 .. 0x2f87f */
+    0x02b3, 0x02b4, 0x02b5, 0x02b6, 0x02b7, 0x02b8, 0x02b9, 0x02ba,
+    0x02bb, 0x02bc, 0x02bd, 0x02be, 0x02bf, 0x02c0, 0x02c1, 0x02c2,
+    /* 0x2f880 .. 0x2f88f */
+    0x02c3, 0x02c4, 0x02c5, 0x02c6, 0x02c7, 0x02c8, 0x02c9, 0x02ca,
+    0x02cb, 0x02cc, 0x02cd, 0x02ce, 0x02cf, 0x02d0, 0x02d1, 0x02d2,
+    /* 0x2f890 .. 0x2f89f */
+    0x02d3, 0x02d4, 0x02d5, 0x02d6, 0x02d7, 0x02d8, 0x02d9, 0x02da,
+    0x02db, 0x02dc, 0x02dd, 0x02de, 0x02df, 0x02e0, 0x02e1, 0x02e2,
+    /* 0x2f8a0 .. 0x2f8af */
+    0x02e3, 0x02e4, 0x02e5, 0x02e6, 0x02e7, 0x02e8, 0x02e9, 0x02ea,
+    0x02eb, 0x02ec, 0x02ed, 0x02ee, 0x02ef, 0x02f0, 0x02f1, 0x02f2,
+    /* 0x2f8b0 .. 0x2f8bf */
+    0x02f3, 0x02f4, 0x02f5, 0x02f6, 0x02f7, 0x02f8, 0x02f9, 0x02fa,
+    0x02fb, 0x02fc, 0x02fd, 0x02fe, 0x02ff, 0x0300, 0x0301, 0x0302,
+    /* 0x2f8c0 .. 0x2f8cf */
+    0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, 0x030a,
+    0x030b, 0x030c, 0x030d, 0x030e, 0x030f, 0x0310, 0x0311, 0x0312,
+    /* 0x2f8d0 .. 0x2f8df */
+    0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 0x0318, 0x0319, 0x031a,
+    0x031b, 0x031c, 0x031d, 0x031e, 0x031f, 0x0320, 0x0321, 0x0322,
+    /* 0x2f8e0 .. 0x2f8ef */
+    0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 0x0328, 0x0329, 0x032a,
+    0x032b, 0x032c, 0x032d, 0x032e, 0x032f, 0x0330, 0x0331, 0x0332,
+    /* 0x2f8f0 .. 0x2f8ff */
+    0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 0x0338, 0x0339, 0x033a,
+    0x033b, 0x033c, 0x033d, 0x033e, 0x033f, 0x0340, 0x0341, 0x0342,
+    /* 0x2f900 .. 0x2f90f */
+    0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 0x0348, 0x0349, 0x034a,
+    0x034b, 0x034c, 0x034d, 0x034e, 0x034f, 0x0350, 0x0351, 0x0352,
+    /* 0x2f910 .. 0x2f91f */
+    0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 0x0358, 0x0359, 0x035a,
+    0x035b, 0x035c, 0x035d, 0x035e, 0x035f, 0x0360, 0x0361, 0x0362,
+    /* 0x2f920 .. 0x2f92f */
+    0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 0x0368, 0x0369, 0x036a,
+    0x036b, 0x036c, 0x036d, 0x036e, 0x036f, 0x0370, 0x0371, 0x0372,
+    /* 0x2f930 .. 0x2f93f */
+    0x0373, 0x0374, 0x0375, 0x0376, 0x0377, 0x0378, 0x0379, 0x037a,
+    0x037b, 0x037c, 0x037d, 0x037e, 0x037f, 0x0380, 0x0381, 0x0382,
+    /* 0x2f940 .. 0x2f94f */
+    0x0383, 0x0384, 0x0385, 0x0386, 0x0387, 0x0388, 0x0389, 0x038a,
+    0x038b, 0x038c, 0x038d, 0x038e, 0x038f, 0x0390, 0x0391, 0x0392,
+    /* 0x2f950 .. 0x2f95f */
+    0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a,
+    0x039b, 0x039c, 0x039d, 0x039e, 0x039f, 0x03a0, 0x03a1, 0x03a2,
+    /* 0x2f960 .. 0x2f96f */
+    0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa,
+    0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b1, 0x03b2,
+    /* 0x2f970 .. 0x2f97f */
+    0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba,
+    0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03c1, 0x03c2,
+    /* 0x2f980 .. 0x2f98f */
+    0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca,
+    0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x03cf, 0x03d0, 0x03d1, 0x03d2,
+    /* 0x2f990 .. 0x2f99f */
+    0x03d3, 0x03d4, 0x03d5, 0x03d6, 0x03d7, 0x03d8, 0x03d9, 0x03da,
+    0x03db, 0x03dc, 0x03dd, 0x03de, 0x03df, 0x03e0, 0x03e1, 0x03e2,
+    /* 0x2f9a0 .. 0x2f9af */
+    0x03e3, 0x03e4, 0x03e5, 0x03e6, 0x03e7, 0x03e8, 0x03e9, 0x03ea,
+    0x03eb, 0x03ec, 0x03ed, 0x03ee, 0x03ef, 0x03f0, 0x03f1, 0x03f2,
+    /* 0x2f9b0 .. 0x2f9bf */
+    0x03f3, 0x03f4, 0x03f5, 0x03f6, 0x03f7, 0x03f8, 0x03f9, 0x03fa,
+    0x03fb, 0x03fc, 0x03fd, 0x03fe, 0x03ff, 0x0400, 0x0401, 0x0402,
+    /* 0x2f9c0 .. 0x2f9cf */
+    0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a,
+    0x040b, 0x040c, 0x040d, 0x040e, 0x040f, 0x0410, 0x0411, 0x0412,
+    /* 0x2f9d0 .. 0x2f9df */
+    0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a,
+    0x041b, 0x041c, 0x041d, 0x041e, 0x041f, 0x0420, 0x0421, 0x0422,
+    /* 0x2f9e0 .. 0x2f9ef */
+    0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a,
+    0x042b, 0x042c, 0x042d, 0x042e, 0x042f, 0x0430, 0x0431, 0x0432,
+    /* 0x2f9f0 .. 0x2f9ff */
+    0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a,
+    0x043b, 0x043c, 0x043d, 0x043e, 0x043f, 0x0440, 0x0441, 0x0442,
+    /* 0x2fa00 .. 0x2fa0f */
+    0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a,
+    0x044b, 0x044c, 0x044d, 0x044e, 0x044f, 0x0450, 0x0451, 0x0452,
+    /* 0x2fa10 .. 0x2fa1f */
+    0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a,
+    0x045b, 0x045c, 0x045d, 0x045e, 0x045f, 0x0460, 0x0000, 0x0000
+};
+
 static const WCHAR *unicode_table_lookup( UINT cp, int compat, const BYTE *idx1, UINT scale_idx1,
                                           const USHORT *idx2, UINT scale_idx2, const USHORT *offsets,
                                           UINT scale_off, const WCHAR *data, UINT scale_data )
@@ -4032,6 +5460,20 @@ static inline int decompose_hangul( WCHAR ch, WCHAR dum[4], int dstlen )
     return 0;
 }
 
+static inline int reorderable_pair( WCHAR ch1, WCHAR ch2 )
+{
+    const WCHAR *cc1, *cc2;
+
+    if (ch1 == 0 || ch2 == 0) return 0;
+
+    cc1 = unicode_table_lookup( ch1, 0, idx1_comb, 8, idx2_comb, 4,
+                                offsets_comb, 4, data_comb, 0 );
+    cc2 = unicode_table_lookup( ch2, 0, idx1_comb, 8, idx2_comb, 4,
+                                offsets_comb, 4, data_comb, 0 );
+    if (*cc2 < *cc1) return 1;
+    else return 0;
+}
+
 static inline UINT utf16_codepoint_to_surrogates( UINT cp )
 {
     UINT ch = cp;
@@ -4161,3 +5603,37 @@ unsigned int wine_unicode_decompose_string( int compat, const WCHAR *src, int sr
 
     return dstpos;
 }
+
+int is_starter( WCHAR ch )
+{
+    const WCHAR *map = unicode_table_lookup( ch, 0, idx1_comb, 8, idx2_comb, 4,
+                                             offsets_comb, 4, data_comb, 0 );
+    return (*map == 0) ? 1 : 0;
+}
+
+void unicode_canon_order( WCHAR *str, int strlen )
+{
+    int i, j, m, sublen = 0, tot_sublen = 0;
+    WCHAR *substr = str;
+
+    for (m = 1; m < strlen; m++)
+    {
+        if (m == strlen || is_starter(str[m])) sublen = m - tot_sublen;
+        else continue;
+
+        for (i = 0; i < sublen; i++)
+        {
+            for (j = i+1; j < sublen; j++)
+            {
+                if (reorderable_pair( substr[i], substr[j] ))
+                {
+                    WCHAR swp = substr[i];
+                    substr[i] = substr[j];
+                    substr[j] = swp;
+                }
+            }
+        }
+        tot_sublen += m;
+        substr = str+m;
+    }
+}
diff --git a/tools/make_unicode b/tools/make_unicode
index 34938f9786..321b7854f2 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -359,6 +359,8 @@ my @joining_table = ();
 my @direction_table = ();
 my @decomp_table = ();
 my @compose_table = ();
+my @comb_class_table = ();
+my @full_comp_table = ();
 my $default_char;
 my $default_wchar;
 
@@ -469,6 +471,11 @@ sub READ_DEFAULTS($)
             }
         }
 
+        if ($comb != 0)
+        {
+            $comb_class_table[$src] = (hex $comb);
+        }
+
         next if $decomp eq "";  # no decomposition, skip it
 
         # store decomposition table
@@ -561,6 +568,25 @@ sub READ_DEFAULTS($)
         my $flag = $ctype{$cat};
         foreach my $i (@{$special_categories{$cat}}) { $category_table[$i] |= $flag; }
     }
+
+    my $UNICODE_DERIVED = open_data_file( $UNIDATA, "DerivedNormalizationProps.txt" );
+    while (<$UNICODE_DERIVED>)
+    {
+        next unless (/^([0-9a-fA-F.]+)\s+;\s+Full_Composition_Exclusion/);
+        my ($first, $last) = split /\.\./,$1;
+        $first = hex $first;
+        if (defined $last)
+        {
+            $last = hex $last;
+            while ($last gt $first)
+            {
+                $full_comp_table[$last] = 1;
+                $last--;
+            }
+        }
+        $full_comp_table[$first] = 1;
+    }
+    close $UNICODE_DERIVED;
 }
 
 
@@ -2249,6 +2275,8 @@ sub dump_compose_table($)
     }
     print OUTPUT "\n};\n\n";
     print OUTPUT <<"EOF";
+#include "decompose.c"
+
 static inline int binary_search( WCHAR ch, int low, int high )
 {
     while (low <= high)
@@ -2272,6 +2300,64 @@ WCHAR DECLSPEC_HIDDEN wine_compose( const WCHAR *str )
         count = table[2 * pos + 3];
     }
 }
+
+static inline int is_blocked(WCHAR *ptr1, WCHAR *ptr2)
+{
+    if (ptr1 >= ptr2) return -1;
+
+    while (++ptr1 < ptr2)
+    {
+        const WCHAR *map1, *map2;
+        map1 = unicode_table_lookup( *ptr1, 0, idx1_comb, 8, idx2_comb, 4,
+                                     offsets_comb, 4, data_comb, 0 );
+        map2 = unicode_table_lookup( *ptr2, 0, idx1_comb, 8, idx2_comb, 4,
+                                     offsets_comb, 4, data_comb, 0 );
+        if (*map1 == 0 || *map2 <= *map1) return 1;
+    }
+    return 0;
+}
+
+static inline int is_fullexcl(WCHAR ch)
+{
+    const WCHAR *map;
+    map = unicode_table_lookup( ch, 0, idx1_fullcomp, 8, idx2_fullcomp, 4,
+                                offsets_fullcomp, 4, data_fullcomp, 0 );
+    return (int)*map;
+}
+
+UINT unicode_canonical_composition( WCHAR *str, UINT strlen )
+{
+    int i, j;
+    WCHAR dum[3] = {0};
+
+    if (strlen == 0) strlen = strlenW( str );
+
+    for (i = 1; i <= strlen; i++)
+    {
+        WCHAR *scratch = str+i, comp;
+        if (*scratch == 0) break;
+        for (scratch = str+i; scratch - str > 0; --scratch)
+        {
+            if (is_starter(*scratch)) break;
+        }
+        if (!is_starter(*scratch)) continue;
+        if (is_blocked( scratch, str+i )) continue;
+        dum[0] = *scratch;
+        dum[1] = str[i];
+        comp = wine_compose( dum );
+        if (comp == 0) continue;
+        if (is_fullexcl( comp )) continue;
+        *scratch = comp; // replace
+        for (j = i; j < strlen-1; j++)
+        {
+            str[j] = str[j+1];
+        }
+        strlen--;
+        i--;
+    }
+
+    return strlen;
+}
 EOF
     close OUTPUT;
     save_file($filename);
@@ -2339,13 +2425,21 @@ sub dump_decompose_table($)
     my %nfd_lookup = ();
     my %nfkd_lookup = ();
     my %decomp_lookup = ();
+    my %comb_lookup = ();
+    my %fullcomp_lookup = ();
     my @decomp_data = (0);
+    my @comb_data = (0);
+    my @full_comp_data = (0);
     my $pos = 1;
+    my $pos_comb = 1;
+    my $pos_fullcomp = 1;
     my $lastchar_decomp;
+    my $lastchar_comb;
+    my $lastchar_fullcomp;
 
     for (my $i = 0; $i < $utflim; $i++)
     {
-        next unless defined $decomp_table[$i];
+        next unless defined $decomp_table[$i] || defined $comb_class_table[$i] || defined $full_comp_table[$i];
 
         if (defined $decomp_table[$i])
         {
@@ -2400,6 +2494,20 @@ sub dump_decompose_table($)
                 $pos += @nfkd;
             }
         }
+        if (defined $comb_class_table[$i])
+        {
+            push @comb_data, $comb_class_table[$i];
+            $lastchar_comb = $i;
+            $comb_lookup{$i} = $pos_comb;
+            $pos_comb++;
+        }
+        if (defined $full_comp_table[$i])
+        {
+            push @full_comp_data, $full_comp_table[$i];
+            $lastchar_fullcomp = $i;
+            $fullcomp_lookup{$i} = $pos_fullcomp;
+            $pos_fullcomp++;
+        }
     }
 
     printf OUTPUT "static const UINT last_decomposable = 0x%x;\n\n", $lastchar_decomp;
@@ -2491,6 +2599,154 @@ sub dump_decompose_table($)
     }
     print OUTPUT "\n};\n\n";
 
+    # now for Compatibility Class
+
+    printf OUTPUT "static const WCHAR data_comb[%d] =\n", $pos_comb;
+    print OUTPUT "{\n";
+    printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @comb_data );
+    print OUTPUT "\n};\n\n";
+
+    my $comb_pos = 1;
+    my $comb_lim = ($lastchar_comb >> 8) + 1;
+    my @comb_filled = (0) x $comb_lim;
+    for (my $i = 0; $i < $utflim; $i++)
+    {
+        last if $i > $lastchar_comb;
+        next unless defined $comb_class_table[$i];
+        $comb_filled[$i >> 8] = $comb_pos++;
+        $i |= 255;
+    }
+    printf OUTPUT "static const BYTE idx1_comb[%d] =\n", $comb_lim;
+    print OUTPUT "{\n";
+    printf OUTPUT "%s", DUMP_ARRAY( "0x%02x", 0, @comb_filled );
+    print OUTPUT "\n};\n\n";
+
+    my $sub_comb_filled_pos = 1;
+    my %sub_comb_filled = ();
+    for (my $i = 0; $i < $comb_lim; $i++)
+    {
+        next unless $comb_filled[$i];
+        for (my $j = 0; $j < 256; $j++)
+        {
+            my $idx = ($i << 8) | $j;
+            next unless defined $comb_class_table[$idx];
+            $sub_comb_filled{$idx >> 4} = $sub_comb_filled_pos++;
+            $j |= 15;
+        }
+    }
+
+    printf OUTPUT "static const USHORT idx2_comb[%d] =\n", $comb_pos * 16;
+    print OUTPUT "{\n";
+    @null_idx = (0) x 16;
+    print OUTPUT "    /* all-zero 256-char blocks get mapped to here */\n";
+    printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @null_idx );
+    for (my $i = 0; $i < $comb_lim; $i++)
+    {
+        next unless $comb_filled[$i];
+        printf OUTPUT ",\n    /* sub-index 0x%02x */\n", $comb_filled[$i];
+
+        my @sub_idx;
+        for (my $j = 0; $j < 16; $j++)
+        {
+            my $idx = ($i << 4) | $j;
+            $sub_idx[$j] = $sub_comb_filled{$idx} || 0;
+        }
+        printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @sub_idx );
+    }
+    print OUTPUT "\n};\n\n";
+
+    printf OUTPUT "static const USHORT offsets_comb[%d] =\n", 16 * $sub_comb_filled_pos;
+    print OUTPUT "{\n";
+    @null_table = (0) x 16;
+    print OUTPUT "    /* all-zero 16-char blocks get mapped to here */\n";
+    printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @null_table );
+    for my $key (sort {$a <=> $b} keys %sub_comb_filled)
+    {
+        printf OUTPUT ",\n    /* 0x%03x0 .. 0x%03xf */\n", $key, $key;
+        my @sub_table;
+        for (my $j = 0; $j < 16; $j++)
+        {
+            my $idx = ($key << 4) | $j;
+            $sub_table[$j] = $comb_lookup{$idx} || 0;
+        }
+        printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @sub_table );
+    }
+    print OUTPUT "\n};\n\n";
+
+    # now for Full Composition Exclusion
+
+    printf OUTPUT "const WCHAR data_fullcomp[%d] =\n", $pos_fullcomp;
+    print OUTPUT "{\n";
+    printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @full_comp_data );
+    print OUTPUT "\n};\n\n";
+
+    my $fullcomp_pos = 1;
+    my $fullcomp_lim = ($lastchar_fullcomp >> 8) + 1;
+    my @fullcomp_filled = (0) x $fullcomp_lim;
+    for (my $i = 0; $i < $utflim; $i++)
+    {
+        last if $i > $lastchar_fullcomp;
+        next unless defined $full_comp_table[$i];
+        $fullcomp_filled[$i >> 8] = $fullcomp_pos++;
+        $i |= 255;
+    }
+    printf OUTPUT "const BYTE idx1_fullcomp[%d] =\n", $fullcomp_lim;
+    print OUTPUT "{\n";
+    printf OUTPUT "%s", DUMP_ARRAY( "0x%02x", 0, @fullcomp_filled );
+    print OUTPUT "\n};\n\n";
+
+    my $sub_fullcomp_filled_pos = 1;
+    my %sub_fullcomp_filled = ();
+    for (my $i = 0; $i < $fullcomp_lim; $i++)
+    {
+        next unless $fullcomp_filled[$i];
+        for (my $j = 0; $j < 256; $j++)
+        {
+            my $idx = ($i << 8) | $j;
+            next unless defined $full_comp_table[$idx];
+            $sub_fullcomp_filled{$idx >> 4} = $sub_fullcomp_filled_pos++;
+            $j |= 15;
+        }
+    }
+
+    printf OUTPUT "const USHORT idx2_fullcomp[%d] =\n", $fullcomp_pos * 16;
+    print OUTPUT "{\n";
+    @null_idx = (0) x 16;
+    print OUTPUT "    /* all-zero 256-char blocks get mapped to here */\n";
+    printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @null_idx );
+    for (my $i = 0; $i < $fullcomp_lim; $i++)
+    {
+        next unless $fullcomp_filled[$i];
+        printf OUTPUT ",\n    /* sub-index 0x%02x */\n", $fullcomp_filled[$i];
+
+        my @sub_idx;
+        for (my $j = 0; $j < 16; $j++)
+        {
+            my $idx = ($i << 4) | $j;
+            $sub_idx[$j] = $sub_fullcomp_filled{$idx} || 0;
+        }
+        printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @sub_idx );
+    }
+    print OUTPUT "\n};\n\n";
+
+    printf OUTPUT "const USHORT offsets_fullcomp[%d] =\n", 16 * $sub_fullcomp_filled_pos;
+    print OUTPUT "{\n";
+    @null_table = (0) x 16;
+    print OUTPUT "    /* all-zero 16-char blocks get mapped to here */\n";
+    printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @null_table );
+    for my $key (sort {$a <=> $b} keys %sub_fullcomp_filled)
+    {
+        printf OUTPUT ",\n    /* 0x%03x0 .. 0x%03xf */\n", $key, $key;
+        my @sub_table;
+        for (my $j = 0; $j < 16; $j++)
+        {
+            my $idx = ($key << 4) | $j;
+            $sub_table[$j] = $fullcomp_lookup{$idx} || 0;
+        }
+        printf OUTPUT "%s", DUMP_ARRAY( "0x%04x", 0, @sub_table );
+    }
+    print OUTPUT "\n};\n\n";
+
     print OUTPUT <<"EOF";
 static const WCHAR *unicode_table_lookup( UINT cp, int compat, const BYTE *idx1, UINT scale_idx1,
                                           const USHORT *idx2, UINT scale_idx2, const USHORT *offsets,
@@ -2530,6 +2786,20 @@ static inline int decompose_hangul( WCHAR ch, WCHAR dum[4], int dstlen )
     return 0;
 }
 
+static inline int reorderable_pair( WCHAR ch1, WCHAR ch2 )
+{
+    const WCHAR *cc1, *cc2;
+
+    if (ch1 == 0 || ch2 == 0) return 0;
+
+    cc1 = unicode_table_lookup( ch1, 0, idx1_comb, 8, idx2_comb, 4,
+                                offsets_comb, 4, data_comb, 0 );
+    cc2 = unicode_table_lookup( ch2, 0, idx1_comb, 8, idx2_comb, 4,
+                                offsets_comb, 4, data_comb, 0 );
+    if (*cc2 < *cc1) return 1;
+    else return 0;
+}
+
 static inline UINT utf16_codepoint_to_surrogates( UINT cp )
 {
     UINT ch = cp;
@@ -2659,6 +2929,40 @@ unsigned int wine_unicode_decompose_string( int compat, const WCHAR *src, int sr
 
     return dstpos;
 }
+
+int is_starter( WCHAR ch )
+{
+    const WCHAR *map = unicode_table_lookup( ch, 0, idx1_comb, 8, idx2_comb, 4,
+                                             offsets_comb, 4, data_comb, 0 );
+    return (*map == 0) ? 1 : 0;
+}
+
+void unicode_canon_order( WCHAR *str, int strlen )
+{
+    int i, j, m, sublen = 0, tot_sublen = 0;
+    WCHAR *substr = str;
+
+    for (m = 1; m < strlen; m++)
+    {
+        if (m == strlen || is_starter(str[m])) sublen = m - tot_sublen;
+        else continue;
+
+        for (i = 0; i < sublen; i++)
+        {
+            for (j = i+1; j < sublen; j++)
+            {
+                if (reorderable_pair( substr[i], substr[j] ))
+                {
+                    WCHAR swp = substr[i];
+                    substr[i] = substr[j];
+                    substr[j] = swp;
+                }
+            }
+        }
+        tot_sublen += m;
+        substr = str+m;
+    }
+}
 EOF
     close OUTPUT;
     save_file($filename);
-- 
2.14.1




More information about the wine-devel mailing list