17935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/*
27935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
37935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Copyright (C) 2012-2014, International Business Machines
47935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* Corporation and others.  All Rights Reserved.
57935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*******************************************************************************
67935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* CollationFCD.java, ported from collationfcd.h/.cpp
77935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*
87935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* C++ version created on: 2012aug18
97935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert* created by: Markus W. Scherer
107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert*/
117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpackage com.ibm.icu.impl.coll;
137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertimport com.ibm.icu.text.UTF16;
157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert/**
177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * Data and functions for the FCD check fast path.
187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The fast path looks at a pair of 16-bit code units and checks
207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * whether there is an FCD boundary between them;
217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * there is if the first unit has a trailing ccc=0 (!hasTccc(first))
227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * or the second unit has a leading ccc=0 (!hasLccc(second)),
237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * or both.
247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * When the fast path finds a possible non-boundary,
257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * then the FCD check slow path looks at the actual sequence of FCD values.
267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * This is a pure optimization.
287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * The fast path must at least find all possible non-boundaries.
297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * If the fast path is too pessimistic, it costs performance.
307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * For a pair of BMP characters, the fast path tests are precise (1 bit per character).
327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * For a supplementary code point, the two units are its lead and trail surrogates.
347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * We set hasTccc(lead)=true if any of its 1024 associated supplementary code points
357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * has lccc!=0 or tccc!=0.
367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * We set hasLccc(trail)=true for all trail surrogates.
377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * As a result, we leave the fast path if the lead surrogate might start a
387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * supplementary code point that is not FCD-inert.
397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * (So the fast path need not detect that there is a surrogate pair,
407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * nor look ahead to the next full code point.)
417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * hasLccc(lead)=true if any of its 1024 associated supplementary code points
437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * has lccc!=0, for fast boundary checking between BMP & supplementary.
447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert *
457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * hasTccc(trail)=false:
467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert * It should only be tested for unpaired trail surrogates which are FCD-inert.
477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert */
487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubertpublic final class CollationFCD {
497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static boolean hasLccc(int c) {
507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assert c <= 0xffff;
517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // c can be negative, e.g., Collation.SENTINEL_CP from UCharIterator;
527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // that is handled in the first test.
537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i;
547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return
557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // U+0300 is the first character with lccc!=0.
567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            c >= 0x300 &&
577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (i = lcccIndex[c >> 5]) != 0 &&
587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (lcccBits[i] & (1 << (c & 0x1f))) != 0;
597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    public static boolean hasTccc(int c) {
627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        assert c <= 0xffff;
637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // c can be negative, e.g., Collation.SENTINEL_CP from UCharIterator;
647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // that is handled in the first test.
657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i;
667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return
677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            // U+00C0 is the first character with tccc!=0.
687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            c >= 0xc0 &&
697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (i = tcccIndex[c >> 5]) != 0 &&
707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (tcccBits[i] & (1 << (c & 0x1f))) != 0;
717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static boolean mayHaveLccc(int c) {
747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // Handles all of Unicode 0..10FFFF.
757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // c can be negative, e.g., Collation.SENTINEL_CP.
767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        // U+0300 is the first character with lccc!=0.
777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(c < 0x300) { return false; }
787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        if(c > 0xffff) { c = UTF16.getLeadSurrogate(c); }
797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        int i;
807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return
817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (i = lcccIndex[c >> 5]) != 0 &&
827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert            (lcccBits[i] & (1 << (c & 0x1f))) != 0;
837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tibetan composite vowel signs (U+0F73, U+0F75, U+0F81)
877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * must be decomposed before reaching the core collation code,
887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * or else some sequences including them, even ones passing the FCD check,
897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * do not yield canonically equivalent results.
907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * This is a fast and imprecise test.
927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param c a code point
947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return true if c is U+0F73, U+0F75 or U+0F81 or one of several other Tibetan characters
957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static boolean maybeTibetanCompositeVowel(int c) {
977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return (c & 0x1fff01) == 0xf01;
987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    /**
1017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * Tibetan composite vowel signs (U+0F73, U+0F75, U+0F81)
1027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * must be decomposed before reaching the core collation code,
1037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * or else some sequences including them, even ones passing the FCD check,
1047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * do not yield canonically equivalent results.
1057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * They have distinct lccc/tccc combinations: 129/130 or 129/132.
1077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     *
1087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @param fcd16 the FCD value (lccc/tccc combination) of a code point
1097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     * @return true if fcd16 is from U+0F73, U+0F75 or U+0F81
1107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert     */
1117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    static boolean isFCD16OfTibetanCompositeVowel(int fcd16) {
1127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert        return fcd16 == 0x8182 || fcd16 == 0x8184;
1137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    }
1147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // CollationFCD();  // No instantiation.
1167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    // TODO: machine-generate by: icu/tools/unicode/c/genuca/genuca.cpp
1187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
1197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final byte[] lcccIndex={
1207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,1,1,2,3,0,0,0,0,
1227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,4,0,0,0,0,0,0,0,5,6,7,0,
1237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert8,0,9,0xa,0,0,0xb,0xc,0xd,0xe,0xf,0,0,0,0,0x10,
1247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x11,0x12,0x13,0,0,0,0,0x14,0,0x15,0x16,0,0,0x15,0x17,0,
1257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x15,0x17,0,0,0x15,0x17,0,0,0x15,0x17,0,0,0,0x17,0,
1267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0x18,0,0,0x15,0x17,0,0,0,0x17,0,0,0,0x19,0,
1277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x1a,0x1b,0,0,0x1c,0x1b,0,0x1c,0x1d,0,0x1e,0x1f,0,0x20,0,
1287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x21,0,0,0x17,0,0,0,0,0,0,0,0,0,0,0,
1297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0x22,0,0,0,0,0,
1307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0x23,0x23,0,0,0,0,0x24,0,
1327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0x25,0,0,0,0x13,0,0,0,0,0,0,
1337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x26,0,0,0x27,0,0x28,0,0,0,0x23,0x29,0x10,0,0x2a,0,0x2b,
1347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x2c,0,0,0,0,0x2d,0x2e,0,0,0,0,0,0,1,0x2f,
1357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0x30,0x31,0,0,0,0,0,0,0,0,
1377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0x32,0,0,0,0x33,0,0,0,1,
1437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x34,0,0,0x35,0,0,0,0,0,0,0,0,0,0,0,
1457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0x36,0x33,0,0,0x37,0,0,0,0,0,0,0,0,
2047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x20,0,0,0,0,0,0x29,0x38,0,0x39,0x3a,0,0,0x3a,0x3b,0,
2057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0x3c,0x3d,0x3e,0,0,0,0,0,0,0,0x17,
2067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x3f,0x40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
2327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0x41,0,0,0,0,0,0,0,
2467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x42,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
2497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
2507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final byte[] tcccIndex={
2517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,2,3,4,5,6,7,0,8,9,0xa,
2527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0xb,0xc,0,0,0,0,0,0,1,1,0xd,0xe,0xf,0x10,0x11,0,
2537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x12,0x13,0x14,0x15,0x16,0,0x17,0x18,0,0,0,0,0x19,0x1a,0x1b,0,
2547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x1c,0x1d,0x1e,0x1f,0,0,0x20,0x21,0x22,0x23,0x24,0,0,0,0,0x25,
2557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x26,0x27,0x28,0,0,0,0,0x29,0,0x2a,0x2b,0,0,0x2c,0x2d,0,
2567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x2e,0x2f,0,0,0x2c,0x30,0,0,0x2c,0x31,0,0,0,0x30,0,
2577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0x32,0,0,0x2c,0x30,0,0,0,0x30,0,0,0,0x33,0,
2587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x34,0x35,0,0,0x36,0x35,0,0x36,0x37,0,0x38,0x39,0,0x3a,0,
2597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x3b,0,0,0x30,0,0,0,0,0,0,0,0,0,0,0,
2607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0x3c,0,0,0,0,0,
2617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0x3d,0x3d,0,0,0,0,0x3e,0,
2637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0x3f,0,0,0,0x28,0,0,0,0,0,0,
2647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x40,0,0,0x41,0,0x42,0,0,0,0x3d,0x43,0x25,0,0x44,0,0x45,
2657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x46,0,0,0,0,0x47,0x48,0,0,0,0,0,0,1,0x49,
2667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert1,1,1,1,0x4a,1,1,0x4b,0x4c,1,0x4d,0x4e,1,0x4f,0x50,0x51,
2677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0x52,0x53,0,0x54,0,0,0x55,0x56,0x57,0,
2687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x58,0x59,0x5a,0x5b,0x5c,0x5d,0,0x5e,0,0,0,0,0,0,0,0,
2697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0x2c,0,0,0,0,0,0,0,0,0,
2737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0x5f,0,0,0,0x60,0,0,0,1,
2747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x61,0x62,0x63,0x64,0x62,0x63,0x65,0,0,0,0,0,0,0,0,
2767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3007935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3017935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3027935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3037935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3047935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3057935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3067935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3077935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3087935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3097935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3107935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3117935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3127935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3137935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3147935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3157935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3167935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3177935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3187935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3197935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3207935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3217935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3227935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3237935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3247935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3257935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3267935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3277935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3287935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3297935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3307935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3317935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3327935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3337935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3347935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0x66,0x60,0,0,0x67,0,0,0,0,0,0,0,0,
3357935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x3a,0,0,0,0,0,0x43,0x68,0,0x69,0x6a,0,0,0x6a,0x6b,0,
3367935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0x6c,0x6d,0x6e,0,0,0,0,0,0,0,0x30,
3377935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3387935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3397935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3407935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3417935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3427935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3437935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3447935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3457935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3467935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3477935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3487935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3497935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3507935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3517935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3527935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3537935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3547935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3557935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3567935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3577935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3587935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3597935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x6f,0x70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3607935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3617935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3627935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3637935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3647935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3657935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3667935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3677935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3687935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3697935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3707935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3717935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3727935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3737935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3747935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3757935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3767935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0x3c,0x71,0x72,0,0,0,0,0,
3777935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3787935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0x73,0,0,0,0,0,0,0,0,0,0,0,0,0,0
3797935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
3807935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3817935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int[] lcccBits={
3827935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0xffffffff,0xffff7fff,0xffff,0xf8,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0xfffff800,0x10000,0x9fc00000,0x3d9f,0x20000,0xffff0000,0x7ff,
3837935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0xff800,0xfbc00000,0x3eef,0xe000000,0xfffffff0,0x10000000,0x1e2000,0x2000,0x602000,0x400,0x7000000,0xf00,0x3000000,0x2a00000,0x3c3e0000,0xdf,
3847935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xf03fffff,
3857935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x1fff0000,0x1ffe2,0x38000,0x80000000,0xfc00,0x6000000,0x3ff08000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0x4000035,
3867935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x4108000,0x40000000,0x3fff
3877935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
3887935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert    private static final int[] tcccBits={
3897935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0,0xffffffff,0x3e7effbf,0xbe7effbf,0xfffcffff,0x7ef1ff3f,0xfff3f1f8,0x7fffff3f,0x18003,0xdfffe000,0xff31ffcf,0xcfffffff,0xfffc0,0xffff7fff,0xffff,0x1d760,
3907935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x1fc00,0x187c00,0x200708b,0x2000000,0x708b0000,0xc00000,0xf8,0xfccf0006,0x33ffcfc,0xfffe0000,0xbfffffff,0xb6,0x7ff0000,0x7c,0xfffff800,0x10000,
3917935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x9fc80005,0x3d9f,0x20000,0xffff0000,0x7ff,0xff800,0xfbc00000,0x3eef,0xe000000,0xfffffff0,0x10120200,0xff1e2000,0x10000000,0xb0002000,0x10480000,0x4e002000,
3927935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x2000,0x30002000,0x602100,0x24000400,0x7000000,0xf00,0x3000000,0x2a00000,0x3d7e0000,0xdf,0x40,0x6800000,0xe0000000,0x100000,0x20040000,0x200,
3937935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x1800000,0x9fe00001,0x3fff0000,0x10,0xc00,0xc0040,0x800000,0xfff70000,0x31021fd,0xf03fffff,0xbffffff,0x3ffffff,0x3f3fffff,0xaaff3f3f,0x3fffffff,0x1fdfffff,
3947935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0xefcfffde,0x1fdc7fff,0x1fff0000,0x1ffe2,0x800,0xc000000,0x4000,0xe000,0x1210,0x50,0x292,0x333e005,0x333,0xf000,0x3c0f,0x38000,
3957935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x80000000,0xfc00,0x55555000,0x36db02a5,0x46100000,0x47900000,0x3ff08000,0x30000,0x3ffff,0x3800,0x80000,1,0xc19d0000,2,0x400000,0x4000035,
3967935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert0x4108000,0x5f7ffc00,0x7fdb,0x3fff
3977935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert};
3987935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert
3997935b1839a081ed19ae0d33029ad3c09632a2caaFredrik Roubert}
400