Commit 22c2b476 authored by Rob Pike's avatar Rob Pike

first cut at case mapping tables and library.

next cut will do the optimization for alternating sequences.

R=rsc
DELTA=1658  (1620 added, 9 deleted, 29 changed)
OCL=34072
CL=34075
parent 30dcb134
...@@ -103,12 +103,12 @@ var testLetter = []int { ...@@ -103,12 +103,12 @@ var testLetter = []int {
func TestDigit(t *testing.T) { func TestDigit(t *testing.T) {
for i, r := range testDigit { for i, r := range testDigit {
if !IsDigit(r) { if !IsDigit(r) {
t.Errorf("IsDigit(%#x) = false, want true\n", r); t.Errorf("IsDigit(U+%04X) = false, want true\n", r);
} }
} }
for i, r := range testLetter { for i, r := range testLetter {
if IsDigit(r) { if IsDigit(r) {
t.Errorf("IsDigit(%#x) = true, want false\n", r); t.Errorf("IsDigit(U+%04X) = true, want false\n", r);
} }
} }
} }
...@@ -9,11 +9,39 @@ package unicode ...@@ -9,11 +9,39 @@ package unicode
// The representation of a range of Unicode code points. The range runs from Lo to Hi // The representation of a range of Unicode code points. The range runs from Lo to Hi
// inclusive and has the specified stride. // inclusive and has the specified stride.
type Range struct { type Range struct {
Lo int; Lo int;
Hi int; Hi int;
Stride int; Stride int;
} }
// The representation of a range of Unicode code points for case conversion.
// The range runs from Lo to Hi inclusive, with a fixed stride of 1. Deltas
// are the number to add to the code point to reach the code point for a
// different case for that character. They may be negative. If zero, it
// means the character is in the corresponding case.
type CaseRange struct {
Lo int;
Hi int;
Delta d;
}
// Indices into the Delta arrays inside CaseRanges for case mapping.
const (
UpperCase = iota;
LowerCase;
TitleCase;
MaxCase;
)
type d [MaxCase]int32 // to make the CaseRanges text shorter
// If the Delta field of a CaseRange is UpperLower or LowerUpper, it means
// this CaseRange represents a sequence of the form (say)
// Upper Lower Upper Lower.
const (
UpperLower = 1;
LowerUpper = -1;
)
// Is tests whether rune is in the specified table of ranges. // Is tests whether rune is in the specified table of ranges.
func Is(ranges []Range, rune int) bool { func Is(ranges []Range, rune int) bool {
// common case: rune is ASCII or Latin-1 // common case: rune is ASCII or Latin-1
...@@ -80,3 +108,59 @@ func IsLetter(rune int) bool { ...@@ -80,3 +108,59 @@ func IsLetter(rune int) bool {
} }
return Is(Letter, rune); return Is(Letter, rune);
} }
// To maps the rune to the specified case, UpperCase, LowerCase, or TitleCase
func To(_case int, rune int) int {
if _case < 0 || MaxCase <= _case {
return 0xFFFD // as reasonable an error as any
}
// binary search over ranges
lo := 0;
hi := len(CaseRanges);
for lo < hi {
m := lo + (hi - lo)/2;
r := CaseRanges[m];
if r.Lo <= rune && rune <= r.Hi {
return rune + int(r.Delta[_case]);
}
if rune < r.Lo {
hi = m;
} else {
lo = m+1;
}
}
return rune;
}
// ToUpper maps the rune to upper case
func ToUpper(rune int) int {
if rune < 0x80 { // quick ASCII check
if 'a' <= rune && rune <= 'z' {
rune &^= ' '
}
return rune
}
return To(UpperCase, rune);
}
// ToLower maps the rune to lower case
func ToLower(rune int) int {
if rune < 0x80 { // quick ASCII check
if 'A' <= rune && rune <= 'Z' {
rune |= ' '
}
return rune
}
return To(LowerCase, rune);
}
// ToTitle maps the rune to title case
func ToTitle(rune int) int {
if rune < 0x80 { // quick ASCII check
if 'a' <= rune && rune <= 'z' { // title case is upper case for ASCII
rune &^= ' '
}
return rune
}
return To(TitleCase, rune);
}
...@@ -89,20 +89,127 @@ var notletterTest = []int{ ...@@ -89,20 +89,127 @@ var notletterTest = []int{
0x10ffff, 0x10ffff,
} }
type caseT struct {
cas, in, out int
}
var caseTest = []caseT {
// errors
caseT{-1, '\n', 0xFFFD},
caseT{UpperCase, -1, -1},
caseT{UpperCase, 1<<30, 1<<30},
// ASCII (special-cased so test carefully)
caseT{UpperCase, '\n', '\n'},
caseT{UpperCase, 'a', 'A'},
caseT{UpperCase, 'A', 'A'},
caseT{UpperCase, '7', '7'},
caseT{LowerCase, '\n', '\n'},
caseT{LowerCase, 'a', 'a'},
caseT{LowerCase, 'A', 'a'},
caseT{LowerCase, '7', '7'},
caseT{TitleCase, '\n', '\n'},
caseT{TitleCase, 'a', 'A'},
caseT{TitleCase, 'A', 'A'},
caseT{TitleCase, '7', '7'},
// Latin-1: easy to read the tests!
caseT{UpperCase, 0x80, 0x80},
caseT{UpperCase, 'Å', 'Å'},
caseT{UpperCase, 'å', 'Å'},
caseT{LowerCase, 0x80, 0x80},
caseT{LowerCase, 'Å', 'å'},
caseT{LowerCase, 'å', 'å'},
caseT{TitleCase, 0x80, 0x80},
caseT{TitleCase, 'Å', 'Å'},
caseT{TitleCase, 'å', 'Å'},
// 0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049
caseT{UpperCase, 0x0131, 'I'},
caseT{LowerCase, 0x0131, 0x0131},
caseT{TitleCase, 0x0131, 'I'},
// 0133;LATIN SMALL LIGATURE IJ;Ll;0;L;<compat> 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132
caseT{UpperCase, 0x0133, 0x0132},
caseT{LowerCase, 0x0133, 0x0133},
caseT{TitleCase, 0x0133, 0x0132},
// 212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B;
caseT{UpperCase, 0x212A, 0x212A},
caseT{LowerCase, 0x212A, 'k'},
caseT{TitleCase, 0x212A, 0x212A},
// From an UpperLower sequence
// A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641;
caseT{UpperCase, 0xA640, 0xA640},
caseT{LowerCase, 0xA640, 0xA641},
caseT{TitleCase, 0xA640, 0xA640},
// A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640
caseT{UpperCase, 0xA641, 0xA640},
caseT{LowerCase, 0xA641, 0xA641},
caseT{TitleCase, 0xA641, 0xA640},
// A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F;
caseT{UpperCase, 0xA64E, 0xA64E},
caseT{LowerCase, 0xA64E, 0xA64F},
caseT{TitleCase, 0xA64E, 0xA64E},
// A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E
caseT{UpperCase, 0xA65F, 0xA65E},
caseT{LowerCase, 0xA65F, 0xA65F},
caseT{TitleCase, 0xA65F, 0xA65E},
// From a LowerUpper sequence
// 0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A;
caseT{UpperCase, 0x0139, 0x0139},
caseT{LowerCase, 0x0139, 0x013A},
caseT{TitleCase, 0x0139, 0x0139},
// 013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L;<compat> 004C 00B7;;;;N;;;;0140;
caseT{UpperCase, 0x013f, 0x013f},
caseT{LowerCase, 0x013f, 0x0140},
caseT{TitleCase, 0x013f, 0x013f},
// 0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147
caseT{UpperCase, 0x0148, 0x0147},
caseT{LowerCase, 0x0148, 0x0148},
caseT{TitleCase, 0x0148, 0x0147},
// Last block in the 5.1.0 table
// 10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
caseT{UpperCase, 0x10400, 0x10400},
caseT{LowerCase, 0x10400, 0x10428},
caseT{TitleCase, 0x10400, 0x10400},
// 10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
caseT{UpperCase, 0x10427, 0x10427},
caseT{LowerCase, 0x10427, 0x1044F},
caseT{TitleCase, 0x10427, 0x10427},
// 10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
caseT{UpperCase, 0x10428, 0x10400},
caseT{LowerCase, 0x10428, 0x10428},
caseT{TitleCase, 0x10428, 0x10400},
// 1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
caseT{UpperCase, 0x1044F, 0x10427},
caseT{LowerCase, 0x1044F, 0x1044F},
caseT{TitleCase, 0x1044F, 0x10427},
// First one not in the 5.1.0 table
// 10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
caseT{UpperCase, 0x10450, 0x10450},
caseT{LowerCase, 0x10450, 0x10450},
caseT{TitleCase, 0x10450, 0x10450},
}
func TestIsLetter(t *testing.T) { func TestIsLetter(t *testing.T) {
for i, r := range upperTest { for i, r := range upperTest {
if !IsLetter(r) { if !IsLetter(r) {
t.Errorf("IsLetter(%#x) = false, want true\n", r); t.Errorf("IsLetter(U+%04X) = false, want true\n", r);
} }
} }
for i, r := range letterTest { for i, r := range letterTest {
if !IsLetter(r) { if !IsLetter(r) {
t.Errorf("IsLetter(%#x) = false, want true\n", r); t.Errorf("IsLetter(U+%04X) = false, want true\n", r);
} }
} }
for i, r := range notletterTest { for i, r := range notletterTest {
if IsLetter(r) { if IsLetter(r) {
t.Errorf("IsLetter(%#x) = true, want false\n", r); t.Errorf("IsLetter(U+%04X) = true, want false\n", r);
} }
} }
} }
...@@ -110,17 +217,74 @@ func TestIsLetter(t *testing.T) { ...@@ -110,17 +217,74 @@ func TestIsLetter(t *testing.T) {
func TestIsUpper(t *testing.T) { func TestIsUpper(t *testing.T) {
for i, r := range upperTest { for i, r := range upperTest {
if !IsUpper(r) { if !IsUpper(r) {
t.Errorf("IsUpper(%#x) = false, want true\n", r); t.Errorf("IsUpper(U+%04X) = false, want true\n", r);
} }
} }
for i, r := range notupperTest { for i, r := range notupperTest {
if IsUpper(r) { if IsUpper(r) {
t.Errorf("IsUpper(%#x) = true, want false\n", r); t.Errorf("IsUpper(U+%04X) = true, want false\n", r);
} }
} }
for i, r := range notletterTest { for i, r := range notletterTest {
if IsUpper(r) { if IsUpper(r) {
t.Errorf("IsUpper(%#x) = true, want false\n", r); t.Errorf("IsUpper(U+%04X) = true, want false\n", r);
}
}
}
func caseString(c int) string {
switch c {
case UpperCase:
return "UpperCase"
case LowerCase:
return "LowerCase"
case TitleCase:
return "TitleCase"
}
return "ErrorCase"
}
func TestTo(t *testing.T) {
for i, c := range caseTest {
r := To(c.cas, c.in);
if c.out != r {
t.Errorf("To(U+%04X, %s) = U+%04X want U+%04X\n", c.in, caseString(c.cas), r, c.out);
}
}
}
func TestToUpperCase(t *testing.T) {
for i, c := range caseTest {
if c.cas != UpperCase {
continue
}
r := ToUpper(c.in);
if c.out != r {
t.Errorf("ToUpper(U+%04X) = U+%04X want U+%04X\n", c.in, r, c.out);
}
}
}
func TestToLowerCase(t *testing.T) {
for i, c := range caseTest {
if c.cas != LowerCase {
continue
}
r := ToLower(c.in);
if c.out != r {
t.Errorf("ToLower(U+%04X) = U+%04X want U+%04X\n", c.in, r, c.out);
}
}
}
func TestToTitleCase(t *testing.T) {
for i, c := range caseTest {
if c.cas != TitleCase {
continue
}
r := ToTitle(c.in);
if c.out != r {
t.Errorf("ToTitle(U+%04X) = U+%04X want U+%04X\n", c.in, r, c.out);
} }
} }
} }
...@@ -21,6 +21,14 @@ import ( ...@@ -21,6 +21,14 @@ import (
"unicode"; "unicode";
) )
func main() {
flag.Parse();
loadChars(); // always needed
printCategories();
printScripts();
printCases();
}
var dataUrl = flag.String("data", "", "full URL for UnicodeData.txt; defaults to --url/UnicodeData.txt"); var dataUrl = flag.String("data", "", "full URL for UnicodeData.txt; defaults to --url/UnicodeData.txt");
var url = flag.String("url", var url = flag.String("url",
"http://www.unicode.org/Public/5.1.0/ucd/", "http://www.unicode.org/Public/5.1.0/ucd/",
...@@ -31,6 +39,9 @@ var tablelist = flag.String("tables", ...@@ -31,6 +39,9 @@ var tablelist = flag.String("tables",
var scriptlist = flag.String("scripts", var scriptlist = flag.String("scripts",
"all", "all",
"comma-separated list of which script tables to generate"); "comma-separated list of which script tables to generate");
var cases = flag.Bool("cases",
true,
"generate case tables");
var test = flag.Bool("test", var test = flag.Bool("test",
false, false,
"test existing tables; can be used to compare web data with package data"); "test existing tables; can be used to compare web data with package data");
...@@ -44,7 +55,7 @@ var category = map[string] bool{ "letter":true } // Nd Lu etc. letter is a speci ...@@ -44,7 +55,7 @@ var category = map[string] bool{ "letter":true } // Nd Lu etc. letter is a speci
// 0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; // 0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;;
// 007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A // 007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A
// See http://www.unicode.org/Public/5.1.0/ucd/UCD.html for full explanation // See http://www.unicode.org/Public/5.1.0/ucd/UCD.html for full explanation
// The fields // The fields:
const ( const (
FCodePoint = iota; FCodePoint = iota;
FName; FName;
...@@ -87,11 +98,11 @@ var fieldName = []string{ ...@@ -87,11 +98,11 @@ var fieldName = []string{
// This contains only the properties we're interested in. // This contains only the properties we're interested in.
type Char struct { type Char struct {
field []string; // debugging only; could be deleted if we take out char.dump() field []string; // debugging only; could be deleted if we take out char.dump()
codePoint uint32; // redundant (it's the index in the chars table) but useful codePoint uint32; // if zero, this index is not a valid code point.
category string; category string;
upperCase uint32; upperCase int;
lowerCase uint32; lowerCase int;
titleCase uint32; titleCase int;
} }
// Scripts.txt has form: // Scripts.txt has form:
...@@ -104,26 +115,21 @@ type Script struct { ...@@ -104,26 +115,21 @@ type Script struct {
script string; script string;
} }
func main() { var chars = make([]Char, MaxChar+1)
flag.Parse();
printCategories();
printScripts();
}
var chars = make([]Char, MaxChar)
var scripts = make(map[string] []Script) var scripts = make(map[string] []Script)
var lastChar uint32 = 0; var lastChar uint32 = 0;
// In UnicodeData.txt, some ranges are marked like this: // In UnicodeData.txt, some ranges are marked like this:
// 3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;; // 3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
// 4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;; // 4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
// parseCategory returns a state variable indicating the weirdness. // parseCategory returns a state variable indicating the weirdness.
type State int type State int
const ( const (
SNormal State = iota; // known to be zero for the type SNormal State = iota; // known to be zero for the type
SFirst; SFirst;
SLast; SLast;
SMissing;
) )
func parseCategory(line string) (state State) { func parseCategory(line string) (state State) {
...@@ -139,7 +145,7 @@ func parseCategory(line string) (state State) { ...@@ -139,7 +145,7 @@ func parseCategory(line string) (state State) {
if point == 0 { if point == 0 {
return // not interesting and we use 0 as unset return // not interesting and we use 0 as unset
} }
if point >= MaxChar { if point > MaxChar {
return; return;
} }
char := &chars[point]; char := &chars[point];
...@@ -189,7 +195,7 @@ func (char *Char) letter(u, l, t string) { ...@@ -189,7 +195,7 @@ func (char *Char) letter(u, l, t string) {
char.titleCase = char.letterValue(t, "T"); char.titleCase = char.letterValue(t, "T");
} }
func (char *Char) letterValue(s string, cas string) uint32 { func (char *Char) letterValue(s string, cas string) int {
if s == "" { if s == "" {
return 0 return 0
} }
...@@ -198,7 +204,7 @@ func (char *Char) letterValue(s string, cas string) uint32 { ...@@ -198,7 +204,7 @@ func (char *Char) letterValue(s string, cas string) uint32 {
char.dump(cas); char.dump(cas);
die.Logf("U+%04x: bad letter(%s): %s", char.codePoint, s, err) die.Logf("U+%04x: bad letter(%s): %s", char.codePoint, s, err)
} }
return uint32(v) return int(v)
} }
func allCategories() []string { func allCategories() []string {
...@@ -242,10 +248,7 @@ func letterOp(code int) bool { ...@@ -242,10 +248,7 @@ func letterOp(code int) bool {
return false return false
} }
func printCategories() { func loadChars() {
if *tablelist == "" {
return
}
if *dataUrl == "" { if *dataUrl == "" {
flag.Set("data", *url + "UnicodeData.txt"); flag.Set("data", *url + "UnicodeData.txt");
} }
...@@ -288,6 +291,12 @@ func printCategories() { ...@@ -288,6 +291,12 @@ func printCategories() {
} }
} }
resp.Body.Close(); resp.Body.Close();
}
func printCategories() {
if *tablelist == "" {
return
}
// Find out which categories to dump // Find out which categories to dump
list := strings.Split(*tablelist, ",", 0); list := strings.Split(*tablelist, ",", 0);
if *tablelist == "all" { if *tablelist == "all" {
...@@ -299,11 +308,11 @@ func printCategories() { ...@@ -299,11 +308,11 @@ func printCategories() {
} }
fmt.Printf( fmt.Printf(
"// Generated by running\n" "// Generated by running\n"
"// maketables --tables=%s --url=%s\n" "// maketables --tables=%s --data=%s\n"
"// DO NOT EDIT\n\n" "// DO NOT EDIT\n\n"
"package unicode\n\n", "package unicode\n\n",
*tablelist, *tablelist,
*url *dataUrl
); );
fmt.Println("// Version is the Unicode edition from which the tables are derived."); fmt.Println("// Version is the Unicode edition from which the tables are derived.");
...@@ -496,6 +505,9 @@ func parseScript(line string) { ...@@ -496,6 +505,9 @@ func parseScript(line string) {
} }
func printScripts() { func printScripts() {
if *scriptlist == "" {
return
}
var err os.Error; var err os.Error;
scriptRe, err = regexp.Compile(`([0-9A-F]+)(\.\.[0-9A-F]+)? +; ([A-Za-z_]+)`); scriptRe, err = regexp.Compile(`([0-9A-F]+)(\.\.[0-9A-F]+)? +; ([A-Za-z_]+)`);
if err != nil { if err != nil {
...@@ -604,3 +616,148 @@ func fullScriptTest(list []string) { ...@@ -604,3 +616,148 @@ func fullScriptTest(list []string) {
} }
} }
} }
const (
CaseUpper = 1 << iota;
CaseLower;
CaseTitle;
CaseNone = 0; // must be zero
CaseMissing = -1; // character not present; not a valid case state
)
type caseState struct {
point int;
_case int;
deltaToUpper int;
deltaToLower int;
deltaToTitle int;
}
// Is d a continuation of the state of c?
func (c *caseState) adjacent(d *caseState) bool {
if d.point < c.point {
return d.adjacent(c)
}
switch {
case d.point != c.point+1:
return false
case d._case != c._case:
return false
case c._case == CaseNone:
return false
case c._case == CaseMissing:
return false
case d.deltaToUpper != c.deltaToUpper:
return false
case d.deltaToLower != c.deltaToLower:
return false
case d.deltaToTitle != c.deltaToTitle:
return false
}
return true;
}
func getCaseState(i int) (c *caseState) {
c = &caseState{ point: i, _case: CaseNone };
ch := &chars[i];
switch int(ch.codePoint) {
case 0:
c._case = CaseMissing; // Will get NUL wrong but that doesn't matter
return;
case ch.upperCase:
c._case = CaseUpper;
case ch.lowerCase:
c._case = CaseLower;
case ch.titleCase:
c._case = CaseTitle;
}
if ch.upperCase != 0 {
c.deltaToUpper = ch.upperCase - i
}
if ch.lowerCase != 0 {
c.deltaToLower = ch.lowerCase - i
}
if ch.titleCase != 0 {
c.deltaToTitle = ch.titleCase - i
}
return;
}
func printCases() {
if !*cases {
return
}
if *test {
fullCaseTest();
return
}
fmt.Printf(
"// Generated by running\n"
"// maketables --data=%s\n"
"// DO NOT EDIT\n\n"
"// CaseRanges is the table describing case mappings for all letters with\n"
"// non-self mappings.\n"
"var CaseRanges = _CaseRanges\n"
"var _CaseRanges = []CaseRange {\n",
*dataUrl
);
var startState *caseState; // the start of a run; nil for not active
var prevState = &caseState{}; // the state of the previous character
for i, c := range chars {
state := getCaseState(i);
if state.adjacent(prevState) {
prevState = state;
continue;
}
// end of run (possibly)
printCaseRange(startState, prevState);
startState = nil;
if state._case != CaseMissing && state._case != CaseNone {
startState = state;
}
prevState = state;
}
fmt.Printf("}\n");
}
func printCaseRange(lo, hi *caseState) {
if lo == nil {
return
}
if lo.deltaToUpper == 0 && lo.deltaToLower == 0 && lo.deltaToTitle == 0 {
// character represents itself in all cases - no need to mention it
return
}
fmt.Printf("\tCaseRange{0x%04X, 0x%04X, d{%d, %d, %d}},\n",
lo.point, hi.point,
lo.deltaToUpper, lo.deltaToLower, lo.deltaToTitle)
}
// If the cased value in the Char is 0, it means use the rune itself.
func caseIt(rune, cased int) int {
if cased == 0 {
return rune
}
return cased
}
func fullCaseTest() {
for i, c := range chars {
lower := unicode.ToLower(i);
want := caseIt(i, c.lowerCase);
if lower != want {
fmt.Fprintf(os.Stderr, "lower U+%04X should be U+%04X is U+%04X\n", i, want, lower);
}
upper := unicode.ToUpper(i);
want = caseIt(i, c.upperCase);
if upper != want {
fmt.Fprintf(os.Stderr, "upper U+%04X should be U+%04X is U+%04X\n", i, want, upper);
}
title := unicode.ToTitle(i);
want = caseIt(i, c.titleCase);
if title != want {
fmt.Fprintf(os.Stderr, "title U+%04X should be U+%04X is U+%04X\n", i, want, title);
}
}
}
// Generated by running // Generated by running
// maketables --tables=all --url=http://www.unicode.org/Public/5.1.0/ucd/ // maketables --tables=all --data=http://www.unicode.org/Public/5.1.0/ucd/UnicodeData.txt
// DO NOT EDIT // DO NOT EDIT
package unicode package unicode
...@@ -2788,3 +2788,1209 @@ var ( ...@@ -2788,3 +2788,1209 @@ var (
Yi = _Yi; // Yi is the set of Unicode characters in script Yi. Yi = _Yi; // Yi is the set of Unicode characters in script Yi.
) )
// Generated by running
// maketables --data=http://www.unicode.org/Public/5.1.0/ucd/UnicodeData.txt
// DO NOT EDIT
// CaseRanges is the table describing case mappings for all letters with
// non-self mappings.
var CaseRanges = _CaseRanges
var _CaseRanges = []CaseRange {
CaseRange{0x0041, 0x005A, d{0, 32, 0}},
CaseRange{0x0061, 0x007A, d{-32, 0, -32}},
CaseRange{0x00B5, 0x00B5, d{743, 0, 743}},
CaseRange{0x00C0, 0x00D6, d{0, 32, 0}},
CaseRange{0x00D8, 0x00DE, d{0, 32, 0}},
CaseRange{0x00E0, 0x00F6, d{-32, 0, -32}},
CaseRange{0x00F8, 0x00FE, d{-32, 0, -32}},
CaseRange{0x00FF, 0x00FF, d{121, 0, 121}},
CaseRange{0x0100, 0x0100, d{0, 1, 0}},
CaseRange{0x0101, 0x0101, d{-1, 0, -1}},
CaseRange{0x0102, 0x0102, d{0, 1, 0}},
CaseRange{0x0103, 0x0103, d{-1, 0, -1}},
CaseRange{0x0104, 0x0104, d{0, 1, 0}},
CaseRange{0x0105, 0x0105, d{-1, 0, -1}},
CaseRange{0x0106, 0x0106, d{0, 1, 0}},
CaseRange{0x0107, 0x0107, d{-1, 0, -1}},
CaseRange{0x0108, 0x0108, d{0, 1, 0}},
CaseRange{0x0109, 0x0109, d{-1, 0, -1}},
CaseRange{0x010A, 0x010A, d{0, 1, 0}},
CaseRange{0x010B, 0x010B, d{-1, 0, -1}},
CaseRange{0x010C, 0x010C, d{0, 1, 0}},
CaseRange{0x010D, 0x010D, d{-1, 0, -1}},
CaseRange{0x010E, 0x010E, d{0, 1, 0}},
CaseRange{0x010F, 0x010F, d{-1, 0, -1}},
CaseRange{0x0110, 0x0110, d{0, 1, 0}},
CaseRange{0x0111, 0x0111, d{-1, 0, -1}},
CaseRange{0x0112, 0x0112, d{0, 1, 0}},
CaseRange{0x0113, 0x0113, d{-1, 0, -1}},
CaseRange{0x0114, 0x0114, d{0, 1, 0}},
CaseRange{0x0115, 0x0115, d{-1, 0, -1}},
CaseRange{0x0116, 0x0116, d{0, 1, 0}},
CaseRange{0x0117, 0x0117, d{-1, 0, -1}},
CaseRange{0x0118, 0x0118, d{0, 1, 0}},
CaseRange{0x0119, 0x0119, d{-1, 0, -1}},
CaseRange{0x011A, 0x011A, d{0, 1, 0}},
CaseRange{0x011B, 0x011B, d{-1, 0, -1}},
CaseRange{0x011C, 0x011C, d{0, 1, 0}},
CaseRange{0x011D, 0x011D, d{-1, 0, -1}},
CaseRange{0x011E, 0x011E, d{0, 1, 0}},
CaseRange{0x011F, 0x011F, d{-1, 0, -1}},
CaseRange{0x0120, 0x0120, d{0, 1, 0}},
CaseRange{0x0121, 0x0121, d{-1, 0, -1}},
CaseRange{0x0122, 0x0122, d{0, 1, 0}},
CaseRange{0x0123, 0x0123, d{-1, 0, -1}},
CaseRange{0x0124, 0x0124, d{0, 1, 0}},
CaseRange{0x0125, 0x0125, d{-1, 0, -1}},
CaseRange{0x0126, 0x0126, d{0, 1, 0}},
CaseRange{0x0127, 0x0127, d{-1, 0, -1}},
CaseRange{0x0128, 0x0128, d{0, 1, 0}},
CaseRange{0x0129, 0x0129, d{-1, 0, -1}},
CaseRange{0x012A, 0x012A, d{0, 1, 0}},
CaseRange{0x012B, 0x012B, d{-1, 0, -1}},
CaseRange{0x012C, 0x012C, d{0, 1, 0}},
CaseRange{0x012D, 0x012D, d{-1, 0, -1}},
CaseRange{0x012E, 0x012E, d{0, 1, 0}},
CaseRange{0x012F, 0x012F, d{-1, 0, -1}},
CaseRange{0x0130, 0x0130, d{0, -199, 0}},
CaseRange{0x0131, 0x0131, d{-232, 0, -232}},
CaseRange{0x0132, 0x0132, d{0, 1, 0}},
CaseRange{0x0133, 0x0133, d{-1, 0, -1}},
CaseRange{0x0134, 0x0134, d{0, 1, 0}},
CaseRange{0x0135, 0x0135, d{-1, 0, -1}},
CaseRange{0x0136, 0x0136, d{0, 1, 0}},
CaseRange{0x0137, 0x0137, d{-1, 0, -1}},
CaseRange{0x0139, 0x0139, d{0, 1, 0}},
CaseRange{0x013A, 0x013A, d{-1, 0, -1}},
CaseRange{0x013B, 0x013B, d{0, 1, 0}},
CaseRange{0x013C, 0x013C, d{-1, 0, -1}},
CaseRange{0x013D, 0x013D, d{0, 1, 0}},
CaseRange{0x013E, 0x013E, d{-1, 0, -1}},
CaseRange{0x013F, 0x013F, d{0, 1, 0}},
CaseRange{0x0140, 0x0140, d{-1, 0, -1}},
CaseRange{0x0141, 0x0141, d{0, 1, 0}},
CaseRange{0x0142, 0x0142, d{-1, 0, -1}},
CaseRange{0x0143, 0x0143, d{0, 1, 0}},
CaseRange{0x0144, 0x0144, d{-1, 0, -1}},
CaseRange{0x0145, 0x0145, d{0, 1, 0}},
CaseRange{0x0146, 0x0146, d{-1, 0, -1}},
CaseRange{0x0147, 0x0147, d{0, 1, 0}},
CaseRange{0x0148, 0x0148, d{-1, 0, -1}},
CaseRange{0x014A, 0x014A, d{0, 1, 0}},
CaseRange{0x014B, 0x014B, d{-1, 0, -1}},
CaseRange{0x014C, 0x014C, d{0, 1, 0}},
CaseRange{0x014D, 0x014D, d{-1, 0, -1}},
CaseRange{0x014E, 0x014E, d{0, 1, 0}},
CaseRange{0x014F, 0x014F, d{-1, 0, -1}},
CaseRange{0x0150, 0x0150, d{0, 1, 0}},
CaseRange{0x0151, 0x0151, d{-1, 0, -1}},
CaseRange{0x0152, 0x0152, d{0, 1, 0}},
CaseRange{0x0153, 0x0153, d{-1, 0, -1}},
CaseRange{0x0154, 0x0154, d{0, 1, 0}},
CaseRange{0x0155, 0x0155, d{-1, 0, -1}},
CaseRange{0x0156, 0x0156, d{0, 1, 0}},
CaseRange{0x0157, 0x0157, d{-1, 0, -1}},
CaseRange{0x0158, 0x0158, d{0, 1, 0}},
CaseRange{0x0159, 0x0159, d{-1, 0, -1}},
CaseRange{0x015A, 0x015A, d{0, 1, 0}},
CaseRange{0x015B, 0x015B, d{-1, 0, -1}},
CaseRange{0x015C, 0x015C, d{0, 1, 0}},
CaseRange{0x015D, 0x015D, d{-1, 0, -1}},
CaseRange{0x015E, 0x015E, d{0, 1, 0}},
CaseRange{0x015F, 0x015F, d{-1, 0, -1}},
CaseRange{0x0160, 0x0160, d{0, 1, 0}},
CaseRange{0x0161, 0x0161, d{-1, 0, -1}},
CaseRange{0x0162, 0x0162, d{0, 1, 0}},
CaseRange{0x0163, 0x0163, d{-1, 0, -1}},
CaseRange{0x0164, 0x0164, d{0, 1, 0}},
CaseRange{0x0165, 0x0165, d{-1, 0, -1}},
CaseRange{0x0166, 0x0166, d{0, 1, 0}},
CaseRange{0x0167, 0x0167, d{-1, 0, -1}},
CaseRange{0x0168, 0x0168, d{0, 1, 0}},
CaseRange{0x0169, 0x0169, d{-1, 0, -1}},
CaseRange{0x016A, 0x016A, d{0, 1, 0}},
CaseRange{0x016B, 0x016B, d{-1, 0, -1}},
CaseRange{0x016C, 0x016C, d{0, 1, 0}},
CaseRange{0x016D, 0x016D, d{-1, 0, -1}},
CaseRange{0x016E, 0x016E, d{0, 1, 0}},
CaseRange{0x016F, 0x016F, d{-1, 0, -1}},
CaseRange{0x0170, 0x0170, d{0, 1, 0}},
CaseRange{0x0171, 0x0171, d{-1, 0, -1}},
CaseRange{0x0172, 0x0172, d{0, 1, 0}},
CaseRange{0x0173, 0x0173, d{-1, 0, -1}},
CaseRange{0x0174, 0x0174, d{0, 1, 0}},
CaseRange{0x0175, 0x0175, d{-1, 0, -1}},
CaseRange{0x0176, 0x0176, d{0, 1, 0}},
CaseRange{0x0177, 0x0177, d{-1, 0, -1}},
CaseRange{0x0178, 0x0178, d{0, -121, 0}},
CaseRange{0x0179, 0x0179, d{0, 1, 0}},
CaseRange{0x017A, 0x017A, d{-1, 0, -1}},
CaseRange{0x017B, 0x017B, d{0, 1, 0}},
CaseRange{0x017C, 0x017C, d{-1, 0, -1}},
CaseRange{0x017D, 0x017D, d{0, 1, 0}},
CaseRange{0x017E, 0x017E, d{-1, 0, -1}},
CaseRange{0x017F, 0x017F, d{-300, 0, -300}},
CaseRange{0x0180, 0x0180, d{195, 0, 195}},
CaseRange{0x0181, 0x0181, d{0, 210, 0}},
CaseRange{0x0182, 0x0182, d{0, 1, 0}},
CaseRange{0x0183, 0x0183, d{-1, 0, -1}},
CaseRange{0x0184, 0x0184, d{0, 1, 0}},
CaseRange{0x0185, 0x0185, d{-1, 0, -1}},
CaseRange{0x0186, 0x0186, d{0, 206, 0}},
CaseRange{0x0187, 0x0187, d{0, 1, 0}},
CaseRange{0x0188, 0x0188, d{-1, 0, -1}},
CaseRange{0x0189, 0x018A, d{0, 205, 0}},
CaseRange{0x018B, 0x018B, d{0, 1, 0}},
CaseRange{0x018C, 0x018C, d{-1, 0, -1}},
CaseRange{0x018E, 0x018E, d{0, 79, 0}},
CaseRange{0x018F, 0x018F, d{0, 202, 0}},
CaseRange{0x0190, 0x0190, d{0, 203, 0}},
CaseRange{0x0191, 0x0191, d{0, 1, 0}},
CaseRange{0x0192, 0x0192, d{-1, 0, -1}},
CaseRange{0x0193, 0x0193, d{0, 205, 0}},
CaseRange{0x0194, 0x0194, d{0, 207, 0}},
CaseRange{0x0195, 0x0195, d{97, 0, 97}},
CaseRange{0x0196, 0x0196, d{0, 211, 0}},
CaseRange{0x0197, 0x0197, d{0, 209, 0}},
CaseRange{0x0198, 0x0198, d{0, 1, 0}},
CaseRange{0x0199, 0x0199, d{-1, 0, -1}},
CaseRange{0x019A, 0x019A, d{163, 0, 163}},
CaseRange{0x019C, 0x019C, d{0, 211, 0}},
CaseRange{0x019D, 0x019D, d{0, 213, 0}},
CaseRange{0x019E, 0x019E, d{130, 0, 130}},
CaseRange{0x019F, 0x019F, d{0, 214, 0}},
CaseRange{0x01A0, 0x01A0, d{0, 1, 0}},
CaseRange{0x01A1, 0x01A1, d{-1, 0, -1}},
CaseRange{0x01A2, 0x01A2, d{0, 1, 0}},
CaseRange{0x01A3, 0x01A3, d{-1, 0, -1}},
CaseRange{0x01A4, 0x01A4, d{0, 1, 0}},
CaseRange{0x01A5, 0x01A5, d{-1, 0, -1}},
CaseRange{0x01A6, 0x01A6, d{0, 218, 0}},
CaseRange{0x01A7, 0x01A7, d{0, 1, 0}},
CaseRange{0x01A8, 0x01A8, d{-1, 0, -1}},
CaseRange{0x01A9, 0x01A9, d{0, 218, 0}},
CaseRange{0x01AC, 0x01AC, d{0, 1, 0}},
CaseRange{0x01AD, 0x01AD, d{-1, 0, -1}},
CaseRange{0x01AE, 0x01AE, d{0, 218, 0}},
CaseRange{0x01AF, 0x01AF, d{0, 1, 0}},
CaseRange{0x01B0, 0x01B0, d{-1, 0, -1}},
CaseRange{0x01B1, 0x01B2, d{0, 217, 0}},
CaseRange{0x01B3, 0x01B3, d{0, 1, 0}},
CaseRange{0x01B4, 0x01B4, d{-1, 0, -1}},
CaseRange{0x01B5, 0x01B5, d{0, 1, 0}},
CaseRange{0x01B6, 0x01B6, d{-1, 0, -1}},
CaseRange{0x01B7, 0x01B7, d{0, 219, 0}},
CaseRange{0x01B8, 0x01B8, d{0, 1, 0}},
CaseRange{0x01B9, 0x01B9, d{-1, 0, -1}},
CaseRange{0x01BC, 0x01BC, d{0, 1, 0}},
CaseRange{0x01BD, 0x01BD, d{-1, 0, -1}},
CaseRange{0x01BF, 0x01BF, d{56, 0, 56}},
CaseRange{0x01C4, 0x01C4, d{0, 2, 1}},
CaseRange{0x01C5, 0x01C5, d{-1, 1, 0}},
CaseRange{0x01C6, 0x01C6, d{-2, 0, -1}},
CaseRange{0x01C7, 0x01C7, d{0, 2, 1}},
CaseRange{0x01C8, 0x01C8, d{-1, 1, 0}},
CaseRange{0x01C9, 0x01C9, d{-2, 0, -1}},
CaseRange{0x01CA, 0x01CA, d{0, 2, 1}},
CaseRange{0x01CB, 0x01CB, d{-1, 1, 0}},
CaseRange{0x01CC, 0x01CC, d{-2, 0, -1}},
CaseRange{0x01CD, 0x01CD, d{0, 1, 0}},
CaseRange{0x01CE, 0x01CE, d{-1, 0, -1}},
CaseRange{0x01CF, 0x01CF, d{0, 1, 0}},
CaseRange{0x01D0, 0x01D0, d{-1, 0, -1}},
CaseRange{0x01D1, 0x01D1, d{0, 1, 0}},
CaseRange{0x01D2, 0x01D2, d{-1, 0, -1}},
CaseRange{0x01D3, 0x01D3, d{0, 1, 0}},
CaseRange{0x01D4, 0x01D4, d{-1, 0, -1}},
CaseRange{0x01D5, 0x01D5, d{0, 1, 0}},
CaseRange{0x01D6, 0x01D6, d{-1, 0, -1}},
CaseRange{0x01D7, 0x01D7, d{0, 1, 0}},
CaseRange{0x01D8, 0x01D8, d{-1, 0, -1}},
CaseRange{0x01D9, 0x01D9, d{0, 1, 0}},
CaseRange{0x01DA, 0x01DA, d{-1, 0, -1}},
CaseRange{0x01DB, 0x01DB, d{0, 1, 0}},
CaseRange{0x01DC, 0x01DC, d{-1, 0, -1}},
CaseRange{0x01DD, 0x01DD, d{-79, 0, -79}},
CaseRange{0x01DE, 0x01DE, d{0, 1, 0}},
CaseRange{0x01DF, 0x01DF, d{-1, 0, -1}},
CaseRange{0x01E0, 0x01E0, d{0, 1, 0}},
CaseRange{0x01E1, 0x01E1, d{-1, 0, -1}},
CaseRange{0x01E2, 0x01E2, d{0, 1, 0}},
CaseRange{0x01E3, 0x01E3, d{-1, 0, -1}},
CaseRange{0x01E4, 0x01E4, d{0, 1, 0}},
CaseRange{0x01E5, 0x01E5, d{-1, 0, -1}},
CaseRange{0x01E6, 0x01E6, d{0, 1, 0}},
CaseRange{0x01E7, 0x01E7, d{-1, 0, -1}},
CaseRange{0x01E8, 0x01E8, d{0, 1, 0}},
CaseRange{0x01E9, 0x01E9, d{-1, 0, -1}},
CaseRange{0x01EA, 0x01EA, d{0, 1, 0}},
CaseRange{0x01EB, 0x01EB, d{-1, 0, -1}},
CaseRange{0x01EC, 0x01EC, d{0, 1, 0}},
CaseRange{0x01ED, 0x01ED, d{-1, 0, -1}},
CaseRange{0x01EE, 0x01EE, d{0, 1, 0}},
CaseRange{0x01EF, 0x01EF, d{-1, 0, -1}},
CaseRange{0x01F1, 0x01F1, d{0, 2, 1}},
CaseRange{0x01F2, 0x01F2, d{-1, 1, 0}},
CaseRange{0x01F3, 0x01F3, d{-2, 0, -1}},
CaseRange{0x01F4, 0x01F4, d{0, 1, 0}},
CaseRange{0x01F5, 0x01F5, d{-1, 0, -1}},
CaseRange{0x01F6, 0x01F6, d{0, -97, 0}},
CaseRange{0x01F7, 0x01F7, d{0, -56, 0}},
CaseRange{0x01F8, 0x01F8, d{0, 1, 0}},
CaseRange{0x01F9, 0x01F9, d{-1, 0, -1}},
CaseRange{0x01FA, 0x01FA, d{0, 1, 0}},
CaseRange{0x01FB, 0x01FB, d{-1, 0, -1}},
CaseRange{0x01FC, 0x01FC, d{0, 1, 0}},
CaseRange{0x01FD, 0x01FD, d{-1, 0, -1}},
CaseRange{0x01FE, 0x01FE, d{0, 1, 0}},
CaseRange{0x01FF, 0x01FF, d{-1, 0, -1}},
CaseRange{0x0200, 0x0200, d{0, 1, 0}},
CaseRange{0x0201, 0x0201, d{-1, 0, -1}},
CaseRange{0x0202, 0x0202, d{0, 1, 0}},
CaseRange{0x0203, 0x0203, d{-1, 0, -1}},
CaseRange{0x0204, 0x0204, d{0, 1, 0}},
CaseRange{0x0205, 0x0205, d{-1, 0, -1}},
CaseRange{0x0206, 0x0206, d{0, 1, 0}},
CaseRange{0x0207, 0x0207, d{-1, 0, -1}},
CaseRange{0x0208, 0x0208, d{0, 1, 0}},
CaseRange{0x0209, 0x0209, d{-1, 0, -1}},
CaseRange{0x020A, 0x020A, d{0, 1, 0}},
CaseRange{0x020B, 0x020B, d{-1, 0, -1}},
CaseRange{0x020C, 0x020C, d{0, 1, 0}},
CaseRange{0x020D, 0x020D, d{-1, 0, -1}},
CaseRange{0x020E, 0x020E, d{0, 1, 0}},
CaseRange{0x020F, 0x020F, d{-1, 0, -1}},
CaseRange{0x0210, 0x0210, d{0, 1, 0}},
CaseRange{0x0211, 0x0211, d{-1, 0, -1}},
CaseRange{0x0212, 0x0212, d{0, 1, 0}},
CaseRange{0x0213, 0x0213, d{-1, 0, -1}},
CaseRange{0x0214, 0x0214, d{0, 1, 0}},
CaseRange{0x0215, 0x0215, d{-1, 0, -1}},
CaseRange{0x0216, 0x0216, d{0, 1, 0}},
CaseRange{0x0217, 0x0217, d{-1, 0, -1}},
CaseRange{0x0218, 0x0218, d{0, 1, 0}},
CaseRange{0x0219, 0x0219, d{-1, 0, -1}},
CaseRange{0x021A, 0x021A, d{0, 1, 0}},
CaseRange{0x021B, 0x021B, d{-1, 0, -1}},
CaseRange{0x021C, 0x021C, d{0, 1, 0}},
CaseRange{0x021D, 0x021D, d{-1, 0, -1}},
CaseRange{0x021E, 0x021E, d{0, 1, 0}},
CaseRange{0x021F, 0x021F, d{-1, 0, -1}},
CaseRange{0x0220, 0x0220, d{0, -130, 0}},
CaseRange{0x0222, 0x0222, d{0, 1, 0}},
CaseRange{0x0223, 0x0223, d{-1, 0, -1}},
CaseRange{0x0224, 0x0224, d{0, 1, 0}},
CaseRange{0x0225, 0x0225, d{-1, 0, -1}},
CaseRange{0x0226, 0x0226, d{0, 1, 0}},
CaseRange{0x0227, 0x0227, d{-1, 0, -1}},
CaseRange{0x0228, 0x0228, d{0, 1, 0}},
CaseRange{0x0229, 0x0229, d{-1, 0, -1}},
CaseRange{0x022A, 0x022A, d{0, 1, 0}},
CaseRange{0x022B, 0x022B, d{-1, 0, -1}},
CaseRange{0x022C, 0x022C, d{0, 1, 0}},
CaseRange{0x022D, 0x022D, d{-1, 0, -1}},
CaseRange{0x022E, 0x022E, d{0, 1, 0}},
CaseRange{0x022F, 0x022F, d{-1, 0, -1}},
CaseRange{0x0230, 0x0230, d{0, 1, 0}},
CaseRange{0x0231, 0x0231, d{-1, 0, -1}},
CaseRange{0x0232, 0x0232, d{0, 1, 0}},
CaseRange{0x0233, 0x0233, d{-1, 0, -1}},
CaseRange{0x023A, 0x023A, d{0, 10795, 0}},
CaseRange{0x023B, 0x023B, d{0, 1, 0}},
CaseRange{0x023C, 0x023C, d{-1, 0, -1}},
CaseRange{0x023D, 0x023D, d{0, -163, 0}},
CaseRange{0x023E, 0x023E, d{0, 10792, 0}},
CaseRange{0x0241, 0x0241, d{0, 1, 0}},
CaseRange{0x0242, 0x0242, d{-1, 0, -1}},
CaseRange{0x0243, 0x0243, d{0, -195, 0}},
CaseRange{0x0244, 0x0244, d{0, 69, 0}},
CaseRange{0x0245, 0x0245, d{0, 71, 0}},
CaseRange{0x0246, 0x0246, d{0, 1, 0}},
CaseRange{0x0247, 0x0247, d{-1, 0, -1}},
CaseRange{0x0248, 0x0248, d{0, 1, 0}},
CaseRange{0x0249, 0x0249, d{-1, 0, -1}},
CaseRange{0x024A, 0x024A, d{0, 1, 0}},
CaseRange{0x024B, 0x024B, d{-1, 0, -1}},
CaseRange{0x024C, 0x024C, d{0, 1, 0}},
CaseRange{0x024D, 0x024D, d{-1, 0, -1}},
CaseRange{0x024E, 0x024E, d{0, 1, 0}},
CaseRange{0x024F, 0x024F, d{-1, 0, -1}},
CaseRange{0x0250, 0x0250, d{10783, 0, 10783}},
CaseRange{0x0251, 0x0251, d{10780, 0, 10780}},
CaseRange{0x0253, 0x0253, d{-210, 0, -210}},
CaseRange{0x0254, 0x0254, d{-206, 0, -206}},
CaseRange{0x0256, 0x0257, d{-205, 0, -205}},
CaseRange{0x0259, 0x0259, d{-202, 0, -202}},
CaseRange{0x025B, 0x025B, d{-203, 0, -203}},
CaseRange{0x0260, 0x0260, d{-205, 0, -205}},
CaseRange{0x0263, 0x0263, d{-207, 0, -207}},
CaseRange{0x0268, 0x0268, d{-209, 0, -209}},
CaseRange{0x0269, 0x0269, d{-211, 0, -211}},
CaseRange{0x026B, 0x026B, d{10743, 0, 10743}},
CaseRange{0x026F, 0x026F, d{-211, 0, -211}},
CaseRange{0x0271, 0x0271, d{10749, 0, 10749}},
CaseRange{0x0272, 0x0272, d{-213, 0, -213}},
CaseRange{0x0275, 0x0275, d{-214, 0, -214}},
CaseRange{0x027D, 0x027D, d{10727, 0, 10727}},
CaseRange{0x0280, 0x0280, d{-218, 0, -218}},
CaseRange{0x0283, 0x0283, d{-218, 0, -218}},
CaseRange{0x0288, 0x0288, d{-218, 0, -218}},
CaseRange{0x0289, 0x0289, d{-69, 0, -69}},
CaseRange{0x028A, 0x028B, d{-217, 0, -217}},
CaseRange{0x028C, 0x028C, d{-71, 0, -71}},
CaseRange{0x0292, 0x0292, d{-219, 0, -219}},
CaseRange{0x0370, 0x0370, d{0, 1, 0}},
CaseRange{0x0371, 0x0371, d{-1, 0, -1}},
CaseRange{0x0372, 0x0372, d{0, 1, 0}},
CaseRange{0x0373, 0x0373, d{-1, 0, -1}},
CaseRange{0x0376, 0x0376, d{0, 1, 0}},
CaseRange{0x0377, 0x0377, d{-1, 0, -1}},
CaseRange{0x037B, 0x037D, d{130, 0, 130}},
CaseRange{0x0386, 0x0386, d{0, 38, 0}},
CaseRange{0x0388, 0x038A, d{0, 37, 0}},
CaseRange{0x038C, 0x038C, d{0, 64, 0}},
CaseRange{0x038E, 0x038F, d{0, 63, 0}},
CaseRange{0x0391, 0x03A1, d{0, 32, 0}},
CaseRange{0x03A3, 0x03AB, d{0, 32, 0}},
CaseRange{0x03AC, 0x03AC, d{-38, 0, -38}},
CaseRange{0x03AD, 0x03AF, d{-37, 0, -37}},
CaseRange{0x03B1, 0x03C1, d{-32, 0, -32}},
CaseRange{0x03C2, 0x03C2, d{-31, 0, -31}},
CaseRange{0x03C3, 0x03CB, d{-32, 0, -32}},
CaseRange{0x03CC, 0x03CC, d{-64, 0, -64}},
CaseRange{0x03CD, 0x03CE, d{-63, 0, -63}},
CaseRange{0x03CF, 0x03CF, d{0, 8, 0}},
CaseRange{0x03D0, 0x03D0, d{-62, 0, -62}},
CaseRange{0x03D1, 0x03D1, d{-57, 0, -57}},
CaseRange{0x03D5, 0x03D5, d{-47, 0, -47}},
CaseRange{0x03D6, 0x03D6, d{-54, 0, -54}},
CaseRange{0x03D7, 0x03D7, d{-8, 0, -8}},
CaseRange{0x03D8, 0x03D8, d{0, 1, 0}},
CaseRange{0x03D9, 0x03D9, d{-1, 0, -1}},
CaseRange{0x03DA, 0x03DA, d{0, 1, 0}},
CaseRange{0x03DB, 0x03DB, d{-1, 0, -1}},
CaseRange{0x03DC, 0x03DC, d{0, 1, 0}},
CaseRange{0x03DD, 0x03DD, d{-1, 0, -1}},
CaseRange{0x03DE, 0x03DE, d{0, 1, 0}},
CaseRange{0x03DF, 0x03DF, d{-1, 0, -1}},
CaseRange{0x03E0, 0x03E0, d{0, 1, 0}},
CaseRange{0x03E1, 0x03E1, d{-1, 0, -1}},
CaseRange{0x03E2, 0x03E2, d{0, 1, 0}},
CaseRange{0x03E3, 0x03E3, d{-1, 0, -1}},
CaseRange{0x03E4, 0x03E4, d{0, 1, 0}},
CaseRange{0x03E5, 0x03E5, d{-1, 0, -1}},
CaseRange{0x03E6, 0x03E6, d{0, 1, 0}},
CaseRange{0x03E7, 0x03E7, d{-1, 0, -1}},
CaseRange{0x03E8, 0x03E8, d{0, 1, 0}},
CaseRange{0x03E9, 0x03E9, d{-1, 0, -1}},
CaseRange{0x03EA, 0x03EA, d{0, 1, 0}},
CaseRange{0x03EB, 0x03EB, d{-1, 0, -1}},
CaseRange{0x03EC, 0x03EC, d{0, 1, 0}},
CaseRange{0x03ED, 0x03ED, d{-1, 0, -1}},
CaseRange{0x03EE, 0x03EE, d{0, 1, 0}},
CaseRange{0x03EF, 0x03EF, d{-1, 0, -1}},
CaseRange{0x03F0, 0x03F0, d{-86, 0, -86}},
CaseRange{0x03F1, 0x03F1, d{-80, 0, -80}},
CaseRange{0x03F2, 0x03F2, d{7, 0, 7}},
CaseRange{0x03F4, 0x03F4, d{0, -60, 0}},
CaseRange{0x03F5, 0x03F5, d{-96, 0, -96}},
CaseRange{0x03F7, 0x03F7, d{0, 1, 0}},
CaseRange{0x03F8, 0x03F8, d{-1, 0, -1}},
CaseRange{0x03F9, 0x03F9, d{0, -7, 0}},
CaseRange{0x03FA, 0x03FA, d{0, 1, 0}},
CaseRange{0x03FB, 0x03FB, d{-1, 0, -1}},
CaseRange{0x03FD, 0x03FF, d{0, -130, 0}},
CaseRange{0x0400, 0x040F, d{0, 80, 0}},
CaseRange{0x0410, 0x042F, d{0, 32, 0}},
CaseRange{0x0430, 0x044F, d{-32, 0, -32}},
CaseRange{0x0450, 0x045F, d{-80, 0, -80}},
CaseRange{0x0460, 0x0460, d{0, 1, 0}},
CaseRange{0x0461, 0x0461, d{-1, 0, -1}},
CaseRange{0x0462, 0x0462, d{0, 1, 0}},
CaseRange{0x0463, 0x0463, d{-1, 0, -1}},
CaseRange{0x0464, 0x0464, d{0, 1, 0}},
CaseRange{0x0465, 0x0465, d{-1, 0, -1}},
CaseRange{0x0466, 0x0466, d{0, 1, 0}},
CaseRange{0x0467, 0x0467, d{-1, 0, -1}},
CaseRange{0x0468, 0x0468, d{0, 1, 0}},
CaseRange{0x0469, 0x0469, d{-1, 0, -1}},
CaseRange{0x046A, 0x046A, d{0, 1, 0}},
CaseRange{0x046B, 0x046B, d{-1, 0, -1}},
CaseRange{0x046C, 0x046C, d{0, 1, 0}},
CaseRange{0x046D, 0x046D, d{-1, 0, -1}},
CaseRange{0x046E, 0x046E, d{0, 1, 0}},
CaseRange{0x046F, 0x046F, d{-1, 0, -1}},
CaseRange{0x0470, 0x0470, d{0, 1, 0}},
CaseRange{0x0471, 0x0471, d{-1, 0, -1}},
CaseRange{0x0472, 0x0472, d{0, 1, 0}},
CaseRange{0x0473, 0x0473, d{-1, 0, -1}},
CaseRange{0x0474, 0x0474, d{0, 1, 0}},
CaseRange{0x0475, 0x0475, d{-1, 0, -1}},
CaseRange{0x0476, 0x0476, d{0, 1, 0}},
CaseRange{0x0477, 0x0477, d{-1, 0, -1}},
CaseRange{0x0478, 0x0478, d{0, 1, 0}},
CaseRange{0x0479, 0x0479, d{-1, 0, -1}},
CaseRange{0x047A, 0x047A, d{0, 1, 0}},
CaseRange{0x047B, 0x047B, d{-1, 0, -1}},
CaseRange{0x047C, 0x047C, d{0, 1, 0}},
CaseRange{0x047D, 0x047D, d{-1, 0, -1}},
CaseRange{0x047E, 0x047E, d{0, 1, 0}},
CaseRange{0x047F, 0x047F, d{-1, 0, -1}},
CaseRange{0x0480, 0x0480, d{0, 1, 0}},
CaseRange{0x0481, 0x0481, d{-1, 0, -1}},
CaseRange{0x048A, 0x048A, d{0, 1, 0}},
CaseRange{0x048B, 0x048B, d{-1, 0, -1}},
CaseRange{0x048C, 0x048C, d{0, 1, 0}},
CaseRange{0x048D, 0x048D, d{-1, 0, -1}},
CaseRange{0x048E, 0x048E, d{0, 1, 0}},
CaseRange{0x048F, 0x048F, d{-1, 0, -1}},
CaseRange{0x0490, 0x0490, d{0, 1, 0}},
CaseRange{0x0491, 0x0491, d{-1, 0, -1}},
CaseRange{0x0492, 0x0492, d{0, 1, 0}},
CaseRange{0x0493, 0x0493, d{-1, 0, -1}},
CaseRange{0x0494, 0x0494, d{0, 1, 0}},
CaseRange{0x0495, 0x0495, d{-1, 0, -1}},
CaseRange{0x0496, 0x0496, d{0, 1, 0}},
CaseRange{0x0497, 0x0497, d{-1, 0, -1}},
CaseRange{0x0498, 0x0498, d{0, 1, 0}},
CaseRange{0x0499, 0x0499, d{-1, 0, -1}},
CaseRange{0x049A, 0x049A, d{0, 1, 0}},
CaseRange{0x049B, 0x049B, d{-1, 0, -1}},
CaseRange{0x049C, 0x049C, d{0, 1, 0}},
CaseRange{0x049D, 0x049D, d{-1, 0, -1}},
CaseRange{0x049E, 0x049E, d{0, 1, 0}},
CaseRange{0x049F, 0x049F, d{-1, 0, -1}},
CaseRange{0x04A0, 0x04A0, d{0, 1, 0}},
CaseRange{0x04A1, 0x04A1, d{-1, 0, -1}},
CaseRange{0x04A2, 0x04A2, d{0, 1, 0}},
CaseRange{0x04A3, 0x04A3, d{-1, 0, -1}},
CaseRange{0x04A4, 0x04A4, d{0, 1, 0}},
CaseRange{0x04A5, 0x04A5, d{-1, 0, -1}},
CaseRange{0x04A6, 0x04A6, d{0, 1, 0}},
CaseRange{0x04A7, 0x04A7, d{-1, 0, -1}},
CaseRange{0x04A8, 0x04A8, d{0, 1, 0}},
CaseRange{0x04A9, 0x04A9, d{-1, 0, -1}},
CaseRange{0x04AA, 0x04AA, d{0, 1, 0}},
CaseRange{0x04AB, 0x04AB, d{-1, 0, -1}},
CaseRange{0x04AC, 0x04AC, d{0, 1, 0}},
CaseRange{0x04AD, 0x04AD, d{-1, 0, -1}},
CaseRange{0x04AE, 0x04AE, d{0, 1, 0}},
CaseRange{0x04AF, 0x04AF, d{-1, 0, -1}},
CaseRange{0x04B0, 0x04B0, d{0, 1, 0}},
CaseRange{0x04B1, 0x04B1, d{-1, 0, -1}},
CaseRange{0x04B2, 0x04B2, d{0, 1, 0}},
CaseRange{0x04B3, 0x04B3, d{-1, 0, -1}},
CaseRange{0x04B4, 0x04B4, d{0, 1, 0}},
CaseRange{0x04B5, 0x04B5, d{-1, 0, -1}},
CaseRange{0x04B6, 0x04B6, d{0, 1, 0}},
CaseRange{0x04B7, 0x04B7, d{-1, 0, -1}},
CaseRange{0x04B8, 0x04B8, d{0, 1, 0}},
CaseRange{0x04B9, 0x04B9, d{-1, 0, -1}},
CaseRange{0x04BA, 0x04BA, d{0, 1, 0}},
CaseRange{0x04BB, 0x04BB, d{-1, 0, -1}},
CaseRange{0x04BC, 0x04BC, d{0, 1, 0}},
CaseRange{0x04BD, 0x04BD, d{-1, 0, -1}},
CaseRange{0x04BE, 0x04BE, d{0, 1, 0}},
CaseRange{0x04BF, 0x04BF, d{-1, 0, -1}},
CaseRange{0x04C0, 0x04C0, d{0, 15, 0}},
CaseRange{0x04C1, 0x04C1, d{0, 1, 0}},
CaseRange{0x04C2, 0x04C2, d{-1, 0, -1}},
CaseRange{0x04C3, 0x04C3, d{0, 1, 0}},
CaseRange{0x04C4, 0x04C4, d{-1, 0, -1}},
CaseRange{0x04C5, 0x04C5, d{0, 1, 0}},
CaseRange{0x04C6, 0x04C6, d{-1, 0, -1}},
CaseRange{0x04C7, 0x04C7, d{0, 1, 0}},
CaseRange{0x04C8, 0x04C8, d{-1, 0, -1}},
CaseRange{0x04C9, 0x04C9, d{0, 1, 0}},
CaseRange{0x04CA, 0x04CA, d{-1, 0, -1}},
CaseRange{0x04CB, 0x04CB, d{0, 1, 0}},
CaseRange{0x04CC, 0x04CC, d{-1, 0, -1}},
CaseRange{0x04CD, 0x04CD, d{0, 1, 0}},
CaseRange{0x04CE, 0x04CE, d{-1, 0, -1}},
CaseRange{0x04CF, 0x04CF, d{-15, 0, -15}},
CaseRange{0x04D0, 0x04D0, d{0, 1, 0}},
CaseRange{0x04D1, 0x04D1, d{-1, 0, -1}},
CaseRange{0x04D2, 0x04D2, d{0, 1, 0}},
CaseRange{0x04D3, 0x04D3, d{-1, 0, -1}},
CaseRange{0x04D4, 0x04D4, d{0, 1, 0}},
CaseRange{0x04D5, 0x04D5, d{-1, 0, -1}},
CaseRange{0x04D6, 0x04D6, d{0, 1, 0}},
CaseRange{0x04D7, 0x04D7, d{-1, 0, -1}},
CaseRange{0x04D8, 0x04D8, d{0, 1, 0}},
CaseRange{0x04D9, 0x04D9, d{-1, 0, -1}},
CaseRange{0x04DA, 0x04DA, d{0, 1, 0}},
CaseRange{0x04DB, 0x04DB, d{-1, 0, -1}},
CaseRange{0x04DC, 0x04DC, d{0, 1, 0}},
CaseRange{0x04DD, 0x04DD, d{-1, 0, -1}},
CaseRange{0x04DE, 0x04DE, d{0, 1, 0}},
CaseRange{0x04DF, 0x04DF, d{-1, 0, -1}},
CaseRange{0x04E0, 0x04E0, d{0, 1, 0}},
CaseRange{0x04E1, 0x04E1, d{-1, 0, -1}},
CaseRange{0x04E2, 0x04E2, d{0, 1, 0}},
CaseRange{0x04E3, 0x04E3, d{-1, 0, -1}},
CaseRange{0x04E4, 0x04E4, d{0, 1, 0}},
CaseRange{0x04E5, 0x04E5, d{-1, 0, -1}},
CaseRange{0x04E6, 0x04E6, d{0, 1, 0}},
CaseRange{0x04E7, 0x04E7, d{-1, 0, -1}},
CaseRange{0x04E8, 0x04E8, d{0, 1, 0}},
CaseRange{0x04E9, 0x04E9, d{-1, 0, -1}},
CaseRange{0x04EA, 0x04EA, d{0, 1, 0}},
CaseRange{0x04EB, 0x04EB, d{-1, 0, -1}},
CaseRange{0x04EC, 0x04EC, d{0, 1, 0}},
CaseRange{0x04ED, 0x04ED, d{-1, 0, -1}},
CaseRange{0x04EE, 0x04EE, d{0, 1, 0}},
CaseRange{0x04EF, 0x04EF, d{-1, 0, -1}},
CaseRange{0x04F0, 0x04F0, d{0, 1, 0}},
CaseRange{0x04F1, 0x04F1, d{-1, 0, -1}},
CaseRange{0x04F2, 0x04F2, d{0, 1, 0}},
CaseRange{0x04F3, 0x04F3, d{-1, 0, -1}},
CaseRange{0x04F4, 0x04F4, d{0, 1, 0}},
CaseRange{0x04F5, 0x04F5, d{-1, 0, -1}},
CaseRange{0x04F6, 0x04F6, d{0, 1, 0}},
CaseRange{0x04F7, 0x04F7, d{-1, 0, -1}},
CaseRange{0x04F8, 0x04F8, d{0, 1, 0}},
CaseRange{0x04F9, 0x04F9, d{-1, 0, -1}},
CaseRange{0x04FA, 0x04FA, d{0, 1, 0}},
CaseRange{0x04FB, 0x04FB, d{-1, 0, -1}},
CaseRange{0x04FC, 0x04FC, d{0, 1, 0}},
CaseRange{0x04FD, 0x04FD, d{-1, 0, -1}},
CaseRange{0x04FE, 0x04FE, d{0, 1, 0}},
CaseRange{0x04FF, 0x04FF, d{-1, 0, -1}},
CaseRange{0x0500, 0x0500, d{0, 1, 0}},
CaseRange{0x0501, 0x0501, d{-1, 0, -1}},
CaseRange{0x0502, 0x0502, d{0, 1, 0}},
CaseRange{0x0503, 0x0503, d{-1, 0, -1}},
CaseRange{0x0504, 0x0504, d{0, 1, 0}},
CaseRange{0x0505, 0x0505, d{-1, 0, -1}},
CaseRange{0x0506, 0x0506, d{0, 1, 0}},
CaseRange{0x0507, 0x0507, d{-1, 0, -1}},
CaseRange{0x0508, 0x0508, d{0, 1, 0}},
CaseRange{0x0509, 0x0509, d{-1, 0, -1}},
CaseRange{0x050A, 0x050A, d{0, 1, 0}},
CaseRange{0x050B, 0x050B, d{-1, 0, -1}},
CaseRange{0x050C, 0x050C, d{0, 1, 0}},
CaseRange{0x050D, 0x050D, d{-1, 0, -1}},
CaseRange{0x050E, 0x050E, d{0, 1, 0}},
CaseRange{0x050F, 0x050F, d{-1, 0, -1}},
CaseRange{0x0510, 0x0510, d{0, 1, 0}},
CaseRange{0x0511, 0x0511, d{-1, 0, -1}},
CaseRange{0x0512, 0x0512, d{0, 1, 0}},
CaseRange{0x0513, 0x0513, d{-1, 0, -1}},
CaseRange{0x0514, 0x0514, d{0, 1, 0}},
CaseRange{0x0515, 0x0515, d{-1, 0, -1}},
CaseRange{0x0516, 0x0516, d{0, 1, 0}},
CaseRange{0x0517, 0x0517, d{-1, 0, -1}},
CaseRange{0x0518, 0x0518, d{0, 1, 0}},
CaseRange{0x0519, 0x0519, d{-1, 0, -1}},
CaseRange{0x051A, 0x051A, d{0, 1, 0}},
CaseRange{0x051B, 0x051B, d{-1, 0, -1}},
CaseRange{0x051C, 0x051C, d{0, 1, 0}},
CaseRange{0x051D, 0x051D, d{-1, 0, -1}},
CaseRange{0x051E, 0x051E, d{0, 1, 0}},
CaseRange{0x051F, 0x051F, d{-1, 0, -1}},
CaseRange{0x0520, 0x0520, d{0, 1, 0}},
CaseRange{0x0521, 0x0521, d{-1, 0, -1}},
CaseRange{0x0522, 0x0522, d{0, 1, 0}},
CaseRange{0x0523, 0x0523, d{-1, 0, -1}},
CaseRange{0x0531, 0x0556, d{0, 48, 0}},
CaseRange{0x0561, 0x0586, d{-48, 0, -48}},
CaseRange{0x10A0, 0x10C5, d{0, 7264, 0}},
CaseRange{0x1D79, 0x1D79, d{35332, 0, 35332}},
CaseRange{0x1D7D, 0x1D7D, d{3814, 0, 3814}},
CaseRange{0x1E00, 0x1E00, d{0, 1, 0}},
CaseRange{0x1E01, 0x1E01, d{-1, 0, -1}},
CaseRange{0x1E02, 0x1E02, d{0, 1, 0}},
CaseRange{0x1E03, 0x1E03, d{-1, 0, -1}},
CaseRange{0x1E04, 0x1E04, d{0, 1, 0}},
CaseRange{0x1E05, 0x1E05, d{-1, 0, -1}},
CaseRange{0x1E06, 0x1E06, d{0, 1, 0}},
CaseRange{0x1E07, 0x1E07, d{-1, 0, -1}},
CaseRange{0x1E08, 0x1E08, d{0, 1, 0}},
CaseRange{0x1E09, 0x1E09, d{-1, 0, -1}},
CaseRange{0x1E0A, 0x1E0A, d{0, 1, 0}},
CaseRange{0x1E0B, 0x1E0B, d{-1, 0, -1}},
CaseRange{0x1E0C, 0x1E0C, d{0, 1, 0}},
CaseRange{0x1E0D, 0x1E0D, d{-1, 0, -1}},
CaseRange{0x1E0E, 0x1E0E, d{0, 1, 0}},
CaseRange{0x1E0F, 0x1E0F, d{-1, 0, -1}},
CaseRange{0x1E10, 0x1E10, d{0, 1, 0}},
CaseRange{0x1E11, 0x1E11, d{-1, 0, -1}},
CaseRange{0x1E12, 0x1E12, d{0, 1, 0}},
CaseRange{0x1E13, 0x1E13, d{-1, 0, -1}},
CaseRange{0x1E14, 0x1E14, d{0, 1, 0}},
CaseRange{0x1E15, 0x1E15, d{-1, 0, -1}},
CaseRange{0x1E16, 0x1E16, d{0, 1, 0}},
CaseRange{0x1E17, 0x1E17, d{-1, 0, -1}},
CaseRange{0x1E18, 0x1E18, d{0, 1, 0}},
CaseRange{0x1E19, 0x1E19, d{-1, 0, -1}},
CaseRange{0x1E1A, 0x1E1A, d{0, 1, 0}},
CaseRange{0x1E1B, 0x1E1B, d{-1, 0, -1}},
CaseRange{0x1E1C, 0x1E1C, d{0, 1, 0}},
CaseRange{0x1E1D, 0x1E1D, d{-1, 0, -1}},
CaseRange{0x1E1E, 0x1E1E, d{0, 1, 0}},
CaseRange{0x1E1F, 0x1E1F, d{-1, 0, -1}},
CaseRange{0x1E20, 0x1E20, d{0, 1, 0}},
CaseRange{0x1E21, 0x1E21, d{-1, 0, -1}},
CaseRange{0x1E22, 0x1E22, d{0, 1, 0}},
CaseRange{0x1E23, 0x1E23, d{-1, 0, -1}},
CaseRange{0x1E24, 0x1E24, d{0, 1, 0}},
CaseRange{0x1E25, 0x1E25, d{-1, 0, -1}},
CaseRange{0x1E26, 0x1E26, d{0, 1, 0}},
CaseRange{0x1E27, 0x1E27, d{-1, 0, -1}},
CaseRange{0x1E28, 0x1E28, d{0, 1, 0}},
CaseRange{0x1E29, 0x1E29, d{-1, 0, -1}},
CaseRange{0x1E2A, 0x1E2A, d{0, 1, 0}},
CaseRange{0x1E2B, 0x1E2B, d{-1, 0, -1}},
CaseRange{0x1E2C, 0x1E2C, d{0, 1, 0}},
CaseRange{0x1E2D, 0x1E2D, d{-1, 0, -1}},
CaseRange{0x1E2E, 0x1E2E, d{0, 1, 0}},
CaseRange{0x1E2F, 0x1E2F, d{-1, 0, -1}},
CaseRange{0x1E30, 0x1E30, d{0, 1, 0}},
CaseRange{0x1E31, 0x1E31, d{-1, 0, -1}},
CaseRange{0x1E32, 0x1E32, d{0, 1, 0}},
CaseRange{0x1E33, 0x1E33, d{-1, 0, -1}},
CaseRange{0x1E34, 0x1E34, d{0, 1, 0}},
CaseRange{0x1E35, 0x1E35, d{-1, 0, -1}},
CaseRange{0x1E36, 0x1E36, d{0, 1, 0}},
CaseRange{0x1E37, 0x1E37, d{-1, 0, -1}},
CaseRange{0x1E38, 0x1E38, d{0, 1, 0}},
CaseRange{0x1E39, 0x1E39, d{-1, 0, -1}},
CaseRange{0x1E3A, 0x1E3A, d{0, 1, 0}},
CaseRange{0x1E3B, 0x1E3B, d{-1, 0, -1}},
CaseRange{0x1E3C, 0x1E3C, d{0, 1, 0}},
CaseRange{0x1E3D, 0x1E3D, d{-1, 0, -1}},
CaseRange{0x1E3E, 0x1E3E, d{0, 1, 0}},
CaseRange{0x1E3F, 0x1E3F, d{-1, 0, -1}},
CaseRange{0x1E40, 0x1E40, d{0, 1, 0}},
CaseRange{0x1E41, 0x1E41, d{-1, 0, -1}},
CaseRange{0x1E42, 0x1E42, d{0, 1, 0}},
CaseRange{0x1E43, 0x1E43, d{-1, 0, -1}},
CaseRange{0x1E44, 0x1E44, d{0, 1, 0}},
CaseRange{0x1E45, 0x1E45, d{-1, 0, -1}},
CaseRange{0x1E46, 0x1E46, d{0, 1, 0}},
CaseRange{0x1E47, 0x1E47, d{-1, 0, -1}},
CaseRange{0x1E48, 0x1E48, d{0, 1, 0}},
CaseRange{0x1E49, 0x1E49, d{-1, 0, -1}},
CaseRange{0x1E4A, 0x1E4A, d{0, 1, 0}},
CaseRange{0x1E4B, 0x1E4B, d{-1, 0, -1}},
CaseRange{0x1E4C, 0x1E4C, d{0, 1, 0}},
CaseRange{0x1E4D, 0x1E4D, d{-1, 0, -1}},
CaseRange{0x1E4E, 0x1E4E, d{0, 1, 0}},
CaseRange{0x1E4F, 0x1E4F, d{-1, 0, -1}},
CaseRange{0x1E50, 0x1E50, d{0, 1, 0}},
CaseRange{0x1E51, 0x1E51, d{-1, 0, -1}},
CaseRange{0x1E52, 0x1E52, d{0, 1, 0}},
CaseRange{0x1E53, 0x1E53, d{-1, 0, -1}},
CaseRange{0x1E54, 0x1E54, d{0, 1, 0}},
CaseRange{0x1E55, 0x1E55, d{-1, 0, -1}},
CaseRange{0x1E56, 0x1E56, d{0, 1, 0}},
CaseRange{0x1E57, 0x1E57, d{-1, 0, -1}},
CaseRange{0x1E58, 0x1E58, d{0, 1, 0}},
CaseRange{0x1E59, 0x1E59, d{-1, 0, -1}},
CaseRange{0x1E5A, 0x1E5A, d{0, 1, 0}},
CaseRange{0x1E5B, 0x1E5B, d{-1, 0, -1}},
CaseRange{0x1E5C, 0x1E5C, d{0, 1, 0}},
CaseRange{0x1E5D, 0x1E5D, d{-1, 0, -1}},
CaseRange{0x1E5E, 0x1E5E, d{0, 1, 0}},
CaseRange{0x1E5F, 0x1E5F, d{-1, 0, -1}},
CaseRange{0x1E60, 0x1E60, d{0, 1, 0}},
CaseRange{0x1E61, 0x1E61, d{-1, 0, -1}},
CaseRange{0x1E62, 0x1E62, d{0, 1, 0}},
CaseRange{0x1E63, 0x1E63, d{-1, 0, -1}},
CaseRange{0x1E64, 0x1E64, d{0, 1, 0}},
CaseRange{0x1E65, 0x1E65, d{-1, 0, -1}},
CaseRange{0x1E66, 0x1E66, d{0, 1, 0}},
CaseRange{0x1E67, 0x1E67, d{-1, 0, -1}},
CaseRange{0x1E68, 0x1E68, d{0, 1, 0}},
CaseRange{0x1E69, 0x1E69, d{-1, 0, -1}},
CaseRange{0x1E6A, 0x1E6A, d{0, 1, 0}},
CaseRange{0x1E6B, 0x1E6B, d{-1, 0, -1}},
CaseRange{0x1E6C, 0x1E6C, d{0, 1, 0}},
CaseRange{0x1E6D, 0x1E6D, d{-1, 0, -1}},
CaseRange{0x1E6E, 0x1E6E, d{0, 1, 0}},
CaseRange{0x1E6F, 0x1E6F, d{-1, 0, -1}},
CaseRange{0x1E70, 0x1E70, d{0, 1, 0}},
CaseRange{0x1E71, 0x1E71, d{-1, 0, -1}},
CaseRange{0x1E72, 0x1E72, d{0, 1, 0}},
CaseRange{0x1E73, 0x1E73, d{-1, 0, -1}},
CaseRange{0x1E74, 0x1E74, d{0, 1, 0}},
CaseRange{0x1E75, 0x1E75, d{-1, 0, -1}},
CaseRange{0x1E76, 0x1E76, d{0, 1, 0}},
CaseRange{0x1E77, 0x1E77, d{-1, 0, -1}},
CaseRange{0x1E78, 0x1E78, d{0, 1, 0}},
CaseRange{0x1E79, 0x1E79, d{-1, 0, -1}},
CaseRange{0x1E7A, 0x1E7A, d{0, 1, 0}},
CaseRange{0x1E7B, 0x1E7B, d{-1, 0, -1}},
CaseRange{0x1E7C, 0x1E7C, d{0, 1, 0}},
CaseRange{0x1E7D, 0x1E7D, d{-1, 0, -1}},
CaseRange{0x1E7E, 0x1E7E, d{0, 1, 0}},
CaseRange{0x1E7F, 0x1E7F, d{-1, 0, -1}},
CaseRange{0x1E80, 0x1E80, d{0, 1, 0}},
CaseRange{0x1E81, 0x1E81, d{-1, 0, -1}},
CaseRange{0x1E82, 0x1E82, d{0, 1, 0}},
CaseRange{0x1E83, 0x1E83, d{-1, 0, -1}},
CaseRange{0x1E84, 0x1E84, d{0, 1, 0}},
CaseRange{0x1E85, 0x1E85, d{-1, 0, -1}},
CaseRange{0x1E86, 0x1E86, d{0, 1, 0}},
CaseRange{0x1E87, 0x1E87, d{-1, 0, -1}},
CaseRange{0x1E88, 0x1E88, d{0, 1, 0}},
CaseRange{0x1E89, 0x1E89, d{-1, 0, -1}},
CaseRange{0x1E8A, 0x1E8A, d{0, 1, 0}},
CaseRange{0x1E8B, 0x1E8B, d{-1, 0, -1}},
CaseRange{0x1E8C, 0x1E8C, d{0, 1, 0}},
CaseRange{0x1E8D, 0x1E8D, d{-1, 0, -1}},
CaseRange{0x1E8E, 0x1E8E, d{0, 1, 0}},
CaseRange{0x1E8F, 0x1E8F, d{-1, 0, -1}},
CaseRange{0x1E90, 0x1E90, d{0, 1, 0}},
CaseRange{0x1E91, 0x1E91, d{-1, 0, -1}},
CaseRange{0x1E92, 0x1E92, d{0, 1, 0}},
CaseRange{0x1E93, 0x1E93, d{-1, 0, -1}},
CaseRange{0x1E94, 0x1E94, d{0, 1, 0}},
CaseRange{0x1E95, 0x1E95, d{-1, 0, -1}},
CaseRange{0x1E9B, 0x1E9B, d{-59, 0, -59}},
CaseRange{0x1E9E, 0x1E9E, d{0, -7615, 0}},
CaseRange{0x1EA0, 0x1EA0, d{0, 1, 0}},
CaseRange{0x1EA1, 0x1EA1, d{-1, 0, -1}},
CaseRange{0x1EA2, 0x1EA2, d{0, 1, 0}},
CaseRange{0x1EA3, 0x1EA3, d{-1, 0, -1}},
CaseRange{0x1EA4, 0x1EA4, d{0, 1, 0}},
CaseRange{0x1EA5, 0x1EA5, d{-1, 0, -1}},
CaseRange{0x1EA6, 0x1EA6, d{0, 1, 0}},
CaseRange{0x1EA7, 0x1EA7, d{-1, 0, -1}},
CaseRange{0x1EA8, 0x1EA8, d{0, 1, 0}},
CaseRange{0x1EA9, 0x1EA9, d{-1, 0, -1}},
CaseRange{0x1EAA, 0x1EAA, d{0, 1, 0}},
CaseRange{0x1EAB, 0x1EAB, d{-1, 0, -1}},
CaseRange{0x1EAC, 0x1EAC, d{0, 1, 0}},
CaseRange{0x1EAD, 0x1EAD, d{-1, 0, -1}},
CaseRange{0x1EAE, 0x1EAE, d{0, 1, 0}},
CaseRange{0x1EAF, 0x1EAF, d{-1, 0, -1}},
CaseRange{0x1EB0, 0x1EB0, d{0, 1, 0}},
CaseRange{0x1EB1, 0x1EB1, d{-1, 0, -1}},
CaseRange{0x1EB2, 0x1EB2, d{0, 1, 0}},
CaseRange{0x1EB3, 0x1EB3, d{-1, 0, -1}},
CaseRange{0x1EB4, 0x1EB4, d{0, 1, 0}},
CaseRange{0x1EB5, 0x1EB5, d{-1, 0, -1}},
CaseRange{0x1EB6, 0x1EB6, d{0, 1, 0}},
CaseRange{0x1EB7, 0x1EB7, d{-1, 0, -1}},
CaseRange{0x1EB8, 0x1EB8, d{0, 1, 0}},
CaseRange{0x1EB9, 0x1EB9, d{-1, 0, -1}},
CaseRange{0x1EBA, 0x1EBA, d{0, 1, 0}},
CaseRange{0x1EBB, 0x1EBB, d{-1, 0, -1}},
CaseRange{0x1EBC, 0x1EBC, d{0, 1, 0}},
CaseRange{0x1EBD, 0x1EBD, d{-1, 0, -1}},
CaseRange{0x1EBE, 0x1EBE, d{0, 1, 0}},
CaseRange{0x1EBF, 0x1EBF, d{-1, 0, -1}},
CaseRange{0x1EC0, 0x1EC0, d{0, 1, 0}},
CaseRange{0x1EC1, 0x1EC1, d{-1, 0, -1}},
CaseRange{0x1EC2, 0x1EC2, d{0, 1, 0}},
CaseRange{0x1EC3, 0x1EC3, d{-1, 0, -1}},
CaseRange{0x1EC4, 0x1EC4, d{0, 1, 0}},
CaseRange{0x1EC5, 0x1EC5, d{-1, 0, -1}},
CaseRange{0x1EC6, 0x1EC6, d{0, 1, 0}},
CaseRange{0x1EC7, 0x1EC7, d{-1, 0, -1}},
CaseRange{0x1EC8, 0x1EC8, d{0, 1, 0}},
CaseRange{0x1EC9, 0x1EC9, d{-1, 0, -1}},
CaseRange{0x1ECA, 0x1ECA, d{0, 1, 0}},
CaseRange{0x1ECB, 0x1ECB, d{-1, 0, -1}},
CaseRange{0x1ECC, 0x1ECC, d{0, 1, 0}},
CaseRange{0x1ECD, 0x1ECD, d{-1, 0, -1}},
CaseRange{0x1ECE, 0x1ECE, d{0, 1, 0}},
CaseRange{0x1ECF, 0x1ECF, d{-1, 0, -1}},
CaseRange{0x1ED0, 0x1ED0, d{0, 1, 0}},
CaseRange{0x1ED1, 0x1ED1, d{-1, 0, -1}},
CaseRange{0x1ED2, 0x1ED2, d{0, 1, 0}},
CaseRange{0x1ED3, 0x1ED3, d{-1, 0, -1}},
CaseRange{0x1ED4, 0x1ED4, d{0, 1, 0}},
CaseRange{0x1ED5, 0x1ED5, d{-1, 0, -1}},
CaseRange{0x1ED6, 0x1ED6, d{0, 1, 0}},
CaseRange{0x1ED7, 0x1ED7, d{-1, 0, -1}},
CaseRange{0x1ED8, 0x1ED8, d{0, 1, 0}},
CaseRange{0x1ED9, 0x1ED9, d{-1, 0, -1}},
CaseRange{0x1EDA, 0x1EDA, d{0, 1, 0}},
CaseRange{0x1EDB, 0x1EDB, d{-1, 0, -1}},
CaseRange{0x1EDC, 0x1EDC, d{0, 1, 0}},
CaseRange{0x1EDD, 0x1EDD, d{-1, 0, -1}},
CaseRange{0x1EDE, 0x1EDE, d{0, 1, 0}},
CaseRange{0x1EDF, 0x1EDF, d{-1, 0, -1}},
CaseRange{0x1EE0, 0x1EE0, d{0, 1, 0}},
CaseRange{0x1EE1, 0x1EE1, d{-1, 0, -1}},
CaseRange{0x1EE2, 0x1EE2, d{0, 1, 0}},
CaseRange{0x1EE3, 0x1EE3, d{-1, 0, -1}},
CaseRange{0x1EE4, 0x1EE4, d{0, 1, 0}},
CaseRange{0x1EE5, 0x1EE5, d{-1, 0, -1}},
CaseRange{0x1EE6, 0x1EE6, d{0, 1, 0}},
CaseRange{0x1EE7, 0x1EE7, d{-1, 0, -1}},
CaseRange{0x1EE8, 0x1EE8, d{0, 1, 0}},
CaseRange{0x1EE9, 0x1EE9, d{-1, 0, -1}},
CaseRange{0x1EEA, 0x1EEA, d{0, 1, 0}},
CaseRange{0x1EEB, 0x1EEB, d{-1, 0, -1}},
CaseRange{0x1EEC, 0x1EEC, d{0, 1, 0}},
CaseRange{0x1EED, 0x1EED, d{-1, 0, -1}},
CaseRange{0x1EEE, 0x1EEE, d{0, 1, 0}},
CaseRange{0x1EEF, 0x1EEF, d{-1, 0, -1}},
CaseRange{0x1EF0, 0x1EF0, d{0, 1, 0}},
CaseRange{0x1EF1, 0x1EF1, d{-1, 0, -1}},
CaseRange{0x1EF2, 0x1EF2, d{0, 1, 0}},
CaseRange{0x1EF3, 0x1EF3, d{-1, 0, -1}},
CaseRange{0x1EF4, 0x1EF4, d{0, 1, 0}},
CaseRange{0x1EF5, 0x1EF5, d{-1, 0, -1}},
CaseRange{0x1EF6, 0x1EF6, d{0, 1, 0}},
CaseRange{0x1EF7, 0x1EF7, d{-1, 0, -1}},
CaseRange{0x1EF8, 0x1EF8, d{0, 1, 0}},
CaseRange{0x1EF9, 0x1EF9, d{-1, 0, -1}},
CaseRange{0x1EFA, 0x1EFA, d{0, 1, 0}},
CaseRange{0x1EFB, 0x1EFB, d{-1, 0, -1}},
CaseRange{0x1EFC, 0x1EFC, d{0, 1, 0}},
CaseRange{0x1EFD, 0x1EFD, d{-1, 0, -1}},
CaseRange{0x1EFE, 0x1EFE, d{0, 1, 0}},
CaseRange{0x1EFF, 0x1EFF, d{-1, 0, -1}},
CaseRange{0x1F00, 0x1F07, d{8, 0, 8}},
CaseRange{0x1F08, 0x1F0F, d{0, -8, 0}},
CaseRange{0x1F10, 0x1F15, d{8, 0, 8}},
CaseRange{0x1F18, 0x1F1D, d{0, -8, 0}},
CaseRange{0x1F20, 0x1F27, d{8, 0, 8}},
CaseRange{0x1F28, 0x1F2F, d{0, -8, 0}},
CaseRange{0x1F30, 0x1F37, d{8, 0, 8}},
CaseRange{0x1F38, 0x1F3F, d{0, -8, 0}},
CaseRange{0x1F40, 0x1F45, d{8, 0, 8}},
CaseRange{0x1F48, 0x1F4D, d{0, -8, 0}},
CaseRange{0x1F51, 0x1F51, d{8, 0, 8}},
CaseRange{0x1F53, 0x1F53, d{8, 0, 8}},
CaseRange{0x1F55, 0x1F55, d{8, 0, 8}},
CaseRange{0x1F57, 0x1F57, d{8, 0, 8}},
CaseRange{0x1F59, 0x1F59, d{0, -8, 0}},
CaseRange{0x1F5B, 0x1F5B, d{0, -8, 0}},
CaseRange{0x1F5D, 0x1F5D, d{0, -8, 0}},
CaseRange{0x1F5F, 0x1F5F, d{0, -8, 0}},
CaseRange{0x1F60, 0x1F67, d{8, 0, 8}},
CaseRange{0x1F68, 0x1F6F, d{0, -8, 0}},
CaseRange{0x1F70, 0x1F71, d{74, 0, 74}},
CaseRange{0x1F72, 0x1F75, d{86, 0, 86}},
CaseRange{0x1F76, 0x1F77, d{100, 0, 100}},
CaseRange{0x1F78, 0x1F79, d{128, 0, 128}},
CaseRange{0x1F7A, 0x1F7B, d{112, 0, 112}},
CaseRange{0x1F7C, 0x1F7D, d{126, 0, 126}},
CaseRange{0x1F80, 0x1F87, d{8, 0, 8}},
CaseRange{0x1F88, 0x1F8F, d{0, -8, 0}},
CaseRange{0x1F90, 0x1F97, d{8, 0, 8}},
CaseRange{0x1F98, 0x1F9F, d{0, -8, 0}},
CaseRange{0x1FA0, 0x1FA7, d{8, 0, 8}},
CaseRange{0x1FA8, 0x1FAF, d{0, -8, 0}},
CaseRange{0x1FB0, 0x1FB1, d{8, 0, 8}},
CaseRange{0x1FB3, 0x1FB3, d{9, 0, 9}},
CaseRange{0x1FB8, 0x1FB9, d{0, -8, 0}},
CaseRange{0x1FBA, 0x1FBB, d{0, -74, 0}},
CaseRange{0x1FBC, 0x1FBC, d{0, -9, 0}},
CaseRange{0x1FBE, 0x1FBE, d{-7205, 0, -7205}},
CaseRange{0x1FC3, 0x1FC3, d{9, 0, 9}},
CaseRange{0x1FC8, 0x1FCB, d{0, -86, 0}},
CaseRange{0x1FCC, 0x1FCC, d{0, -9, 0}},
CaseRange{0x1FD0, 0x1FD1, d{8, 0, 8}},
CaseRange{0x1FD8, 0x1FD9, d{0, -8, 0}},
CaseRange{0x1FDA, 0x1FDB, d{0, -100, 0}},
CaseRange{0x1FE0, 0x1FE1, d{8, 0, 8}},
CaseRange{0x1FE5, 0x1FE5, d{7, 0, 7}},
CaseRange{0x1FE8, 0x1FE9, d{0, -8, 0}},
CaseRange{0x1FEA, 0x1FEB, d{0, -112, 0}},
CaseRange{0x1FEC, 0x1FEC, d{0, -7, 0}},
CaseRange{0x1FF3, 0x1FF3, d{9, 0, 9}},
CaseRange{0x1FF8, 0x1FF9, d{0, -128, 0}},
CaseRange{0x1FFA, 0x1FFB, d{0, -126, 0}},
CaseRange{0x1FFC, 0x1FFC, d{0, -9, 0}},
CaseRange{0x2126, 0x2126, d{0, -7517, 0}},
CaseRange{0x212A, 0x212A, d{0, -8383, 0}},
CaseRange{0x212B, 0x212B, d{0, -8262, 0}},
CaseRange{0x2132, 0x2132, d{0, 28, 0}},
CaseRange{0x214E, 0x214E, d{-28, 0, -28}},
CaseRange{0x2183, 0x2183, d{0, 1, 0}},
CaseRange{0x2184, 0x2184, d{-1, 0, -1}},
CaseRange{0x2C00, 0x2C2E, d{0, 48, 0}},
CaseRange{0x2C30, 0x2C5E, d{-48, 0, -48}},
CaseRange{0x2C60, 0x2C60, d{0, 1, 0}},
CaseRange{0x2C61, 0x2C61, d{-1, 0, -1}},
CaseRange{0x2C62, 0x2C62, d{0, -10743, 0}},
CaseRange{0x2C63, 0x2C63, d{0, -3814, 0}},
CaseRange{0x2C64, 0x2C64, d{0, -10727, 0}},
CaseRange{0x2C65, 0x2C65, d{-10795, 0, -10795}},
CaseRange{0x2C66, 0x2C66, d{-10792, 0, -10792}},
CaseRange{0x2C67, 0x2C67, d{0, 1, 0}},
CaseRange{0x2C68, 0x2C68, d{-1, 0, -1}},
CaseRange{0x2C69, 0x2C69, d{0, 1, 0}},
CaseRange{0x2C6A, 0x2C6A, d{-1, 0, -1}},
CaseRange{0x2C6B, 0x2C6B, d{0, 1, 0}},
CaseRange{0x2C6C, 0x2C6C, d{-1, 0, -1}},
CaseRange{0x2C6D, 0x2C6D, d{0, -10780, 0}},
CaseRange{0x2C6E, 0x2C6E, d{0, -10749, 0}},
CaseRange{0x2C6F, 0x2C6F, d{0, -10783, 0}},
CaseRange{0x2C72, 0x2C72, d{0, 1, 0}},
CaseRange{0x2C73, 0x2C73, d{-1, 0, -1}},
CaseRange{0x2C75, 0x2C75, d{0, 1, 0}},
CaseRange{0x2C76, 0x2C76, d{-1, 0, -1}},
CaseRange{0x2C80, 0x2C80, d{0, 1, 0}},
CaseRange{0x2C81, 0x2C81, d{-1, 0, -1}},
CaseRange{0x2C82, 0x2C82, d{0, 1, 0}},
CaseRange{0x2C83, 0x2C83, d{-1, 0, -1}},
CaseRange{0x2C84, 0x2C84, d{0, 1, 0}},
CaseRange{0x2C85, 0x2C85, d{-1, 0, -1}},
CaseRange{0x2C86, 0x2C86, d{0, 1, 0}},
CaseRange{0x2C87, 0x2C87, d{-1, 0, -1}},
CaseRange{0x2C88, 0x2C88, d{0, 1, 0}},
CaseRange{0x2C89, 0x2C89, d{-1, 0, -1}},
CaseRange{0x2C8A, 0x2C8A, d{0, 1, 0}},
CaseRange{0x2C8B, 0x2C8B, d{-1, 0, -1}},
CaseRange{0x2C8C, 0x2C8C, d{0, 1, 0}},
CaseRange{0x2C8D, 0x2C8D, d{-1, 0, -1}},
CaseRange{0x2C8E, 0x2C8E, d{0, 1, 0}},
CaseRange{0x2C8F, 0x2C8F, d{-1, 0, -1}},
CaseRange{0x2C90, 0x2C90, d{0, 1, 0}},
CaseRange{0x2C91, 0x2C91, d{-1, 0, -1}},
CaseRange{0x2C92, 0x2C92, d{0, 1, 0}},
CaseRange{0x2C93, 0x2C93, d{-1, 0, -1}},
CaseRange{0x2C94, 0x2C94, d{0, 1, 0}},
CaseRange{0x2C95, 0x2C95, d{-1, 0, -1}},
CaseRange{0x2C96, 0x2C96, d{0, 1, 0}},
CaseRange{0x2C97, 0x2C97, d{-1, 0, -1}},
CaseRange{0x2C98, 0x2C98, d{0, 1, 0}},
CaseRange{0x2C99, 0x2C99, d{-1, 0, -1}},
CaseRange{0x2C9A, 0x2C9A, d{0, 1, 0}},
CaseRange{0x2C9B, 0x2C9B, d{-1, 0, -1}},
CaseRange{0x2C9C, 0x2C9C, d{0, 1, 0}},
CaseRange{0x2C9D, 0x2C9D, d{-1, 0, -1}},
CaseRange{0x2C9E, 0x2C9E, d{0, 1, 0}},
CaseRange{0x2C9F, 0x2C9F, d{-1, 0, -1}},
CaseRange{0x2CA0, 0x2CA0, d{0, 1, 0}},
CaseRange{0x2CA1, 0x2CA1, d{-1, 0, -1}},
CaseRange{0x2CA2, 0x2CA2, d{0, 1, 0}},
CaseRange{0x2CA3, 0x2CA3, d{-1, 0, -1}},
CaseRange{0x2CA4, 0x2CA4, d{0, 1, 0}},
CaseRange{0x2CA5, 0x2CA5, d{-1, 0, -1}},
CaseRange{0x2CA6, 0x2CA6, d{0, 1, 0}},
CaseRange{0x2CA7, 0x2CA7, d{-1, 0, -1}},
CaseRange{0x2CA8, 0x2CA8, d{0, 1, 0}},
CaseRange{0x2CA9, 0x2CA9, d{-1, 0, -1}},
CaseRange{0x2CAA, 0x2CAA, d{0, 1, 0}},
CaseRange{0x2CAB, 0x2CAB, d{-1, 0, -1}},
CaseRange{0x2CAC, 0x2CAC, d{0, 1, 0}},
CaseRange{0x2CAD, 0x2CAD, d{-1, 0, -1}},
CaseRange{0x2CAE, 0x2CAE, d{0, 1, 0}},
CaseRange{0x2CAF, 0x2CAF, d{-1, 0, -1}},
CaseRange{0x2CB0, 0x2CB0, d{0, 1, 0}},
CaseRange{0x2CB1, 0x2CB1, d{-1, 0, -1}},
CaseRange{0x2CB2, 0x2CB2, d{0, 1, 0}},
CaseRange{0x2CB3, 0x2CB3, d{-1, 0, -1}},
CaseRange{0x2CB4, 0x2CB4, d{0, 1, 0}},
CaseRange{0x2CB5, 0x2CB5, d{-1, 0, -1}},
CaseRange{0x2CB6, 0x2CB6, d{0, 1, 0}},
CaseRange{0x2CB7, 0x2CB7, d{-1, 0, -1}},
CaseRange{0x2CB8, 0x2CB8, d{0, 1, 0}},
CaseRange{0x2CB9, 0x2CB9, d{-1, 0, -1}},
CaseRange{0x2CBA, 0x2CBA, d{0, 1, 0}},
CaseRange{0x2CBB, 0x2CBB, d{-1, 0, -1}},
CaseRange{0x2CBC, 0x2CBC, d{0, 1, 0}},
CaseRange{0x2CBD, 0x2CBD, d{-1, 0, -1}},
CaseRange{0x2CBE, 0x2CBE, d{0, 1, 0}},
CaseRange{0x2CBF, 0x2CBF, d{-1, 0, -1}},
CaseRange{0x2CC0, 0x2CC0, d{0, 1, 0}},
CaseRange{0x2CC1, 0x2CC1, d{-1, 0, -1}},
CaseRange{0x2CC2, 0x2CC2, d{0, 1, 0}},
CaseRange{0x2CC3, 0x2CC3, d{-1, 0, -1}},
CaseRange{0x2CC4, 0x2CC4, d{0, 1, 0}},
CaseRange{0x2CC5, 0x2CC5, d{-1, 0, -1}},
CaseRange{0x2CC6, 0x2CC6, d{0, 1, 0}},
CaseRange{0x2CC7, 0x2CC7, d{-1, 0, -1}},
CaseRange{0x2CC8, 0x2CC8, d{0, 1, 0}},
CaseRange{0x2CC9, 0x2CC9, d{-1, 0, -1}},
CaseRange{0x2CCA, 0x2CCA, d{0, 1, 0}},
CaseRange{0x2CCB, 0x2CCB, d{-1, 0, -1}},
CaseRange{0x2CCC, 0x2CCC, d{0, 1, 0}},
CaseRange{0x2CCD, 0x2CCD, d{-1, 0, -1}},
CaseRange{0x2CCE, 0x2CCE, d{0, 1, 0}},
CaseRange{0x2CCF, 0x2CCF, d{-1, 0, -1}},
CaseRange{0x2CD0, 0x2CD0, d{0, 1, 0}},
CaseRange{0x2CD1, 0x2CD1, d{-1, 0, -1}},
CaseRange{0x2CD2, 0x2CD2, d{0, 1, 0}},
CaseRange{0x2CD3, 0x2CD3, d{-1, 0, -1}},
CaseRange{0x2CD4, 0x2CD4, d{0, 1, 0}},
CaseRange{0x2CD5, 0x2CD5, d{-1, 0, -1}},
CaseRange{0x2CD6, 0x2CD6, d{0, 1, 0}},
CaseRange{0x2CD7, 0x2CD7, d{-1, 0, -1}},
CaseRange{0x2CD8, 0x2CD8, d{0, 1, 0}},
CaseRange{0x2CD9, 0x2CD9, d{-1, 0, -1}},
CaseRange{0x2CDA, 0x2CDA, d{0, 1, 0}},
CaseRange{0x2CDB, 0x2CDB, d{-1, 0, -1}},
CaseRange{0x2CDC, 0x2CDC, d{0, 1, 0}},
CaseRange{0x2CDD, 0x2CDD, d{-1, 0, -1}},
CaseRange{0x2CDE, 0x2CDE, d{0, 1, 0}},
CaseRange{0x2CDF, 0x2CDF, d{-1, 0, -1}},
CaseRange{0x2CE0, 0x2CE0, d{0, 1, 0}},
CaseRange{0x2CE1, 0x2CE1, d{-1, 0, -1}},
CaseRange{0x2CE2, 0x2CE2, d{0, 1, 0}},
CaseRange{0x2CE3, 0x2CE3, d{-1, 0, -1}},
CaseRange{0x2D00, 0x2D25, d{-7264, 0, -7264}},
CaseRange{0xA640, 0xA640, d{0, 1, 0}},
CaseRange{0xA641, 0xA641, d{-1, 0, -1}},
CaseRange{0xA642, 0xA642, d{0, 1, 0}},
CaseRange{0xA643, 0xA643, d{-1, 0, -1}},
CaseRange{0xA644, 0xA644, d{0, 1, 0}},
CaseRange{0xA645, 0xA645, d{-1, 0, -1}},
CaseRange{0xA646, 0xA646, d{0, 1, 0}},
CaseRange{0xA647, 0xA647, d{-1, 0, -1}},
CaseRange{0xA648, 0xA648, d{0, 1, 0}},
CaseRange{0xA649, 0xA649, d{-1, 0, -1}},
CaseRange{0xA64A, 0xA64A, d{0, 1, 0}},
CaseRange{0xA64B, 0xA64B, d{-1, 0, -1}},
CaseRange{0xA64C, 0xA64C, d{0, 1, 0}},
CaseRange{0xA64D, 0xA64D, d{-1, 0, -1}},
CaseRange{0xA64E, 0xA64E, d{0, 1, 0}},
CaseRange{0xA64F, 0xA64F, d{-1, 0, -1}},
CaseRange{0xA650, 0xA650, d{0, 1, 0}},
CaseRange{0xA651, 0xA651, d{-1, 0, -1}},
CaseRange{0xA652, 0xA652, d{0, 1, 0}},
CaseRange{0xA653, 0xA653, d{-1, 0, -1}},
CaseRange{0xA654, 0xA654, d{0, 1, 0}},
CaseRange{0xA655, 0xA655, d{-1, 0, -1}},
CaseRange{0xA656, 0xA656, d{0, 1, 0}},
CaseRange{0xA657, 0xA657, d{-1, 0, -1}},
CaseRange{0xA658, 0xA658, d{0, 1, 0}},
CaseRange{0xA659, 0xA659, d{-1, 0, -1}},
CaseRange{0xA65A, 0xA65A, d{0, 1, 0}},
CaseRange{0xA65B, 0xA65B, d{-1, 0, -1}},
CaseRange{0xA65C, 0xA65C, d{0, 1, 0}},
CaseRange{0xA65D, 0xA65D, d{-1, 0, -1}},
CaseRange{0xA65E, 0xA65E, d{0, 1, 0}},
CaseRange{0xA65F, 0xA65F, d{-1, 0, -1}},
CaseRange{0xA662, 0xA662, d{0, 1, 0}},
CaseRange{0xA663, 0xA663, d{-1, 0, -1}},
CaseRange{0xA664, 0xA664, d{0, 1, 0}},
CaseRange{0xA665, 0xA665, d{-1, 0, -1}},
CaseRange{0xA666, 0xA666, d{0, 1, 0}},
CaseRange{0xA667, 0xA667, d{-1, 0, -1}},
CaseRange{0xA668, 0xA668, d{0, 1, 0}},
CaseRange{0xA669, 0xA669, d{-1, 0, -1}},
CaseRange{0xA66A, 0xA66A, d{0, 1, 0}},
CaseRange{0xA66B, 0xA66B, d{-1, 0, -1}},
CaseRange{0xA66C, 0xA66C, d{0, 1, 0}},
CaseRange{0xA66D, 0xA66D, d{-1, 0, -1}},
CaseRange{0xA680, 0xA680, d{0, 1, 0}},
CaseRange{0xA681, 0xA681, d{-1, 0, -1}},
CaseRange{0xA682, 0xA682, d{0, 1, 0}},
CaseRange{0xA683, 0xA683, d{-1, 0, -1}},
CaseRange{0xA684, 0xA684, d{0, 1, 0}},
CaseRange{0xA685, 0xA685, d{-1, 0, -1}},
CaseRange{0xA686, 0xA686, d{0, 1, 0}},
CaseRange{0xA687, 0xA687, d{-1, 0, -1}},
CaseRange{0xA688, 0xA688, d{0, 1, 0}},
CaseRange{0xA689, 0xA689, d{-1, 0, -1}},
CaseRange{0xA68A, 0xA68A, d{0, 1, 0}},
CaseRange{0xA68B, 0xA68B, d{-1, 0, -1}},
CaseRange{0xA68C, 0xA68C, d{0, 1, 0}},
CaseRange{0xA68D, 0xA68D, d{-1, 0, -1}},
CaseRange{0xA68E, 0xA68E, d{0, 1, 0}},
CaseRange{0xA68F, 0xA68F, d{-1, 0, -1}},
CaseRange{0xA690, 0xA690, d{0, 1, 0}},
CaseRange{0xA691, 0xA691, d{-1, 0, -1}},
CaseRange{0xA692, 0xA692, d{0, 1, 0}},
CaseRange{0xA693, 0xA693, d{-1, 0, -1}},
CaseRange{0xA694, 0xA694, d{0, 1, 0}},
CaseRange{0xA695, 0xA695, d{-1, 0, -1}},
CaseRange{0xA696, 0xA696, d{0, 1, 0}},
CaseRange{0xA697, 0xA697, d{-1, 0, -1}},
CaseRange{0xA722, 0xA722, d{0, 1, 0}},
CaseRange{0xA723, 0xA723, d{-1, 0, -1}},
CaseRange{0xA724, 0xA724, d{0, 1, 0}},
CaseRange{0xA725, 0xA725, d{-1, 0, -1}},
CaseRange{0xA726, 0xA726, d{0, 1, 0}},
CaseRange{0xA727, 0xA727, d{-1, 0, -1}},
CaseRange{0xA728, 0xA728, d{0, 1, 0}},
CaseRange{0xA729, 0xA729, d{-1, 0, -1}},
CaseRange{0xA72A, 0xA72A, d{0, 1, 0}},
CaseRange{0xA72B, 0xA72B, d{-1, 0, -1}},
CaseRange{0xA72C, 0xA72C, d{0, 1, 0}},
CaseRange{0xA72D, 0xA72D, d{-1, 0, -1}},
CaseRange{0xA72E, 0xA72E, d{0, 1, 0}},
CaseRange{0xA72F, 0xA72F, d{-1, 0, -1}},
CaseRange{0xA732, 0xA732, d{0, 1, 0}},
CaseRange{0xA733, 0xA733, d{-1, 0, -1}},
CaseRange{0xA734, 0xA734, d{0, 1, 0}},
CaseRange{0xA735, 0xA735, d{-1, 0, -1}},
CaseRange{0xA736, 0xA736, d{0, 1, 0}},
CaseRange{0xA737, 0xA737, d{-1, 0, -1}},
CaseRange{0xA738, 0xA738, d{0, 1, 0}},
CaseRange{0xA739, 0xA739, d{-1, 0, -1}},
CaseRange{0xA73A, 0xA73A, d{0, 1, 0}},
CaseRange{0xA73B, 0xA73B, d{-1, 0, -1}},
CaseRange{0xA73C, 0xA73C, d{0, 1, 0}},
CaseRange{0xA73D, 0xA73D, d{-1, 0, -1}},
CaseRange{0xA73E, 0xA73E, d{0, 1, 0}},
CaseRange{0xA73F, 0xA73F, d{-1, 0, -1}},
CaseRange{0xA740, 0xA740, d{0, 1, 0}},
CaseRange{0xA741, 0xA741, d{-1, 0, -1}},
CaseRange{0xA742, 0xA742, d{0, 1, 0}},
CaseRange{0xA743, 0xA743, d{-1, 0, -1}},
CaseRange{0xA744, 0xA744, d{0, 1, 0}},
CaseRange{0xA745, 0xA745, d{-1, 0, -1}},
CaseRange{0xA746, 0xA746, d{0, 1, 0}},
CaseRange{0xA747, 0xA747, d{-1, 0, -1}},
CaseRange{0xA748, 0xA748, d{0, 1, 0}},
CaseRange{0xA749, 0xA749, d{-1, 0, -1}},
CaseRange{0xA74A, 0xA74A, d{0, 1, 0}},
CaseRange{0xA74B, 0xA74B, d{-1, 0, -1}},
CaseRange{0xA74C, 0xA74C, d{0, 1, 0}},
CaseRange{0xA74D, 0xA74D, d{-1, 0, -1}},
CaseRange{0xA74E, 0xA74E, d{0, 1, 0}},
CaseRange{0xA74F, 0xA74F, d{-1, 0, -1}},
CaseRange{0xA750, 0xA750, d{0, 1, 0}},
CaseRange{0xA751, 0xA751, d{-1, 0, -1}},
CaseRange{0xA752, 0xA752, d{0, 1, 0}},
CaseRange{0xA753, 0xA753, d{-1, 0, -1}},
CaseRange{0xA754, 0xA754, d{0, 1, 0}},
CaseRange{0xA755, 0xA755, d{-1, 0, -1}},
CaseRange{0xA756, 0xA756, d{0, 1, 0}},
CaseRange{0xA757, 0xA757, d{-1, 0, -1}},
CaseRange{0xA758, 0xA758, d{0, 1, 0}},
CaseRange{0xA759, 0xA759, d{-1, 0, -1}},
CaseRange{0xA75A, 0xA75A, d{0, 1, 0}},
CaseRange{0xA75B, 0xA75B, d{-1, 0, -1}},
CaseRange{0xA75C, 0xA75C, d{0, 1, 0}},
CaseRange{0xA75D, 0xA75D, d{-1, 0, -1}},
CaseRange{0xA75E, 0xA75E, d{0, 1, 0}},
CaseRange{0xA75F, 0xA75F, d{-1, 0, -1}},
CaseRange{0xA760, 0xA760, d{0, 1, 0}},
CaseRange{0xA761, 0xA761, d{-1, 0, -1}},
CaseRange{0xA762, 0xA762, d{0, 1, 0}},
CaseRange{0xA763, 0xA763, d{-1, 0, -1}},
CaseRange{0xA764, 0xA764, d{0, 1, 0}},
CaseRange{0xA765, 0xA765, d{-1, 0, -1}},
CaseRange{0xA766, 0xA766, d{0, 1, 0}},
CaseRange{0xA767, 0xA767, d{-1, 0, -1}},
CaseRange{0xA768, 0xA768, d{0, 1, 0}},
CaseRange{0xA769, 0xA769, d{-1, 0, -1}},
CaseRange{0xA76A, 0xA76A, d{0, 1, 0}},
CaseRange{0xA76B, 0xA76B, d{-1, 0, -1}},
CaseRange{0xA76C, 0xA76C, d{0, 1, 0}},
CaseRange{0xA76D, 0xA76D, d{-1, 0, -1}},
CaseRange{0xA76E, 0xA76E, d{0, 1, 0}},
CaseRange{0xA76F, 0xA76F, d{-1, 0, -1}},
CaseRange{0xA779, 0xA779, d{0, 1, 0}},
CaseRange{0xA77A, 0xA77A, d{-1, 0, -1}},
CaseRange{0xA77B, 0xA77B, d{0, 1, 0}},
CaseRange{0xA77C, 0xA77C, d{-1, 0, -1}},
CaseRange{0xA77D, 0xA77D, d{0, -35332, 0}},
CaseRange{0xA77E, 0xA77E, d{0, 1, 0}},
CaseRange{0xA77F, 0xA77F, d{-1, 0, -1}},
CaseRange{0xA780, 0xA780, d{0, 1, 0}},
CaseRange{0xA781, 0xA781, d{-1, 0, -1}},
CaseRange{0xA782, 0xA782, d{0, 1, 0}},
CaseRange{0xA783, 0xA783, d{-1, 0, -1}},
CaseRange{0xA784, 0xA784, d{0, 1, 0}},
CaseRange{0xA785, 0xA785, d{-1, 0, -1}},
CaseRange{0xA786, 0xA786, d{0, 1, 0}},
CaseRange{0xA787, 0xA787, d{-1, 0, -1}},
CaseRange{0xA78B, 0xA78B, d{0, 1, 0}},
CaseRange{0xA78C, 0xA78C, d{-1, 0, -1}},
CaseRange{0xFF21, 0xFF3A, d{0, 32, 0}},
CaseRange{0xFF41, 0xFF5A, d{-32, 0, -32}},
CaseRange{0x10400, 0x10427, d{0, 40, 0}},
CaseRange{0x10428, 0x1044F, d{-40, 0, -40}},
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment