about summary refs log tree commit diff stats
path: root/res
diff options
context:
space:
mode:
authorbptato <nincsnevem662@gmail.com>2024-01-04 18:54:08 +0100
committerbptato <nincsnevem662@gmail.com>2024-01-04 18:56:48 +0100
commitd4409baee1a510bf3361820cbdf4118ed09baffd (patch)
treea579e85083fcdee24b262a9ff1b328921c2a3290 /res
parentc9337674db699951918225cddc56fcf75f313a15 (diff)
downloadchawan-d4409baee1a510bf3361820cbdf4118ed09baffd.tar.gz
charwidth: use pre-generated map file
Also for reducing compilation time.
Diffstat (limited to 'res')
-rw-r--r--res/gencharwidth.nim202
-rw-r--r--res/genidna.nim1
-rw-r--r--res/map/charwidth_gen.nim196
3 files changed, 399 insertions, 0 deletions
diff --git a/res/gencharwidth.nim b/res/gencharwidth.nim
new file mode 100644
index 00000000..9e6d25a7
--- /dev/null
+++ b/res/gencharwidth.nim
@@ -0,0 +1,202 @@
+import std/streams
+import std/strutils
+
+import utils/charcategory
+import utils/proptable
+
+var DoubleWidthRanges: seq[(uint32, uint32)]
+var DoubleWidthAmbiguousRanges: seq[(uint32, uint32)]
+#var HalfWidthRanges: seq[(uint32, uint32)]
+
+# Combining chars from https://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
+#
+# The following two functions define the column width of an ISO 10646
+# character as follows:
+#
+#   - The null character (U+0000) has a column width of 0.
+#
+#   - Other C0/C1 control characters and DEL will lead to a return value of 0
+#
+#   - Non-spacing and enclosing combining characters (general category code Mn
+#     or Me in the Unicode database) have a column width of 0.
+#
+#   - SOFT HYPHEN (U+00AD) has a column width of 1.
+#
+#   - Other format characters (general category code Cf in the Unicode
+#     database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.
+#
+#   - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) have a
+#     column width of 0.
+#
+#   - Spacing characters in the East Asian Wide (W) or East Asian Full-width
+#     (F) category as defined in Unicode Technical Report #11 have a column
+#     width of 2.
+#
+#   - All remaining characters (including all printable ISO 8859-1 and WGL4
+#     characters, Unicode control characters, etc.) have a column width of 1.
+#
+
+# sorted list of non-overlapping intervals of non-spacing characters generated
+# by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c"
+const Combining = [
+  (0x0300u32, 0x036Fu32), (0x0483u32, 0x0486u32), (0x0488u32, 0x0489u32),
+  (0x0591u32, 0x05BDu32), (0x05BFu32, 0x05BFu32), (0x05C1u32, 0x05C2u32),
+  (0x05C4u32, 0x05C5u32), (0x05C7u32, 0x05C7u32), (0x0600u32, 0x0603u32),
+  (0x0610u32, 0x0615u32), (0x064Bu32, 0x065Eu32), (0x0670u32, 0x0670u32),
+  (0x06D6u32, 0x06E4u32), (0x06E7u32, 0x06E8u32), (0x06EAu32, 0x06EDu32),
+  (0x070Fu32, 0x070Fu32), (0x0711u32, 0x0711u32), (0x0730u32, 0x074Au32),
+  (0x07A6u32, 0x07B0u32), (0x07EBu32, 0x07F3u32), (0x0901u32, 0x0902u32),
+  (0x093Cu32, 0x093Cu32), (0x0941u32, 0x0948u32), (0x094Du32, 0x094Du32),
+  (0x0951u32, 0x0954u32), (0x0962u32, 0x0963u32), (0x0981u32, 0x0981u32),
+  (0x09BCu32, 0x09BCu32), (0x09C1u32, 0x09C4u32), (0x09CDu32, 0x09CDu32),
+  (0x09E2u32, 0x09E3u32), (0x0A01u32, 0x0A02u32), (0x0A3Cu32, 0x0A3Cu32),
+  (0x0A41u32, 0x0A42u32), (0x0A47u32, 0x0A48u32), (0x0A4Bu32, 0x0A4Du32),
+  (0x0A70u32, 0x0A71u32), (0x0A81u32, 0x0A82u32), (0x0ABCu32, 0x0ABCu32),
+  (0x0AC1u32, 0x0AC5u32), (0x0AC7u32, 0x0AC8u32), (0x0ACDu32, 0x0ACDu32),
+  (0x0AE2u32, 0x0AE3u32), (0x0B01u32, 0x0B01u32), (0x0B3Cu32, 0x0B3Cu32),
+  (0x0B3Fu32, 0x0B3Fu32), (0x0B41u32, 0x0B43u32), (0x0B4Du32, 0x0B4Du32),
+  (0x0B56u32, 0x0B56u32), (0x0B82u32, 0x0B82u32), (0x0BC0u32, 0x0BC0u32),
+  (0x0BCDu32, 0x0BCDu32), (0x0C3Eu32, 0x0C40u32), (0x0C46u32, 0x0C48u32),
+  (0x0C4Au32, 0x0C4Du32), (0x0C55u32, 0x0C56u32), (0x0CBCu32, 0x0CBCu32),
+  (0x0CBFu32, 0x0CBFu32), (0x0CC6u32, 0x0CC6u32), (0x0CCCu32, 0x0CCDu32),
+  (0x0CE2u32, 0x0CE3u32), (0x0D41u32, 0x0D43u32), (0x0D4Du32, 0x0D4Du32),
+  (0x0DCAu32, 0x0DCAu32), (0x0DD2u32, 0x0DD4u32), (0x0DD6u32, 0x0DD6u32),
+  (0x0E31u32, 0x0E31u32), (0x0E34u32, 0x0E3Au32), (0x0E47u32, 0x0E4Eu32),
+  (0x0EB1u32, 0x0EB1u32), (0x0EB4u32, 0x0EB9u32), (0x0EBBu32, 0x0EBCu32),
+  (0x0EC8u32, 0x0ECDu32), (0x0F18u32, 0x0F19u32), (0x0F35u32, 0x0F35u32),
+  (0x0F37u32, 0x0F37u32), (0x0F39u32, 0x0F39u32), (0x0F71u32, 0x0F7Eu32),
+  (0x0F80u32, 0x0F84u32), (0x0F86u32, 0x0F87u32), (0x0F90u32, 0x0F97u32),
+  (0x0F99u32, 0x0FBCu32), (0x0FC6u32, 0x0FC6u32), (0x102Du32, 0x1030u32),
+  (0x1032u32, 0x1032u32), (0x1036u32, 0x1037u32), (0x1039u32, 0x1039u32),
+  (0x1058u32, 0x1059u32), (0x1160u32, 0x11FFu32), (0x135Fu32, 0x135Fu32),
+  (0x1712u32, 0x1714u32), (0x1732u32, 0x1734u32), (0x1752u32, 0x1753u32),
+  (0x1772u32, 0x1773u32), (0x17B4u32, 0x17B5u32), (0x17B7u32, 0x17BDu32),
+  (0x17C6u32, 0x17C6u32), (0x17C9u32, 0x17D3u32), (0x17DDu32, 0x17DDu32),
+  (0x180Bu32, 0x180Du32), (0x18A9u32, 0x18A9u32), (0x1920u32, 0x1922u32),
+  (0x1927u32, 0x1928u32), (0x1932u32, 0x1932u32), (0x1939u32, 0x193Bu32),
+  (0x1A17u32, 0x1A18u32), (0x1B00u32, 0x1B03u32), (0x1B34u32, 0x1B34u32),
+  (0x1B36u32, 0x1B3Au32), (0x1B3Cu32, 0x1B3Cu32), (0x1B42u32, 0x1B42u32),
+  (0x1B6Bu32, 0x1B73u32), (0x1DC0u32, 0x1DCAu32), (0x1DFEu32, 0x1DFFu32),
+  (0x200Bu32, 0x200Fu32), (0x202Au32, 0x202Eu32), (0x2060u32, 0x2063u32),
+  (0x206Au32, 0x206Fu32), (0x20D0u32, 0x20EFu32), (0x302Au32, 0x302Fu32),
+  (0x3099u32, 0x309Au32), (0xA806u32, 0xA806u32), (0xA80Bu32, 0xA80Bu32),
+  (0xA825u32, 0xA826u32), (0xFB1Eu32, 0xFB1Eu32), (0xFE00u32, 0xFE0Fu32),
+  (0xFE20u32, 0xFE23u32), (0xFEFFu32, 0xFEFFu32), (0xFFF9u32, 0xFFFBu32),
+  (0x10A01u32, 0x10A03u32), (0x10A05u32, 0x10A06u32), (0x10A0Cu32, 0x10A0Fu32),
+  (0x10A38u32, 0x10A3Au32), (0x10A3Fu32, 0x10A3Fu32), (0x1D167u32, 0x1D169u32),
+  (0x1D173u32, 0x1D182u32), (0x1D185u32, 0x1D18Bu32), (0x1D1AAu32, 0x1D1ADu32),
+  (0x1D242u32, 0x1D244u32), (0xE0001u32, 0xE0001u32), (0xE0020u32, 0xE007Fu32),
+  (0xE0100u32, 0xE01EFu32)
+]
+
+proc loadRanges() =
+  template add(firstcol: string, res: var seq[(uint32, uint32)]) =
+    if firstcol.contains(".."):
+      let fcs = firstcol.split("..")
+      let rstart = uint32(parseHexInt(fcs[0]))
+      let rend = uint32(parseHexInt(fcs[1]))
+      res.add((rstart, rend))
+    else:
+      let cp = uint32(parseHexInt(firstcol))
+      res.add((cp, cp))
+  var f: File
+  if not open(f, "res/map/EastAsianWidth.txt"):
+    stderr.write("res/map/EastAsianWidth.txt not found\n")
+    quit(1)
+  let s = f.readAll()
+  f.close()
+  for line in s.split('\n'):
+    if line.len == 0 or line[0] == '#':
+      continue
+    var i = 0
+    var firstcol = ""
+    var status = ""
+    while i < line.len and line[i] notin {'#', ';'}:
+      if line[i] != ' ':
+        firstcol &= line[i]
+      inc i
+    if line[i] != '#':
+      inc i
+    while i < line.len and line[i] notin {'#', ';'}:
+      if line[i] != ' ':
+        status &= line[i]
+      inc i
+    case status
+    of "W", "F": add(firstcol, DoubleWidthRanges)
+    of "A": add(firstcol, DoubleWidthAmbiguousRanges)
+    #of "H": add(firstcol, HalfWidthRanges)
+
+type LineWriter = object
+  s: Stream
+  line: string
+
+proc write(writer: var LineWriter, s: string) =
+  if s.len + writer.line.len > 80:
+    writer.s.writeLine(writer.line)
+    writer.line = ""
+  writer.line &= s
+
+proc flush(writer: var LineWriter) =
+  writer.s.writeLine(writer.line)
+  writer.line = ""
+
+proc main() =
+  loadRanges()
+  var DoubleWidthTable = makePropertyTable(DoubleWidthRanges, Combining)
+  # Control chars return a width of 2, and are displayed as ^{letter}.
+  for c in Controls:
+    let u = int(c)
+    let i = u div (sizeof(int) * 8)
+    let m = u mod (sizeof(int) * 8)
+    DoubleWidthTable[i] = DoubleWidthTable[i] or ptint(1 shl m)
+  let CombiningTable = makePropertyTable(Combining)
+
+  var dwrLen = 0
+  for (ucs, mapped) in DoubleWidthRanges:
+    if ucs > uint16.high: # lower ranges are added to DoubleWidthTable
+      inc dwrLen
+  echo "const DoubleWidthRanges: array[" & $dwrLen &
+    ", tuple[ucs, mapped: uint32]] = ["
+  var writer = LineWriter(s: newFileStream(stdout))
+  for (ucs, mapped) in DoubleWidthRanges:
+    if ucs > uint16.high: # lower ranges are added to DoubleWidthTable
+      writer.write("(" & $ucs & "," & $mapped & "),")
+  writer.flush()
+  echo "]"
+  echo ""
+
+  echo "const DoubleWidthAmbiguousRanges: array[" &
+    $DoubleWidthAmbiguousRanges.len & ", tuple[ucs, mapped: uint32]] = ["
+  for (ucs, mapped) in DoubleWidthAmbiguousRanges:
+    writer.write("(" & $ucs & "," & $mapped & "),")
+  writer.flush()
+  echo "]"
+  echo ""
+
+  var cmbLen = 0
+  for (ucs, mapped) in Combining:
+    if ucs > uint16.high: # lower ranges are added to CombiningTable
+      inc cmbLen
+  echo "const Combining: array[" & $cmbLen & ", tuple[ucs, mapped: uint32]] = ["
+  for (ucs, mapped) in Combining:
+    if ucs > uint16.high:
+      writer.write("(" & $ucs & "," & $mapped & "),")
+  writer.flush()
+  echo "]"
+  echo ""
+
+  echo "const DoubleWidthTable: PropertyTable = ["
+  for u in DoubleWidthTable:
+    writer.write($u & ",")
+  writer.flush()
+  echo "]"
+  echo ""
+
+  echo "const CombiningTable: PropertyTable = ["
+  for u in CombiningTable:
+    writer.write($u & ",")
+  writer.flush()
+  echo "]"
+  echo ""
+
+main()
diff --git a/res/genidna.nim b/res/genidna.nim
index 772c88d0..bd8e8bf7 100644
--- a/res/genidna.nim
+++ b/res/genidna.nim
@@ -69,6 +69,7 @@ proc loadIdnaData() =
     stderr.write("res/map/IdnaMappingTable.txt not found\n")
     quit(1)
   let s = f.readAll()
+  f.close()
   for line in s.split('\n'):
     if line.len == 0 or line[0] == '#':
       continue
diff --git a/res/map/charwidth_gen.nim b/res/map/charwidth_gen.nim
new file mode 100644
index 00000000..70e650d4
--- /dev/null
+++ b/res/map/charwidth_gen.nim
@@ -0,0 +1,196 @@
+const DoubleWidthRanges: array[85, tuple[ucs, mapped: uint32]] = [
+(94176,94177),(94178,94178),(94179,94179),(94180,94180),(94192,94193),
+(94208,100343),(100352,101119),(101120,101589),(101632,101640),(110576,110579),
+(110581,110587),(110589,110590),(110592,110847),(110848,110882),(110898,110898),
+(110928,110930),(110933,110933),(110948,110951),(110960,111355),(126980,126980),
+(127183,127183),(127374,127374),(127377,127386),(127488,127490),(127504,127547),
+(127552,127560),(127568,127569),(127584,127589),(127744,127776),(127789,127797),
+(127799,127868),(127870,127891),(127904,127946),(127951,127955),(127968,127984),
+(127988,127988),(127992,127994),(127995,127999),(128000,128062),(128064,128064),
+(128066,128252),(128255,128317),(128331,128334),(128336,128359),(128378,128378),
+(128405,128406),(128420,128420),(128507,128511),(128512,128591),(128640,128709),
+(128716,128716),(128720,128722),(128725,128727),(128732,128735),(128747,128748),
+(128756,128764),(128992,129003),(129008,129008),(129292,129338),(129340,129349),
+(129351,129535),(129648,129660),(129664,129672),(129680,129725),(129727,129733),
+(129742,129755),(129760,129768),(129776,129784),(131072,173791),(173792,173823),
+(173824,177977),(177978,177983),(177984,178205),(178206,178207),(178208,183969),
+(183970,183983),(183984,191456),(191457,194559),(194560,195101),(195102,195103),
+(195104,196605),(196608,201546),(201547,201551),(201552,205743),(205744,262141),
+]
+
+const DoubleWidthAmbiguousRanges: array[198, tuple[ucs, mapped: uint32]] = [
+(161,161),(164,164),(167,167),(168,168),(170,170),(173,173),(174,174),(176,176),
+(177,177),(178,179),(180,180),(182,183),(184,184),(185,185),(186,186),(188,190),
+(191,191),(198,198),(208,208),(215,215),(216,216),(222,225),(230,230),(232,234),
+(236,237),(240,240),(242,243),(247,247),(248,250),(252,252),(254,254),(257,257),
+(273,273),(275,275),(283,283),(294,295),(299,299),(305,307),(312,312),(319,322),
+(324,324),(328,331),(333,333),(338,339),(358,359),(363,363),(462,462),(464,464),
+(466,466),(468,468),(470,470),(472,472),(474,474),(476,476),(593,593),(609,609),
+(708,708),(711,711),(713,715),(717,717),(720,720),(728,731),(733,733),(735,735),
+(768,879),(913,929),(931,937),(945,961),(963,969),(1025,1025),(1040,1103),
+(1105,1105),(8208,8208),(8211,8213),(8214,8214),(8216,8216),(8217,8217),
+(8220,8220),(8221,8221),(8224,8226),(8228,8231),(8240,8240),(8242,8243),
+(8245,8245),(8251,8251),(8254,8254),(8308,8308),(8319,8319),(8321,8324),
+(8364,8364),(8451,8451),(8453,8453),(8457,8457),(8467,8467),(8470,8470),
+(8481,8482),(8486,8486),(8491,8491),(8531,8532),(8539,8542),(8544,8555),
+(8560,8569),(8585,8585),(8592,8596),(8597,8601),(8632,8633),(8658,8658),
+(8660,8660),(8679,8679),(8704,8704),(8706,8707),(8711,8712),(8715,8715),
+(8719,8719),(8721,8721),(8725,8725),(8730,8730),(8733,8736),(8739,8739),
+(8741,8741),(8743,8748),(8750,8750),(8756,8759),(8764,8765),(8776,8776),
+(8780,8780),(8786,8786),(8800,8801),(8804,8807),(8810,8811),(8814,8815),
+(8834,8835),(8838,8839),(8853,8853),(8857,8857),(8869,8869),(8895,8895),
+(8978,8978),(9312,9371),(9372,9449),(9451,9471),(9472,9547),(9552,9587),
+(9600,9615),(9618,9621),(9632,9633),(9635,9641),(9650,9651),(9654,9654),
+(9655,9655),(9660,9661),(9664,9664),(9665,9665),(9670,9672),(9675,9675),
+(9678,9681),(9698,9701),(9711,9711),(9733,9734),(9737,9737),(9742,9743),
+(9756,9756),(9758,9758),(9792,9792),(9794,9794),(9824,9825),(9827,9829),
+(9831,9834),(9836,9837),(9839,9839),(9886,9887),(9919,9919),(9926,9933),
+(9935,9939),(9941,9953),(9955,9955),(9960,9961),(9963,9969),(9972,9972),
+(9974,9977),(9979,9980),(9982,9983),(10045,10045),(10102,10111),(11094,11097),
+(12872,12879),(57344,63743),(65024,65039),(65533,65533),(127232,127242),
+(127248,127277),(127280,127337),(127344,127373),(127375,127376),(127387,127404),
+(917760,917999),(983040,1048573),(1048576,1114109),
+]
+
+const Combining: array[13, tuple[ucs, mapped: uint32]] = [
+(68097,68099),(68101,68102),(68108,68111),(68152,68154),(68159,68159),
+(119143,119145),(119155,119170),(119173,119179),(119210,119213),(119362,119364),
+(917505,917505),(917536,917631),(917760,917999),
+]
+
+const DoubleWidthTable: PropertyTable = [
+-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,201326592,1536,0,0,0,0,0,597504,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1610612736,
+3145728,0,1048320,-2147483648,524288,1610615810,1065008,606864384,3104,256,
+12079104,0,14680064,-2147418112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,402653184,0,2162688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+-67108865,-1,-1,1048575,-1,-1,-1,-1,-1,-1,4194303,268369920,-1,2147483647,-2,-1,
+-25165825,-1,-1,-1,-32,-65537,-1,-1,-32769,-1,-1,-65521,2147483647,-1,-65281,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-57345,-1,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,536870911,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
+-1,-1,-1,-1,-1,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,
+-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,67043328,-65536,-524289,3967,0,0,0,0,-2,-1,-1,1,0,0,0,127,
+]
+
+const CombiningTable: PropertyTable = [
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,65535,0,0,0,0,0,0,0,0,
+888,0,0,0,0,0,0,0,-131072,-1073741825,182,0,4128783,0,2147481600,65536,0,0,
+-4194304,15775,163840,-65536,2047,0,0,131008,0,1046528,0,0,0,0,0,0,0,0,6,
+268435456,1974782,12,2,268435456,8222,12,6,268435456,14726,196608,6,268435456,
+8638,12,2,-1879048192,4202510,0,4,0,8193,0,0,-1073741824,6307265,0,0,
+-1879048192,12352,12,0,0,8206,0,0,0,6030336,0,0,133300224,32640,0,0,468844544,
+16128,0,50331648,44040192,0,2147352576,-16842529,536870911,64,0,0,46522368,
+50331648,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,-2147483648,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1835008,1835008,786432,786432,
+0,1068498944,537919040,0,14336,0,0,0,0,512,0,0,0,235143559,0,0,0,0,0,0,25165824,
+0,0,0,0,0,0,0,15,399507456,4,1046528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2047,
+-1073741824,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63488,31744,0,64527,0,0,-65536,
+65535,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,64512,0,0,100663296,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,2112,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+1073741824,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65535,15,0,0,0,0,0,
+-2147483648,0,0,0,0,0,0,0,234881024,
+]
+