From 26db10b5abecab415b9e3cef0bd3aeac1d3e38c9 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 17 Nov 2017 19:10:35 +0000 Subject: [PATCH 01/17] [MetaTools] add a script to download and parse UCD data files The script currently only parses the Scripts.txt file and generates a new python module `fontTools.unicodedata.scripts` containing a `SCRIPT_RANGES` list of tuples, each containing the range and the corresponding script name. --- MetaTools/buildUCD.py | 114 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100755 MetaTools/buildUCD.py diff --git a/MetaTools/buildUCD.py b/MetaTools/buildUCD.py new file mode 100755 index 000000000..994bd1e02 --- /dev/null +++ b/MetaTools/buildUCD.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python +""" +Tools to parse data files from the Unicode Character Database. +""" + +from __future__ import print_function, absolute_import, division +from __future__ import unicode_literals +from fontTools.misc.py23 import * + +try: + from urllib.request import urlopen +except ImportError: + from urllib2 import urlopen +from contextlib import closing, contextmanager +import re +from codecs import iterdecode +from os.path import abspath, dirname, join as pjoin, pardir, sep + + +UNIDATA_URL = "https://unicode.org/Public/UNIDATA/" + +# by default save output files to ../Lib/fontTools/unicodedata/ +UNIDATA_PATH = pjoin(abspath(dirname(__file__)), pardir, + "Lib", "fontTools", "unicodedata") + sep + +SRC_ENCODING = "# -*- coding: utf-8 -*-\n" + +NOTICE = "# NOTE: This file was auto-generated with MetaTools/buildUCD.py.\n" + + +@contextmanager +def open_unidata_file(filename): + """Open a text file from https://unicode.org/Public/UNIDATA/""" + url = UNIDATA_URL + filename + with closing(urlopen(url)) as response: + yield iterdecode(response, encoding="utf-8") + + +def parse_unidata_header(infile): + """Read the top header of data files, until the first line + that does not start with '#'. + """ + header = [] + line = next(infile) + while line.startswith("#"): + header.append(line) + line = next(infile) + return "".join(header) + + +def parse_range_properties(infile): + """Parse a Unicode data file containing a column with one character or + a range of characters, and another column containing a property value + separated by a semicolon. Comments after '#' are ignored. + """ + ranges = [] + line_regex = re.compile( + r"^" + r"([0-9A-F]{4,6})" # first character code + r"(?:\.\.([0-9A-F]{4,6}))?" # optional second character code + r"\s*;\s*" + r"([^#]+)") # everything up to the potential comment + for line in infile: + match = line_regex.match(line) + if not match: + continue + + first, last, data = match.groups() + if last is None: + last = first + + first = int(first, 16) + last = int(last, 16) + data = data.rstrip() + + ranges.append((first, last, data)) + + return ranges + + +def build_scripts(output_path=None): + """Fetch "Scripts.txt" data file, parse the script ranges and write + them as a list of Python tuples to 'fontTools.unicodedata.scripts'. + """ + filename = "Scripts.txt" + with open_unidata_file(filename) as f: + header = parse_unidata_header(f) + script_ranges = parse_range_properties(f) + + if not output_path: + output_path = UNIDATA_PATH + "scripts.py" + + with open(output_path, "w", encoding="utf-8") as f: + f.write(SRC_ENCODING) + f.write("#\n") + f.write(NOTICE) + f.write("# Source: {}{}\n".format(UNIDATA_URL, filename)) + f.write("#\n") + f.write(header+"\n\n") + + f.write("SCRIPT_RANGES = [\n") + for first, last, script_name in sorted(script_ranges): + f.write(" (0x{:X}, 0x{:X}, '{}'),\n".format( + first, last, tostr(script_name))) + f.write("]\n") + + +def main(): + build_scripts() + + +if __name__ == "__main__": + import sys + sys.exit(main()) From 96dafe4afce7aa160f71081472c3d3d0691d867e Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 17 Nov 2017 19:16:45 +0000 Subject: [PATCH 02/17] [unicodedata] add auto-generated 'scripts' module containing the script ranges and names from Scripts.txt --- Lib/fontTools/unicodedata/scripts.py | 1986 ++++++++++++++++++++++++++ 1 file changed, 1986 insertions(+) create mode 100644 Lib/fontTools/unicodedata/scripts.py diff --git a/Lib/fontTools/unicodedata/scripts.py b/Lib/fontTools/unicodedata/scripts.py new file mode 100644 index 000000000..133212cd2 --- /dev/null +++ b/Lib/fontTools/unicodedata/scripts.py @@ -0,0 +1,1986 @@ +# -*- coding: utf-8 -*- +# +# NOTE: This file was auto-generated with MetaTools/buildUCD.py. +# Source: https://unicode.org/Public/UNIDATA/Scripts.txt +# +# Scripts-10.0.0.txt +# Date: 2017-03-11, 06:40:37 GMT +# © 2017 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# For more information, see: +# UAX #24, Unicode Script Property: http://www.unicode.org/reports/tr24/ +# Especially the sections: +# http://www.unicode.org/reports/tr24/#Assignment_Script_Values +# http://www.unicode.org/reports/tr24/#Assignment_ScriptX_Values +# + + +SCRIPT_RANGES = [ + (0x0, 0x1F, 'Common'), + (0x20, 0x20, 'Common'), + (0x21, 0x23, 'Common'), + (0x24, 0x24, 'Common'), + (0x25, 0x27, 'Common'), + (0x28, 0x28, 'Common'), + (0x29, 0x29, 'Common'), + (0x2A, 0x2A, 'Common'), + (0x2B, 0x2B, 'Common'), + (0x2C, 0x2C, 'Common'), + (0x2D, 0x2D, 'Common'), + (0x2E, 0x2F, 'Common'), + (0x30, 0x39, 'Common'), + (0x3A, 0x3B, 'Common'), + (0x3C, 0x3E, 'Common'), + (0x3F, 0x40, 'Common'), + (0x41, 0x5A, 'Latin'), + (0x5B, 0x5B, 'Common'), + (0x5C, 0x5C, 'Common'), + (0x5D, 0x5D, 'Common'), + (0x5E, 0x5E, 'Common'), + (0x5F, 0x5F, 'Common'), + (0x60, 0x60, 'Common'), + (0x61, 0x7A, 'Latin'), + (0x7B, 0x7B, 'Common'), + (0x7C, 0x7C, 'Common'), + (0x7D, 0x7D, 'Common'), + (0x7E, 0x7E, 'Common'), + (0x7F, 0x9F, 'Common'), + (0xA0, 0xA0, 'Common'), + (0xA1, 0xA1, 'Common'), + (0xA2, 0xA5, 'Common'), + (0xA6, 0xA6, 'Common'), + (0xA7, 0xA7, 'Common'), + (0xA8, 0xA8, 'Common'), + (0xA9, 0xA9, 'Common'), + (0xAA, 0xAA, 'Latin'), + (0xAB, 0xAB, 'Common'), + (0xAC, 0xAC, 'Common'), + (0xAD, 0xAD, 'Common'), + (0xAE, 0xAE, 'Common'), + (0xAF, 0xAF, 'Common'), + (0xB0, 0xB0, 'Common'), + (0xB1, 0xB1, 'Common'), + (0xB2, 0xB3, 'Common'), + (0xB4, 0xB4, 'Common'), + (0xB5, 0xB5, 'Common'), + (0xB6, 0xB7, 'Common'), + (0xB8, 0xB8, 'Common'), + (0xB9, 0xB9, 'Common'), + (0xBA, 0xBA, 'Latin'), + (0xBB, 0xBB, 'Common'), + (0xBC, 0xBE, 'Common'), + (0xBF, 0xBF, 'Common'), + (0xC0, 0xD6, 'Latin'), + (0xD7, 0xD7, 'Common'), + (0xD8, 0xF6, 'Latin'), + (0xF7, 0xF7, 'Common'), + (0xF8, 0x1BA, 'Latin'), + (0x1BB, 0x1BB, 'Latin'), + (0x1BC, 0x1BF, 'Latin'), + (0x1C0, 0x1C3, 'Latin'), + (0x1C4, 0x293, 'Latin'), + (0x294, 0x294, 'Latin'), + (0x295, 0x2AF, 'Latin'), + (0x2B0, 0x2B8, 'Latin'), + (0x2B9, 0x2C1, 'Common'), + (0x2C2, 0x2C5, 'Common'), + (0x2C6, 0x2D1, 'Common'), + (0x2D2, 0x2DF, 'Common'), + (0x2E0, 0x2E4, 'Latin'), + (0x2E5, 0x2E9, 'Common'), + (0x2EA, 0x2EB, 'Bopomofo'), + (0x2EC, 0x2EC, 'Common'), + (0x2ED, 0x2ED, 'Common'), + (0x2EE, 0x2EE, 'Common'), + (0x2EF, 0x2FF, 'Common'), + (0x300, 0x36F, 'Inherited'), + (0x370, 0x373, 'Greek'), + (0x374, 0x374, 'Common'), + (0x375, 0x375, 'Greek'), + (0x376, 0x377, 'Greek'), + (0x37A, 0x37A, 'Greek'), + (0x37B, 0x37D, 'Greek'), + (0x37E, 0x37E, 'Common'), + (0x37F, 0x37F, 'Greek'), + (0x384, 0x384, 'Greek'), + (0x385, 0x385, 'Common'), + (0x386, 0x386, 'Greek'), + (0x387, 0x387, 'Common'), + (0x388, 0x38A, 'Greek'), + (0x38C, 0x38C, 'Greek'), + (0x38E, 0x3A1, 'Greek'), + (0x3A3, 0x3E1, 'Greek'), + (0x3E2, 0x3EF, 'Coptic'), + (0x3F0, 0x3F5, 'Greek'), + (0x3F6, 0x3F6, 'Greek'), + (0x3F7, 0x3FF, 'Greek'), + (0x400, 0x481, 'Cyrillic'), + (0x482, 0x482, 'Cyrillic'), + (0x483, 0x484, 'Cyrillic'), + (0x485, 0x486, 'Inherited'), + (0x487, 0x487, 'Cyrillic'), + (0x488, 0x489, 'Cyrillic'), + (0x48A, 0x52F, 'Cyrillic'), + (0x531, 0x556, 'Armenian'), + (0x559, 0x559, 'Armenian'), + (0x55A, 0x55F, 'Armenian'), + (0x561, 0x587, 'Armenian'), + (0x589, 0x589, 'Common'), + (0x58A, 0x58A, 'Armenian'), + (0x58D, 0x58E, 'Armenian'), + (0x58F, 0x58F, 'Armenian'), + (0x591, 0x5BD, 'Hebrew'), + (0x5BE, 0x5BE, 'Hebrew'), + (0x5BF, 0x5BF, 'Hebrew'), + (0x5C0, 0x5C0, 'Hebrew'), + (0x5C1, 0x5C2, 'Hebrew'), + (0x5C3, 0x5C3, 'Hebrew'), + (0x5C4, 0x5C5, 'Hebrew'), + (0x5C6, 0x5C6, 'Hebrew'), + (0x5C7, 0x5C7, 'Hebrew'), + (0x5D0, 0x5EA, 'Hebrew'), + (0x5F0, 0x5F2, 'Hebrew'), + (0x5F3, 0x5F4, 'Hebrew'), + (0x600, 0x604, 'Arabic'), + (0x605, 0x605, 'Common'), + (0x606, 0x608, 'Arabic'), + (0x609, 0x60A, 'Arabic'), + (0x60B, 0x60B, 'Arabic'), + (0x60C, 0x60C, 'Common'), + (0x60D, 0x60D, 'Arabic'), + (0x60E, 0x60F, 'Arabic'), + (0x610, 0x61A, 'Arabic'), + (0x61B, 0x61B, 'Common'), + (0x61C, 0x61C, 'Arabic'), + (0x61E, 0x61E, 'Arabic'), + (0x61F, 0x61F, 'Common'), + (0x620, 0x63F, 'Arabic'), + (0x640, 0x640, 'Common'), + (0x641, 0x64A, 'Arabic'), + (0x64B, 0x655, 'Inherited'), + (0x656, 0x65F, 'Arabic'), + (0x660, 0x669, 'Arabic'), + (0x66A, 0x66D, 'Arabic'), + (0x66E, 0x66F, 'Arabic'), + (0x670, 0x670, 'Inherited'), + (0x671, 0x6D3, 'Arabic'), + (0x6D4, 0x6D4, 'Arabic'), + (0x6D5, 0x6D5, 'Arabic'), + (0x6D6, 0x6DC, 'Arabic'), + (0x6DD, 0x6DD, 'Common'), + (0x6DE, 0x6DE, 'Arabic'), + (0x6DF, 0x6E4, 'Arabic'), + (0x6E5, 0x6E6, 'Arabic'), + (0x6E7, 0x6E8, 'Arabic'), + (0x6E9, 0x6E9, 'Arabic'), + (0x6EA, 0x6ED, 'Arabic'), + (0x6EE, 0x6EF, 'Arabic'), + (0x6F0, 0x6F9, 'Arabic'), + (0x6FA, 0x6FC, 'Arabic'), + (0x6FD, 0x6FE, 'Arabic'), + (0x6FF, 0x6FF, 'Arabic'), + (0x700, 0x70D, 'Syriac'), + (0x70F, 0x70F, 'Syriac'), + (0x710, 0x710, 'Syriac'), + (0x711, 0x711, 'Syriac'), + (0x712, 0x72F, 'Syriac'), + (0x730, 0x74A, 'Syriac'), + (0x74D, 0x74F, 'Syriac'), + (0x750, 0x77F, 'Arabic'), + (0x780, 0x7A5, 'Thaana'), + (0x7A6, 0x7B0, 'Thaana'), + (0x7B1, 0x7B1, 'Thaana'), + (0x7C0, 0x7C9, 'Nko'), + (0x7CA, 0x7EA, 'Nko'), + (0x7EB, 0x7F3, 'Nko'), + (0x7F4, 0x7F5, 'Nko'), + (0x7F6, 0x7F6, 'Nko'), + (0x7F7, 0x7F9, 'Nko'), + (0x7FA, 0x7FA, 'Nko'), + (0x800, 0x815, 'Samaritan'), + (0x816, 0x819, 'Samaritan'), + (0x81A, 0x81A, 'Samaritan'), + (0x81B, 0x823, 'Samaritan'), + (0x824, 0x824, 'Samaritan'), + (0x825, 0x827, 'Samaritan'), + (0x828, 0x828, 'Samaritan'), + (0x829, 0x82D, 'Samaritan'), + (0x830, 0x83E, 'Samaritan'), + (0x840, 0x858, 'Mandaic'), + (0x859, 0x85B, 'Mandaic'), + (0x85E, 0x85E, 'Mandaic'), + (0x860, 0x86A, 'Syriac'), + (0x8A0, 0x8B4, 'Arabic'), + (0x8B6, 0x8BD, 'Arabic'), + (0x8D4, 0x8E1, 'Arabic'), + (0x8E2, 0x8E2, 'Common'), + (0x8E3, 0x8FF, 'Arabic'), + (0x900, 0x902, 'Devanagari'), + (0x903, 0x903, 'Devanagari'), + (0x904, 0x939, 'Devanagari'), + (0x93A, 0x93A, 'Devanagari'), + (0x93B, 0x93B, 'Devanagari'), + (0x93C, 0x93C, 'Devanagari'), + (0x93D, 0x93D, 'Devanagari'), + (0x93E, 0x940, 'Devanagari'), + (0x941, 0x948, 'Devanagari'), + (0x949, 0x94C, 'Devanagari'), + (0x94D, 0x94D, 'Devanagari'), + (0x94E, 0x94F, 'Devanagari'), + (0x950, 0x950, 'Devanagari'), + (0x951, 0x952, 'Inherited'), + (0x953, 0x957, 'Devanagari'), + (0x958, 0x961, 'Devanagari'), + (0x962, 0x963, 'Devanagari'), + (0x964, 0x965, 'Common'), + (0x966, 0x96F, 'Devanagari'), + (0x970, 0x970, 'Devanagari'), + (0x971, 0x971, 'Devanagari'), + (0x972, 0x97F, 'Devanagari'), + (0x980, 0x980, 'Bengali'), + (0x981, 0x981, 'Bengali'), + (0x982, 0x983, 'Bengali'), + (0x985, 0x98C, 'Bengali'), + (0x98F, 0x990, 'Bengali'), + (0x993, 0x9A8, 'Bengali'), + (0x9AA, 0x9B0, 'Bengali'), + (0x9B2, 0x9B2, 'Bengali'), + (0x9B6, 0x9B9, 'Bengali'), + (0x9BC, 0x9BC, 'Bengali'), + (0x9BD, 0x9BD, 'Bengali'), + (0x9BE, 0x9C0, 'Bengali'), + (0x9C1, 0x9C4, 'Bengali'), + (0x9C7, 0x9C8, 'Bengali'), + (0x9CB, 0x9CC, 'Bengali'), + (0x9CD, 0x9CD, 'Bengali'), + (0x9CE, 0x9CE, 'Bengali'), + (0x9D7, 0x9D7, 'Bengali'), + (0x9DC, 0x9DD, 'Bengali'), + (0x9DF, 0x9E1, 'Bengali'), + (0x9E2, 0x9E3, 'Bengali'), + (0x9E6, 0x9EF, 'Bengali'), + (0x9F0, 0x9F1, 'Bengali'), + (0x9F2, 0x9F3, 'Bengali'), + (0x9F4, 0x9F9, 'Bengali'), + (0x9FA, 0x9FA, 'Bengali'), + (0x9FB, 0x9FB, 'Bengali'), + (0x9FC, 0x9FC, 'Bengali'), + (0x9FD, 0x9FD, 'Bengali'), + (0xA01, 0xA02, 'Gurmukhi'), + (0xA03, 0xA03, 'Gurmukhi'), + (0xA05, 0xA0A, 'Gurmukhi'), + (0xA0F, 0xA10, 'Gurmukhi'), + (0xA13, 0xA28, 'Gurmukhi'), + (0xA2A, 0xA30, 'Gurmukhi'), + (0xA32, 0xA33, 'Gurmukhi'), + (0xA35, 0xA36, 'Gurmukhi'), + (0xA38, 0xA39, 'Gurmukhi'), + (0xA3C, 0xA3C, 'Gurmukhi'), + (0xA3E, 0xA40, 'Gurmukhi'), + (0xA41, 0xA42, 'Gurmukhi'), + (0xA47, 0xA48, 'Gurmukhi'), + (0xA4B, 0xA4D, 'Gurmukhi'), + (0xA51, 0xA51, 'Gurmukhi'), + (0xA59, 0xA5C, 'Gurmukhi'), + (0xA5E, 0xA5E, 'Gurmukhi'), + (0xA66, 0xA6F, 'Gurmukhi'), + (0xA70, 0xA71, 'Gurmukhi'), + (0xA72, 0xA74, 'Gurmukhi'), + (0xA75, 0xA75, 'Gurmukhi'), + (0xA81, 0xA82, 'Gujarati'), + (0xA83, 0xA83, 'Gujarati'), + (0xA85, 0xA8D, 'Gujarati'), + (0xA8F, 0xA91, 'Gujarati'), + (0xA93, 0xAA8, 'Gujarati'), + (0xAAA, 0xAB0, 'Gujarati'), + (0xAB2, 0xAB3, 'Gujarati'), + (0xAB5, 0xAB9, 'Gujarati'), + (0xABC, 0xABC, 'Gujarati'), + (0xABD, 0xABD, 'Gujarati'), + (0xABE, 0xAC0, 'Gujarati'), + (0xAC1, 0xAC5, 'Gujarati'), + (0xAC7, 0xAC8, 'Gujarati'), + (0xAC9, 0xAC9, 'Gujarati'), + (0xACB, 0xACC, 'Gujarati'), + (0xACD, 0xACD, 'Gujarati'), + (0xAD0, 0xAD0, 'Gujarati'), + (0xAE0, 0xAE1, 'Gujarati'), + (0xAE2, 0xAE3, 'Gujarati'), + (0xAE6, 0xAEF, 'Gujarati'), + (0xAF0, 0xAF0, 'Gujarati'), + (0xAF1, 0xAF1, 'Gujarati'), + (0xAF9, 0xAF9, 'Gujarati'), + (0xAFA, 0xAFF, 'Gujarati'), + (0xB01, 0xB01, 'Oriya'), + (0xB02, 0xB03, 'Oriya'), + (0xB05, 0xB0C, 'Oriya'), + (0xB0F, 0xB10, 'Oriya'), + (0xB13, 0xB28, 'Oriya'), + (0xB2A, 0xB30, 'Oriya'), + (0xB32, 0xB33, 'Oriya'), + (0xB35, 0xB39, 'Oriya'), + (0xB3C, 0xB3C, 'Oriya'), + (0xB3D, 0xB3D, 'Oriya'), + (0xB3E, 0xB3E, 'Oriya'), + (0xB3F, 0xB3F, 'Oriya'), + (0xB40, 0xB40, 'Oriya'), + (0xB41, 0xB44, 'Oriya'), + (0xB47, 0xB48, 'Oriya'), + (0xB4B, 0xB4C, 'Oriya'), + (0xB4D, 0xB4D, 'Oriya'), + (0xB56, 0xB56, 'Oriya'), + (0xB57, 0xB57, 'Oriya'), + (0xB5C, 0xB5D, 'Oriya'), + (0xB5F, 0xB61, 'Oriya'), + (0xB62, 0xB63, 'Oriya'), + (0xB66, 0xB6F, 'Oriya'), + (0xB70, 0xB70, 'Oriya'), + (0xB71, 0xB71, 'Oriya'), + (0xB72, 0xB77, 'Oriya'), + (0xB82, 0xB82, 'Tamil'), + (0xB83, 0xB83, 'Tamil'), + (0xB85, 0xB8A, 'Tamil'), + (0xB8E, 0xB90, 'Tamil'), + (0xB92, 0xB95, 'Tamil'), + (0xB99, 0xB9A, 'Tamil'), + (0xB9C, 0xB9C, 'Tamil'), + (0xB9E, 0xB9F, 'Tamil'), + (0xBA3, 0xBA4, 'Tamil'), + (0xBA8, 0xBAA, 'Tamil'), + (0xBAE, 0xBB9, 'Tamil'), + (0xBBE, 0xBBF, 'Tamil'), + (0xBC0, 0xBC0, 'Tamil'), + (0xBC1, 0xBC2, 'Tamil'), + (0xBC6, 0xBC8, 'Tamil'), + (0xBCA, 0xBCC, 'Tamil'), + (0xBCD, 0xBCD, 'Tamil'), + (0xBD0, 0xBD0, 'Tamil'), + (0xBD7, 0xBD7, 'Tamil'), + (0xBE6, 0xBEF, 'Tamil'), + (0xBF0, 0xBF2, 'Tamil'), + (0xBF3, 0xBF8, 'Tamil'), + (0xBF9, 0xBF9, 'Tamil'), + (0xBFA, 0xBFA, 'Tamil'), + (0xC00, 0xC00, 'Telugu'), + (0xC01, 0xC03, 'Telugu'), + (0xC05, 0xC0C, 'Telugu'), + (0xC0E, 0xC10, 'Telugu'), + (0xC12, 0xC28, 'Telugu'), + (0xC2A, 0xC39, 'Telugu'), + (0xC3D, 0xC3D, 'Telugu'), + (0xC3E, 0xC40, 'Telugu'), + (0xC41, 0xC44, 'Telugu'), + (0xC46, 0xC48, 'Telugu'), + (0xC4A, 0xC4D, 'Telugu'), + (0xC55, 0xC56, 'Telugu'), + (0xC58, 0xC5A, 'Telugu'), + (0xC60, 0xC61, 'Telugu'), + (0xC62, 0xC63, 'Telugu'), + (0xC66, 0xC6F, 'Telugu'), + (0xC78, 0xC7E, 'Telugu'), + (0xC7F, 0xC7F, 'Telugu'), + (0xC80, 0xC80, 'Kannada'), + (0xC81, 0xC81, 'Kannada'), + (0xC82, 0xC83, 'Kannada'), + (0xC85, 0xC8C, 'Kannada'), + (0xC8E, 0xC90, 'Kannada'), + (0xC92, 0xCA8, 'Kannada'), + (0xCAA, 0xCB3, 'Kannada'), + (0xCB5, 0xCB9, 'Kannada'), + (0xCBC, 0xCBC, 'Kannada'), + (0xCBD, 0xCBD, 'Kannada'), + (0xCBE, 0xCBE, 'Kannada'), + (0xCBF, 0xCBF, 'Kannada'), + (0xCC0, 0xCC4, 'Kannada'), + (0xCC6, 0xCC6, 'Kannada'), + (0xCC7, 0xCC8, 'Kannada'), + (0xCCA, 0xCCB, 'Kannada'), + (0xCCC, 0xCCD, 'Kannada'), + (0xCD5, 0xCD6, 'Kannada'), + (0xCDE, 0xCDE, 'Kannada'), + (0xCE0, 0xCE1, 'Kannada'), + (0xCE2, 0xCE3, 'Kannada'), + (0xCE6, 0xCEF, 'Kannada'), + (0xCF1, 0xCF2, 'Kannada'), + (0xD00, 0xD01, 'Malayalam'), + (0xD02, 0xD03, 'Malayalam'), + (0xD05, 0xD0C, 'Malayalam'), + (0xD0E, 0xD10, 'Malayalam'), + (0xD12, 0xD3A, 'Malayalam'), + (0xD3B, 0xD3C, 'Malayalam'), + (0xD3D, 0xD3D, 'Malayalam'), + (0xD3E, 0xD40, 'Malayalam'), + (0xD41, 0xD44, 'Malayalam'), + (0xD46, 0xD48, 'Malayalam'), + (0xD4A, 0xD4C, 'Malayalam'), + (0xD4D, 0xD4D, 'Malayalam'), + (0xD4E, 0xD4E, 'Malayalam'), + (0xD4F, 0xD4F, 'Malayalam'), + (0xD54, 0xD56, 'Malayalam'), + (0xD57, 0xD57, 'Malayalam'), + (0xD58, 0xD5E, 'Malayalam'), + (0xD5F, 0xD61, 'Malayalam'), + (0xD62, 0xD63, 'Malayalam'), + (0xD66, 0xD6F, 'Malayalam'), + (0xD70, 0xD78, 'Malayalam'), + (0xD79, 0xD79, 'Malayalam'), + (0xD7A, 0xD7F, 'Malayalam'), + (0xD82, 0xD83, 'Sinhala'), + (0xD85, 0xD96, 'Sinhala'), + (0xD9A, 0xDB1, 'Sinhala'), + (0xDB3, 0xDBB, 'Sinhala'), + (0xDBD, 0xDBD, 'Sinhala'), + (0xDC0, 0xDC6, 'Sinhala'), + (0xDCA, 0xDCA, 'Sinhala'), + (0xDCF, 0xDD1, 'Sinhala'), + (0xDD2, 0xDD4, 'Sinhala'), + (0xDD6, 0xDD6, 'Sinhala'), + (0xDD8, 0xDDF, 'Sinhala'), + (0xDE6, 0xDEF, 'Sinhala'), + (0xDF2, 0xDF3, 'Sinhala'), + (0xDF4, 0xDF4, 'Sinhala'), + (0xE01, 0xE30, 'Thai'), + (0xE31, 0xE31, 'Thai'), + (0xE32, 0xE33, 'Thai'), + (0xE34, 0xE3A, 'Thai'), + (0xE3F, 0xE3F, 'Common'), + (0xE40, 0xE45, 'Thai'), + (0xE46, 0xE46, 'Thai'), + (0xE47, 0xE4E, 'Thai'), + (0xE4F, 0xE4F, 'Thai'), + (0xE50, 0xE59, 'Thai'), + (0xE5A, 0xE5B, 'Thai'), + (0xE81, 0xE82, 'Lao'), + (0xE84, 0xE84, 'Lao'), + (0xE87, 0xE88, 'Lao'), + (0xE8A, 0xE8A, 'Lao'), + (0xE8D, 0xE8D, 'Lao'), + (0xE94, 0xE97, 'Lao'), + (0xE99, 0xE9F, 'Lao'), + (0xEA1, 0xEA3, 'Lao'), + (0xEA5, 0xEA5, 'Lao'), + (0xEA7, 0xEA7, 'Lao'), + (0xEAA, 0xEAB, 'Lao'), + (0xEAD, 0xEB0, 'Lao'), + (0xEB1, 0xEB1, 'Lao'), + (0xEB2, 0xEB3, 'Lao'), + (0xEB4, 0xEB9, 'Lao'), + (0xEBB, 0xEBC, 'Lao'), + (0xEBD, 0xEBD, 'Lao'), + (0xEC0, 0xEC4, 'Lao'), + (0xEC6, 0xEC6, 'Lao'), + (0xEC8, 0xECD, 'Lao'), + (0xED0, 0xED9, 'Lao'), + (0xEDC, 0xEDF, 'Lao'), + (0xF00, 0xF00, 'Tibetan'), + (0xF01, 0xF03, 'Tibetan'), + (0xF04, 0xF12, 'Tibetan'), + (0xF13, 0xF13, 'Tibetan'), + (0xF14, 0xF14, 'Tibetan'), + (0xF15, 0xF17, 'Tibetan'), + (0xF18, 0xF19, 'Tibetan'), + (0xF1A, 0xF1F, 'Tibetan'), + (0xF20, 0xF29, 'Tibetan'), + (0xF2A, 0xF33, 'Tibetan'), + (0xF34, 0xF34, 'Tibetan'), + (0xF35, 0xF35, 'Tibetan'), + (0xF36, 0xF36, 'Tibetan'), + (0xF37, 0xF37, 'Tibetan'), + (0xF38, 0xF38, 'Tibetan'), + (0xF39, 0xF39, 'Tibetan'), + (0xF3A, 0xF3A, 'Tibetan'), + (0xF3B, 0xF3B, 'Tibetan'), + (0xF3C, 0xF3C, 'Tibetan'), + (0xF3D, 0xF3D, 'Tibetan'), + (0xF3E, 0xF3F, 'Tibetan'), + (0xF40, 0xF47, 'Tibetan'), + (0xF49, 0xF6C, 'Tibetan'), + (0xF71, 0xF7E, 'Tibetan'), + (0xF7F, 0xF7F, 'Tibetan'), + (0xF80, 0xF84, 'Tibetan'), + (0xF85, 0xF85, 'Tibetan'), + (0xF86, 0xF87, 'Tibetan'), + (0xF88, 0xF8C, 'Tibetan'), + (0xF8D, 0xF97, 'Tibetan'), + (0xF99, 0xFBC, 'Tibetan'), + (0xFBE, 0xFC5, 'Tibetan'), + (0xFC6, 0xFC6, 'Tibetan'), + (0xFC7, 0xFCC, 'Tibetan'), + (0xFCE, 0xFCF, 'Tibetan'), + (0xFD0, 0xFD4, 'Tibetan'), + (0xFD5, 0xFD8, 'Common'), + (0xFD9, 0xFDA, 'Tibetan'), + (0x1000, 0x102A, 'Myanmar'), + (0x102B, 0x102C, 'Myanmar'), + (0x102D, 0x1030, 'Myanmar'), + (0x1031, 0x1031, 'Myanmar'), + (0x1032, 0x1037, 'Myanmar'), + (0x1038, 0x1038, 'Myanmar'), + (0x1039, 0x103A, 'Myanmar'), + (0x103B, 0x103C, 'Myanmar'), + (0x103D, 0x103E, 'Myanmar'), + (0x103F, 0x103F, 'Myanmar'), + (0x1040, 0x1049, 'Myanmar'), + (0x104A, 0x104F, 'Myanmar'), + (0x1050, 0x1055, 'Myanmar'), + (0x1056, 0x1057, 'Myanmar'), + (0x1058, 0x1059, 'Myanmar'), + (0x105A, 0x105D, 'Myanmar'), + (0x105E, 0x1060, 'Myanmar'), + (0x1061, 0x1061, 'Myanmar'), + (0x1062, 0x1064, 'Myanmar'), + (0x1065, 0x1066, 'Myanmar'), + (0x1067, 0x106D, 'Myanmar'), + (0x106E, 0x1070, 'Myanmar'), + (0x1071, 0x1074, 'Myanmar'), + (0x1075, 0x1081, 'Myanmar'), + (0x1082, 0x1082, 'Myanmar'), + (0x1083, 0x1084, 'Myanmar'), + (0x1085, 0x1086, 'Myanmar'), + (0x1087, 0x108C, 'Myanmar'), + (0x108D, 0x108D, 'Myanmar'), + (0x108E, 0x108E, 'Myanmar'), + (0x108F, 0x108F, 'Myanmar'), + (0x1090, 0x1099, 'Myanmar'), + (0x109A, 0x109C, 'Myanmar'), + (0x109D, 0x109D, 'Myanmar'), + (0x109E, 0x109F, 'Myanmar'), + (0x10A0, 0x10C5, 'Georgian'), + (0x10C7, 0x10C7, 'Georgian'), + (0x10CD, 0x10CD, 'Georgian'), + (0x10D0, 0x10FA, 'Georgian'), + (0x10FB, 0x10FB, 'Common'), + (0x10FC, 0x10FC, 'Georgian'), + (0x10FD, 0x10FF, 'Georgian'), + (0x1100, 0x11FF, 'Hangul'), + (0x1200, 0x1248, 'Ethiopic'), + (0x124A, 0x124D, 'Ethiopic'), + (0x1250, 0x1256, 'Ethiopic'), + (0x1258, 0x1258, 'Ethiopic'), + (0x125A, 0x125D, 'Ethiopic'), + (0x1260, 0x1288, 'Ethiopic'), + (0x128A, 0x128D, 'Ethiopic'), + (0x1290, 0x12B0, 'Ethiopic'), + (0x12B2, 0x12B5, 'Ethiopic'), + (0x12B8, 0x12BE, 'Ethiopic'), + (0x12C0, 0x12C0, 'Ethiopic'), + (0x12C2, 0x12C5, 'Ethiopic'), + (0x12C8, 0x12D6, 'Ethiopic'), + (0x12D8, 0x1310, 'Ethiopic'), + (0x1312, 0x1315, 'Ethiopic'), + (0x1318, 0x135A, 'Ethiopic'), + (0x135D, 0x135F, 'Ethiopic'), + (0x1360, 0x1368, 'Ethiopic'), + (0x1369, 0x137C, 'Ethiopic'), + (0x1380, 0x138F, 'Ethiopic'), + (0x1390, 0x1399, 'Ethiopic'), + (0x13A0, 0x13F5, 'Cherokee'), + (0x13F8, 0x13FD, 'Cherokee'), + (0x1400, 0x1400, 'Canadian_Aboriginal'), + (0x1401, 0x166C, 'Canadian_Aboriginal'), + (0x166D, 0x166E, 'Canadian_Aboriginal'), + (0x166F, 0x167F, 'Canadian_Aboriginal'), + (0x1680, 0x1680, 'Ogham'), + (0x1681, 0x169A, 'Ogham'), + (0x169B, 0x169B, 'Ogham'), + (0x169C, 0x169C, 'Ogham'), + (0x16A0, 0x16EA, 'Runic'), + (0x16EB, 0x16ED, 'Common'), + (0x16EE, 0x16F0, 'Runic'), + (0x16F1, 0x16F8, 'Runic'), + (0x1700, 0x170C, 'Tagalog'), + (0x170E, 0x1711, 'Tagalog'), + (0x1712, 0x1714, 'Tagalog'), + (0x1720, 0x1731, 'Hanunoo'), + (0x1732, 0x1734, 'Hanunoo'), + (0x1735, 0x1736, 'Common'), + (0x1740, 0x1751, 'Buhid'), + (0x1752, 0x1753, 'Buhid'), + (0x1760, 0x176C, 'Tagbanwa'), + (0x176E, 0x1770, 'Tagbanwa'), + (0x1772, 0x1773, 'Tagbanwa'), + (0x1780, 0x17B3, 'Khmer'), + (0x17B4, 0x17B5, 'Khmer'), + (0x17B6, 0x17B6, 'Khmer'), + (0x17B7, 0x17BD, 'Khmer'), + (0x17BE, 0x17C5, 'Khmer'), + (0x17C6, 0x17C6, 'Khmer'), + (0x17C7, 0x17C8, 'Khmer'), + (0x17C9, 0x17D3, 'Khmer'), + (0x17D4, 0x17D6, 'Khmer'), + (0x17D7, 0x17D7, 'Khmer'), + (0x17D8, 0x17DA, 'Khmer'), + (0x17DB, 0x17DB, 'Khmer'), + (0x17DC, 0x17DC, 'Khmer'), + (0x17DD, 0x17DD, 'Khmer'), + (0x17E0, 0x17E9, 'Khmer'), + (0x17F0, 0x17F9, 'Khmer'), + (0x1800, 0x1801, 'Mongolian'), + (0x1802, 0x1803, 'Common'), + (0x1804, 0x1804, 'Mongolian'), + (0x1805, 0x1805, 'Common'), + (0x1806, 0x1806, 'Mongolian'), + (0x1807, 0x180A, 'Mongolian'), + (0x180B, 0x180D, 'Mongolian'), + (0x180E, 0x180E, 'Mongolian'), + (0x1810, 0x1819, 'Mongolian'), + (0x1820, 0x1842, 'Mongolian'), + (0x1843, 0x1843, 'Mongolian'), + (0x1844, 0x1877, 'Mongolian'), + (0x1880, 0x1884, 'Mongolian'), + (0x1885, 0x1886, 'Mongolian'), + (0x1887, 0x18A8, 'Mongolian'), + (0x18A9, 0x18A9, 'Mongolian'), + (0x18AA, 0x18AA, 'Mongolian'), + (0x18B0, 0x18F5, 'Canadian_Aboriginal'), + (0x1900, 0x191E, 'Limbu'), + (0x1920, 0x1922, 'Limbu'), + (0x1923, 0x1926, 'Limbu'), + (0x1927, 0x1928, 'Limbu'), + (0x1929, 0x192B, 'Limbu'), + (0x1930, 0x1931, 'Limbu'), + (0x1932, 0x1932, 'Limbu'), + (0x1933, 0x1938, 'Limbu'), + (0x1939, 0x193B, 'Limbu'), + (0x1940, 0x1940, 'Limbu'), + (0x1944, 0x1945, 'Limbu'), + (0x1946, 0x194F, 'Limbu'), + (0x1950, 0x196D, 'Tai_Le'), + (0x1970, 0x1974, 'Tai_Le'), + (0x1980, 0x19AB, 'New_Tai_Lue'), + (0x19B0, 0x19C9, 'New_Tai_Lue'), + (0x19D0, 0x19D9, 'New_Tai_Lue'), + (0x19DA, 0x19DA, 'New_Tai_Lue'), + (0x19DE, 0x19DF, 'New_Tai_Lue'), + (0x19E0, 0x19FF, 'Khmer'), + (0x1A00, 0x1A16, 'Buginese'), + (0x1A17, 0x1A18, 'Buginese'), + (0x1A19, 0x1A1A, 'Buginese'), + (0x1A1B, 0x1A1B, 'Buginese'), + (0x1A1E, 0x1A1F, 'Buginese'), + (0x1A20, 0x1A54, 'Tai_Tham'), + (0x1A55, 0x1A55, 'Tai_Tham'), + (0x1A56, 0x1A56, 'Tai_Tham'), + (0x1A57, 0x1A57, 'Tai_Tham'), + (0x1A58, 0x1A5E, 'Tai_Tham'), + (0x1A60, 0x1A60, 'Tai_Tham'), + (0x1A61, 0x1A61, 'Tai_Tham'), + (0x1A62, 0x1A62, 'Tai_Tham'), + (0x1A63, 0x1A64, 'Tai_Tham'), + (0x1A65, 0x1A6C, 'Tai_Tham'), + (0x1A6D, 0x1A72, 'Tai_Tham'), + (0x1A73, 0x1A7C, 'Tai_Tham'), + (0x1A7F, 0x1A7F, 'Tai_Tham'), + (0x1A80, 0x1A89, 'Tai_Tham'), + (0x1A90, 0x1A99, 'Tai_Tham'), + (0x1AA0, 0x1AA6, 'Tai_Tham'), + (0x1AA7, 0x1AA7, 'Tai_Tham'), + (0x1AA8, 0x1AAD, 'Tai_Tham'), + (0x1AB0, 0x1ABD, 'Inherited'), + (0x1ABE, 0x1ABE, 'Inherited'), + (0x1B00, 0x1B03, 'Balinese'), + (0x1B04, 0x1B04, 'Balinese'), + (0x1B05, 0x1B33, 'Balinese'), + (0x1B34, 0x1B34, 'Balinese'), + (0x1B35, 0x1B35, 'Balinese'), + (0x1B36, 0x1B3A, 'Balinese'), + (0x1B3B, 0x1B3B, 'Balinese'), + (0x1B3C, 0x1B3C, 'Balinese'), + (0x1B3D, 0x1B41, 'Balinese'), + (0x1B42, 0x1B42, 'Balinese'), + (0x1B43, 0x1B44, 'Balinese'), + (0x1B45, 0x1B4B, 'Balinese'), + (0x1B50, 0x1B59, 'Balinese'), + (0x1B5A, 0x1B60, 'Balinese'), + (0x1B61, 0x1B6A, 'Balinese'), + (0x1B6B, 0x1B73, 'Balinese'), + (0x1B74, 0x1B7C, 'Balinese'), + (0x1B80, 0x1B81, 'Sundanese'), + (0x1B82, 0x1B82, 'Sundanese'), + (0x1B83, 0x1BA0, 'Sundanese'), + (0x1BA1, 0x1BA1, 'Sundanese'), + (0x1BA2, 0x1BA5, 'Sundanese'), + (0x1BA6, 0x1BA7, 'Sundanese'), + (0x1BA8, 0x1BA9, 'Sundanese'), + (0x1BAA, 0x1BAA, 'Sundanese'), + (0x1BAB, 0x1BAD, 'Sundanese'), + (0x1BAE, 0x1BAF, 'Sundanese'), + (0x1BB0, 0x1BB9, 'Sundanese'), + (0x1BBA, 0x1BBF, 'Sundanese'), + (0x1BC0, 0x1BE5, 'Batak'), + (0x1BE6, 0x1BE6, 'Batak'), + (0x1BE7, 0x1BE7, 'Batak'), + (0x1BE8, 0x1BE9, 'Batak'), + (0x1BEA, 0x1BEC, 'Batak'), + (0x1BED, 0x1BED, 'Batak'), + (0x1BEE, 0x1BEE, 'Batak'), + (0x1BEF, 0x1BF1, 'Batak'), + (0x1BF2, 0x1BF3, 'Batak'), + (0x1BFC, 0x1BFF, 'Batak'), + (0x1C00, 0x1C23, 'Lepcha'), + (0x1C24, 0x1C2B, 'Lepcha'), + (0x1C2C, 0x1C33, 'Lepcha'), + (0x1C34, 0x1C35, 'Lepcha'), + (0x1C36, 0x1C37, 'Lepcha'), + (0x1C3B, 0x1C3F, 'Lepcha'), + (0x1C40, 0x1C49, 'Lepcha'), + (0x1C4D, 0x1C4F, 'Lepcha'), + (0x1C50, 0x1C59, 'Ol_Chiki'), + (0x1C5A, 0x1C77, 'Ol_Chiki'), + (0x1C78, 0x1C7D, 'Ol_Chiki'), + (0x1C7E, 0x1C7F, 'Ol_Chiki'), + (0x1C80, 0x1C88, 'Cyrillic'), + (0x1CC0, 0x1CC7, 'Sundanese'), + (0x1CD0, 0x1CD2, 'Inherited'), + (0x1CD3, 0x1CD3, 'Common'), + (0x1CD4, 0x1CE0, 'Inherited'), + (0x1CE1, 0x1CE1, 'Common'), + (0x1CE2, 0x1CE8, 'Inherited'), + (0x1CE9, 0x1CEC, 'Common'), + (0x1CED, 0x1CED, 'Inherited'), + (0x1CEE, 0x1CF1, 'Common'), + (0x1CF2, 0x1CF3, 'Common'), + (0x1CF4, 0x1CF4, 'Inherited'), + (0x1CF5, 0x1CF6, 'Common'), + (0x1CF7, 0x1CF7, 'Common'), + (0x1CF8, 0x1CF9, 'Inherited'), + (0x1D00, 0x1D25, 'Latin'), + (0x1D26, 0x1D2A, 'Greek'), + (0x1D2B, 0x1D2B, 'Cyrillic'), + (0x1D2C, 0x1D5C, 'Latin'), + (0x1D5D, 0x1D61, 'Greek'), + (0x1D62, 0x1D65, 'Latin'), + (0x1D66, 0x1D6A, 'Greek'), + (0x1D6B, 0x1D77, 'Latin'), + (0x1D78, 0x1D78, 'Cyrillic'), + (0x1D79, 0x1D9A, 'Latin'), + (0x1D9B, 0x1DBE, 'Latin'), + (0x1DBF, 0x1DBF, 'Greek'), + (0x1DC0, 0x1DF9, 'Inherited'), + (0x1DFB, 0x1DFF, 'Inherited'), + (0x1E00, 0x1EFF, 'Latin'), + (0x1F00, 0x1F15, 'Greek'), + (0x1F18, 0x1F1D, 'Greek'), + (0x1F20, 0x1F45, 'Greek'), + (0x1F48, 0x1F4D, 'Greek'), + (0x1F50, 0x1F57, 'Greek'), + (0x1F59, 0x1F59, 'Greek'), + (0x1F5B, 0x1F5B, 'Greek'), + (0x1F5D, 0x1F5D, 'Greek'), + (0x1F5F, 0x1F7D, 'Greek'), + (0x1F80, 0x1FB4, 'Greek'), + (0x1FB6, 0x1FBC, 'Greek'), + (0x1FBD, 0x1FBD, 'Greek'), + (0x1FBE, 0x1FBE, 'Greek'), + (0x1FBF, 0x1FC1, 'Greek'), + (0x1FC2, 0x1FC4, 'Greek'), + (0x1FC6, 0x1FCC, 'Greek'), + (0x1FCD, 0x1FCF, 'Greek'), + (0x1FD0, 0x1FD3, 'Greek'), + (0x1FD6, 0x1FDB, 'Greek'), + (0x1FDD, 0x1FDF, 'Greek'), + (0x1FE0, 0x1FEC, 'Greek'), + (0x1FED, 0x1FEF, 'Greek'), + (0x1FF2, 0x1FF4, 'Greek'), + (0x1FF6, 0x1FFC, 'Greek'), + (0x1FFD, 0x1FFE, 'Greek'), + (0x2000, 0x200A, 'Common'), + (0x200B, 0x200B, 'Common'), + (0x200C, 0x200D, 'Inherited'), + (0x200E, 0x200F, 'Common'), + (0x2010, 0x2015, 'Common'), + (0x2016, 0x2017, 'Common'), + (0x2018, 0x2018, 'Common'), + (0x2019, 0x2019, 'Common'), + (0x201A, 0x201A, 'Common'), + (0x201B, 0x201C, 'Common'), + (0x201D, 0x201D, 'Common'), + (0x201E, 0x201E, 'Common'), + (0x201F, 0x201F, 'Common'), + (0x2020, 0x2027, 'Common'), + (0x2028, 0x2028, 'Common'), + (0x2029, 0x2029, 'Common'), + (0x202A, 0x202E, 'Common'), + (0x202F, 0x202F, 'Common'), + (0x2030, 0x2038, 'Common'), + (0x2039, 0x2039, 'Common'), + (0x203A, 0x203A, 'Common'), + (0x203B, 0x203E, 'Common'), + (0x203F, 0x2040, 'Common'), + (0x2041, 0x2043, 'Common'), + (0x2044, 0x2044, 'Common'), + (0x2045, 0x2045, 'Common'), + (0x2046, 0x2046, 'Common'), + (0x2047, 0x2051, 'Common'), + (0x2052, 0x2052, 'Common'), + (0x2053, 0x2053, 'Common'), + (0x2054, 0x2054, 'Common'), + (0x2055, 0x205E, 'Common'), + (0x205F, 0x205F, 'Common'), + (0x2060, 0x2064, 'Common'), + (0x2066, 0x206F, 'Common'), + (0x2070, 0x2070, 'Common'), + (0x2071, 0x2071, 'Latin'), + (0x2074, 0x2079, 'Common'), + (0x207A, 0x207C, 'Common'), + (0x207D, 0x207D, 'Common'), + (0x207E, 0x207E, 'Common'), + (0x207F, 0x207F, 'Latin'), + (0x2080, 0x2089, 'Common'), + (0x208A, 0x208C, 'Common'), + (0x208D, 0x208D, 'Common'), + (0x208E, 0x208E, 'Common'), + (0x2090, 0x209C, 'Latin'), + (0x20A0, 0x20BF, 'Common'), + (0x20D0, 0x20DC, 'Inherited'), + (0x20DD, 0x20E0, 'Inherited'), + (0x20E1, 0x20E1, 'Inherited'), + (0x20E2, 0x20E4, 'Inherited'), + (0x20E5, 0x20F0, 'Inherited'), + (0x2100, 0x2101, 'Common'), + (0x2102, 0x2102, 'Common'), + (0x2103, 0x2106, 'Common'), + (0x2107, 0x2107, 'Common'), + (0x2108, 0x2109, 'Common'), + (0x210A, 0x2113, 'Common'), + (0x2114, 0x2114, 'Common'), + (0x2115, 0x2115, 'Common'), + (0x2116, 0x2117, 'Common'), + (0x2118, 0x2118, 'Common'), + (0x2119, 0x211D, 'Common'), + (0x211E, 0x2123, 'Common'), + (0x2124, 0x2124, 'Common'), + (0x2125, 0x2125, 'Common'), + (0x2126, 0x2126, 'Greek'), + (0x2127, 0x2127, 'Common'), + (0x2128, 0x2128, 'Common'), + (0x2129, 0x2129, 'Common'), + (0x212A, 0x212B, 'Latin'), + (0x212C, 0x212D, 'Common'), + (0x212E, 0x212E, 'Common'), + (0x212F, 0x2131, 'Common'), + (0x2132, 0x2132, 'Latin'), + (0x2133, 0x2134, 'Common'), + (0x2135, 0x2138, 'Common'), + (0x2139, 0x2139, 'Common'), + (0x213A, 0x213B, 'Common'), + (0x213C, 0x213F, 'Common'), + (0x2140, 0x2144, 'Common'), + (0x2145, 0x2149, 'Common'), + (0x214A, 0x214A, 'Common'), + (0x214B, 0x214B, 'Common'), + (0x214C, 0x214D, 'Common'), + (0x214E, 0x214E, 'Latin'), + (0x214F, 0x214F, 'Common'), + (0x2150, 0x215F, 'Common'), + (0x2160, 0x2182, 'Latin'), + (0x2183, 0x2184, 'Latin'), + (0x2185, 0x2188, 'Latin'), + (0x2189, 0x2189, 'Common'), + (0x218A, 0x218B, 'Common'), + (0x2190, 0x2194, 'Common'), + (0x2195, 0x2199, 'Common'), + (0x219A, 0x219B, 'Common'), + (0x219C, 0x219F, 'Common'), + (0x21A0, 0x21A0, 'Common'), + (0x21A1, 0x21A2, 'Common'), + (0x21A3, 0x21A3, 'Common'), + (0x21A4, 0x21A5, 'Common'), + (0x21A6, 0x21A6, 'Common'), + (0x21A7, 0x21AD, 'Common'), + (0x21AE, 0x21AE, 'Common'), + (0x21AF, 0x21CD, 'Common'), + (0x21CE, 0x21CF, 'Common'), + (0x21D0, 0x21D1, 'Common'), + (0x21D2, 0x21D2, 'Common'), + (0x21D3, 0x21D3, 'Common'), + (0x21D4, 0x21D4, 'Common'), + (0x21D5, 0x21F3, 'Common'), + (0x21F4, 0x22FF, 'Common'), + (0x2300, 0x2307, 'Common'), + (0x2308, 0x2308, 'Common'), + (0x2309, 0x2309, 'Common'), + (0x230A, 0x230A, 'Common'), + (0x230B, 0x230B, 'Common'), + (0x230C, 0x231F, 'Common'), + (0x2320, 0x2321, 'Common'), + (0x2322, 0x2328, 'Common'), + (0x2329, 0x2329, 'Common'), + (0x232A, 0x232A, 'Common'), + (0x232B, 0x237B, 'Common'), + (0x237C, 0x237C, 'Common'), + (0x237D, 0x239A, 'Common'), + (0x239B, 0x23B3, 'Common'), + (0x23B4, 0x23DB, 'Common'), + (0x23DC, 0x23E1, 'Common'), + (0x23E2, 0x2426, 'Common'), + (0x2440, 0x244A, 'Common'), + (0x2460, 0x249B, 'Common'), + (0x249C, 0x24E9, 'Common'), + (0x24EA, 0x24FF, 'Common'), + (0x2500, 0x25B6, 'Common'), + (0x25B7, 0x25B7, 'Common'), + (0x25B8, 0x25C0, 'Common'), + (0x25C1, 0x25C1, 'Common'), + (0x25C2, 0x25F7, 'Common'), + (0x25F8, 0x25FF, 'Common'), + (0x2600, 0x266E, 'Common'), + (0x266F, 0x266F, 'Common'), + (0x2670, 0x2767, 'Common'), + (0x2768, 0x2768, 'Common'), + (0x2769, 0x2769, 'Common'), + (0x276A, 0x276A, 'Common'), + (0x276B, 0x276B, 'Common'), + (0x276C, 0x276C, 'Common'), + (0x276D, 0x276D, 'Common'), + (0x276E, 0x276E, 'Common'), + (0x276F, 0x276F, 'Common'), + (0x2770, 0x2770, 'Common'), + (0x2771, 0x2771, 'Common'), + (0x2772, 0x2772, 'Common'), + (0x2773, 0x2773, 'Common'), + (0x2774, 0x2774, 'Common'), + (0x2775, 0x2775, 'Common'), + (0x2776, 0x2793, 'Common'), + (0x2794, 0x27BF, 'Common'), + (0x27C0, 0x27C4, 'Common'), + (0x27C5, 0x27C5, 'Common'), + (0x27C6, 0x27C6, 'Common'), + (0x27C7, 0x27E5, 'Common'), + (0x27E6, 0x27E6, 'Common'), + (0x27E7, 0x27E7, 'Common'), + (0x27E8, 0x27E8, 'Common'), + (0x27E9, 0x27E9, 'Common'), + (0x27EA, 0x27EA, 'Common'), + (0x27EB, 0x27EB, 'Common'), + (0x27EC, 0x27EC, 'Common'), + (0x27ED, 0x27ED, 'Common'), + (0x27EE, 0x27EE, 'Common'), + (0x27EF, 0x27EF, 'Common'), + (0x27F0, 0x27FF, 'Common'), + (0x2800, 0x28FF, 'Braille'), + (0x2900, 0x2982, 'Common'), + (0x2983, 0x2983, 'Common'), + (0x2984, 0x2984, 'Common'), + (0x2985, 0x2985, 'Common'), + (0x2986, 0x2986, 'Common'), + (0x2987, 0x2987, 'Common'), + (0x2988, 0x2988, 'Common'), + (0x2989, 0x2989, 'Common'), + (0x298A, 0x298A, 'Common'), + (0x298B, 0x298B, 'Common'), + (0x298C, 0x298C, 'Common'), + (0x298D, 0x298D, 'Common'), + (0x298E, 0x298E, 'Common'), + (0x298F, 0x298F, 'Common'), + (0x2990, 0x2990, 'Common'), + (0x2991, 0x2991, 'Common'), + (0x2992, 0x2992, 'Common'), + (0x2993, 0x2993, 'Common'), + (0x2994, 0x2994, 'Common'), + (0x2995, 0x2995, 'Common'), + (0x2996, 0x2996, 'Common'), + (0x2997, 0x2997, 'Common'), + (0x2998, 0x2998, 'Common'), + (0x2999, 0x29D7, 'Common'), + (0x29D8, 0x29D8, 'Common'), + (0x29D9, 0x29D9, 'Common'), + (0x29DA, 0x29DA, 'Common'), + (0x29DB, 0x29DB, 'Common'), + (0x29DC, 0x29FB, 'Common'), + (0x29FC, 0x29FC, 'Common'), + (0x29FD, 0x29FD, 'Common'), + (0x29FE, 0x2AFF, 'Common'), + (0x2B00, 0x2B2F, 'Common'), + (0x2B30, 0x2B44, 'Common'), + (0x2B45, 0x2B46, 'Common'), + (0x2B47, 0x2B4C, 'Common'), + (0x2B4D, 0x2B73, 'Common'), + (0x2B76, 0x2B95, 'Common'), + (0x2B98, 0x2BB9, 'Common'), + (0x2BBD, 0x2BC8, 'Common'), + (0x2BCA, 0x2BD2, 'Common'), + (0x2BEC, 0x2BEF, 'Common'), + (0x2C00, 0x2C2E, 'Glagolitic'), + (0x2C30, 0x2C5E, 'Glagolitic'), + (0x2C60, 0x2C7B, 'Latin'), + (0x2C7C, 0x2C7D, 'Latin'), + (0x2C7E, 0x2C7F, 'Latin'), + (0x2C80, 0x2CE4, 'Coptic'), + (0x2CE5, 0x2CEA, 'Coptic'), + (0x2CEB, 0x2CEE, 'Coptic'), + (0x2CEF, 0x2CF1, 'Coptic'), + (0x2CF2, 0x2CF3, 'Coptic'), + (0x2CF9, 0x2CFC, 'Coptic'), + (0x2CFD, 0x2CFD, 'Coptic'), + (0x2CFE, 0x2CFF, 'Coptic'), + (0x2D00, 0x2D25, 'Georgian'), + (0x2D27, 0x2D27, 'Georgian'), + (0x2D2D, 0x2D2D, 'Georgian'), + (0x2D30, 0x2D67, 'Tifinagh'), + (0x2D6F, 0x2D6F, 'Tifinagh'), + (0x2D70, 0x2D70, 'Tifinagh'), + (0x2D7F, 0x2D7F, 'Tifinagh'), + (0x2D80, 0x2D96, 'Ethiopic'), + (0x2DA0, 0x2DA6, 'Ethiopic'), + (0x2DA8, 0x2DAE, 'Ethiopic'), + (0x2DB0, 0x2DB6, 'Ethiopic'), + (0x2DB8, 0x2DBE, 'Ethiopic'), + (0x2DC0, 0x2DC6, 'Ethiopic'), + (0x2DC8, 0x2DCE, 'Ethiopic'), + (0x2DD0, 0x2DD6, 'Ethiopic'), + (0x2DD8, 0x2DDE, 'Ethiopic'), + (0x2DE0, 0x2DFF, 'Cyrillic'), + (0x2E00, 0x2E01, 'Common'), + (0x2E02, 0x2E02, 'Common'), + (0x2E03, 0x2E03, 'Common'), + (0x2E04, 0x2E04, 'Common'), + (0x2E05, 0x2E05, 'Common'), + (0x2E06, 0x2E08, 'Common'), + (0x2E09, 0x2E09, 'Common'), + (0x2E0A, 0x2E0A, 'Common'), + (0x2E0B, 0x2E0B, 'Common'), + (0x2E0C, 0x2E0C, 'Common'), + (0x2E0D, 0x2E0D, 'Common'), + (0x2E0E, 0x2E16, 'Common'), + (0x2E17, 0x2E17, 'Common'), + (0x2E18, 0x2E19, 'Common'), + (0x2E1A, 0x2E1A, 'Common'), + (0x2E1B, 0x2E1B, 'Common'), + (0x2E1C, 0x2E1C, 'Common'), + (0x2E1D, 0x2E1D, 'Common'), + (0x2E1E, 0x2E1F, 'Common'), + (0x2E20, 0x2E20, 'Common'), + (0x2E21, 0x2E21, 'Common'), + (0x2E22, 0x2E22, 'Common'), + (0x2E23, 0x2E23, 'Common'), + (0x2E24, 0x2E24, 'Common'), + (0x2E25, 0x2E25, 'Common'), + (0x2E26, 0x2E26, 'Common'), + (0x2E27, 0x2E27, 'Common'), + (0x2E28, 0x2E28, 'Common'), + (0x2E29, 0x2E29, 'Common'), + (0x2E2A, 0x2E2E, 'Common'), + (0x2E2F, 0x2E2F, 'Common'), + (0x2E30, 0x2E39, 'Common'), + (0x2E3A, 0x2E3B, 'Common'), + (0x2E3C, 0x2E3F, 'Common'), + (0x2E40, 0x2E40, 'Common'), + (0x2E41, 0x2E41, 'Common'), + (0x2E42, 0x2E42, 'Common'), + (0x2E43, 0x2E49, 'Common'), + (0x2E80, 0x2E99, 'Han'), + (0x2E9B, 0x2EF3, 'Han'), + (0x2F00, 0x2FD5, 'Han'), + (0x2FF0, 0x2FFB, 'Common'), + (0x3000, 0x3000, 'Common'), + (0x3001, 0x3003, 'Common'), + (0x3004, 0x3004, 'Common'), + (0x3005, 0x3005, 'Han'), + (0x3006, 0x3006, 'Common'), + (0x3007, 0x3007, 'Han'), + (0x3008, 0x3008, 'Common'), + (0x3009, 0x3009, 'Common'), + (0x300A, 0x300A, 'Common'), + (0x300B, 0x300B, 'Common'), + (0x300C, 0x300C, 'Common'), + (0x300D, 0x300D, 'Common'), + (0x300E, 0x300E, 'Common'), + (0x300F, 0x300F, 'Common'), + (0x3010, 0x3010, 'Common'), + (0x3011, 0x3011, 'Common'), + (0x3012, 0x3013, 'Common'), + (0x3014, 0x3014, 'Common'), + (0x3015, 0x3015, 'Common'), + (0x3016, 0x3016, 'Common'), + (0x3017, 0x3017, 'Common'), + (0x3018, 0x3018, 'Common'), + (0x3019, 0x3019, 'Common'), + (0x301A, 0x301A, 'Common'), + (0x301B, 0x301B, 'Common'), + (0x301C, 0x301C, 'Common'), + (0x301D, 0x301D, 'Common'), + (0x301E, 0x301F, 'Common'), + (0x3020, 0x3020, 'Common'), + (0x3021, 0x3029, 'Han'), + (0x302A, 0x302D, 'Inherited'), + (0x302E, 0x302F, 'Hangul'), + (0x3030, 0x3030, 'Common'), + (0x3031, 0x3035, 'Common'), + (0x3036, 0x3037, 'Common'), + (0x3038, 0x303A, 'Han'), + (0x303B, 0x303B, 'Han'), + (0x303C, 0x303C, 'Common'), + (0x303D, 0x303D, 'Common'), + (0x303E, 0x303F, 'Common'), + (0x3041, 0x3096, 'Hiragana'), + (0x3099, 0x309A, 'Inherited'), + (0x309B, 0x309C, 'Common'), + (0x309D, 0x309E, 'Hiragana'), + (0x309F, 0x309F, 'Hiragana'), + (0x30A0, 0x30A0, 'Common'), + (0x30A1, 0x30FA, 'Katakana'), + (0x30FB, 0x30FB, 'Common'), + (0x30FC, 0x30FC, 'Common'), + (0x30FD, 0x30FE, 'Katakana'), + (0x30FF, 0x30FF, 'Katakana'), + (0x3105, 0x312E, 'Bopomofo'), + (0x3131, 0x318E, 'Hangul'), + (0x3190, 0x3191, 'Common'), + (0x3192, 0x3195, 'Common'), + (0x3196, 0x319F, 'Common'), + (0x31A0, 0x31BA, 'Bopomofo'), + (0x31C0, 0x31E3, 'Common'), + (0x31F0, 0x31FF, 'Katakana'), + (0x3200, 0x321E, 'Hangul'), + (0x3220, 0x3229, 'Common'), + (0x322A, 0x3247, 'Common'), + (0x3248, 0x324F, 'Common'), + (0x3250, 0x3250, 'Common'), + (0x3251, 0x325F, 'Common'), + (0x3260, 0x327E, 'Hangul'), + (0x327F, 0x327F, 'Common'), + (0x3280, 0x3289, 'Common'), + (0x328A, 0x32B0, 'Common'), + (0x32B1, 0x32BF, 'Common'), + (0x32C0, 0x32CF, 'Common'), + (0x32D0, 0x32FE, 'Katakana'), + (0x3300, 0x3357, 'Katakana'), + (0x3358, 0x33FF, 'Common'), + (0x3400, 0x4DB5, 'Han'), + (0x4DC0, 0x4DFF, 'Common'), + (0x4E00, 0x9FEA, 'Han'), + (0xA000, 0xA014, 'Yi'), + (0xA015, 0xA015, 'Yi'), + (0xA016, 0xA48C, 'Yi'), + (0xA490, 0xA4C6, 'Yi'), + (0xA4D0, 0xA4F7, 'Lisu'), + (0xA4F8, 0xA4FD, 'Lisu'), + (0xA4FE, 0xA4FF, 'Lisu'), + (0xA500, 0xA60B, 'Vai'), + (0xA60C, 0xA60C, 'Vai'), + (0xA60D, 0xA60F, 'Vai'), + (0xA610, 0xA61F, 'Vai'), + (0xA620, 0xA629, 'Vai'), + (0xA62A, 0xA62B, 'Vai'), + (0xA640, 0xA66D, 'Cyrillic'), + (0xA66E, 0xA66E, 'Cyrillic'), + (0xA66F, 0xA66F, 'Cyrillic'), + (0xA670, 0xA672, 'Cyrillic'), + (0xA673, 0xA673, 'Cyrillic'), + (0xA674, 0xA67D, 'Cyrillic'), + (0xA67E, 0xA67E, 'Cyrillic'), + (0xA67F, 0xA67F, 'Cyrillic'), + (0xA680, 0xA69B, 'Cyrillic'), + (0xA69C, 0xA69D, 'Cyrillic'), + (0xA69E, 0xA69F, 'Cyrillic'), + (0xA6A0, 0xA6E5, 'Bamum'), + (0xA6E6, 0xA6EF, 'Bamum'), + (0xA6F0, 0xA6F1, 'Bamum'), + (0xA6F2, 0xA6F7, 'Bamum'), + (0xA700, 0xA716, 'Common'), + (0xA717, 0xA71F, 'Common'), + (0xA720, 0xA721, 'Common'), + (0xA722, 0xA76F, 'Latin'), + (0xA770, 0xA770, 'Latin'), + (0xA771, 0xA787, 'Latin'), + (0xA788, 0xA788, 'Common'), + (0xA789, 0xA78A, 'Common'), + (0xA78B, 0xA78E, 'Latin'), + (0xA78F, 0xA78F, 'Latin'), + (0xA790, 0xA7AE, 'Latin'), + (0xA7B0, 0xA7B7, 'Latin'), + (0xA7F7, 0xA7F7, 'Latin'), + (0xA7F8, 0xA7F9, 'Latin'), + (0xA7FA, 0xA7FA, 'Latin'), + (0xA7FB, 0xA7FF, 'Latin'), + (0xA800, 0xA801, 'Syloti_Nagri'), + (0xA802, 0xA802, 'Syloti_Nagri'), + (0xA803, 0xA805, 'Syloti_Nagri'), + (0xA806, 0xA806, 'Syloti_Nagri'), + (0xA807, 0xA80A, 'Syloti_Nagri'), + (0xA80B, 0xA80B, 'Syloti_Nagri'), + (0xA80C, 0xA822, 'Syloti_Nagri'), + (0xA823, 0xA824, 'Syloti_Nagri'), + (0xA825, 0xA826, 'Syloti_Nagri'), + (0xA827, 0xA827, 'Syloti_Nagri'), + (0xA828, 0xA82B, 'Syloti_Nagri'), + (0xA830, 0xA835, 'Common'), + (0xA836, 0xA837, 'Common'), + (0xA838, 0xA838, 'Common'), + (0xA839, 0xA839, 'Common'), + (0xA840, 0xA873, 'Phags_Pa'), + (0xA874, 0xA877, 'Phags_Pa'), + (0xA880, 0xA881, 'Saurashtra'), + (0xA882, 0xA8B3, 'Saurashtra'), + (0xA8B4, 0xA8C3, 'Saurashtra'), + (0xA8C4, 0xA8C5, 'Saurashtra'), + (0xA8CE, 0xA8CF, 'Saurashtra'), + (0xA8D0, 0xA8D9, 'Saurashtra'), + (0xA8E0, 0xA8F1, 'Devanagari'), + (0xA8F2, 0xA8F7, 'Devanagari'), + (0xA8F8, 0xA8FA, 'Devanagari'), + (0xA8FB, 0xA8FB, 'Devanagari'), + (0xA8FC, 0xA8FC, 'Devanagari'), + (0xA8FD, 0xA8FD, 'Devanagari'), + (0xA900, 0xA909, 'Kayah_Li'), + (0xA90A, 0xA925, 'Kayah_Li'), + (0xA926, 0xA92D, 'Kayah_Li'), + (0xA92E, 0xA92E, 'Common'), + (0xA92F, 0xA92F, 'Kayah_Li'), + (0xA930, 0xA946, 'Rejang'), + (0xA947, 0xA951, 'Rejang'), + (0xA952, 0xA953, 'Rejang'), + (0xA95F, 0xA95F, 'Rejang'), + (0xA960, 0xA97C, 'Hangul'), + (0xA980, 0xA982, 'Javanese'), + (0xA983, 0xA983, 'Javanese'), + (0xA984, 0xA9B2, 'Javanese'), + (0xA9B3, 0xA9B3, 'Javanese'), + (0xA9B4, 0xA9B5, 'Javanese'), + (0xA9B6, 0xA9B9, 'Javanese'), + (0xA9BA, 0xA9BB, 'Javanese'), + (0xA9BC, 0xA9BC, 'Javanese'), + (0xA9BD, 0xA9C0, 'Javanese'), + (0xA9C1, 0xA9CD, 'Javanese'), + (0xA9CF, 0xA9CF, 'Common'), + (0xA9D0, 0xA9D9, 'Javanese'), + (0xA9DE, 0xA9DF, 'Javanese'), + (0xA9E0, 0xA9E4, 'Myanmar'), + (0xA9E5, 0xA9E5, 'Myanmar'), + (0xA9E6, 0xA9E6, 'Myanmar'), + (0xA9E7, 0xA9EF, 'Myanmar'), + (0xA9F0, 0xA9F9, 'Myanmar'), + (0xA9FA, 0xA9FE, 'Myanmar'), + (0xAA00, 0xAA28, 'Cham'), + (0xAA29, 0xAA2E, 'Cham'), + (0xAA2F, 0xAA30, 'Cham'), + (0xAA31, 0xAA32, 'Cham'), + (0xAA33, 0xAA34, 'Cham'), + (0xAA35, 0xAA36, 'Cham'), + (0xAA40, 0xAA42, 'Cham'), + (0xAA43, 0xAA43, 'Cham'), + (0xAA44, 0xAA4B, 'Cham'), + (0xAA4C, 0xAA4C, 'Cham'), + (0xAA4D, 0xAA4D, 'Cham'), + (0xAA50, 0xAA59, 'Cham'), + (0xAA5C, 0xAA5F, 'Cham'), + (0xAA60, 0xAA6F, 'Myanmar'), + (0xAA70, 0xAA70, 'Myanmar'), + (0xAA71, 0xAA76, 'Myanmar'), + (0xAA77, 0xAA79, 'Myanmar'), + (0xAA7A, 0xAA7A, 'Myanmar'), + (0xAA7B, 0xAA7B, 'Myanmar'), + (0xAA7C, 0xAA7C, 'Myanmar'), + (0xAA7D, 0xAA7D, 'Myanmar'), + (0xAA7E, 0xAA7F, 'Myanmar'), + (0xAA80, 0xAAAF, 'Tai_Viet'), + (0xAAB0, 0xAAB0, 'Tai_Viet'), + (0xAAB1, 0xAAB1, 'Tai_Viet'), + (0xAAB2, 0xAAB4, 'Tai_Viet'), + (0xAAB5, 0xAAB6, 'Tai_Viet'), + (0xAAB7, 0xAAB8, 'Tai_Viet'), + (0xAAB9, 0xAABD, 'Tai_Viet'), + (0xAABE, 0xAABF, 'Tai_Viet'), + (0xAAC0, 0xAAC0, 'Tai_Viet'), + (0xAAC1, 0xAAC1, 'Tai_Viet'), + (0xAAC2, 0xAAC2, 'Tai_Viet'), + (0xAADB, 0xAADC, 'Tai_Viet'), + (0xAADD, 0xAADD, 'Tai_Viet'), + (0xAADE, 0xAADF, 'Tai_Viet'), + (0xAAE0, 0xAAEA, 'Meetei_Mayek'), + (0xAAEB, 0xAAEB, 'Meetei_Mayek'), + (0xAAEC, 0xAAED, 'Meetei_Mayek'), + (0xAAEE, 0xAAEF, 'Meetei_Mayek'), + (0xAAF0, 0xAAF1, 'Meetei_Mayek'), + (0xAAF2, 0xAAF2, 'Meetei_Mayek'), + (0xAAF3, 0xAAF4, 'Meetei_Mayek'), + (0xAAF5, 0xAAF5, 'Meetei_Mayek'), + (0xAAF6, 0xAAF6, 'Meetei_Mayek'), + (0xAB01, 0xAB06, 'Ethiopic'), + (0xAB09, 0xAB0E, 'Ethiopic'), + (0xAB11, 0xAB16, 'Ethiopic'), + (0xAB20, 0xAB26, 'Ethiopic'), + (0xAB28, 0xAB2E, 'Ethiopic'), + (0xAB30, 0xAB5A, 'Latin'), + (0xAB5B, 0xAB5B, 'Common'), + (0xAB5C, 0xAB5F, 'Latin'), + (0xAB60, 0xAB64, 'Latin'), + (0xAB65, 0xAB65, 'Greek'), + (0xAB70, 0xABBF, 'Cherokee'), + (0xABC0, 0xABE2, 'Meetei_Mayek'), + (0xABE3, 0xABE4, 'Meetei_Mayek'), + (0xABE5, 0xABE5, 'Meetei_Mayek'), + (0xABE6, 0xABE7, 'Meetei_Mayek'), + (0xABE8, 0xABE8, 'Meetei_Mayek'), + (0xABE9, 0xABEA, 'Meetei_Mayek'), + (0xABEB, 0xABEB, 'Meetei_Mayek'), + (0xABEC, 0xABEC, 'Meetei_Mayek'), + (0xABED, 0xABED, 'Meetei_Mayek'), + (0xABF0, 0xABF9, 'Meetei_Mayek'), + (0xAC00, 0xD7A3, 'Hangul'), + (0xD7B0, 0xD7C6, 'Hangul'), + (0xD7CB, 0xD7FB, 'Hangul'), + (0xF900, 0xFA6D, 'Han'), + (0xFA70, 0xFAD9, 'Han'), + (0xFB00, 0xFB06, 'Latin'), + (0xFB13, 0xFB17, 'Armenian'), + (0xFB1D, 0xFB1D, 'Hebrew'), + (0xFB1E, 0xFB1E, 'Hebrew'), + (0xFB1F, 0xFB28, 'Hebrew'), + (0xFB29, 0xFB29, 'Hebrew'), + (0xFB2A, 0xFB36, 'Hebrew'), + (0xFB38, 0xFB3C, 'Hebrew'), + (0xFB3E, 0xFB3E, 'Hebrew'), + (0xFB40, 0xFB41, 'Hebrew'), + (0xFB43, 0xFB44, 'Hebrew'), + (0xFB46, 0xFB4F, 'Hebrew'), + (0xFB50, 0xFBB1, 'Arabic'), + (0xFBB2, 0xFBC1, 'Arabic'), + (0xFBD3, 0xFD3D, 'Arabic'), + (0xFD3E, 0xFD3E, 'Common'), + (0xFD3F, 0xFD3F, 'Common'), + (0xFD50, 0xFD8F, 'Arabic'), + (0xFD92, 0xFDC7, 'Arabic'), + (0xFDF0, 0xFDFB, 'Arabic'), + (0xFDFC, 0xFDFC, 'Arabic'), + (0xFDFD, 0xFDFD, 'Arabic'), + (0xFE00, 0xFE0F, 'Inherited'), + (0xFE10, 0xFE16, 'Common'), + (0xFE17, 0xFE17, 'Common'), + (0xFE18, 0xFE18, 'Common'), + (0xFE19, 0xFE19, 'Common'), + (0xFE20, 0xFE2D, 'Inherited'), + (0xFE2E, 0xFE2F, 'Cyrillic'), + (0xFE30, 0xFE30, 'Common'), + (0xFE31, 0xFE32, 'Common'), + (0xFE33, 0xFE34, 'Common'), + (0xFE35, 0xFE35, 'Common'), + (0xFE36, 0xFE36, 'Common'), + (0xFE37, 0xFE37, 'Common'), + (0xFE38, 0xFE38, 'Common'), + (0xFE39, 0xFE39, 'Common'), + (0xFE3A, 0xFE3A, 'Common'), + (0xFE3B, 0xFE3B, 'Common'), + (0xFE3C, 0xFE3C, 'Common'), + (0xFE3D, 0xFE3D, 'Common'), + (0xFE3E, 0xFE3E, 'Common'), + (0xFE3F, 0xFE3F, 'Common'), + (0xFE40, 0xFE40, 'Common'), + (0xFE41, 0xFE41, 'Common'), + (0xFE42, 0xFE42, 'Common'), + (0xFE43, 0xFE43, 'Common'), + (0xFE44, 0xFE44, 'Common'), + (0xFE45, 0xFE46, 'Common'), + (0xFE47, 0xFE47, 'Common'), + (0xFE48, 0xFE48, 'Common'), + (0xFE49, 0xFE4C, 'Common'), + (0xFE4D, 0xFE4F, 'Common'), + (0xFE50, 0xFE52, 'Common'), + (0xFE54, 0xFE57, 'Common'), + (0xFE58, 0xFE58, 'Common'), + (0xFE59, 0xFE59, 'Common'), + (0xFE5A, 0xFE5A, 'Common'), + (0xFE5B, 0xFE5B, 'Common'), + (0xFE5C, 0xFE5C, 'Common'), + (0xFE5D, 0xFE5D, 'Common'), + (0xFE5E, 0xFE5E, 'Common'), + (0xFE5F, 0xFE61, 'Common'), + (0xFE62, 0xFE62, 'Common'), + (0xFE63, 0xFE63, 'Common'), + (0xFE64, 0xFE66, 'Common'), + (0xFE68, 0xFE68, 'Common'), + (0xFE69, 0xFE69, 'Common'), + (0xFE6A, 0xFE6B, 'Common'), + (0xFE70, 0xFE74, 'Arabic'), + (0xFE76, 0xFEFC, 'Arabic'), + (0xFEFF, 0xFEFF, 'Common'), + (0xFF01, 0xFF03, 'Common'), + (0xFF04, 0xFF04, 'Common'), + (0xFF05, 0xFF07, 'Common'), + (0xFF08, 0xFF08, 'Common'), + (0xFF09, 0xFF09, 'Common'), + (0xFF0A, 0xFF0A, 'Common'), + (0xFF0B, 0xFF0B, 'Common'), + (0xFF0C, 0xFF0C, 'Common'), + (0xFF0D, 0xFF0D, 'Common'), + (0xFF0E, 0xFF0F, 'Common'), + (0xFF10, 0xFF19, 'Common'), + (0xFF1A, 0xFF1B, 'Common'), + (0xFF1C, 0xFF1E, 'Common'), + (0xFF1F, 0xFF20, 'Common'), + (0xFF21, 0xFF3A, 'Latin'), + (0xFF3B, 0xFF3B, 'Common'), + (0xFF3C, 0xFF3C, 'Common'), + (0xFF3D, 0xFF3D, 'Common'), + (0xFF3E, 0xFF3E, 'Common'), + (0xFF3F, 0xFF3F, 'Common'), + (0xFF40, 0xFF40, 'Common'), + (0xFF41, 0xFF5A, 'Latin'), + (0xFF5B, 0xFF5B, 'Common'), + (0xFF5C, 0xFF5C, 'Common'), + (0xFF5D, 0xFF5D, 'Common'), + (0xFF5E, 0xFF5E, 'Common'), + (0xFF5F, 0xFF5F, 'Common'), + (0xFF60, 0xFF60, 'Common'), + (0xFF61, 0xFF61, 'Common'), + (0xFF62, 0xFF62, 'Common'), + (0xFF63, 0xFF63, 'Common'), + (0xFF64, 0xFF65, 'Common'), + (0xFF66, 0xFF6F, 'Katakana'), + (0xFF70, 0xFF70, 'Common'), + (0xFF71, 0xFF9D, 'Katakana'), + (0xFF9E, 0xFF9F, 'Common'), + (0xFFA0, 0xFFBE, 'Hangul'), + (0xFFC2, 0xFFC7, 'Hangul'), + (0xFFCA, 0xFFCF, 'Hangul'), + (0xFFD2, 0xFFD7, 'Hangul'), + (0xFFDA, 0xFFDC, 'Hangul'), + (0xFFE0, 0xFFE1, 'Common'), + (0xFFE2, 0xFFE2, 'Common'), + (0xFFE3, 0xFFE3, 'Common'), + (0xFFE4, 0xFFE4, 'Common'), + (0xFFE5, 0xFFE6, 'Common'), + (0xFFE8, 0xFFE8, 'Common'), + (0xFFE9, 0xFFEC, 'Common'), + (0xFFED, 0xFFEE, 'Common'), + (0xFFF9, 0xFFFB, 'Common'), + (0xFFFC, 0xFFFD, 'Common'), + (0x10000, 0x1000B, 'Linear_B'), + (0x1000D, 0x10026, 'Linear_B'), + (0x10028, 0x1003A, 'Linear_B'), + (0x1003C, 0x1003D, 'Linear_B'), + (0x1003F, 0x1004D, 'Linear_B'), + (0x10050, 0x1005D, 'Linear_B'), + (0x10080, 0x100FA, 'Linear_B'), + (0x10100, 0x10102, 'Common'), + (0x10107, 0x10133, 'Common'), + (0x10137, 0x1013F, 'Common'), + (0x10140, 0x10174, 'Greek'), + (0x10175, 0x10178, 'Greek'), + (0x10179, 0x10189, 'Greek'), + (0x1018A, 0x1018B, 'Greek'), + (0x1018C, 0x1018E, 'Greek'), + (0x10190, 0x1019B, 'Common'), + (0x101A0, 0x101A0, 'Greek'), + (0x101D0, 0x101FC, 'Common'), + (0x101FD, 0x101FD, 'Inherited'), + (0x10280, 0x1029C, 'Lycian'), + (0x102A0, 0x102D0, 'Carian'), + (0x102E0, 0x102E0, 'Inherited'), + (0x102E1, 0x102FB, 'Common'), + (0x10300, 0x1031F, 'Old_Italic'), + (0x10320, 0x10323, 'Old_Italic'), + (0x1032D, 0x1032F, 'Old_Italic'), + (0x10330, 0x10340, 'Gothic'), + (0x10341, 0x10341, 'Gothic'), + (0x10342, 0x10349, 'Gothic'), + (0x1034A, 0x1034A, 'Gothic'), + (0x10350, 0x10375, 'Old_Permic'), + (0x10376, 0x1037A, 'Old_Permic'), + (0x10380, 0x1039D, 'Ugaritic'), + (0x1039F, 0x1039F, 'Ugaritic'), + (0x103A0, 0x103C3, 'Old_Persian'), + (0x103C8, 0x103CF, 'Old_Persian'), + (0x103D0, 0x103D0, 'Old_Persian'), + (0x103D1, 0x103D5, 'Old_Persian'), + (0x10400, 0x1044F, 'Deseret'), + (0x10450, 0x1047F, 'Shavian'), + (0x10480, 0x1049D, 'Osmanya'), + (0x104A0, 0x104A9, 'Osmanya'), + (0x104B0, 0x104D3, 'Osage'), + (0x104D8, 0x104FB, 'Osage'), + (0x10500, 0x10527, 'Elbasan'), + (0x10530, 0x10563, 'Caucasian_Albanian'), + (0x1056F, 0x1056F, 'Caucasian_Albanian'), + (0x10600, 0x10736, 'Linear_A'), + (0x10740, 0x10755, 'Linear_A'), + (0x10760, 0x10767, 'Linear_A'), + (0x10800, 0x10805, 'Cypriot'), + (0x10808, 0x10808, 'Cypriot'), + (0x1080A, 0x10835, 'Cypriot'), + (0x10837, 0x10838, 'Cypriot'), + (0x1083C, 0x1083C, 'Cypriot'), + (0x1083F, 0x1083F, 'Cypriot'), + (0x10840, 0x10855, 'Imperial_Aramaic'), + (0x10857, 0x10857, 'Imperial_Aramaic'), + (0x10858, 0x1085F, 'Imperial_Aramaic'), + (0x10860, 0x10876, 'Palmyrene'), + (0x10877, 0x10878, 'Palmyrene'), + (0x10879, 0x1087F, 'Palmyrene'), + (0x10880, 0x1089E, 'Nabataean'), + (0x108A7, 0x108AF, 'Nabataean'), + (0x108E0, 0x108F2, 'Hatran'), + (0x108F4, 0x108F5, 'Hatran'), + (0x108FB, 0x108FF, 'Hatran'), + (0x10900, 0x10915, 'Phoenician'), + (0x10916, 0x1091B, 'Phoenician'), + (0x1091F, 0x1091F, 'Phoenician'), + (0x10920, 0x10939, 'Lydian'), + (0x1093F, 0x1093F, 'Lydian'), + (0x10980, 0x1099F, 'Meroitic_Hieroglyphs'), + (0x109A0, 0x109B7, 'Meroitic_Cursive'), + (0x109BC, 0x109BD, 'Meroitic_Cursive'), + (0x109BE, 0x109BF, 'Meroitic_Cursive'), + (0x109C0, 0x109CF, 'Meroitic_Cursive'), + (0x109D2, 0x109FF, 'Meroitic_Cursive'), + (0x10A00, 0x10A00, 'Kharoshthi'), + (0x10A01, 0x10A03, 'Kharoshthi'), + (0x10A05, 0x10A06, 'Kharoshthi'), + (0x10A0C, 0x10A0F, 'Kharoshthi'), + (0x10A10, 0x10A13, 'Kharoshthi'), + (0x10A15, 0x10A17, 'Kharoshthi'), + (0x10A19, 0x10A33, 'Kharoshthi'), + (0x10A38, 0x10A3A, 'Kharoshthi'), + (0x10A3F, 0x10A3F, 'Kharoshthi'), + (0x10A40, 0x10A47, 'Kharoshthi'), + (0x10A50, 0x10A58, 'Kharoshthi'), + (0x10A60, 0x10A7C, 'Old_South_Arabian'), + (0x10A7D, 0x10A7E, 'Old_South_Arabian'), + (0x10A7F, 0x10A7F, 'Old_South_Arabian'), + (0x10A80, 0x10A9C, 'Old_North_Arabian'), + (0x10A9D, 0x10A9F, 'Old_North_Arabian'), + (0x10AC0, 0x10AC7, 'Manichaean'), + (0x10AC8, 0x10AC8, 'Manichaean'), + (0x10AC9, 0x10AE4, 'Manichaean'), + (0x10AE5, 0x10AE6, 'Manichaean'), + (0x10AEB, 0x10AEF, 'Manichaean'), + (0x10AF0, 0x10AF6, 'Manichaean'), + (0x10B00, 0x10B35, 'Avestan'), + (0x10B39, 0x10B3F, 'Avestan'), + (0x10B40, 0x10B55, 'Inscriptional_Parthian'), + (0x10B58, 0x10B5F, 'Inscriptional_Parthian'), + (0x10B60, 0x10B72, 'Inscriptional_Pahlavi'), + (0x10B78, 0x10B7F, 'Inscriptional_Pahlavi'), + (0x10B80, 0x10B91, 'Psalter_Pahlavi'), + (0x10B99, 0x10B9C, 'Psalter_Pahlavi'), + (0x10BA9, 0x10BAF, 'Psalter_Pahlavi'), + (0x10C00, 0x10C48, 'Old_Turkic'), + (0x10C80, 0x10CB2, 'Old_Hungarian'), + (0x10CC0, 0x10CF2, 'Old_Hungarian'), + (0x10CFA, 0x10CFF, 'Old_Hungarian'), + (0x10E60, 0x10E7E, 'Arabic'), + (0x11000, 0x11000, 'Brahmi'), + (0x11001, 0x11001, 'Brahmi'), + (0x11002, 0x11002, 'Brahmi'), + (0x11003, 0x11037, 'Brahmi'), + (0x11038, 0x11046, 'Brahmi'), + (0x11047, 0x1104D, 'Brahmi'), + (0x11052, 0x11065, 'Brahmi'), + (0x11066, 0x1106F, 'Brahmi'), + (0x1107F, 0x1107F, 'Brahmi'), + (0x11080, 0x11081, 'Kaithi'), + (0x11082, 0x11082, 'Kaithi'), + (0x11083, 0x110AF, 'Kaithi'), + (0x110B0, 0x110B2, 'Kaithi'), + (0x110B3, 0x110B6, 'Kaithi'), + (0x110B7, 0x110B8, 'Kaithi'), + (0x110B9, 0x110BA, 'Kaithi'), + (0x110BB, 0x110BC, 'Kaithi'), + (0x110BD, 0x110BD, 'Kaithi'), + (0x110BE, 0x110C1, 'Kaithi'), + (0x110D0, 0x110E8, 'Sora_Sompeng'), + (0x110F0, 0x110F9, 'Sora_Sompeng'), + (0x11100, 0x11102, 'Chakma'), + (0x11103, 0x11126, 'Chakma'), + (0x11127, 0x1112B, 'Chakma'), + (0x1112C, 0x1112C, 'Chakma'), + (0x1112D, 0x11134, 'Chakma'), + (0x11136, 0x1113F, 'Chakma'), + (0x11140, 0x11143, 'Chakma'), + (0x11150, 0x11172, 'Mahajani'), + (0x11173, 0x11173, 'Mahajani'), + (0x11174, 0x11175, 'Mahajani'), + (0x11176, 0x11176, 'Mahajani'), + (0x11180, 0x11181, 'Sharada'), + (0x11182, 0x11182, 'Sharada'), + (0x11183, 0x111B2, 'Sharada'), + (0x111B3, 0x111B5, 'Sharada'), + (0x111B6, 0x111BE, 'Sharada'), + (0x111BF, 0x111C0, 'Sharada'), + (0x111C1, 0x111C4, 'Sharada'), + (0x111C5, 0x111C9, 'Sharada'), + (0x111CA, 0x111CC, 'Sharada'), + (0x111CD, 0x111CD, 'Sharada'), + (0x111D0, 0x111D9, 'Sharada'), + (0x111DA, 0x111DA, 'Sharada'), + (0x111DB, 0x111DB, 'Sharada'), + (0x111DC, 0x111DC, 'Sharada'), + (0x111DD, 0x111DF, 'Sharada'), + (0x111E1, 0x111F4, 'Sinhala'), + (0x11200, 0x11211, 'Khojki'), + (0x11213, 0x1122B, 'Khojki'), + (0x1122C, 0x1122E, 'Khojki'), + (0x1122F, 0x11231, 'Khojki'), + (0x11232, 0x11233, 'Khojki'), + (0x11234, 0x11234, 'Khojki'), + (0x11235, 0x11235, 'Khojki'), + (0x11236, 0x11237, 'Khojki'), + (0x11238, 0x1123D, 'Khojki'), + (0x1123E, 0x1123E, 'Khojki'), + (0x11280, 0x11286, 'Multani'), + (0x11288, 0x11288, 'Multani'), + (0x1128A, 0x1128D, 'Multani'), + (0x1128F, 0x1129D, 'Multani'), + (0x1129F, 0x112A8, 'Multani'), + (0x112A9, 0x112A9, 'Multani'), + (0x112B0, 0x112DE, 'Khudawadi'), + (0x112DF, 0x112DF, 'Khudawadi'), + (0x112E0, 0x112E2, 'Khudawadi'), + (0x112E3, 0x112EA, 'Khudawadi'), + (0x112F0, 0x112F9, 'Khudawadi'), + (0x11300, 0x11301, 'Grantha'), + (0x11302, 0x11303, 'Grantha'), + (0x11305, 0x1130C, 'Grantha'), + (0x1130F, 0x11310, 'Grantha'), + (0x11313, 0x11328, 'Grantha'), + (0x1132A, 0x11330, 'Grantha'), + (0x11332, 0x11333, 'Grantha'), + (0x11335, 0x11339, 'Grantha'), + (0x1133C, 0x1133C, 'Grantha'), + (0x1133D, 0x1133D, 'Grantha'), + (0x1133E, 0x1133F, 'Grantha'), + (0x11340, 0x11340, 'Grantha'), + (0x11341, 0x11344, 'Grantha'), + (0x11347, 0x11348, 'Grantha'), + (0x1134B, 0x1134D, 'Grantha'), + (0x11350, 0x11350, 'Grantha'), + (0x11357, 0x11357, 'Grantha'), + (0x1135D, 0x11361, 'Grantha'), + (0x11362, 0x11363, 'Grantha'), + (0x11366, 0x1136C, 'Grantha'), + (0x11370, 0x11374, 'Grantha'), + (0x11400, 0x11434, 'Newa'), + (0x11435, 0x11437, 'Newa'), + (0x11438, 0x1143F, 'Newa'), + (0x11440, 0x11441, 'Newa'), + (0x11442, 0x11444, 'Newa'), + (0x11445, 0x11445, 'Newa'), + (0x11446, 0x11446, 'Newa'), + (0x11447, 0x1144A, 'Newa'), + (0x1144B, 0x1144F, 'Newa'), + (0x11450, 0x11459, 'Newa'), + (0x1145B, 0x1145B, 'Newa'), + (0x1145D, 0x1145D, 'Newa'), + (0x11480, 0x114AF, 'Tirhuta'), + (0x114B0, 0x114B2, 'Tirhuta'), + (0x114B3, 0x114B8, 'Tirhuta'), + (0x114B9, 0x114B9, 'Tirhuta'), + (0x114BA, 0x114BA, 'Tirhuta'), + (0x114BB, 0x114BE, 'Tirhuta'), + (0x114BF, 0x114C0, 'Tirhuta'), + (0x114C1, 0x114C1, 'Tirhuta'), + (0x114C2, 0x114C3, 'Tirhuta'), + (0x114C4, 0x114C5, 'Tirhuta'), + (0x114C6, 0x114C6, 'Tirhuta'), + (0x114C7, 0x114C7, 'Tirhuta'), + (0x114D0, 0x114D9, 'Tirhuta'), + (0x11580, 0x115AE, 'Siddham'), + (0x115AF, 0x115B1, 'Siddham'), + (0x115B2, 0x115B5, 'Siddham'), + (0x115B8, 0x115BB, 'Siddham'), + (0x115BC, 0x115BD, 'Siddham'), + (0x115BE, 0x115BE, 'Siddham'), + (0x115BF, 0x115C0, 'Siddham'), + (0x115C1, 0x115D7, 'Siddham'), + (0x115D8, 0x115DB, 'Siddham'), + (0x115DC, 0x115DD, 'Siddham'), + (0x11600, 0x1162F, 'Modi'), + (0x11630, 0x11632, 'Modi'), + (0x11633, 0x1163A, 'Modi'), + (0x1163B, 0x1163C, 'Modi'), + (0x1163D, 0x1163D, 'Modi'), + (0x1163E, 0x1163E, 'Modi'), + (0x1163F, 0x11640, 'Modi'), + (0x11641, 0x11643, 'Modi'), + (0x11644, 0x11644, 'Modi'), + (0x11650, 0x11659, 'Modi'), + (0x11660, 0x1166C, 'Mongolian'), + (0x11680, 0x116AA, 'Takri'), + (0x116AB, 0x116AB, 'Takri'), + (0x116AC, 0x116AC, 'Takri'), + (0x116AD, 0x116AD, 'Takri'), + (0x116AE, 0x116AF, 'Takri'), + (0x116B0, 0x116B5, 'Takri'), + (0x116B6, 0x116B6, 'Takri'), + (0x116B7, 0x116B7, 'Takri'), + (0x116C0, 0x116C9, 'Takri'), + (0x11700, 0x11719, 'Ahom'), + (0x1171D, 0x1171F, 'Ahom'), + (0x11720, 0x11721, 'Ahom'), + (0x11722, 0x11725, 'Ahom'), + (0x11726, 0x11726, 'Ahom'), + (0x11727, 0x1172B, 'Ahom'), + (0x11730, 0x11739, 'Ahom'), + (0x1173A, 0x1173B, 'Ahom'), + (0x1173C, 0x1173E, 'Ahom'), + (0x1173F, 0x1173F, 'Ahom'), + (0x118A0, 0x118DF, 'Warang_Citi'), + (0x118E0, 0x118E9, 'Warang_Citi'), + (0x118EA, 0x118F2, 'Warang_Citi'), + (0x118FF, 0x118FF, 'Warang_Citi'), + (0x11A00, 0x11A00, 'Zanabazar_Square'), + (0x11A01, 0x11A06, 'Zanabazar_Square'), + (0x11A07, 0x11A08, 'Zanabazar_Square'), + (0x11A09, 0x11A0A, 'Zanabazar_Square'), + (0x11A0B, 0x11A32, 'Zanabazar_Square'), + (0x11A33, 0x11A38, 'Zanabazar_Square'), + (0x11A39, 0x11A39, 'Zanabazar_Square'), + (0x11A3A, 0x11A3A, 'Zanabazar_Square'), + (0x11A3B, 0x11A3E, 'Zanabazar_Square'), + (0x11A3F, 0x11A46, 'Zanabazar_Square'), + (0x11A47, 0x11A47, 'Zanabazar_Square'), + (0x11A50, 0x11A50, 'Soyombo'), + (0x11A51, 0x11A56, 'Soyombo'), + (0x11A57, 0x11A58, 'Soyombo'), + (0x11A59, 0x11A5B, 'Soyombo'), + (0x11A5C, 0x11A83, 'Soyombo'), + (0x11A86, 0x11A89, 'Soyombo'), + (0x11A8A, 0x11A96, 'Soyombo'), + (0x11A97, 0x11A97, 'Soyombo'), + (0x11A98, 0x11A99, 'Soyombo'), + (0x11A9A, 0x11A9C, 'Soyombo'), + (0x11A9E, 0x11AA2, 'Soyombo'), + (0x11AC0, 0x11AF8, 'Pau_Cin_Hau'), + (0x11C00, 0x11C08, 'Bhaiksuki'), + (0x11C0A, 0x11C2E, 'Bhaiksuki'), + (0x11C2F, 0x11C2F, 'Bhaiksuki'), + (0x11C30, 0x11C36, 'Bhaiksuki'), + (0x11C38, 0x11C3D, 'Bhaiksuki'), + (0x11C3E, 0x11C3E, 'Bhaiksuki'), + (0x11C3F, 0x11C3F, 'Bhaiksuki'), + (0x11C40, 0x11C40, 'Bhaiksuki'), + (0x11C41, 0x11C45, 'Bhaiksuki'), + (0x11C50, 0x11C59, 'Bhaiksuki'), + (0x11C5A, 0x11C6C, 'Bhaiksuki'), + (0x11C70, 0x11C71, 'Marchen'), + (0x11C72, 0x11C8F, 'Marchen'), + (0x11C92, 0x11CA7, 'Marchen'), + (0x11CA9, 0x11CA9, 'Marchen'), + (0x11CAA, 0x11CB0, 'Marchen'), + (0x11CB1, 0x11CB1, 'Marchen'), + (0x11CB2, 0x11CB3, 'Marchen'), + (0x11CB4, 0x11CB4, 'Marchen'), + (0x11CB5, 0x11CB6, 'Marchen'), + (0x11D00, 0x11D06, 'Masaram_Gondi'), + (0x11D08, 0x11D09, 'Masaram_Gondi'), + (0x11D0B, 0x11D30, 'Masaram_Gondi'), + (0x11D31, 0x11D36, 'Masaram_Gondi'), + (0x11D3A, 0x11D3A, 'Masaram_Gondi'), + (0x11D3C, 0x11D3D, 'Masaram_Gondi'), + (0x11D3F, 0x11D45, 'Masaram_Gondi'), + (0x11D46, 0x11D46, 'Masaram_Gondi'), + (0x11D47, 0x11D47, 'Masaram_Gondi'), + (0x11D50, 0x11D59, 'Masaram_Gondi'), + (0x12000, 0x12399, 'Cuneiform'), + (0x12400, 0x1246E, 'Cuneiform'), + (0x12470, 0x12474, 'Cuneiform'), + (0x12480, 0x12543, 'Cuneiform'), + (0x13000, 0x1342E, 'Egyptian_Hieroglyphs'), + (0x14400, 0x14646, 'Anatolian_Hieroglyphs'), + (0x16800, 0x16A38, 'Bamum'), + (0x16A40, 0x16A5E, 'Mro'), + (0x16A60, 0x16A69, 'Mro'), + (0x16A6E, 0x16A6F, 'Mro'), + (0x16AD0, 0x16AED, 'Bassa_Vah'), + (0x16AF0, 0x16AF4, 'Bassa_Vah'), + (0x16AF5, 0x16AF5, 'Bassa_Vah'), + (0x16B00, 0x16B2F, 'Pahawh_Hmong'), + (0x16B30, 0x16B36, 'Pahawh_Hmong'), + (0x16B37, 0x16B3B, 'Pahawh_Hmong'), + (0x16B3C, 0x16B3F, 'Pahawh_Hmong'), + (0x16B40, 0x16B43, 'Pahawh_Hmong'), + (0x16B44, 0x16B44, 'Pahawh_Hmong'), + (0x16B45, 0x16B45, 'Pahawh_Hmong'), + (0x16B50, 0x16B59, 'Pahawh_Hmong'), + (0x16B5B, 0x16B61, 'Pahawh_Hmong'), + (0x16B63, 0x16B77, 'Pahawh_Hmong'), + (0x16B7D, 0x16B8F, 'Pahawh_Hmong'), + (0x16F00, 0x16F44, 'Miao'), + (0x16F50, 0x16F50, 'Miao'), + (0x16F51, 0x16F7E, 'Miao'), + (0x16F8F, 0x16F92, 'Miao'), + (0x16F93, 0x16F9F, 'Miao'), + (0x16FE0, 0x16FE0, 'Tangut'), + (0x16FE1, 0x16FE1, 'Nushu'), + (0x17000, 0x187EC, 'Tangut'), + (0x18800, 0x18AF2, 'Tangut'), + (0x1B000, 0x1B000, 'Katakana'), + (0x1B001, 0x1B11E, 'Hiragana'), + (0x1B170, 0x1B2FB, 'Nushu'), + (0x1BC00, 0x1BC6A, 'Duployan'), + (0x1BC70, 0x1BC7C, 'Duployan'), + (0x1BC80, 0x1BC88, 'Duployan'), + (0x1BC90, 0x1BC99, 'Duployan'), + (0x1BC9C, 0x1BC9C, 'Duployan'), + (0x1BC9D, 0x1BC9E, 'Duployan'), + (0x1BC9F, 0x1BC9F, 'Duployan'), + (0x1BCA0, 0x1BCA3, 'Common'), + (0x1D000, 0x1D0F5, 'Common'), + (0x1D100, 0x1D126, 'Common'), + (0x1D129, 0x1D164, 'Common'), + (0x1D165, 0x1D166, 'Common'), + (0x1D167, 0x1D169, 'Inherited'), + (0x1D16A, 0x1D16C, 'Common'), + (0x1D16D, 0x1D172, 'Common'), + (0x1D173, 0x1D17A, 'Common'), + (0x1D17B, 0x1D182, 'Inherited'), + (0x1D183, 0x1D184, 'Common'), + (0x1D185, 0x1D18B, 'Inherited'), + (0x1D18C, 0x1D1A9, 'Common'), + (0x1D1AA, 0x1D1AD, 'Inherited'), + (0x1D1AE, 0x1D1E8, 'Common'), + (0x1D200, 0x1D241, 'Greek'), + (0x1D242, 0x1D244, 'Greek'), + (0x1D245, 0x1D245, 'Greek'), + (0x1D300, 0x1D356, 'Common'), + (0x1D360, 0x1D371, 'Common'), + (0x1D400, 0x1D454, 'Common'), + (0x1D456, 0x1D49C, 'Common'), + (0x1D49E, 0x1D49F, 'Common'), + (0x1D4A2, 0x1D4A2, 'Common'), + (0x1D4A5, 0x1D4A6, 'Common'), + (0x1D4A9, 0x1D4AC, 'Common'), + (0x1D4AE, 0x1D4B9, 'Common'), + (0x1D4BB, 0x1D4BB, 'Common'), + (0x1D4BD, 0x1D4C3, 'Common'), + (0x1D4C5, 0x1D505, 'Common'), + (0x1D507, 0x1D50A, 'Common'), + (0x1D50D, 0x1D514, 'Common'), + (0x1D516, 0x1D51C, 'Common'), + (0x1D51E, 0x1D539, 'Common'), + (0x1D53B, 0x1D53E, 'Common'), + (0x1D540, 0x1D544, 'Common'), + (0x1D546, 0x1D546, 'Common'), + (0x1D54A, 0x1D550, 'Common'), + (0x1D552, 0x1D6A5, 'Common'), + (0x1D6A8, 0x1D6C0, 'Common'), + (0x1D6C1, 0x1D6C1, 'Common'), + (0x1D6C2, 0x1D6DA, 'Common'), + (0x1D6DB, 0x1D6DB, 'Common'), + (0x1D6DC, 0x1D6FA, 'Common'), + (0x1D6FB, 0x1D6FB, 'Common'), + (0x1D6FC, 0x1D714, 'Common'), + (0x1D715, 0x1D715, 'Common'), + (0x1D716, 0x1D734, 'Common'), + (0x1D735, 0x1D735, 'Common'), + (0x1D736, 0x1D74E, 'Common'), + (0x1D74F, 0x1D74F, 'Common'), + (0x1D750, 0x1D76E, 'Common'), + (0x1D76F, 0x1D76F, 'Common'), + (0x1D770, 0x1D788, 'Common'), + (0x1D789, 0x1D789, 'Common'), + (0x1D78A, 0x1D7A8, 'Common'), + (0x1D7A9, 0x1D7A9, 'Common'), + (0x1D7AA, 0x1D7C2, 'Common'), + (0x1D7C3, 0x1D7C3, 'Common'), + (0x1D7C4, 0x1D7CB, 'Common'), + (0x1D7CE, 0x1D7FF, 'Common'), + (0x1D800, 0x1D9FF, 'SignWriting'), + (0x1DA00, 0x1DA36, 'SignWriting'), + (0x1DA37, 0x1DA3A, 'SignWriting'), + (0x1DA3B, 0x1DA6C, 'SignWriting'), + (0x1DA6D, 0x1DA74, 'SignWriting'), + (0x1DA75, 0x1DA75, 'SignWriting'), + (0x1DA76, 0x1DA83, 'SignWriting'), + (0x1DA84, 0x1DA84, 'SignWriting'), + (0x1DA85, 0x1DA86, 'SignWriting'), + (0x1DA87, 0x1DA8B, 'SignWriting'), + (0x1DA9B, 0x1DA9F, 'SignWriting'), + (0x1DAA1, 0x1DAAF, 'SignWriting'), + (0x1E000, 0x1E006, 'Glagolitic'), + (0x1E008, 0x1E018, 'Glagolitic'), + (0x1E01B, 0x1E021, 'Glagolitic'), + (0x1E023, 0x1E024, 'Glagolitic'), + (0x1E026, 0x1E02A, 'Glagolitic'), + (0x1E800, 0x1E8C4, 'Mende_Kikakui'), + (0x1E8C7, 0x1E8CF, 'Mende_Kikakui'), + (0x1E8D0, 0x1E8D6, 'Mende_Kikakui'), + (0x1E900, 0x1E943, 'Adlam'), + (0x1E944, 0x1E94A, 'Adlam'), + (0x1E950, 0x1E959, 'Adlam'), + (0x1E95E, 0x1E95F, 'Adlam'), + (0x1EE00, 0x1EE03, 'Arabic'), + (0x1EE05, 0x1EE1F, 'Arabic'), + (0x1EE21, 0x1EE22, 'Arabic'), + (0x1EE24, 0x1EE24, 'Arabic'), + (0x1EE27, 0x1EE27, 'Arabic'), + (0x1EE29, 0x1EE32, 'Arabic'), + (0x1EE34, 0x1EE37, 'Arabic'), + (0x1EE39, 0x1EE39, 'Arabic'), + (0x1EE3B, 0x1EE3B, 'Arabic'), + (0x1EE42, 0x1EE42, 'Arabic'), + (0x1EE47, 0x1EE47, 'Arabic'), + (0x1EE49, 0x1EE49, 'Arabic'), + (0x1EE4B, 0x1EE4B, 'Arabic'), + (0x1EE4D, 0x1EE4F, 'Arabic'), + (0x1EE51, 0x1EE52, 'Arabic'), + (0x1EE54, 0x1EE54, 'Arabic'), + (0x1EE57, 0x1EE57, 'Arabic'), + (0x1EE59, 0x1EE59, 'Arabic'), + (0x1EE5B, 0x1EE5B, 'Arabic'), + (0x1EE5D, 0x1EE5D, 'Arabic'), + (0x1EE5F, 0x1EE5F, 'Arabic'), + (0x1EE61, 0x1EE62, 'Arabic'), + (0x1EE64, 0x1EE64, 'Arabic'), + (0x1EE67, 0x1EE6A, 'Arabic'), + (0x1EE6C, 0x1EE72, 'Arabic'), + (0x1EE74, 0x1EE77, 'Arabic'), + (0x1EE79, 0x1EE7C, 'Arabic'), + (0x1EE7E, 0x1EE7E, 'Arabic'), + (0x1EE80, 0x1EE89, 'Arabic'), + (0x1EE8B, 0x1EE9B, 'Arabic'), + (0x1EEA1, 0x1EEA3, 'Arabic'), + (0x1EEA5, 0x1EEA9, 'Arabic'), + (0x1EEAB, 0x1EEBB, 'Arabic'), + (0x1EEF0, 0x1EEF1, 'Arabic'), + (0x1F000, 0x1F02B, 'Common'), + (0x1F030, 0x1F093, 'Common'), + (0x1F0A0, 0x1F0AE, 'Common'), + (0x1F0B1, 0x1F0BF, 'Common'), + (0x1F0C1, 0x1F0CF, 'Common'), + (0x1F0D1, 0x1F0F5, 'Common'), + (0x1F100, 0x1F10C, 'Common'), + (0x1F110, 0x1F12E, 'Common'), + (0x1F130, 0x1F16B, 'Common'), + (0x1F170, 0x1F1AC, 'Common'), + (0x1F1E6, 0x1F1FF, 'Common'), + (0x1F200, 0x1F200, 'Hiragana'), + (0x1F201, 0x1F202, 'Common'), + (0x1F210, 0x1F23B, 'Common'), + (0x1F240, 0x1F248, 'Common'), + (0x1F250, 0x1F251, 'Common'), + (0x1F260, 0x1F265, 'Common'), + (0x1F300, 0x1F3FA, 'Common'), + (0x1F3FB, 0x1F3FF, 'Common'), + (0x1F400, 0x1F6D4, 'Common'), + (0x1F6E0, 0x1F6EC, 'Common'), + (0x1F6F0, 0x1F6F8, 'Common'), + (0x1F700, 0x1F773, 'Common'), + (0x1F780, 0x1F7D4, 'Common'), + (0x1F800, 0x1F80B, 'Common'), + (0x1F810, 0x1F847, 'Common'), + (0x1F850, 0x1F859, 'Common'), + (0x1F860, 0x1F887, 'Common'), + (0x1F890, 0x1F8AD, 'Common'), + (0x1F900, 0x1F90B, 'Common'), + (0x1F910, 0x1F93E, 'Common'), + (0x1F940, 0x1F94C, 'Common'), + (0x1F950, 0x1F96B, 'Common'), + (0x1F980, 0x1F997, 'Common'), + (0x1F9C0, 0x1F9C0, 'Common'), + (0x1F9D0, 0x1F9E6, 'Common'), + (0x20000, 0x2A6D6, 'Han'), + (0x2A700, 0x2B734, 'Han'), + (0x2B740, 0x2B81D, 'Han'), + (0x2B820, 0x2CEA1, 'Han'), + (0x2CEB0, 0x2EBE0, 'Han'), + (0x2F800, 0x2FA1D, 'Han'), + (0xE0001, 0xE0001, 'Common'), + (0xE0020, 0xE007F, 'Common'), + (0xE0100, 0xE01EF, 'Inherited'), +] From 52d61315254223b5a19551985c84211a4868d841 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 17 Nov 2017 19:17:17 +0000 Subject: [PATCH 03/17] [unicodedata] add new module and 'script' function The new `fontTools.unicodedata` module re-exports all the public functions from the built-in `unicodedata` module, and also adds additional functions. The `script` function takes a unicode character and returns the script name as defined in the UCD "Script.txt" data file. It's implemented as a simple binary search, plus a memoizing decorator that caches the results to avoid search the same character more than once. The unicodedata2 backport is imported if present, otherwise the unicodedata built-in is used. --- Lib/fontTools/unicodedata/__init__.py | 71 +++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 Lib/fontTools/unicodedata/__init__.py diff --git a/Lib/fontTools/unicodedata/__init__.py b/Lib/fontTools/unicodedata/__init__.py new file mode 100644 index 000000000..e5d3189ee --- /dev/null +++ b/Lib/fontTools/unicodedata/__init__.py @@ -0,0 +1,71 @@ +from __future__ import ( + print_function, division, absolute_import, unicode_literals) +from fontTools.misc.py23 import * + +import functools + +try: + # use unicodedata backport compatible with python2: + # https://github.com/mikekap/unicodedata2 + from unicodedata2 import * +except ImportError: + # fall back to built-in unicodedata (possibly outdated) + from unicodedata import * + +from .scripts import SCRIPT_RANGES + + +__all__ = [ + # names from built-in unicodedata module + "lookup", + "name", + "decimal", + "digit", + "numeric", + "category", + "bidirectional", + "combining", + "east_asian_width", + "mirrored", + "decomposition", + "normalize", + "unidata_version", + "ucd_3_2_0", + # additonal functions + "script", +] + + +def _memoize(func): + # Decorator that caches a function's return value each time it is + # called, and returns the cached value if called later with the same + # argument. + cache = func.cache = {} + + @functools.wraps(func) + def wrapper(arg): + if arg not in cache: + cache[arg] = func(arg) + return cache[arg] + return wrapper + + +@_memoize +def script(char): + """For the unicode character 'char' return the script name.""" + code = byteord(char) + return _binary_search_range(code, SCRIPT_RANGES, default="Unknown") + + +def _binary_search_range(code, ranges, default=None): + left = 0 + right = len(ranges) - 1 + while right >= left: + mid = (left + right) >> 1 + if code < ranges[mid][0]: + right = mid - 1 + elif code > ranges[mid][1]: + left = mid + 1 + else: + return ranges[mid][2] + return default From 2eb59f163fb6bd0998415e94467575647e100e67 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Fri, 17 Nov 2017 19:21:45 +0000 Subject: [PATCH 04/17] [Tests] add tests for unicodedata.script function --- Tests/unicodedata/scripts_test.py | 179 ++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 Tests/unicodedata/scripts_test.py diff --git a/Tests/unicodedata/scripts_test.py b/Tests/unicodedata/scripts_test.py new file mode 100644 index 000000000..a641eb66a --- /dev/null +++ b/Tests/unicodedata/scripts_test.py @@ -0,0 +1,179 @@ +from __future__ import ( + print_function, division, absolute_import, unicode_literals) +from fontTools.misc.py23 import * + + +from fontTools import unicodedata + + +def test__binary_search_range(): + ranges = [ + (0, 10, "foo"), + (11, 11, "bar"), + (12, 20, "baz"), + (21, 22, "bum"), + ] + search = unicodedata._binary_search_range + + for i in range(11): + assert search(1, ranges) == "foo" + + assert search(11, ranges) == "bar" + + for i in range(12, 21): + assert search(i, ranges) == "baz" + + for i in range(21, 23): + assert search(i, ranges) == "bum" + + assert search(23, ranges) is None + + +def test_script(): + assert unicodedata.script("a") == "Latin" + + assert hasattr(unicodedata.script, "cache") + assert unicodedata.script("a") == unicodedata.script.cache["a"] + + # these were randomly sampled, one character per script + assert unicodedata.script(unichr(0x1E918)) == 'Adlam' + assert unicodedata.script(unichr(0x1170D)) == 'Ahom' + assert unicodedata.script(unichr(0x145A0)) == 'Anatolian_Hieroglyphs' + assert unicodedata.script(unichr(0x0607)) == 'Arabic' + assert unicodedata.script(unichr(0x056C)) == 'Armenian' + assert unicodedata.script(unichr(0x10B27)) == 'Avestan' + assert unicodedata.script(unichr(0x1B41)) == 'Balinese' + assert unicodedata.script(unichr(0x168AD)) == 'Bamum' + assert unicodedata.script(unichr(0x16ADD)) == 'Bassa_Vah' + assert unicodedata.script(unichr(0x1BE5)) == 'Batak' + assert unicodedata.script(unichr(0x09F3)) == 'Bengali' + assert unicodedata.script(unichr(0x11C5B)) == 'Bhaiksuki' + assert unicodedata.script(unichr(0x3126)) == 'Bopomofo' + assert unicodedata.script(unichr(0x1103B)) == 'Brahmi' + assert unicodedata.script(unichr(0x2849)) == 'Braille' + assert unicodedata.script(unichr(0x1A0A)) == 'Buginese' + assert unicodedata.script(unichr(0x174E)) == 'Buhid' + assert unicodedata.script(unichr(0x18EE)) == 'Canadian_Aboriginal' + assert unicodedata.script(unichr(0x102B7)) == 'Carian' + assert unicodedata.script(unichr(0x1053D)) == 'Caucasian_Albanian' + assert unicodedata.script(unichr(0x11123)) == 'Chakma' + assert unicodedata.script(unichr(0xAA1F)) == 'Cham' + assert unicodedata.script(unichr(0xAB95)) == 'Cherokee' + assert unicodedata.script(unichr(0x1F0C7)) == 'Common' + assert unicodedata.script(unichr(0x2C85)) == 'Coptic' + assert unicodedata.script(unichr(0x12014)) == 'Cuneiform' + assert unicodedata.script(unichr(0x1082E)) == 'Cypriot' + assert unicodedata.script(unichr(0xA686)) == 'Cyrillic' + assert unicodedata.script(unichr(0x10417)) == 'Deseret' + assert unicodedata.script(unichr(0x093E)) == 'Devanagari' + assert unicodedata.script(unichr(0x1BC4B)) == 'Duployan' + assert unicodedata.script(unichr(0x1310C)) == 'Egyptian_Hieroglyphs' + assert unicodedata.script(unichr(0x1051C)) == 'Elbasan' + assert unicodedata.script(unichr(0x2DA6)) == 'Ethiopic' + assert unicodedata.script(unichr(0x10AD)) == 'Georgian' + assert unicodedata.script(unichr(0x2C52)) == 'Glagolitic' + assert unicodedata.script(unichr(0x10343)) == 'Gothic' + assert unicodedata.script(unichr(0x11371)) == 'Grantha' + assert unicodedata.script(unichr(0x03D0)) == 'Greek' + assert unicodedata.script(unichr(0x0AAA)) == 'Gujarati' + assert unicodedata.script(unichr(0x0A4C)) == 'Gurmukhi' + assert unicodedata.script(unichr(0x23C9F)) == 'Han' + assert unicodedata.script(unichr(0xC259)) == 'Hangul' + assert unicodedata.script(unichr(0x1722)) == 'Hanunoo' + assert unicodedata.script(unichr(0x108F5)) == 'Hatran' + assert unicodedata.script(unichr(0x05C2)) == 'Hebrew' + assert unicodedata.script(unichr(0x1B072)) == 'Hiragana' + assert unicodedata.script(unichr(0x10847)) == 'Imperial_Aramaic' + assert unicodedata.script(unichr(0x033A)) == 'Inherited' + assert unicodedata.script(unichr(0x10B66)) == 'Inscriptional_Pahlavi' + assert unicodedata.script(unichr(0x10B4B)) == 'Inscriptional_Parthian' + assert unicodedata.script(unichr(0xA98A)) == 'Javanese' + assert unicodedata.script(unichr(0x110B2)) == 'Kaithi' + assert unicodedata.script(unichr(0x0CC6)) == 'Kannada' + assert unicodedata.script(unichr(0x3337)) == 'Katakana' + assert unicodedata.script(unichr(0xA915)) == 'Kayah_Li' + assert unicodedata.script(unichr(0x10A2E)) == 'Kharoshthi' + assert unicodedata.script(unichr(0x17AA)) == 'Khmer' + assert unicodedata.script(unichr(0x11225)) == 'Khojki' + assert unicodedata.script(unichr(0x112B6)) == 'Khudawadi' + assert unicodedata.script(unichr(0x0ED7)) == 'Lao' + assert unicodedata.script(unichr(0xAB3C)) == 'Latin' + assert unicodedata.script(unichr(0x1C48)) == 'Lepcha' + assert unicodedata.script(unichr(0x1923)) == 'Limbu' + assert unicodedata.script(unichr(0x1071D)) == 'Linear_A' + assert unicodedata.script(unichr(0x100EC)) == 'Linear_B' + assert unicodedata.script(unichr(0xA4E9)) == 'Lisu' + assert unicodedata.script(unichr(0x10284)) == 'Lycian' + assert unicodedata.script(unichr(0x10926)) == 'Lydian' + assert unicodedata.script(unichr(0x11161)) == 'Mahajani' + assert unicodedata.script(unichr(0x0D56)) == 'Malayalam' + assert unicodedata.script(unichr(0x0856)) == 'Mandaic' + assert unicodedata.script(unichr(0x10AF0)) == 'Manichaean' + assert unicodedata.script(unichr(0x11CB0)) == 'Marchen' + assert unicodedata.script(unichr(0x11D28)) == 'Masaram_Gondi' + assert unicodedata.script(unichr(0xABDD)) == 'Meetei_Mayek' + assert unicodedata.script(unichr(0x1E897)) == 'Mende_Kikakui' + assert unicodedata.script(unichr(0x109B0)) == 'Meroitic_Cursive' + assert unicodedata.script(unichr(0x10993)) == 'Meroitic_Hieroglyphs' + assert unicodedata.script(unichr(0x16F5D)) == 'Miao' + assert unicodedata.script(unichr(0x1160B)) == 'Modi' + assert unicodedata.script(unichr(0x18A8)) == 'Mongolian' + assert unicodedata.script(unichr(0x16A48)) == 'Mro' + assert unicodedata.script(unichr(0x1128C)) == 'Multani' + assert unicodedata.script(unichr(0x105B)) == 'Myanmar' + assert unicodedata.script(unichr(0x108AF)) == 'Nabataean' + assert unicodedata.script(unichr(0x19B3)) == 'New_Tai_Lue' + assert unicodedata.script(unichr(0x1143D)) == 'Newa' + assert unicodedata.script(unichr(0x07F4)) == 'Nko' + assert unicodedata.script(unichr(0x1B192)) == 'Nushu' + assert unicodedata.script(unichr(0x169C)) == 'Ogham' + assert unicodedata.script(unichr(0x1C56)) == 'Ol_Chiki' + assert unicodedata.script(unichr(0x10CE9)) == 'Old_Hungarian' + assert unicodedata.script(unichr(0x10316)) == 'Old_Italic' + assert unicodedata.script(unichr(0x10A93)) == 'Old_North_Arabian' + assert unicodedata.script(unichr(0x1035A)) == 'Old_Permic' + assert unicodedata.script(unichr(0x103D5)) == 'Old_Persian' + assert unicodedata.script(unichr(0x10A65)) == 'Old_South_Arabian' + assert unicodedata.script(unichr(0x10C09)) == 'Old_Turkic' + assert unicodedata.script(unichr(0x0B60)) == 'Oriya' + assert unicodedata.script(unichr(0x104CF)) == 'Osage' + assert unicodedata.script(unichr(0x104A8)) == 'Osmanya' + assert unicodedata.script(unichr(0x16B12)) == 'Pahawh_Hmong' + assert unicodedata.script(unichr(0x10879)) == 'Palmyrene' + assert unicodedata.script(unichr(0x11AF1)) == 'Pau_Cin_Hau' + assert unicodedata.script(unichr(0xA869)) == 'Phags_Pa' + assert unicodedata.script(unichr(0x10909)) == 'Phoenician' + assert unicodedata.script(unichr(0x10B81)) == 'Psalter_Pahlavi' + assert unicodedata.script(unichr(0xA941)) == 'Rejang' + assert unicodedata.script(unichr(0x16C3)) == 'Runic' + assert unicodedata.script(unichr(0x0814)) == 'Samaritan' + assert unicodedata.script(unichr(0xA88C)) == 'Saurashtra' + assert unicodedata.script(unichr(0x111C8)) == 'Sharada' + assert unicodedata.script(unichr(0x1045F)) == 'Shavian' + assert unicodedata.script(unichr(0x115AD)) == 'Siddham' + assert unicodedata.script(unichr(0x1D8C0)) == 'SignWriting' + assert unicodedata.script(unichr(0x0DB9)) == 'Sinhala' + assert unicodedata.script(unichr(0x110F9)) == 'Sora_Sompeng' + assert unicodedata.script(unichr(0x11A60)) == 'Soyombo' + assert unicodedata.script(unichr(0x1B94)) == 'Sundanese' + assert unicodedata.script(unichr(0xA81F)) == 'Syloti_Nagri' + assert unicodedata.script(unichr(0x0740)) == 'Syriac' + assert unicodedata.script(unichr(0x1714)) == 'Tagalog' + assert unicodedata.script(unichr(0x1761)) == 'Tagbanwa' + assert unicodedata.script(unichr(0x1965)) == 'Tai_Le' + assert unicodedata.script(unichr(0x1A32)) == 'Tai_Tham' + assert unicodedata.script(unichr(0xAA86)) == 'Tai_Viet' + assert unicodedata.script(unichr(0x116A5)) == 'Takri' + assert unicodedata.script(unichr(0x0B8E)) == 'Tamil' + assert unicodedata.script(unichr(0x1754D)) == 'Tangut' + assert unicodedata.script(unichr(0x0C40)) == 'Telugu' + assert unicodedata.script(unichr(0x07A4)) == 'Thaana' + assert unicodedata.script(unichr(0x0E42)) == 'Thai' + assert unicodedata.script(unichr(0x0F09)) == 'Tibetan' + assert unicodedata.script(unichr(0x2D3A)) == 'Tifinagh' + assert unicodedata.script(unichr(0x114B0)) == 'Tirhuta' + assert unicodedata.script(unichr(0x1038B)) == 'Ugaritic' + assert unicodedata.script(unichr(0xA585)) == 'Vai' + assert unicodedata.script(unichr(0x118CF)) == 'Warang_Citi' + assert unicodedata.script(unichr(0xA066)) == 'Yi' + assert unicodedata.script(unichr(0x11A31)) == 'Zanabazar_Square' From 5b3c189f6d50c955ccbab359e24a50e741c2c3d4 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 13:25:45 +0100 Subject: [PATCH 05/17] [buildUCD] split generated ranges and names in two lists to use the bisect built-in module we need to have two separate tables, one with the ranges themselves (which we pass to bisect to get an index) and the other containing the script name for each range. Also, allow the buildUCD.py script to load data files from a local directory, e.g. to allow downstream maintainers to rebuild the generated modules from local files instead of downloading from Unicode website. --- MetaTools/buildUCD.py | 104 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 91 insertions(+), 13 deletions(-) diff --git a/MetaTools/buildUCD.py b/MetaTools/buildUCD.py index 994bd1e02..acd6cf187 100755 --- a/MetaTools/buildUCD.py +++ b/MetaTools/buildUCD.py @@ -14,6 +14,8 @@ except ImportError: from contextlib import closing, contextmanager import re from codecs import iterdecode +import logging +import os from os.path import abspath, dirname, join as pjoin, pardir, sep @@ -27,6 +29,10 @@ SRC_ENCODING = "# -*- coding: utf-8 -*-\n" NOTICE = "# NOTE: This file was auto-generated with MetaTools/buildUCD.py.\n" +MAX_UNICODE = 0x10FFFF + +log = logging.getLogger() + @contextmanager def open_unidata_file(filename): @@ -48,10 +54,15 @@ def parse_unidata_header(infile): return "".join(header) -def parse_range_properties(infile): +def parse_range_properties(infile, default="Unknown"): """Parse a Unicode data file containing a column with one character or a range of characters, and another column containing a property value separated by a semicolon. Comments after '#' are ignored. + + If the ranges defined in the data file are not continuous, assign the + 'default' property to the unassigned codepoints. + + Return a list of (start, end, property_name) tuples. """ ranges = [] line_regex = re.compile( @@ -75,21 +86,66 @@ def parse_range_properties(infile): ranges.append((first, last, data)) - return ranges + ranges.sort() + + # fill the gaps between explicitly defined ranges + last_start, last_end = -1, -1 + full_ranges = [] + for start, end, name in ranges: + assert last_end < start + assert start <= end + if start - last_end > 1: + full_ranges.append((last_end+1, start-1, default)) + full_ranges.append((start, end, name)) + last_start, last_end = start, end + if last_end != MAX_UNICODE: + full_ranges.append((last_end+1, MAX_UNICODE, default)) + + # reduce total number of ranges by combining continuous ones + last_start, last_end, last_name = full_ranges.pop(0) + merged_ranges = [] + for start, end, name in full_ranges: + if name == last_name: + continue + else: + merged_ranges.append((last_start, start-1, last_name)) + last_start, line_end, last_name = start, end, name + merged_ranges.append((last_start, MAX_UNICODE, last_name)) + + # make sure that the ranges cover the full unicode repertoire + assert merged_ranges[0][0] == 0 + for (cs, ce, cn), (ns, ne, nn) in zip(merged_ranges, merged_ranges[1:]): + assert ce+1 == ns + assert merged_ranges[-1][1] == MAX_UNICODE + + return merged_ranges -def build_scripts(output_path=None): - """Fetch "Scripts.txt" data file, parse the script ranges and write - them as a list of Python tuples to 'fontTools.unicodedata.scripts'. +def build_scripts(local_ucd=None, output_path=None): + """Fetch "Scripts.txt" data file from Unicode official website, parse + the script ranges and write them as a list of Python tuples to + 'fontTools.unicodedata.scripts'. + + To load "Scripts.txt" from a local directory, you can use the + 'local_ucd' argument. """ - filename = "Scripts.txt" - with open_unidata_file(filename) as f: - header = parse_unidata_header(f) - script_ranges = parse_range_properties(f) - if not output_path: output_path = UNIDATA_PATH + "scripts.py" + filename = "Scripts.txt" + if local_ucd: + log.info("loading %r from local directory %r", filename, local_ucd) + cm = open(pjoin(local_ucd, filename), "r", encoding="utf-8") + else: + log.info("downloading %r from %r", filename, UNIDATA_URL) + cm = open_unidata_file(filename) + + with cm as f: + header = parse_unidata_header(f) + ranges = parse_range_properties(f) + + max_name_length = max(len(n) for _, _, n in ranges) + with open(output_path, "w", encoding="utf-8") as f: f.write(SRC_ENCODING) f.write("#\n") @@ -99,14 +155,36 @@ def build_scripts(output_path=None): f.write(header+"\n\n") f.write("SCRIPT_RANGES = [\n") - for first, last, script_name in sorted(script_ranges): - f.write(" (0x{:X}, 0x{:X}, '{}'),\n".format( + for first, last, script_name in ranges: + f.write(" 0x{:0>4X}, # .. 0x{:0>4X} ; {}\n".format( first, last, tostr(script_name))) f.write("]\n") + f.write("\n") + f.write("SCRIPT_NAMES = [\n") + for first, last, script_name in ranges: + script_name = "'{}',".format(script_name) + f.write(" {} # {:0>4X}..{:0>4X}\n".format( + script_name.ljust(max_name_length+3), first, last)) + f.write("]\n") + + log.info("saved new file: %r", os.path.normpath(output_path)) + def main(): - build_scripts() + import argparse + + parser = argparse.ArgumentParser( + description="Generate fontTools.unicodedata from UCD data files") + parser.add_argument( + '--ucd-path', help="Path to local folder containing UCD data files") + parser.add_argument('-q', '--quiet', action="store_true") + options = parser.parse_args() + + level = "WARNING" if options.quiet else "INFO" + logging.basicConfig(level=level, format="%(message)s") + + build_scripts(local_ucd=options.ucd_path) if __name__ == "__main__": From 3442da1529566e4b47d0c998fb9551094e027870 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 13:30:17 +0100 Subject: [PATCH 06/17] [unicodedata] use bisect.bisect_right function CPython comes with a fast C implementation of bisect module. This gives 4 to 5 times speed-ups over my pure-python version. --- Lib/fontTools/unicodedata/__init__.py | 46 ++++++++------------------- 1 file changed, 13 insertions(+), 33 deletions(-) diff --git a/Lib/fontTools/unicodedata/__init__.py b/Lib/fontTools/unicodedata/__init__.py index e5d3189ee..f0c22e4d9 100644 --- a/Lib/fontTools/unicodedata/__init__.py +++ b/Lib/fontTools/unicodedata/__init__.py @@ -2,7 +2,7 @@ from __future__ import ( print_function, division, absolute_import, unicode_literals) from fontTools.misc.py23 import * -import functools +from bisect import bisect_right try: # use unicodedata backport compatible with python2: @@ -12,7 +12,7 @@ except ImportError: # fall back to built-in unicodedata (possibly outdated) from unicodedata import * -from .scripts import SCRIPT_RANGES +from .scripts import SCRIPT_RANGES, SCRIPT_NAMES __all__ = [ @@ -36,36 +36,16 @@ __all__ = [ ] -def _memoize(func): - # Decorator that caches a function's return value each time it is - # called, and returns the cached value if called later with the same - # argument. - cache = func.cache = {} - - @functools.wraps(func) - def wrapper(arg): - if arg not in cache: - cache[arg] = func(arg) - return cache[arg] - return wrapper - - -@_memoize def script(char): - """For the unicode character 'char' return the script name.""" code = byteord(char) - return _binary_search_range(code, SCRIPT_RANGES, default="Unknown") - - -def _binary_search_range(code, ranges, default=None): - left = 0 - right = len(ranges) - 1 - while right >= left: - mid = (left + right) >> 1 - if code < ranges[mid][0]: - right = mid - 1 - elif code > ranges[mid][1]: - left = mid + 1 - else: - return ranges[mid][2] - return default + # 'bisect_right(a, x, lo=0, hi=len(a))' returns an insertion point which + # comes after (to the right of) any existing entries of x in a, and it + # partitions array a into two halves so that, for the left side + # all(val <= x for val in a[lo:i]), and for the right side + # all(val > x for val in a[i:hi]). + # Our 'SCRIPT_RANGES' is a sorted list of ranges (only their starting + # breakpoints); we want to use `bisect_right` to look up the range that + # contains the given codepoint: i.e. whose start is less than or equal + # to the codepoint. Thus, we subtract -1 from the index returned. + i = bisect_right(SCRIPT_RANGES, code) + return SCRIPT_NAMES[i-1] From a17ccc47f3c64e4e67eca1039c92acc87dfc3d78 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 13:38:00 +0100 Subject: [PATCH 07/17] [buildUCD] also write Unicode license URL to generated modules --- MetaTools/buildUCD.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MetaTools/buildUCD.py b/MetaTools/buildUCD.py index acd6cf187..e053e897d 100755 --- a/MetaTools/buildUCD.py +++ b/MetaTools/buildUCD.py @@ -20,6 +20,7 @@ from os.path import abspath, dirname, join as pjoin, pardir, sep UNIDATA_URL = "https://unicode.org/Public/UNIDATA/" +UNIDATA_LICENSE_URL = "http://unicode.org/copyright.html#License" # by default save output files to ../Lib/fontTools/unicodedata/ UNIDATA_PATH = pjoin(abspath(dirname(__file__)), pardir, @@ -151,6 +152,7 @@ def build_scripts(local_ucd=None, output_path=None): f.write("#\n") f.write(NOTICE) f.write("# Source: {}{}\n".format(UNIDATA_URL, filename)) + f.write("# License: {}\n".format(UNIDATA_LICENSE_URL)) f.write("#\n") f.write(header+"\n\n") From b53b878bdc39b550910b491ce273134f9a30258a Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 13:38:49 +0100 Subject: [PATCH 08/17] [scripts] update auto-generated module it now contains two list, one for the ranges and another for the script names --- Lib/fontTools/unicodedata/scripts.py | 4995 ++++++++++++++++---------- 1 file changed, 3032 insertions(+), 1963 deletions(-) diff --git a/Lib/fontTools/unicodedata/scripts.py b/Lib/fontTools/unicodedata/scripts.py index 133212cd2..e494e1e09 100644 --- a/Lib/fontTools/unicodedata/scripts.py +++ b/Lib/fontTools/unicodedata/scripts.py @@ -2,6 +2,7 @@ # # NOTE: This file was auto-generated with MetaTools/buildUCD.py. # Source: https://unicode.org/Public/UNIDATA/Scripts.txt +# License: http://unicode.org/copyright.html#License # # Scripts-10.0.0.txt # Date: 2017-03-11, 06:40:37 GMT @@ -20,1967 +21,3035 @@ SCRIPT_RANGES = [ - (0x0, 0x1F, 'Common'), - (0x20, 0x20, 'Common'), - (0x21, 0x23, 'Common'), - (0x24, 0x24, 'Common'), - (0x25, 0x27, 'Common'), - (0x28, 0x28, 'Common'), - (0x29, 0x29, 'Common'), - (0x2A, 0x2A, 'Common'), - (0x2B, 0x2B, 'Common'), - (0x2C, 0x2C, 'Common'), - (0x2D, 0x2D, 'Common'), - (0x2E, 0x2F, 'Common'), - (0x30, 0x39, 'Common'), - (0x3A, 0x3B, 'Common'), - (0x3C, 0x3E, 'Common'), - (0x3F, 0x40, 'Common'), - (0x41, 0x5A, 'Latin'), - (0x5B, 0x5B, 'Common'), - (0x5C, 0x5C, 'Common'), - (0x5D, 0x5D, 'Common'), - (0x5E, 0x5E, 'Common'), - (0x5F, 0x5F, 'Common'), - (0x60, 0x60, 'Common'), - (0x61, 0x7A, 'Latin'), - (0x7B, 0x7B, 'Common'), - (0x7C, 0x7C, 'Common'), - (0x7D, 0x7D, 'Common'), - (0x7E, 0x7E, 'Common'), - (0x7F, 0x9F, 'Common'), - (0xA0, 0xA0, 'Common'), - (0xA1, 0xA1, 'Common'), - (0xA2, 0xA5, 'Common'), - (0xA6, 0xA6, 'Common'), - (0xA7, 0xA7, 'Common'), - (0xA8, 0xA8, 'Common'), - (0xA9, 0xA9, 'Common'), - (0xAA, 0xAA, 'Latin'), - (0xAB, 0xAB, 'Common'), - (0xAC, 0xAC, 'Common'), - (0xAD, 0xAD, 'Common'), - (0xAE, 0xAE, 'Common'), - (0xAF, 0xAF, 'Common'), - (0xB0, 0xB0, 'Common'), - (0xB1, 0xB1, 'Common'), - (0xB2, 0xB3, 'Common'), - (0xB4, 0xB4, 'Common'), - (0xB5, 0xB5, 'Common'), - (0xB6, 0xB7, 'Common'), - (0xB8, 0xB8, 'Common'), - (0xB9, 0xB9, 'Common'), - (0xBA, 0xBA, 'Latin'), - (0xBB, 0xBB, 'Common'), - (0xBC, 0xBE, 'Common'), - (0xBF, 0xBF, 'Common'), - (0xC0, 0xD6, 'Latin'), - (0xD7, 0xD7, 'Common'), - (0xD8, 0xF6, 'Latin'), - (0xF7, 0xF7, 'Common'), - (0xF8, 0x1BA, 'Latin'), - (0x1BB, 0x1BB, 'Latin'), - (0x1BC, 0x1BF, 'Latin'), - (0x1C0, 0x1C3, 'Latin'), - (0x1C4, 0x293, 'Latin'), - (0x294, 0x294, 'Latin'), - (0x295, 0x2AF, 'Latin'), - (0x2B0, 0x2B8, 'Latin'), - (0x2B9, 0x2C1, 'Common'), - (0x2C2, 0x2C5, 'Common'), - (0x2C6, 0x2D1, 'Common'), - (0x2D2, 0x2DF, 'Common'), - (0x2E0, 0x2E4, 'Latin'), - (0x2E5, 0x2E9, 'Common'), - (0x2EA, 0x2EB, 'Bopomofo'), - (0x2EC, 0x2EC, 'Common'), - (0x2ED, 0x2ED, 'Common'), - (0x2EE, 0x2EE, 'Common'), - (0x2EF, 0x2FF, 'Common'), - (0x300, 0x36F, 'Inherited'), - (0x370, 0x373, 'Greek'), - (0x374, 0x374, 'Common'), - (0x375, 0x375, 'Greek'), - (0x376, 0x377, 'Greek'), - (0x37A, 0x37A, 'Greek'), - (0x37B, 0x37D, 'Greek'), - (0x37E, 0x37E, 'Common'), - (0x37F, 0x37F, 'Greek'), - (0x384, 0x384, 'Greek'), - (0x385, 0x385, 'Common'), - (0x386, 0x386, 'Greek'), - (0x387, 0x387, 'Common'), - (0x388, 0x38A, 'Greek'), - (0x38C, 0x38C, 'Greek'), - (0x38E, 0x3A1, 'Greek'), - (0x3A3, 0x3E1, 'Greek'), - (0x3E2, 0x3EF, 'Coptic'), - (0x3F0, 0x3F5, 'Greek'), - (0x3F6, 0x3F6, 'Greek'), - (0x3F7, 0x3FF, 'Greek'), - (0x400, 0x481, 'Cyrillic'), - (0x482, 0x482, 'Cyrillic'), - (0x483, 0x484, 'Cyrillic'), - (0x485, 0x486, 'Inherited'), - (0x487, 0x487, 'Cyrillic'), - (0x488, 0x489, 'Cyrillic'), - (0x48A, 0x52F, 'Cyrillic'), - (0x531, 0x556, 'Armenian'), - (0x559, 0x559, 'Armenian'), - (0x55A, 0x55F, 'Armenian'), - (0x561, 0x587, 'Armenian'), - (0x589, 0x589, 'Common'), - (0x58A, 0x58A, 'Armenian'), - (0x58D, 0x58E, 'Armenian'), - (0x58F, 0x58F, 'Armenian'), - (0x591, 0x5BD, 'Hebrew'), - (0x5BE, 0x5BE, 'Hebrew'), - (0x5BF, 0x5BF, 'Hebrew'), - (0x5C0, 0x5C0, 'Hebrew'), - (0x5C1, 0x5C2, 'Hebrew'), - (0x5C3, 0x5C3, 'Hebrew'), - (0x5C4, 0x5C5, 'Hebrew'), - (0x5C6, 0x5C6, 'Hebrew'), - (0x5C7, 0x5C7, 'Hebrew'), - (0x5D0, 0x5EA, 'Hebrew'), - (0x5F0, 0x5F2, 'Hebrew'), - (0x5F3, 0x5F4, 'Hebrew'), - (0x600, 0x604, 'Arabic'), - (0x605, 0x605, 'Common'), - (0x606, 0x608, 'Arabic'), - (0x609, 0x60A, 'Arabic'), - (0x60B, 0x60B, 'Arabic'), - (0x60C, 0x60C, 'Common'), - (0x60D, 0x60D, 'Arabic'), - (0x60E, 0x60F, 'Arabic'), - (0x610, 0x61A, 'Arabic'), - (0x61B, 0x61B, 'Common'), - (0x61C, 0x61C, 'Arabic'), - (0x61E, 0x61E, 'Arabic'), - (0x61F, 0x61F, 'Common'), - (0x620, 0x63F, 'Arabic'), - (0x640, 0x640, 'Common'), - (0x641, 0x64A, 'Arabic'), - (0x64B, 0x655, 'Inherited'), - (0x656, 0x65F, 'Arabic'), - (0x660, 0x669, 'Arabic'), - (0x66A, 0x66D, 'Arabic'), - (0x66E, 0x66F, 'Arabic'), - (0x670, 0x670, 'Inherited'), - (0x671, 0x6D3, 'Arabic'), - (0x6D4, 0x6D4, 'Arabic'), - (0x6D5, 0x6D5, 'Arabic'), - (0x6D6, 0x6DC, 'Arabic'), - (0x6DD, 0x6DD, 'Common'), - (0x6DE, 0x6DE, 'Arabic'), - (0x6DF, 0x6E4, 'Arabic'), - (0x6E5, 0x6E6, 'Arabic'), - (0x6E7, 0x6E8, 'Arabic'), - (0x6E9, 0x6E9, 'Arabic'), - (0x6EA, 0x6ED, 'Arabic'), - (0x6EE, 0x6EF, 'Arabic'), - (0x6F0, 0x6F9, 'Arabic'), - (0x6FA, 0x6FC, 'Arabic'), - (0x6FD, 0x6FE, 'Arabic'), - (0x6FF, 0x6FF, 'Arabic'), - (0x700, 0x70D, 'Syriac'), - (0x70F, 0x70F, 'Syriac'), - (0x710, 0x710, 'Syriac'), - (0x711, 0x711, 'Syriac'), - (0x712, 0x72F, 'Syriac'), - (0x730, 0x74A, 'Syriac'), - (0x74D, 0x74F, 'Syriac'), - (0x750, 0x77F, 'Arabic'), - (0x780, 0x7A5, 'Thaana'), - (0x7A6, 0x7B0, 'Thaana'), - (0x7B1, 0x7B1, 'Thaana'), - (0x7C0, 0x7C9, 'Nko'), - (0x7CA, 0x7EA, 'Nko'), - (0x7EB, 0x7F3, 'Nko'), - (0x7F4, 0x7F5, 'Nko'), - (0x7F6, 0x7F6, 'Nko'), - (0x7F7, 0x7F9, 'Nko'), - (0x7FA, 0x7FA, 'Nko'), - (0x800, 0x815, 'Samaritan'), - (0x816, 0x819, 'Samaritan'), - (0x81A, 0x81A, 'Samaritan'), - (0x81B, 0x823, 'Samaritan'), - (0x824, 0x824, 'Samaritan'), - (0x825, 0x827, 'Samaritan'), - (0x828, 0x828, 'Samaritan'), - (0x829, 0x82D, 'Samaritan'), - (0x830, 0x83E, 'Samaritan'), - (0x840, 0x858, 'Mandaic'), - (0x859, 0x85B, 'Mandaic'), - (0x85E, 0x85E, 'Mandaic'), - (0x860, 0x86A, 'Syriac'), - (0x8A0, 0x8B4, 'Arabic'), - (0x8B6, 0x8BD, 'Arabic'), - (0x8D4, 0x8E1, 'Arabic'), - (0x8E2, 0x8E2, 'Common'), - (0x8E3, 0x8FF, 'Arabic'), - (0x900, 0x902, 'Devanagari'), - (0x903, 0x903, 'Devanagari'), - (0x904, 0x939, 'Devanagari'), - (0x93A, 0x93A, 'Devanagari'), - (0x93B, 0x93B, 'Devanagari'), - (0x93C, 0x93C, 'Devanagari'), - (0x93D, 0x93D, 'Devanagari'), - (0x93E, 0x940, 'Devanagari'), - (0x941, 0x948, 'Devanagari'), - (0x949, 0x94C, 'Devanagari'), - (0x94D, 0x94D, 'Devanagari'), - (0x94E, 0x94F, 'Devanagari'), - (0x950, 0x950, 'Devanagari'), - (0x951, 0x952, 'Inherited'), - (0x953, 0x957, 'Devanagari'), - (0x958, 0x961, 'Devanagari'), - (0x962, 0x963, 'Devanagari'), - (0x964, 0x965, 'Common'), - (0x966, 0x96F, 'Devanagari'), - (0x970, 0x970, 'Devanagari'), - (0x971, 0x971, 'Devanagari'), - (0x972, 0x97F, 'Devanagari'), - (0x980, 0x980, 'Bengali'), - (0x981, 0x981, 'Bengali'), - (0x982, 0x983, 'Bengali'), - (0x985, 0x98C, 'Bengali'), - (0x98F, 0x990, 'Bengali'), - (0x993, 0x9A8, 'Bengali'), - (0x9AA, 0x9B0, 'Bengali'), - (0x9B2, 0x9B2, 'Bengali'), - (0x9B6, 0x9B9, 'Bengali'), - (0x9BC, 0x9BC, 'Bengali'), - (0x9BD, 0x9BD, 'Bengali'), - (0x9BE, 0x9C0, 'Bengali'), - (0x9C1, 0x9C4, 'Bengali'), - (0x9C7, 0x9C8, 'Bengali'), - (0x9CB, 0x9CC, 'Bengali'), - (0x9CD, 0x9CD, 'Bengali'), - (0x9CE, 0x9CE, 'Bengali'), - (0x9D7, 0x9D7, 'Bengali'), - (0x9DC, 0x9DD, 'Bengali'), - (0x9DF, 0x9E1, 'Bengali'), - (0x9E2, 0x9E3, 'Bengali'), - (0x9E6, 0x9EF, 'Bengali'), - (0x9F0, 0x9F1, 'Bengali'), - (0x9F2, 0x9F3, 'Bengali'), - (0x9F4, 0x9F9, 'Bengali'), - (0x9FA, 0x9FA, 'Bengali'), - (0x9FB, 0x9FB, 'Bengali'), - (0x9FC, 0x9FC, 'Bengali'), - (0x9FD, 0x9FD, 'Bengali'), - (0xA01, 0xA02, 'Gurmukhi'), - (0xA03, 0xA03, 'Gurmukhi'), - (0xA05, 0xA0A, 'Gurmukhi'), - (0xA0F, 0xA10, 'Gurmukhi'), - (0xA13, 0xA28, 'Gurmukhi'), - (0xA2A, 0xA30, 'Gurmukhi'), - (0xA32, 0xA33, 'Gurmukhi'), - (0xA35, 0xA36, 'Gurmukhi'), - (0xA38, 0xA39, 'Gurmukhi'), - (0xA3C, 0xA3C, 'Gurmukhi'), - (0xA3E, 0xA40, 'Gurmukhi'), - (0xA41, 0xA42, 'Gurmukhi'), - (0xA47, 0xA48, 'Gurmukhi'), - (0xA4B, 0xA4D, 'Gurmukhi'), - (0xA51, 0xA51, 'Gurmukhi'), - (0xA59, 0xA5C, 'Gurmukhi'), - (0xA5E, 0xA5E, 'Gurmukhi'), - (0xA66, 0xA6F, 'Gurmukhi'), - (0xA70, 0xA71, 'Gurmukhi'), - (0xA72, 0xA74, 'Gurmukhi'), - (0xA75, 0xA75, 'Gurmukhi'), - (0xA81, 0xA82, 'Gujarati'), - (0xA83, 0xA83, 'Gujarati'), - (0xA85, 0xA8D, 'Gujarati'), - (0xA8F, 0xA91, 'Gujarati'), - (0xA93, 0xAA8, 'Gujarati'), - (0xAAA, 0xAB0, 'Gujarati'), - (0xAB2, 0xAB3, 'Gujarati'), - (0xAB5, 0xAB9, 'Gujarati'), - (0xABC, 0xABC, 'Gujarati'), - (0xABD, 0xABD, 'Gujarati'), - (0xABE, 0xAC0, 'Gujarati'), - (0xAC1, 0xAC5, 'Gujarati'), - (0xAC7, 0xAC8, 'Gujarati'), - (0xAC9, 0xAC9, 'Gujarati'), - (0xACB, 0xACC, 'Gujarati'), - (0xACD, 0xACD, 'Gujarati'), - (0xAD0, 0xAD0, 'Gujarati'), - (0xAE0, 0xAE1, 'Gujarati'), - (0xAE2, 0xAE3, 'Gujarati'), - (0xAE6, 0xAEF, 'Gujarati'), - (0xAF0, 0xAF0, 'Gujarati'), - (0xAF1, 0xAF1, 'Gujarati'), - (0xAF9, 0xAF9, 'Gujarati'), - (0xAFA, 0xAFF, 'Gujarati'), - (0xB01, 0xB01, 'Oriya'), - (0xB02, 0xB03, 'Oriya'), - (0xB05, 0xB0C, 'Oriya'), - (0xB0F, 0xB10, 'Oriya'), - (0xB13, 0xB28, 'Oriya'), - (0xB2A, 0xB30, 'Oriya'), - (0xB32, 0xB33, 'Oriya'), - (0xB35, 0xB39, 'Oriya'), - (0xB3C, 0xB3C, 'Oriya'), - (0xB3D, 0xB3D, 'Oriya'), - (0xB3E, 0xB3E, 'Oriya'), - (0xB3F, 0xB3F, 'Oriya'), - (0xB40, 0xB40, 'Oriya'), - (0xB41, 0xB44, 'Oriya'), - (0xB47, 0xB48, 'Oriya'), - (0xB4B, 0xB4C, 'Oriya'), - (0xB4D, 0xB4D, 'Oriya'), - (0xB56, 0xB56, 'Oriya'), - (0xB57, 0xB57, 'Oriya'), - (0xB5C, 0xB5D, 'Oriya'), - (0xB5F, 0xB61, 'Oriya'), - (0xB62, 0xB63, 'Oriya'), - (0xB66, 0xB6F, 'Oriya'), - (0xB70, 0xB70, 'Oriya'), - (0xB71, 0xB71, 'Oriya'), - (0xB72, 0xB77, 'Oriya'), - (0xB82, 0xB82, 'Tamil'), - (0xB83, 0xB83, 'Tamil'), - (0xB85, 0xB8A, 'Tamil'), - (0xB8E, 0xB90, 'Tamil'), - (0xB92, 0xB95, 'Tamil'), - (0xB99, 0xB9A, 'Tamil'), - (0xB9C, 0xB9C, 'Tamil'), - (0xB9E, 0xB9F, 'Tamil'), - (0xBA3, 0xBA4, 'Tamil'), - (0xBA8, 0xBAA, 'Tamil'), - (0xBAE, 0xBB9, 'Tamil'), - (0xBBE, 0xBBF, 'Tamil'), - (0xBC0, 0xBC0, 'Tamil'), - (0xBC1, 0xBC2, 'Tamil'), - (0xBC6, 0xBC8, 'Tamil'), - (0xBCA, 0xBCC, 'Tamil'), - (0xBCD, 0xBCD, 'Tamil'), - (0xBD0, 0xBD0, 'Tamil'), - (0xBD7, 0xBD7, 'Tamil'), - (0xBE6, 0xBEF, 'Tamil'), - (0xBF0, 0xBF2, 'Tamil'), - (0xBF3, 0xBF8, 'Tamil'), - (0xBF9, 0xBF9, 'Tamil'), - (0xBFA, 0xBFA, 'Tamil'), - (0xC00, 0xC00, 'Telugu'), - (0xC01, 0xC03, 'Telugu'), - (0xC05, 0xC0C, 'Telugu'), - (0xC0E, 0xC10, 'Telugu'), - (0xC12, 0xC28, 'Telugu'), - (0xC2A, 0xC39, 'Telugu'), - (0xC3D, 0xC3D, 'Telugu'), - (0xC3E, 0xC40, 'Telugu'), - (0xC41, 0xC44, 'Telugu'), - (0xC46, 0xC48, 'Telugu'), - (0xC4A, 0xC4D, 'Telugu'), - (0xC55, 0xC56, 'Telugu'), - (0xC58, 0xC5A, 'Telugu'), - (0xC60, 0xC61, 'Telugu'), - (0xC62, 0xC63, 'Telugu'), - (0xC66, 0xC6F, 'Telugu'), - (0xC78, 0xC7E, 'Telugu'), - (0xC7F, 0xC7F, 'Telugu'), - (0xC80, 0xC80, 'Kannada'), - (0xC81, 0xC81, 'Kannada'), - (0xC82, 0xC83, 'Kannada'), - (0xC85, 0xC8C, 'Kannada'), - (0xC8E, 0xC90, 'Kannada'), - (0xC92, 0xCA8, 'Kannada'), - (0xCAA, 0xCB3, 'Kannada'), - (0xCB5, 0xCB9, 'Kannada'), - (0xCBC, 0xCBC, 'Kannada'), - (0xCBD, 0xCBD, 'Kannada'), - (0xCBE, 0xCBE, 'Kannada'), - (0xCBF, 0xCBF, 'Kannada'), - (0xCC0, 0xCC4, 'Kannada'), - (0xCC6, 0xCC6, 'Kannada'), - (0xCC7, 0xCC8, 'Kannada'), - (0xCCA, 0xCCB, 'Kannada'), - (0xCCC, 0xCCD, 'Kannada'), - (0xCD5, 0xCD6, 'Kannada'), - (0xCDE, 0xCDE, 'Kannada'), - (0xCE0, 0xCE1, 'Kannada'), - (0xCE2, 0xCE3, 'Kannada'), - (0xCE6, 0xCEF, 'Kannada'), - (0xCF1, 0xCF2, 'Kannada'), - (0xD00, 0xD01, 'Malayalam'), - (0xD02, 0xD03, 'Malayalam'), - (0xD05, 0xD0C, 'Malayalam'), - (0xD0E, 0xD10, 'Malayalam'), - (0xD12, 0xD3A, 'Malayalam'), - (0xD3B, 0xD3C, 'Malayalam'), - (0xD3D, 0xD3D, 'Malayalam'), - (0xD3E, 0xD40, 'Malayalam'), - (0xD41, 0xD44, 'Malayalam'), - (0xD46, 0xD48, 'Malayalam'), - (0xD4A, 0xD4C, 'Malayalam'), - (0xD4D, 0xD4D, 'Malayalam'), - (0xD4E, 0xD4E, 'Malayalam'), - (0xD4F, 0xD4F, 'Malayalam'), - (0xD54, 0xD56, 'Malayalam'), - (0xD57, 0xD57, 'Malayalam'), - (0xD58, 0xD5E, 'Malayalam'), - (0xD5F, 0xD61, 'Malayalam'), - (0xD62, 0xD63, 'Malayalam'), - (0xD66, 0xD6F, 'Malayalam'), - (0xD70, 0xD78, 'Malayalam'), - (0xD79, 0xD79, 'Malayalam'), - (0xD7A, 0xD7F, 'Malayalam'), - (0xD82, 0xD83, 'Sinhala'), - (0xD85, 0xD96, 'Sinhala'), - (0xD9A, 0xDB1, 'Sinhala'), - (0xDB3, 0xDBB, 'Sinhala'), - (0xDBD, 0xDBD, 'Sinhala'), - (0xDC0, 0xDC6, 'Sinhala'), - (0xDCA, 0xDCA, 'Sinhala'), - (0xDCF, 0xDD1, 'Sinhala'), - (0xDD2, 0xDD4, 'Sinhala'), - (0xDD6, 0xDD6, 'Sinhala'), - (0xDD8, 0xDDF, 'Sinhala'), - (0xDE6, 0xDEF, 'Sinhala'), - (0xDF2, 0xDF3, 'Sinhala'), - (0xDF4, 0xDF4, 'Sinhala'), - (0xE01, 0xE30, 'Thai'), - (0xE31, 0xE31, 'Thai'), - (0xE32, 0xE33, 'Thai'), - (0xE34, 0xE3A, 'Thai'), - (0xE3F, 0xE3F, 'Common'), - (0xE40, 0xE45, 'Thai'), - (0xE46, 0xE46, 'Thai'), - (0xE47, 0xE4E, 'Thai'), - (0xE4F, 0xE4F, 'Thai'), - (0xE50, 0xE59, 'Thai'), - (0xE5A, 0xE5B, 'Thai'), - (0xE81, 0xE82, 'Lao'), - (0xE84, 0xE84, 'Lao'), - (0xE87, 0xE88, 'Lao'), - (0xE8A, 0xE8A, 'Lao'), - (0xE8D, 0xE8D, 'Lao'), - (0xE94, 0xE97, 'Lao'), - (0xE99, 0xE9F, 'Lao'), - (0xEA1, 0xEA3, 'Lao'), - (0xEA5, 0xEA5, 'Lao'), - (0xEA7, 0xEA7, 'Lao'), - (0xEAA, 0xEAB, 'Lao'), - (0xEAD, 0xEB0, 'Lao'), - (0xEB1, 0xEB1, 'Lao'), - (0xEB2, 0xEB3, 'Lao'), - (0xEB4, 0xEB9, 'Lao'), - (0xEBB, 0xEBC, 'Lao'), - (0xEBD, 0xEBD, 'Lao'), - (0xEC0, 0xEC4, 'Lao'), - (0xEC6, 0xEC6, 'Lao'), - (0xEC8, 0xECD, 'Lao'), - (0xED0, 0xED9, 'Lao'), - (0xEDC, 0xEDF, 'Lao'), - (0xF00, 0xF00, 'Tibetan'), - (0xF01, 0xF03, 'Tibetan'), - (0xF04, 0xF12, 'Tibetan'), - (0xF13, 0xF13, 'Tibetan'), - (0xF14, 0xF14, 'Tibetan'), - (0xF15, 0xF17, 'Tibetan'), - (0xF18, 0xF19, 'Tibetan'), - (0xF1A, 0xF1F, 'Tibetan'), - (0xF20, 0xF29, 'Tibetan'), - (0xF2A, 0xF33, 'Tibetan'), - (0xF34, 0xF34, 'Tibetan'), - (0xF35, 0xF35, 'Tibetan'), - (0xF36, 0xF36, 'Tibetan'), - (0xF37, 0xF37, 'Tibetan'), - (0xF38, 0xF38, 'Tibetan'), - (0xF39, 0xF39, 'Tibetan'), - (0xF3A, 0xF3A, 'Tibetan'), - (0xF3B, 0xF3B, 'Tibetan'), - (0xF3C, 0xF3C, 'Tibetan'), - (0xF3D, 0xF3D, 'Tibetan'), - (0xF3E, 0xF3F, 'Tibetan'), - (0xF40, 0xF47, 'Tibetan'), - (0xF49, 0xF6C, 'Tibetan'), - (0xF71, 0xF7E, 'Tibetan'), - (0xF7F, 0xF7F, 'Tibetan'), - (0xF80, 0xF84, 'Tibetan'), - (0xF85, 0xF85, 'Tibetan'), - (0xF86, 0xF87, 'Tibetan'), - (0xF88, 0xF8C, 'Tibetan'), - (0xF8D, 0xF97, 'Tibetan'), - (0xF99, 0xFBC, 'Tibetan'), - (0xFBE, 0xFC5, 'Tibetan'), - (0xFC6, 0xFC6, 'Tibetan'), - (0xFC7, 0xFCC, 'Tibetan'), - (0xFCE, 0xFCF, 'Tibetan'), - (0xFD0, 0xFD4, 'Tibetan'), - (0xFD5, 0xFD8, 'Common'), - (0xFD9, 0xFDA, 'Tibetan'), - (0x1000, 0x102A, 'Myanmar'), - (0x102B, 0x102C, 'Myanmar'), - (0x102D, 0x1030, 'Myanmar'), - (0x1031, 0x1031, 'Myanmar'), - (0x1032, 0x1037, 'Myanmar'), - (0x1038, 0x1038, 'Myanmar'), - (0x1039, 0x103A, 'Myanmar'), - (0x103B, 0x103C, 'Myanmar'), - (0x103D, 0x103E, 'Myanmar'), - (0x103F, 0x103F, 'Myanmar'), - (0x1040, 0x1049, 'Myanmar'), - (0x104A, 0x104F, 'Myanmar'), - (0x1050, 0x1055, 'Myanmar'), - (0x1056, 0x1057, 'Myanmar'), - (0x1058, 0x1059, 'Myanmar'), - (0x105A, 0x105D, 'Myanmar'), - (0x105E, 0x1060, 'Myanmar'), - (0x1061, 0x1061, 'Myanmar'), - (0x1062, 0x1064, 'Myanmar'), - (0x1065, 0x1066, 'Myanmar'), - (0x1067, 0x106D, 'Myanmar'), - (0x106E, 0x1070, 'Myanmar'), - (0x1071, 0x1074, 'Myanmar'), - (0x1075, 0x1081, 'Myanmar'), - (0x1082, 0x1082, 'Myanmar'), - (0x1083, 0x1084, 'Myanmar'), - (0x1085, 0x1086, 'Myanmar'), - (0x1087, 0x108C, 'Myanmar'), - (0x108D, 0x108D, 'Myanmar'), - (0x108E, 0x108E, 'Myanmar'), - (0x108F, 0x108F, 'Myanmar'), - (0x1090, 0x1099, 'Myanmar'), - (0x109A, 0x109C, 'Myanmar'), - (0x109D, 0x109D, 'Myanmar'), - (0x109E, 0x109F, 'Myanmar'), - (0x10A0, 0x10C5, 'Georgian'), - (0x10C7, 0x10C7, 'Georgian'), - (0x10CD, 0x10CD, 'Georgian'), - (0x10D0, 0x10FA, 'Georgian'), - (0x10FB, 0x10FB, 'Common'), - (0x10FC, 0x10FC, 'Georgian'), - (0x10FD, 0x10FF, 'Georgian'), - (0x1100, 0x11FF, 'Hangul'), - (0x1200, 0x1248, 'Ethiopic'), - (0x124A, 0x124D, 'Ethiopic'), - (0x1250, 0x1256, 'Ethiopic'), - (0x1258, 0x1258, 'Ethiopic'), - (0x125A, 0x125D, 'Ethiopic'), - (0x1260, 0x1288, 'Ethiopic'), - (0x128A, 0x128D, 'Ethiopic'), - (0x1290, 0x12B0, 'Ethiopic'), - (0x12B2, 0x12B5, 'Ethiopic'), - (0x12B8, 0x12BE, 'Ethiopic'), - (0x12C0, 0x12C0, 'Ethiopic'), - (0x12C2, 0x12C5, 'Ethiopic'), - (0x12C8, 0x12D6, 'Ethiopic'), - (0x12D8, 0x1310, 'Ethiopic'), - (0x1312, 0x1315, 'Ethiopic'), - (0x1318, 0x135A, 'Ethiopic'), - (0x135D, 0x135F, 'Ethiopic'), - (0x1360, 0x1368, 'Ethiopic'), - (0x1369, 0x137C, 'Ethiopic'), - (0x1380, 0x138F, 'Ethiopic'), - (0x1390, 0x1399, 'Ethiopic'), - (0x13A0, 0x13F5, 'Cherokee'), - (0x13F8, 0x13FD, 'Cherokee'), - (0x1400, 0x1400, 'Canadian_Aboriginal'), - (0x1401, 0x166C, 'Canadian_Aboriginal'), - (0x166D, 0x166E, 'Canadian_Aboriginal'), - (0x166F, 0x167F, 'Canadian_Aboriginal'), - (0x1680, 0x1680, 'Ogham'), - (0x1681, 0x169A, 'Ogham'), - (0x169B, 0x169B, 'Ogham'), - (0x169C, 0x169C, 'Ogham'), - (0x16A0, 0x16EA, 'Runic'), - (0x16EB, 0x16ED, 'Common'), - (0x16EE, 0x16F0, 'Runic'), - (0x16F1, 0x16F8, 'Runic'), - (0x1700, 0x170C, 'Tagalog'), - (0x170E, 0x1711, 'Tagalog'), - (0x1712, 0x1714, 'Tagalog'), - (0x1720, 0x1731, 'Hanunoo'), - (0x1732, 0x1734, 'Hanunoo'), - (0x1735, 0x1736, 'Common'), - (0x1740, 0x1751, 'Buhid'), - (0x1752, 0x1753, 'Buhid'), - (0x1760, 0x176C, 'Tagbanwa'), - (0x176E, 0x1770, 'Tagbanwa'), - (0x1772, 0x1773, 'Tagbanwa'), - (0x1780, 0x17B3, 'Khmer'), - (0x17B4, 0x17B5, 'Khmer'), - (0x17B6, 0x17B6, 'Khmer'), - (0x17B7, 0x17BD, 'Khmer'), - (0x17BE, 0x17C5, 'Khmer'), - (0x17C6, 0x17C6, 'Khmer'), - (0x17C7, 0x17C8, 'Khmer'), - (0x17C9, 0x17D3, 'Khmer'), - (0x17D4, 0x17D6, 'Khmer'), - (0x17D7, 0x17D7, 'Khmer'), - (0x17D8, 0x17DA, 'Khmer'), - (0x17DB, 0x17DB, 'Khmer'), - (0x17DC, 0x17DC, 'Khmer'), - (0x17DD, 0x17DD, 'Khmer'), - (0x17E0, 0x17E9, 'Khmer'), - (0x17F0, 0x17F9, 'Khmer'), - (0x1800, 0x1801, 'Mongolian'), - (0x1802, 0x1803, 'Common'), - (0x1804, 0x1804, 'Mongolian'), - (0x1805, 0x1805, 'Common'), - (0x1806, 0x1806, 'Mongolian'), - (0x1807, 0x180A, 'Mongolian'), - (0x180B, 0x180D, 'Mongolian'), - (0x180E, 0x180E, 'Mongolian'), - (0x1810, 0x1819, 'Mongolian'), - (0x1820, 0x1842, 'Mongolian'), - (0x1843, 0x1843, 'Mongolian'), - (0x1844, 0x1877, 'Mongolian'), - (0x1880, 0x1884, 'Mongolian'), - (0x1885, 0x1886, 'Mongolian'), - (0x1887, 0x18A8, 'Mongolian'), - (0x18A9, 0x18A9, 'Mongolian'), - (0x18AA, 0x18AA, 'Mongolian'), - (0x18B0, 0x18F5, 'Canadian_Aboriginal'), - (0x1900, 0x191E, 'Limbu'), - (0x1920, 0x1922, 'Limbu'), - (0x1923, 0x1926, 'Limbu'), - (0x1927, 0x1928, 'Limbu'), - (0x1929, 0x192B, 'Limbu'), - (0x1930, 0x1931, 'Limbu'), - (0x1932, 0x1932, 'Limbu'), - (0x1933, 0x1938, 'Limbu'), - (0x1939, 0x193B, 'Limbu'), - (0x1940, 0x1940, 'Limbu'), - (0x1944, 0x1945, 'Limbu'), - (0x1946, 0x194F, 'Limbu'), - (0x1950, 0x196D, 'Tai_Le'), - (0x1970, 0x1974, 'Tai_Le'), - (0x1980, 0x19AB, 'New_Tai_Lue'), - (0x19B0, 0x19C9, 'New_Tai_Lue'), - (0x19D0, 0x19D9, 'New_Tai_Lue'), - (0x19DA, 0x19DA, 'New_Tai_Lue'), - (0x19DE, 0x19DF, 'New_Tai_Lue'), - (0x19E0, 0x19FF, 'Khmer'), - (0x1A00, 0x1A16, 'Buginese'), - (0x1A17, 0x1A18, 'Buginese'), - (0x1A19, 0x1A1A, 'Buginese'), - (0x1A1B, 0x1A1B, 'Buginese'), - (0x1A1E, 0x1A1F, 'Buginese'), - (0x1A20, 0x1A54, 'Tai_Tham'), - (0x1A55, 0x1A55, 'Tai_Tham'), - (0x1A56, 0x1A56, 'Tai_Tham'), - (0x1A57, 0x1A57, 'Tai_Tham'), - (0x1A58, 0x1A5E, 'Tai_Tham'), - (0x1A60, 0x1A60, 'Tai_Tham'), - (0x1A61, 0x1A61, 'Tai_Tham'), - (0x1A62, 0x1A62, 'Tai_Tham'), - (0x1A63, 0x1A64, 'Tai_Tham'), - (0x1A65, 0x1A6C, 'Tai_Tham'), - (0x1A6D, 0x1A72, 'Tai_Tham'), - (0x1A73, 0x1A7C, 'Tai_Tham'), - (0x1A7F, 0x1A7F, 'Tai_Tham'), - (0x1A80, 0x1A89, 'Tai_Tham'), - (0x1A90, 0x1A99, 'Tai_Tham'), - (0x1AA0, 0x1AA6, 'Tai_Tham'), - (0x1AA7, 0x1AA7, 'Tai_Tham'), - (0x1AA8, 0x1AAD, 'Tai_Tham'), - (0x1AB0, 0x1ABD, 'Inherited'), - (0x1ABE, 0x1ABE, 'Inherited'), - (0x1B00, 0x1B03, 'Balinese'), - (0x1B04, 0x1B04, 'Balinese'), - (0x1B05, 0x1B33, 'Balinese'), - (0x1B34, 0x1B34, 'Balinese'), - (0x1B35, 0x1B35, 'Balinese'), - (0x1B36, 0x1B3A, 'Balinese'), - (0x1B3B, 0x1B3B, 'Balinese'), - (0x1B3C, 0x1B3C, 'Balinese'), - (0x1B3D, 0x1B41, 'Balinese'), - (0x1B42, 0x1B42, 'Balinese'), - (0x1B43, 0x1B44, 'Balinese'), - (0x1B45, 0x1B4B, 'Balinese'), - (0x1B50, 0x1B59, 'Balinese'), - (0x1B5A, 0x1B60, 'Balinese'), - (0x1B61, 0x1B6A, 'Balinese'), - (0x1B6B, 0x1B73, 'Balinese'), - (0x1B74, 0x1B7C, 'Balinese'), - (0x1B80, 0x1B81, 'Sundanese'), - (0x1B82, 0x1B82, 'Sundanese'), - (0x1B83, 0x1BA0, 'Sundanese'), - (0x1BA1, 0x1BA1, 'Sundanese'), - (0x1BA2, 0x1BA5, 'Sundanese'), - (0x1BA6, 0x1BA7, 'Sundanese'), - (0x1BA8, 0x1BA9, 'Sundanese'), - (0x1BAA, 0x1BAA, 'Sundanese'), - (0x1BAB, 0x1BAD, 'Sundanese'), - (0x1BAE, 0x1BAF, 'Sundanese'), - (0x1BB0, 0x1BB9, 'Sundanese'), - (0x1BBA, 0x1BBF, 'Sundanese'), - (0x1BC0, 0x1BE5, 'Batak'), - (0x1BE6, 0x1BE6, 'Batak'), - (0x1BE7, 0x1BE7, 'Batak'), - (0x1BE8, 0x1BE9, 'Batak'), - (0x1BEA, 0x1BEC, 'Batak'), - (0x1BED, 0x1BED, 'Batak'), - (0x1BEE, 0x1BEE, 'Batak'), - (0x1BEF, 0x1BF1, 'Batak'), - (0x1BF2, 0x1BF3, 'Batak'), - (0x1BFC, 0x1BFF, 'Batak'), - (0x1C00, 0x1C23, 'Lepcha'), - (0x1C24, 0x1C2B, 'Lepcha'), - (0x1C2C, 0x1C33, 'Lepcha'), - (0x1C34, 0x1C35, 'Lepcha'), - (0x1C36, 0x1C37, 'Lepcha'), - (0x1C3B, 0x1C3F, 'Lepcha'), - (0x1C40, 0x1C49, 'Lepcha'), - (0x1C4D, 0x1C4F, 'Lepcha'), - (0x1C50, 0x1C59, 'Ol_Chiki'), - (0x1C5A, 0x1C77, 'Ol_Chiki'), - (0x1C78, 0x1C7D, 'Ol_Chiki'), - (0x1C7E, 0x1C7F, 'Ol_Chiki'), - (0x1C80, 0x1C88, 'Cyrillic'), - (0x1CC0, 0x1CC7, 'Sundanese'), - (0x1CD0, 0x1CD2, 'Inherited'), - (0x1CD3, 0x1CD3, 'Common'), - (0x1CD4, 0x1CE0, 'Inherited'), - (0x1CE1, 0x1CE1, 'Common'), - (0x1CE2, 0x1CE8, 'Inherited'), - (0x1CE9, 0x1CEC, 'Common'), - (0x1CED, 0x1CED, 'Inherited'), - (0x1CEE, 0x1CF1, 'Common'), - (0x1CF2, 0x1CF3, 'Common'), - (0x1CF4, 0x1CF4, 'Inherited'), - (0x1CF5, 0x1CF6, 'Common'), - (0x1CF7, 0x1CF7, 'Common'), - (0x1CF8, 0x1CF9, 'Inherited'), - (0x1D00, 0x1D25, 'Latin'), - (0x1D26, 0x1D2A, 'Greek'), - (0x1D2B, 0x1D2B, 'Cyrillic'), - (0x1D2C, 0x1D5C, 'Latin'), - (0x1D5D, 0x1D61, 'Greek'), - (0x1D62, 0x1D65, 'Latin'), - (0x1D66, 0x1D6A, 'Greek'), - (0x1D6B, 0x1D77, 'Latin'), - (0x1D78, 0x1D78, 'Cyrillic'), - (0x1D79, 0x1D9A, 'Latin'), - (0x1D9B, 0x1DBE, 'Latin'), - (0x1DBF, 0x1DBF, 'Greek'), - (0x1DC0, 0x1DF9, 'Inherited'), - (0x1DFB, 0x1DFF, 'Inherited'), - (0x1E00, 0x1EFF, 'Latin'), - (0x1F00, 0x1F15, 'Greek'), - (0x1F18, 0x1F1D, 'Greek'), - (0x1F20, 0x1F45, 'Greek'), - (0x1F48, 0x1F4D, 'Greek'), - (0x1F50, 0x1F57, 'Greek'), - (0x1F59, 0x1F59, 'Greek'), - (0x1F5B, 0x1F5B, 'Greek'), - (0x1F5D, 0x1F5D, 'Greek'), - (0x1F5F, 0x1F7D, 'Greek'), - (0x1F80, 0x1FB4, 'Greek'), - (0x1FB6, 0x1FBC, 'Greek'), - (0x1FBD, 0x1FBD, 'Greek'), - (0x1FBE, 0x1FBE, 'Greek'), - (0x1FBF, 0x1FC1, 'Greek'), - (0x1FC2, 0x1FC4, 'Greek'), - (0x1FC6, 0x1FCC, 'Greek'), - (0x1FCD, 0x1FCF, 'Greek'), - (0x1FD0, 0x1FD3, 'Greek'), - (0x1FD6, 0x1FDB, 'Greek'), - (0x1FDD, 0x1FDF, 'Greek'), - (0x1FE0, 0x1FEC, 'Greek'), - (0x1FED, 0x1FEF, 'Greek'), - (0x1FF2, 0x1FF4, 'Greek'), - (0x1FF6, 0x1FFC, 'Greek'), - (0x1FFD, 0x1FFE, 'Greek'), - (0x2000, 0x200A, 'Common'), - (0x200B, 0x200B, 'Common'), - (0x200C, 0x200D, 'Inherited'), - (0x200E, 0x200F, 'Common'), - (0x2010, 0x2015, 'Common'), - (0x2016, 0x2017, 'Common'), - (0x2018, 0x2018, 'Common'), - (0x2019, 0x2019, 'Common'), - (0x201A, 0x201A, 'Common'), - (0x201B, 0x201C, 'Common'), - (0x201D, 0x201D, 'Common'), - (0x201E, 0x201E, 'Common'), - (0x201F, 0x201F, 'Common'), - (0x2020, 0x2027, 'Common'), - (0x2028, 0x2028, 'Common'), - (0x2029, 0x2029, 'Common'), - (0x202A, 0x202E, 'Common'), - (0x202F, 0x202F, 'Common'), - (0x2030, 0x2038, 'Common'), - (0x2039, 0x2039, 'Common'), - (0x203A, 0x203A, 'Common'), - (0x203B, 0x203E, 'Common'), - (0x203F, 0x2040, 'Common'), - (0x2041, 0x2043, 'Common'), - (0x2044, 0x2044, 'Common'), - (0x2045, 0x2045, 'Common'), - (0x2046, 0x2046, 'Common'), - (0x2047, 0x2051, 'Common'), - (0x2052, 0x2052, 'Common'), - (0x2053, 0x2053, 'Common'), - (0x2054, 0x2054, 'Common'), - (0x2055, 0x205E, 'Common'), - (0x205F, 0x205F, 'Common'), - (0x2060, 0x2064, 'Common'), - (0x2066, 0x206F, 'Common'), - (0x2070, 0x2070, 'Common'), - (0x2071, 0x2071, 'Latin'), - (0x2074, 0x2079, 'Common'), - (0x207A, 0x207C, 'Common'), - (0x207D, 0x207D, 'Common'), - (0x207E, 0x207E, 'Common'), - (0x207F, 0x207F, 'Latin'), - (0x2080, 0x2089, 'Common'), - (0x208A, 0x208C, 'Common'), - (0x208D, 0x208D, 'Common'), - (0x208E, 0x208E, 'Common'), - (0x2090, 0x209C, 'Latin'), - (0x20A0, 0x20BF, 'Common'), - (0x20D0, 0x20DC, 'Inherited'), - (0x20DD, 0x20E0, 'Inherited'), - (0x20E1, 0x20E1, 'Inherited'), - (0x20E2, 0x20E4, 'Inherited'), - (0x20E5, 0x20F0, 'Inherited'), - (0x2100, 0x2101, 'Common'), - (0x2102, 0x2102, 'Common'), - (0x2103, 0x2106, 'Common'), - (0x2107, 0x2107, 'Common'), - (0x2108, 0x2109, 'Common'), - (0x210A, 0x2113, 'Common'), - (0x2114, 0x2114, 'Common'), - (0x2115, 0x2115, 'Common'), - (0x2116, 0x2117, 'Common'), - (0x2118, 0x2118, 'Common'), - (0x2119, 0x211D, 'Common'), - (0x211E, 0x2123, 'Common'), - (0x2124, 0x2124, 'Common'), - (0x2125, 0x2125, 'Common'), - (0x2126, 0x2126, 'Greek'), - (0x2127, 0x2127, 'Common'), - (0x2128, 0x2128, 'Common'), - (0x2129, 0x2129, 'Common'), - (0x212A, 0x212B, 'Latin'), - (0x212C, 0x212D, 'Common'), - (0x212E, 0x212E, 'Common'), - (0x212F, 0x2131, 'Common'), - (0x2132, 0x2132, 'Latin'), - (0x2133, 0x2134, 'Common'), - (0x2135, 0x2138, 'Common'), - (0x2139, 0x2139, 'Common'), - (0x213A, 0x213B, 'Common'), - (0x213C, 0x213F, 'Common'), - (0x2140, 0x2144, 'Common'), - (0x2145, 0x2149, 'Common'), - (0x214A, 0x214A, 'Common'), - (0x214B, 0x214B, 'Common'), - (0x214C, 0x214D, 'Common'), - (0x214E, 0x214E, 'Latin'), - (0x214F, 0x214F, 'Common'), - (0x2150, 0x215F, 'Common'), - (0x2160, 0x2182, 'Latin'), - (0x2183, 0x2184, 'Latin'), - (0x2185, 0x2188, 'Latin'), - (0x2189, 0x2189, 'Common'), - (0x218A, 0x218B, 'Common'), - (0x2190, 0x2194, 'Common'), - (0x2195, 0x2199, 'Common'), - (0x219A, 0x219B, 'Common'), - (0x219C, 0x219F, 'Common'), - (0x21A0, 0x21A0, 'Common'), - (0x21A1, 0x21A2, 'Common'), - (0x21A3, 0x21A3, 'Common'), - (0x21A4, 0x21A5, 'Common'), - (0x21A6, 0x21A6, 'Common'), - (0x21A7, 0x21AD, 'Common'), - (0x21AE, 0x21AE, 'Common'), - (0x21AF, 0x21CD, 'Common'), - (0x21CE, 0x21CF, 'Common'), - (0x21D0, 0x21D1, 'Common'), - (0x21D2, 0x21D2, 'Common'), - (0x21D3, 0x21D3, 'Common'), - (0x21D4, 0x21D4, 'Common'), - (0x21D5, 0x21F3, 'Common'), - (0x21F4, 0x22FF, 'Common'), - (0x2300, 0x2307, 'Common'), - (0x2308, 0x2308, 'Common'), - (0x2309, 0x2309, 'Common'), - (0x230A, 0x230A, 'Common'), - (0x230B, 0x230B, 'Common'), - (0x230C, 0x231F, 'Common'), - (0x2320, 0x2321, 'Common'), - (0x2322, 0x2328, 'Common'), - (0x2329, 0x2329, 'Common'), - (0x232A, 0x232A, 'Common'), - (0x232B, 0x237B, 'Common'), - (0x237C, 0x237C, 'Common'), - (0x237D, 0x239A, 'Common'), - (0x239B, 0x23B3, 'Common'), - (0x23B4, 0x23DB, 'Common'), - (0x23DC, 0x23E1, 'Common'), - (0x23E2, 0x2426, 'Common'), - (0x2440, 0x244A, 'Common'), - (0x2460, 0x249B, 'Common'), - (0x249C, 0x24E9, 'Common'), - (0x24EA, 0x24FF, 'Common'), - (0x2500, 0x25B6, 'Common'), - (0x25B7, 0x25B7, 'Common'), - (0x25B8, 0x25C0, 'Common'), - (0x25C1, 0x25C1, 'Common'), - (0x25C2, 0x25F7, 'Common'), - (0x25F8, 0x25FF, 'Common'), - (0x2600, 0x266E, 'Common'), - (0x266F, 0x266F, 'Common'), - (0x2670, 0x2767, 'Common'), - (0x2768, 0x2768, 'Common'), - (0x2769, 0x2769, 'Common'), - (0x276A, 0x276A, 'Common'), - (0x276B, 0x276B, 'Common'), - (0x276C, 0x276C, 'Common'), - (0x276D, 0x276D, 'Common'), - (0x276E, 0x276E, 'Common'), - (0x276F, 0x276F, 'Common'), - (0x2770, 0x2770, 'Common'), - (0x2771, 0x2771, 'Common'), - (0x2772, 0x2772, 'Common'), - (0x2773, 0x2773, 'Common'), - (0x2774, 0x2774, 'Common'), - (0x2775, 0x2775, 'Common'), - (0x2776, 0x2793, 'Common'), - (0x2794, 0x27BF, 'Common'), - (0x27C0, 0x27C4, 'Common'), - (0x27C5, 0x27C5, 'Common'), - (0x27C6, 0x27C6, 'Common'), - (0x27C7, 0x27E5, 'Common'), - (0x27E6, 0x27E6, 'Common'), - (0x27E7, 0x27E7, 'Common'), - (0x27E8, 0x27E8, 'Common'), - (0x27E9, 0x27E9, 'Common'), - (0x27EA, 0x27EA, 'Common'), - (0x27EB, 0x27EB, 'Common'), - (0x27EC, 0x27EC, 'Common'), - (0x27ED, 0x27ED, 'Common'), - (0x27EE, 0x27EE, 'Common'), - (0x27EF, 0x27EF, 'Common'), - (0x27F0, 0x27FF, 'Common'), - (0x2800, 0x28FF, 'Braille'), - (0x2900, 0x2982, 'Common'), - (0x2983, 0x2983, 'Common'), - (0x2984, 0x2984, 'Common'), - (0x2985, 0x2985, 'Common'), - (0x2986, 0x2986, 'Common'), - (0x2987, 0x2987, 'Common'), - (0x2988, 0x2988, 'Common'), - (0x2989, 0x2989, 'Common'), - (0x298A, 0x298A, 'Common'), - (0x298B, 0x298B, 'Common'), - (0x298C, 0x298C, 'Common'), - (0x298D, 0x298D, 'Common'), - (0x298E, 0x298E, 'Common'), - (0x298F, 0x298F, 'Common'), - (0x2990, 0x2990, 'Common'), - (0x2991, 0x2991, 'Common'), - (0x2992, 0x2992, 'Common'), - (0x2993, 0x2993, 'Common'), - (0x2994, 0x2994, 'Common'), - (0x2995, 0x2995, 'Common'), - (0x2996, 0x2996, 'Common'), - (0x2997, 0x2997, 'Common'), - (0x2998, 0x2998, 'Common'), - (0x2999, 0x29D7, 'Common'), - (0x29D8, 0x29D8, 'Common'), - (0x29D9, 0x29D9, 'Common'), - (0x29DA, 0x29DA, 'Common'), - (0x29DB, 0x29DB, 'Common'), - (0x29DC, 0x29FB, 'Common'), - (0x29FC, 0x29FC, 'Common'), - (0x29FD, 0x29FD, 'Common'), - (0x29FE, 0x2AFF, 'Common'), - (0x2B00, 0x2B2F, 'Common'), - (0x2B30, 0x2B44, 'Common'), - (0x2B45, 0x2B46, 'Common'), - (0x2B47, 0x2B4C, 'Common'), - (0x2B4D, 0x2B73, 'Common'), - (0x2B76, 0x2B95, 'Common'), - (0x2B98, 0x2BB9, 'Common'), - (0x2BBD, 0x2BC8, 'Common'), - (0x2BCA, 0x2BD2, 'Common'), - (0x2BEC, 0x2BEF, 'Common'), - (0x2C00, 0x2C2E, 'Glagolitic'), - (0x2C30, 0x2C5E, 'Glagolitic'), - (0x2C60, 0x2C7B, 'Latin'), - (0x2C7C, 0x2C7D, 'Latin'), - (0x2C7E, 0x2C7F, 'Latin'), - (0x2C80, 0x2CE4, 'Coptic'), - (0x2CE5, 0x2CEA, 'Coptic'), - (0x2CEB, 0x2CEE, 'Coptic'), - (0x2CEF, 0x2CF1, 'Coptic'), - (0x2CF2, 0x2CF3, 'Coptic'), - (0x2CF9, 0x2CFC, 'Coptic'), - (0x2CFD, 0x2CFD, 'Coptic'), - (0x2CFE, 0x2CFF, 'Coptic'), - (0x2D00, 0x2D25, 'Georgian'), - (0x2D27, 0x2D27, 'Georgian'), - (0x2D2D, 0x2D2D, 'Georgian'), - (0x2D30, 0x2D67, 'Tifinagh'), - (0x2D6F, 0x2D6F, 'Tifinagh'), - (0x2D70, 0x2D70, 'Tifinagh'), - (0x2D7F, 0x2D7F, 'Tifinagh'), - (0x2D80, 0x2D96, 'Ethiopic'), - (0x2DA0, 0x2DA6, 'Ethiopic'), - (0x2DA8, 0x2DAE, 'Ethiopic'), - (0x2DB0, 0x2DB6, 'Ethiopic'), - (0x2DB8, 0x2DBE, 'Ethiopic'), - (0x2DC0, 0x2DC6, 'Ethiopic'), - (0x2DC8, 0x2DCE, 'Ethiopic'), - (0x2DD0, 0x2DD6, 'Ethiopic'), - (0x2DD8, 0x2DDE, 'Ethiopic'), - (0x2DE0, 0x2DFF, 'Cyrillic'), - (0x2E00, 0x2E01, 'Common'), - (0x2E02, 0x2E02, 'Common'), - (0x2E03, 0x2E03, 'Common'), - (0x2E04, 0x2E04, 'Common'), - (0x2E05, 0x2E05, 'Common'), - (0x2E06, 0x2E08, 'Common'), - (0x2E09, 0x2E09, 'Common'), - (0x2E0A, 0x2E0A, 'Common'), - (0x2E0B, 0x2E0B, 'Common'), - (0x2E0C, 0x2E0C, 'Common'), - (0x2E0D, 0x2E0D, 'Common'), - (0x2E0E, 0x2E16, 'Common'), - (0x2E17, 0x2E17, 'Common'), - (0x2E18, 0x2E19, 'Common'), - (0x2E1A, 0x2E1A, 'Common'), - (0x2E1B, 0x2E1B, 'Common'), - (0x2E1C, 0x2E1C, 'Common'), - (0x2E1D, 0x2E1D, 'Common'), - (0x2E1E, 0x2E1F, 'Common'), - (0x2E20, 0x2E20, 'Common'), - (0x2E21, 0x2E21, 'Common'), - (0x2E22, 0x2E22, 'Common'), - (0x2E23, 0x2E23, 'Common'), - (0x2E24, 0x2E24, 'Common'), - (0x2E25, 0x2E25, 'Common'), - (0x2E26, 0x2E26, 'Common'), - (0x2E27, 0x2E27, 'Common'), - (0x2E28, 0x2E28, 'Common'), - (0x2E29, 0x2E29, 'Common'), - (0x2E2A, 0x2E2E, 'Common'), - (0x2E2F, 0x2E2F, 'Common'), - (0x2E30, 0x2E39, 'Common'), - (0x2E3A, 0x2E3B, 'Common'), - (0x2E3C, 0x2E3F, 'Common'), - (0x2E40, 0x2E40, 'Common'), - (0x2E41, 0x2E41, 'Common'), - (0x2E42, 0x2E42, 'Common'), - (0x2E43, 0x2E49, 'Common'), - (0x2E80, 0x2E99, 'Han'), - (0x2E9B, 0x2EF3, 'Han'), - (0x2F00, 0x2FD5, 'Han'), - (0x2FF0, 0x2FFB, 'Common'), - (0x3000, 0x3000, 'Common'), - (0x3001, 0x3003, 'Common'), - (0x3004, 0x3004, 'Common'), - (0x3005, 0x3005, 'Han'), - (0x3006, 0x3006, 'Common'), - (0x3007, 0x3007, 'Han'), - (0x3008, 0x3008, 'Common'), - (0x3009, 0x3009, 'Common'), - (0x300A, 0x300A, 'Common'), - (0x300B, 0x300B, 'Common'), - (0x300C, 0x300C, 'Common'), - (0x300D, 0x300D, 'Common'), - (0x300E, 0x300E, 'Common'), - (0x300F, 0x300F, 'Common'), - (0x3010, 0x3010, 'Common'), - (0x3011, 0x3011, 'Common'), - (0x3012, 0x3013, 'Common'), - (0x3014, 0x3014, 'Common'), - (0x3015, 0x3015, 'Common'), - (0x3016, 0x3016, 'Common'), - (0x3017, 0x3017, 'Common'), - (0x3018, 0x3018, 'Common'), - (0x3019, 0x3019, 'Common'), - (0x301A, 0x301A, 'Common'), - (0x301B, 0x301B, 'Common'), - (0x301C, 0x301C, 'Common'), - (0x301D, 0x301D, 'Common'), - (0x301E, 0x301F, 'Common'), - (0x3020, 0x3020, 'Common'), - (0x3021, 0x3029, 'Han'), - (0x302A, 0x302D, 'Inherited'), - (0x302E, 0x302F, 'Hangul'), - (0x3030, 0x3030, 'Common'), - (0x3031, 0x3035, 'Common'), - (0x3036, 0x3037, 'Common'), - (0x3038, 0x303A, 'Han'), - (0x303B, 0x303B, 'Han'), - (0x303C, 0x303C, 'Common'), - (0x303D, 0x303D, 'Common'), - (0x303E, 0x303F, 'Common'), - (0x3041, 0x3096, 'Hiragana'), - (0x3099, 0x309A, 'Inherited'), - (0x309B, 0x309C, 'Common'), - (0x309D, 0x309E, 'Hiragana'), - (0x309F, 0x309F, 'Hiragana'), - (0x30A0, 0x30A0, 'Common'), - (0x30A1, 0x30FA, 'Katakana'), - (0x30FB, 0x30FB, 'Common'), - (0x30FC, 0x30FC, 'Common'), - (0x30FD, 0x30FE, 'Katakana'), - (0x30FF, 0x30FF, 'Katakana'), - (0x3105, 0x312E, 'Bopomofo'), - (0x3131, 0x318E, 'Hangul'), - (0x3190, 0x3191, 'Common'), - (0x3192, 0x3195, 'Common'), - (0x3196, 0x319F, 'Common'), - (0x31A0, 0x31BA, 'Bopomofo'), - (0x31C0, 0x31E3, 'Common'), - (0x31F0, 0x31FF, 'Katakana'), - (0x3200, 0x321E, 'Hangul'), - (0x3220, 0x3229, 'Common'), - (0x322A, 0x3247, 'Common'), - (0x3248, 0x324F, 'Common'), - (0x3250, 0x3250, 'Common'), - (0x3251, 0x325F, 'Common'), - (0x3260, 0x327E, 'Hangul'), - (0x327F, 0x327F, 'Common'), - (0x3280, 0x3289, 'Common'), - (0x328A, 0x32B0, 'Common'), - (0x32B1, 0x32BF, 'Common'), - (0x32C0, 0x32CF, 'Common'), - (0x32D0, 0x32FE, 'Katakana'), - (0x3300, 0x3357, 'Katakana'), - (0x3358, 0x33FF, 'Common'), - (0x3400, 0x4DB5, 'Han'), - (0x4DC0, 0x4DFF, 'Common'), - (0x4E00, 0x9FEA, 'Han'), - (0xA000, 0xA014, 'Yi'), - (0xA015, 0xA015, 'Yi'), - (0xA016, 0xA48C, 'Yi'), - (0xA490, 0xA4C6, 'Yi'), - (0xA4D0, 0xA4F7, 'Lisu'), - (0xA4F8, 0xA4FD, 'Lisu'), - (0xA4FE, 0xA4FF, 'Lisu'), - (0xA500, 0xA60B, 'Vai'), - (0xA60C, 0xA60C, 'Vai'), - (0xA60D, 0xA60F, 'Vai'), - (0xA610, 0xA61F, 'Vai'), - (0xA620, 0xA629, 'Vai'), - (0xA62A, 0xA62B, 'Vai'), - (0xA640, 0xA66D, 'Cyrillic'), - (0xA66E, 0xA66E, 'Cyrillic'), - (0xA66F, 0xA66F, 'Cyrillic'), - (0xA670, 0xA672, 'Cyrillic'), - (0xA673, 0xA673, 'Cyrillic'), - (0xA674, 0xA67D, 'Cyrillic'), - (0xA67E, 0xA67E, 'Cyrillic'), - (0xA67F, 0xA67F, 'Cyrillic'), - (0xA680, 0xA69B, 'Cyrillic'), - (0xA69C, 0xA69D, 'Cyrillic'), - (0xA69E, 0xA69F, 'Cyrillic'), - (0xA6A0, 0xA6E5, 'Bamum'), - (0xA6E6, 0xA6EF, 'Bamum'), - (0xA6F0, 0xA6F1, 'Bamum'), - (0xA6F2, 0xA6F7, 'Bamum'), - (0xA700, 0xA716, 'Common'), - (0xA717, 0xA71F, 'Common'), - (0xA720, 0xA721, 'Common'), - (0xA722, 0xA76F, 'Latin'), - (0xA770, 0xA770, 'Latin'), - (0xA771, 0xA787, 'Latin'), - (0xA788, 0xA788, 'Common'), - (0xA789, 0xA78A, 'Common'), - (0xA78B, 0xA78E, 'Latin'), - (0xA78F, 0xA78F, 'Latin'), - (0xA790, 0xA7AE, 'Latin'), - (0xA7B0, 0xA7B7, 'Latin'), - (0xA7F7, 0xA7F7, 'Latin'), - (0xA7F8, 0xA7F9, 'Latin'), - (0xA7FA, 0xA7FA, 'Latin'), - (0xA7FB, 0xA7FF, 'Latin'), - (0xA800, 0xA801, 'Syloti_Nagri'), - (0xA802, 0xA802, 'Syloti_Nagri'), - (0xA803, 0xA805, 'Syloti_Nagri'), - (0xA806, 0xA806, 'Syloti_Nagri'), - (0xA807, 0xA80A, 'Syloti_Nagri'), - (0xA80B, 0xA80B, 'Syloti_Nagri'), - (0xA80C, 0xA822, 'Syloti_Nagri'), - (0xA823, 0xA824, 'Syloti_Nagri'), - (0xA825, 0xA826, 'Syloti_Nagri'), - (0xA827, 0xA827, 'Syloti_Nagri'), - (0xA828, 0xA82B, 'Syloti_Nagri'), - (0xA830, 0xA835, 'Common'), - (0xA836, 0xA837, 'Common'), - (0xA838, 0xA838, 'Common'), - (0xA839, 0xA839, 'Common'), - (0xA840, 0xA873, 'Phags_Pa'), - (0xA874, 0xA877, 'Phags_Pa'), - (0xA880, 0xA881, 'Saurashtra'), - (0xA882, 0xA8B3, 'Saurashtra'), - (0xA8B4, 0xA8C3, 'Saurashtra'), - (0xA8C4, 0xA8C5, 'Saurashtra'), - (0xA8CE, 0xA8CF, 'Saurashtra'), - (0xA8D0, 0xA8D9, 'Saurashtra'), - (0xA8E0, 0xA8F1, 'Devanagari'), - (0xA8F2, 0xA8F7, 'Devanagari'), - (0xA8F8, 0xA8FA, 'Devanagari'), - (0xA8FB, 0xA8FB, 'Devanagari'), - (0xA8FC, 0xA8FC, 'Devanagari'), - (0xA8FD, 0xA8FD, 'Devanagari'), - (0xA900, 0xA909, 'Kayah_Li'), - (0xA90A, 0xA925, 'Kayah_Li'), - (0xA926, 0xA92D, 'Kayah_Li'), - (0xA92E, 0xA92E, 'Common'), - (0xA92F, 0xA92F, 'Kayah_Li'), - (0xA930, 0xA946, 'Rejang'), - (0xA947, 0xA951, 'Rejang'), - (0xA952, 0xA953, 'Rejang'), - (0xA95F, 0xA95F, 'Rejang'), - (0xA960, 0xA97C, 'Hangul'), - (0xA980, 0xA982, 'Javanese'), - (0xA983, 0xA983, 'Javanese'), - (0xA984, 0xA9B2, 'Javanese'), - (0xA9B3, 0xA9B3, 'Javanese'), - (0xA9B4, 0xA9B5, 'Javanese'), - (0xA9B6, 0xA9B9, 'Javanese'), - (0xA9BA, 0xA9BB, 'Javanese'), - (0xA9BC, 0xA9BC, 'Javanese'), - (0xA9BD, 0xA9C0, 'Javanese'), - (0xA9C1, 0xA9CD, 'Javanese'), - (0xA9CF, 0xA9CF, 'Common'), - (0xA9D0, 0xA9D9, 'Javanese'), - (0xA9DE, 0xA9DF, 'Javanese'), - (0xA9E0, 0xA9E4, 'Myanmar'), - (0xA9E5, 0xA9E5, 'Myanmar'), - (0xA9E6, 0xA9E6, 'Myanmar'), - (0xA9E7, 0xA9EF, 'Myanmar'), - (0xA9F0, 0xA9F9, 'Myanmar'), - (0xA9FA, 0xA9FE, 'Myanmar'), - (0xAA00, 0xAA28, 'Cham'), - (0xAA29, 0xAA2E, 'Cham'), - (0xAA2F, 0xAA30, 'Cham'), - (0xAA31, 0xAA32, 'Cham'), - (0xAA33, 0xAA34, 'Cham'), - (0xAA35, 0xAA36, 'Cham'), - (0xAA40, 0xAA42, 'Cham'), - (0xAA43, 0xAA43, 'Cham'), - (0xAA44, 0xAA4B, 'Cham'), - (0xAA4C, 0xAA4C, 'Cham'), - (0xAA4D, 0xAA4D, 'Cham'), - (0xAA50, 0xAA59, 'Cham'), - (0xAA5C, 0xAA5F, 'Cham'), - (0xAA60, 0xAA6F, 'Myanmar'), - (0xAA70, 0xAA70, 'Myanmar'), - (0xAA71, 0xAA76, 'Myanmar'), - (0xAA77, 0xAA79, 'Myanmar'), - (0xAA7A, 0xAA7A, 'Myanmar'), - (0xAA7B, 0xAA7B, 'Myanmar'), - (0xAA7C, 0xAA7C, 'Myanmar'), - (0xAA7D, 0xAA7D, 'Myanmar'), - (0xAA7E, 0xAA7F, 'Myanmar'), - (0xAA80, 0xAAAF, 'Tai_Viet'), - (0xAAB0, 0xAAB0, 'Tai_Viet'), - (0xAAB1, 0xAAB1, 'Tai_Viet'), - (0xAAB2, 0xAAB4, 'Tai_Viet'), - (0xAAB5, 0xAAB6, 'Tai_Viet'), - (0xAAB7, 0xAAB8, 'Tai_Viet'), - (0xAAB9, 0xAABD, 'Tai_Viet'), - (0xAABE, 0xAABF, 'Tai_Viet'), - (0xAAC0, 0xAAC0, 'Tai_Viet'), - (0xAAC1, 0xAAC1, 'Tai_Viet'), - (0xAAC2, 0xAAC2, 'Tai_Viet'), - (0xAADB, 0xAADC, 'Tai_Viet'), - (0xAADD, 0xAADD, 'Tai_Viet'), - (0xAADE, 0xAADF, 'Tai_Viet'), - (0xAAE0, 0xAAEA, 'Meetei_Mayek'), - (0xAAEB, 0xAAEB, 'Meetei_Mayek'), - (0xAAEC, 0xAAED, 'Meetei_Mayek'), - (0xAAEE, 0xAAEF, 'Meetei_Mayek'), - (0xAAF0, 0xAAF1, 'Meetei_Mayek'), - (0xAAF2, 0xAAF2, 'Meetei_Mayek'), - (0xAAF3, 0xAAF4, 'Meetei_Mayek'), - (0xAAF5, 0xAAF5, 'Meetei_Mayek'), - (0xAAF6, 0xAAF6, 'Meetei_Mayek'), - (0xAB01, 0xAB06, 'Ethiopic'), - (0xAB09, 0xAB0E, 'Ethiopic'), - (0xAB11, 0xAB16, 'Ethiopic'), - (0xAB20, 0xAB26, 'Ethiopic'), - (0xAB28, 0xAB2E, 'Ethiopic'), - (0xAB30, 0xAB5A, 'Latin'), - (0xAB5B, 0xAB5B, 'Common'), - (0xAB5C, 0xAB5F, 'Latin'), - (0xAB60, 0xAB64, 'Latin'), - (0xAB65, 0xAB65, 'Greek'), - (0xAB70, 0xABBF, 'Cherokee'), - (0xABC0, 0xABE2, 'Meetei_Mayek'), - (0xABE3, 0xABE4, 'Meetei_Mayek'), - (0xABE5, 0xABE5, 'Meetei_Mayek'), - (0xABE6, 0xABE7, 'Meetei_Mayek'), - (0xABE8, 0xABE8, 'Meetei_Mayek'), - (0xABE9, 0xABEA, 'Meetei_Mayek'), - (0xABEB, 0xABEB, 'Meetei_Mayek'), - (0xABEC, 0xABEC, 'Meetei_Mayek'), - (0xABED, 0xABED, 'Meetei_Mayek'), - (0xABF0, 0xABF9, 'Meetei_Mayek'), - (0xAC00, 0xD7A3, 'Hangul'), - (0xD7B0, 0xD7C6, 'Hangul'), - (0xD7CB, 0xD7FB, 'Hangul'), - (0xF900, 0xFA6D, 'Han'), - (0xFA70, 0xFAD9, 'Han'), - (0xFB00, 0xFB06, 'Latin'), - (0xFB13, 0xFB17, 'Armenian'), - (0xFB1D, 0xFB1D, 'Hebrew'), - (0xFB1E, 0xFB1E, 'Hebrew'), - (0xFB1F, 0xFB28, 'Hebrew'), - (0xFB29, 0xFB29, 'Hebrew'), - (0xFB2A, 0xFB36, 'Hebrew'), - (0xFB38, 0xFB3C, 'Hebrew'), - (0xFB3E, 0xFB3E, 'Hebrew'), - (0xFB40, 0xFB41, 'Hebrew'), - (0xFB43, 0xFB44, 'Hebrew'), - (0xFB46, 0xFB4F, 'Hebrew'), - (0xFB50, 0xFBB1, 'Arabic'), - (0xFBB2, 0xFBC1, 'Arabic'), - (0xFBD3, 0xFD3D, 'Arabic'), - (0xFD3E, 0xFD3E, 'Common'), - (0xFD3F, 0xFD3F, 'Common'), - (0xFD50, 0xFD8F, 'Arabic'), - (0xFD92, 0xFDC7, 'Arabic'), - (0xFDF0, 0xFDFB, 'Arabic'), - (0xFDFC, 0xFDFC, 'Arabic'), - (0xFDFD, 0xFDFD, 'Arabic'), - (0xFE00, 0xFE0F, 'Inherited'), - (0xFE10, 0xFE16, 'Common'), - (0xFE17, 0xFE17, 'Common'), - (0xFE18, 0xFE18, 'Common'), - (0xFE19, 0xFE19, 'Common'), - (0xFE20, 0xFE2D, 'Inherited'), - (0xFE2E, 0xFE2F, 'Cyrillic'), - (0xFE30, 0xFE30, 'Common'), - (0xFE31, 0xFE32, 'Common'), - (0xFE33, 0xFE34, 'Common'), - (0xFE35, 0xFE35, 'Common'), - (0xFE36, 0xFE36, 'Common'), - (0xFE37, 0xFE37, 'Common'), - (0xFE38, 0xFE38, 'Common'), - (0xFE39, 0xFE39, 'Common'), - (0xFE3A, 0xFE3A, 'Common'), - (0xFE3B, 0xFE3B, 'Common'), - (0xFE3C, 0xFE3C, 'Common'), - (0xFE3D, 0xFE3D, 'Common'), - (0xFE3E, 0xFE3E, 'Common'), - (0xFE3F, 0xFE3F, 'Common'), - (0xFE40, 0xFE40, 'Common'), - (0xFE41, 0xFE41, 'Common'), - (0xFE42, 0xFE42, 'Common'), - (0xFE43, 0xFE43, 'Common'), - (0xFE44, 0xFE44, 'Common'), - (0xFE45, 0xFE46, 'Common'), - (0xFE47, 0xFE47, 'Common'), - (0xFE48, 0xFE48, 'Common'), - (0xFE49, 0xFE4C, 'Common'), - (0xFE4D, 0xFE4F, 'Common'), - (0xFE50, 0xFE52, 'Common'), - (0xFE54, 0xFE57, 'Common'), - (0xFE58, 0xFE58, 'Common'), - (0xFE59, 0xFE59, 'Common'), - (0xFE5A, 0xFE5A, 'Common'), - (0xFE5B, 0xFE5B, 'Common'), - (0xFE5C, 0xFE5C, 'Common'), - (0xFE5D, 0xFE5D, 'Common'), - (0xFE5E, 0xFE5E, 'Common'), - (0xFE5F, 0xFE61, 'Common'), - (0xFE62, 0xFE62, 'Common'), - (0xFE63, 0xFE63, 'Common'), - (0xFE64, 0xFE66, 'Common'), - (0xFE68, 0xFE68, 'Common'), - (0xFE69, 0xFE69, 'Common'), - (0xFE6A, 0xFE6B, 'Common'), - (0xFE70, 0xFE74, 'Arabic'), - (0xFE76, 0xFEFC, 'Arabic'), - (0xFEFF, 0xFEFF, 'Common'), - (0xFF01, 0xFF03, 'Common'), - (0xFF04, 0xFF04, 'Common'), - (0xFF05, 0xFF07, 'Common'), - (0xFF08, 0xFF08, 'Common'), - (0xFF09, 0xFF09, 'Common'), - (0xFF0A, 0xFF0A, 'Common'), - (0xFF0B, 0xFF0B, 'Common'), - (0xFF0C, 0xFF0C, 'Common'), - (0xFF0D, 0xFF0D, 'Common'), - (0xFF0E, 0xFF0F, 'Common'), - (0xFF10, 0xFF19, 'Common'), - (0xFF1A, 0xFF1B, 'Common'), - (0xFF1C, 0xFF1E, 'Common'), - (0xFF1F, 0xFF20, 'Common'), - (0xFF21, 0xFF3A, 'Latin'), - (0xFF3B, 0xFF3B, 'Common'), - (0xFF3C, 0xFF3C, 'Common'), - (0xFF3D, 0xFF3D, 'Common'), - (0xFF3E, 0xFF3E, 'Common'), - (0xFF3F, 0xFF3F, 'Common'), - (0xFF40, 0xFF40, 'Common'), - (0xFF41, 0xFF5A, 'Latin'), - (0xFF5B, 0xFF5B, 'Common'), - (0xFF5C, 0xFF5C, 'Common'), - (0xFF5D, 0xFF5D, 'Common'), - (0xFF5E, 0xFF5E, 'Common'), - (0xFF5F, 0xFF5F, 'Common'), - (0xFF60, 0xFF60, 'Common'), - (0xFF61, 0xFF61, 'Common'), - (0xFF62, 0xFF62, 'Common'), - (0xFF63, 0xFF63, 'Common'), - (0xFF64, 0xFF65, 'Common'), - (0xFF66, 0xFF6F, 'Katakana'), - (0xFF70, 0xFF70, 'Common'), - (0xFF71, 0xFF9D, 'Katakana'), - (0xFF9E, 0xFF9F, 'Common'), - (0xFFA0, 0xFFBE, 'Hangul'), - (0xFFC2, 0xFFC7, 'Hangul'), - (0xFFCA, 0xFFCF, 'Hangul'), - (0xFFD2, 0xFFD7, 'Hangul'), - (0xFFDA, 0xFFDC, 'Hangul'), - (0xFFE0, 0xFFE1, 'Common'), - (0xFFE2, 0xFFE2, 'Common'), - (0xFFE3, 0xFFE3, 'Common'), - (0xFFE4, 0xFFE4, 'Common'), - (0xFFE5, 0xFFE6, 'Common'), - (0xFFE8, 0xFFE8, 'Common'), - (0xFFE9, 0xFFEC, 'Common'), - (0xFFED, 0xFFEE, 'Common'), - (0xFFF9, 0xFFFB, 'Common'), - (0xFFFC, 0xFFFD, 'Common'), - (0x10000, 0x1000B, 'Linear_B'), - (0x1000D, 0x10026, 'Linear_B'), - (0x10028, 0x1003A, 'Linear_B'), - (0x1003C, 0x1003D, 'Linear_B'), - (0x1003F, 0x1004D, 'Linear_B'), - (0x10050, 0x1005D, 'Linear_B'), - (0x10080, 0x100FA, 'Linear_B'), - (0x10100, 0x10102, 'Common'), - (0x10107, 0x10133, 'Common'), - (0x10137, 0x1013F, 'Common'), - (0x10140, 0x10174, 'Greek'), - (0x10175, 0x10178, 'Greek'), - (0x10179, 0x10189, 'Greek'), - (0x1018A, 0x1018B, 'Greek'), - (0x1018C, 0x1018E, 'Greek'), - (0x10190, 0x1019B, 'Common'), - (0x101A0, 0x101A0, 'Greek'), - (0x101D0, 0x101FC, 'Common'), - (0x101FD, 0x101FD, 'Inherited'), - (0x10280, 0x1029C, 'Lycian'), - (0x102A0, 0x102D0, 'Carian'), - (0x102E0, 0x102E0, 'Inherited'), - (0x102E1, 0x102FB, 'Common'), - (0x10300, 0x1031F, 'Old_Italic'), - (0x10320, 0x10323, 'Old_Italic'), - (0x1032D, 0x1032F, 'Old_Italic'), - (0x10330, 0x10340, 'Gothic'), - (0x10341, 0x10341, 'Gothic'), - (0x10342, 0x10349, 'Gothic'), - (0x1034A, 0x1034A, 'Gothic'), - (0x10350, 0x10375, 'Old_Permic'), - (0x10376, 0x1037A, 'Old_Permic'), - (0x10380, 0x1039D, 'Ugaritic'), - (0x1039F, 0x1039F, 'Ugaritic'), - (0x103A0, 0x103C3, 'Old_Persian'), - (0x103C8, 0x103CF, 'Old_Persian'), - (0x103D0, 0x103D0, 'Old_Persian'), - (0x103D1, 0x103D5, 'Old_Persian'), - (0x10400, 0x1044F, 'Deseret'), - (0x10450, 0x1047F, 'Shavian'), - (0x10480, 0x1049D, 'Osmanya'), - (0x104A0, 0x104A9, 'Osmanya'), - (0x104B0, 0x104D3, 'Osage'), - (0x104D8, 0x104FB, 'Osage'), - (0x10500, 0x10527, 'Elbasan'), - (0x10530, 0x10563, 'Caucasian_Albanian'), - (0x1056F, 0x1056F, 'Caucasian_Albanian'), - (0x10600, 0x10736, 'Linear_A'), - (0x10740, 0x10755, 'Linear_A'), - (0x10760, 0x10767, 'Linear_A'), - (0x10800, 0x10805, 'Cypriot'), - (0x10808, 0x10808, 'Cypriot'), - (0x1080A, 0x10835, 'Cypriot'), - (0x10837, 0x10838, 'Cypriot'), - (0x1083C, 0x1083C, 'Cypriot'), - (0x1083F, 0x1083F, 'Cypriot'), - (0x10840, 0x10855, 'Imperial_Aramaic'), - (0x10857, 0x10857, 'Imperial_Aramaic'), - (0x10858, 0x1085F, 'Imperial_Aramaic'), - (0x10860, 0x10876, 'Palmyrene'), - (0x10877, 0x10878, 'Palmyrene'), - (0x10879, 0x1087F, 'Palmyrene'), - (0x10880, 0x1089E, 'Nabataean'), - (0x108A7, 0x108AF, 'Nabataean'), - (0x108E0, 0x108F2, 'Hatran'), - (0x108F4, 0x108F5, 'Hatran'), - (0x108FB, 0x108FF, 'Hatran'), - (0x10900, 0x10915, 'Phoenician'), - (0x10916, 0x1091B, 'Phoenician'), - (0x1091F, 0x1091F, 'Phoenician'), - (0x10920, 0x10939, 'Lydian'), - (0x1093F, 0x1093F, 'Lydian'), - (0x10980, 0x1099F, 'Meroitic_Hieroglyphs'), - (0x109A0, 0x109B7, 'Meroitic_Cursive'), - (0x109BC, 0x109BD, 'Meroitic_Cursive'), - (0x109BE, 0x109BF, 'Meroitic_Cursive'), - (0x109C0, 0x109CF, 'Meroitic_Cursive'), - (0x109D2, 0x109FF, 'Meroitic_Cursive'), - (0x10A00, 0x10A00, 'Kharoshthi'), - (0x10A01, 0x10A03, 'Kharoshthi'), - (0x10A05, 0x10A06, 'Kharoshthi'), - (0x10A0C, 0x10A0F, 'Kharoshthi'), - (0x10A10, 0x10A13, 'Kharoshthi'), - (0x10A15, 0x10A17, 'Kharoshthi'), - (0x10A19, 0x10A33, 'Kharoshthi'), - (0x10A38, 0x10A3A, 'Kharoshthi'), - (0x10A3F, 0x10A3F, 'Kharoshthi'), - (0x10A40, 0x10A47, 'Kharoshthi'), - (0x10A50, 0x10A58, 'Kharoshthi'), - (0x10A60, 0x10A7C, 'Old_South_Arabian'), - (0x10A7D, 0x10A7E, 'Old_South_Arabian'), - (0x10A7F, 0x10A7F, 'Old_South_Arabian'), - (0x10A80, 0x10A9C, 'Old_North_Arabian'), - (0x10A9D, 0x10A9F, 'Old_North_Arabian'), - (0x10AC0, 0x10AC7, 'Manichaean'), - (0x10AC8, 0x10AC8, 'Manichaean'), - (0x10AC9, 0x10AE4, 'Manichaean'), - (0x10AE5, 0x10AE6, 'Manichaean'), - (0x10AEB, 0x10AEF, 'Manichaean'), - (0x10AF0, 0x10AF6, 'Manichaean'), - (0x10B00, 0x10B35, 'Avestan'), - (0x10B39, 0x10B3F, 'Avestan'), - (0x10B40, 0x10B55, 'Inscriptional_Parthian'), - (0x10B58, 0x10B5F, 'Inscriptional_Parthian'), - (0x10B60, 0x10B72, 'Inscriptional_Pahlavi'), - (0x10B78, 0x10B7F, 'Inscriptional_Pahlavi'), - (0x10B80, 0x10B91, 'Psalter_Pahlavi'), - (0x10B99, 0x10B9C, 'Psalter_Pahlavi'), - (0x10BA9, 0x10BAF, 'Psalter_Pahlavi'), - (0x10C00, 0x10C48, 'Old_Turkic'), - (0x10C80, 0x10CB2, 'Old_Hungarian'), - (0x10CC0, 0x10CF2, 'Old_Hungarian'), - (0x10CFA, 0x10CFF, 'Old_Hungarian'), - (0x10E60, 0x10E7E, 'Arabic'), - (0x11000, 0x11000, 'Brahmi'), - (0x11001, 0x11001, 'Brahmi'), - (0x11002, 0x11002, 'Brahmi'), - (0x11003, 0x11037, 'Brahmi'), - (0x11038, 0x11046, 'Brahmi'), - (0x11047, 0x1104D, 'Brahmi'), - (0x11052, 0x11065, 'Brahmi'), - (0x11066, 0x1106F, 'Brahmi'), - (0x1107F, 0x1107F, 'Brahmi'), - (0x11080, 0x11081, 'Kaithi'), - (0x11082, 0x11082, 'Kaithi'), - (0x11083, 0x110AF, 'Kaithi'), - (0x110B0, 0x110B2, 'Kaithi'), - (0x110B3, 0x110B6, 'Kaithi'), - (0x110B7, 0x110B8, 'Kaithi'), - (0x110B9, 0x110BA, 'Kaithi'), - (0x110BB, 0x110BC, 'Kaithi'), - (0x110BD, 0x110BD, 'Kaithi'), - (0x110BE, 0x110C1, 'Kaithi'), - (0x110D0, 0x110E8, 'Sora_Sompeng'), - (0x110F0, 0x110F9, 'Sora_Sompeng'), - (0x11100, 0x11102, 'Chakma'), - (0x11103, 0x11126, 'Chakma'), - (0x11127, 0x1112B, 'Chakma'), - (0x1112C, 0x1112C, 'Chakma'), - (0x1112D, 0x11134, 'Chakma'), - (0x11136, 0x1113F, 'Chakma'), - (0x11140, 0x11143, 'Chakma'), - (0x11150, 0x11172, 'Mahajani'), - (0x11173, 0x11173, 'Mahajani'), - (0x11174, 0x11175, 'Mahajani'), - (0x11176, 0x11176, 'Mahajani'), - (0x11180, 0x11181, 'Sharada'), - (0x11182, 0x11182, 'Sharada'), - (0x11183, 0x111B2, 'Sharada'), - (0x111B3, 0x111B5, 'Sharada'), - (0x111B6, 0x111BE, 'Sharada'), - (0x111BF, 0x111C0, 'Sharada'), - (0x111C1, 0x111C4, 'Sharada'), - (0x111C5, 0x111C9, 'Sharada'), - (0x111CA, 0x111CC, 'Sharada'), - (0x111CD, 0x111CD, 'Sharada'), - (0x111D0, 0x111D9, 'Sharada'), - (0x111DA, 0x111DA, 'Sharada'), - (0x111DB, 0x111DB, 'Sharada'), - (0x111DC, 0x111DC, 'Sharada'), - (0x111DD, 0x111DF, 'Sharada'), - (0x111E1, 0x111F4, 'Sinhala'), - (0x11200, 0x11211, 'Khojki'), - (0x11213, 0x1122B, 'Khojki'), - (0x1122C, 0x1122E, 'Khojki'), - (0x1122F, 0x11231, 'Khojki'), - (0x11232, 0x11233, 'Khojki'), - (0x11234, 0x11234, 'Khojki'), - (0x11235, 0x11235, 'Khojki'), - (0x11236, 0x11237, 'Khojki'), - (0x11238, 0x1123D, 'Khojki'), - (0x1123E, 0x1123E, 'Khojki'), - (0x11280, 0x11286, 'Multani'), - (0x11288, 0x11288, 'Multani'), - (0x1128A, 0x1128D, 'Multani'), - (0x1128F, 0x1129D, 'Multani'), - (0x1129F, 0x112A8, 'Multani'), - (0x112A9, 0x112A9, 'Multani'), - (0x112B0, 0x112DE, 'Khudawadi'), - (0x112DF, 0x112DF, 'Khudawadi'), - (0x112E0, 0x112E2, 'Khudawadi'), - (0x112E3, 0x112EA, 'Khudawadi'), - (0x112F0, 0x112F9, 'Khudawadi'), - (0x11300, 0x11301, 'Grantha'), - (0x11302, 0x11303, 'Grantha'), - (0x11305, 0x1130C, 'Grantha'), - (0x1130F, 0x11310, 'Grantha'), - (0x11313, 0x11328, 'Grantha'), - (0x1132A, 0x11330, 'Grantha'), - (0x11332, 0x11333, 'Grantha'), - (0x11335, 0x11339, 'Grantha'), - (0x1133C, 0x1133C, 'Grantha'), - (0x1133D, 0x1133D, 'Grantha'), - (0x1133E, 0x1133F, 'Grantha'), - (0x11340, 0x11340, 'Grantha'), - (0x11341, 0x11344, 'Grantha'), - (0x11347, 0x11348, 'Grantha'), - (0x1134B, 0x1134D, 'Grantha'), - (0x11350, 0x11350, 'Grantha'), - (0x11357, 0x11357, 'Grantha'), - (0x1135D, 0x11361, 'Grantha'), - (0x11362, 0x11363, 'Grantha'), - (0x11366, 0x1136C, 'Grantha'), - (0x11370, 0x11374, 'Grantha'), - (0x11400, 0x11434, 'Newa'), - (0x11435, 0x11437, 'Newa'), - (0x11438, 0x1143F, 'Newa'), - (0x11440, 0x11441, 'Newa'), - (0x11442, 0x11444, 'Newa'), - (0x11445, 0x11445, 'Newa'), - (0x11446, 0x11446, 'Newa'), - (0x11447, 0x1144A, 'Newa'), - (0x1144B, 0x1144F, 'Newa'), - (0x11450, 0x11459, 'Newa'), - (0x1145B, 0x1145B, 'Newa'), - (0x1145D, 0x1145D, 'Newa'), - (0x11480, 0x114AF, 'Tirhuta'), - (0x114B0, 0x114B2, 'Tirhuta'), - (0x114B3, 0x114B8, 'Tirhuta'), - (0x114B9, 0x114B9, 'Tirhuta'), - (0x114BA, 0x114BA, 'Tirhuta'), - (0x114BB, 0x114BE, 'Tirhuta'), - (0x114BF, 0x114C0, 'Tirhuta'), - (0x114C1, 0x114C1, 'Tirhuta'), - (0x114C2, 0x114C3, 'Tirhuta'), - (0x114C4, 0x114C5, 'Tirhuta'), - (0x114C6, 0x114C6, 'Tirhuta'), - (0x114C7, 0x114C7, 'Tirhuta'), - (0x114D0, 0x114D9, 'Tirhuta'), - (0x11580, 0x115AE, 'Siddham'), - (0x115AF, 0x115B1, 'Siddham'), - (0x115B2, 0x115B5, 'Siddham'), - (0x115B8, 0x115BB, 'Siddham'), - (0x115BC, 0x115BD, 'Siddham'), - (0x115BE, 0x115BE, 'Siddham'), - (0x115BF, 0x115C0, 'Siddham'), - (0x115C1, 0x115D7, 'Siddham'), - (0x115D8, 0x115DB, 'Siddham'), - (0x115DC, 0x115DD, 'Siddham'), - (0x11600, 0x1162F, 'Modi'), - (0x11630, 0x11632, 'Modi'), - (0x11633, 0x1163A, 'Modi'), - (0x1163B, 0x1163C, 'Modi'), - (0x1163D, 0x1163D, 'Modi'), - (0x1163E, 0x1163E, 'Modi'), - (0x1163F, 0x11640, 'Modi'), - (0x11641, 0x11643, 'Modi'), - (0x11644, 0x11644, 'Modi'), - (0x11650, 0x11659, 'Modi'), - (0x11660, 0x1166C, 'Mongolian'), - (0x11680, 0x116AA, 'Takri'), - (0x116AB, 0x116AB, 'Takri'), - (0x116AC, 0x116AC, 'Takri'), - (0x116AD, 0x116AD, 'Takri'), - (0x116AE, 0x116AF, 'Takri'), - (0x116B0, 0x116B5, 'Takri'), - (0x116B6, 0x116B6, 'Takri'), - (0x116B7, 0x116B7, 'Takri'), - (0x116C0, 0x116C9, 'Takri'), - (0x11700, 0x11719, 'Ahom'), - (0x1171D, 0x1171F, 'Ahom'), - (0x11720, 0x11721, 'Ahom'), - (0x11722, 0x11725, 'Ahom'), - (0x11726, 0x11726, 'Ahom'), - (0x11727, 0x1172B, 'Ahom'), - (0x11730, 0x11739, 'Ahom'), - (0x1173A, 0x1173B, 'Ahom'), - (0x1173C, 0x1173E, 'Ahom'), - (0x1173F, 0x1173F, 'Ahom'), - (0x118A0, 0x118DF, 'Warang_Citi'), - (0x118E0, 0x118E9, 'Warang_Citi'), - (0x118EA, 0x118F2, 'Warang_Citi'), - (0x118FF, 0x118FF, 'Warang_Citi'), - (0x11A00, 0x11A00, 'Zanabazar_Square'), - (0x11A01, 0x11A06, 'Zanabazar_Square'), - (0x11A07, 0x11A08, 'Zanabazar_Square'), - (0x11A09, 0x11A0A, 'Zanabazar_Square'), - (0x11A0B, 0x11A32, 'Zanabazar_Square'), - (0x11A33, 0x11A38, 'Zanabazar_Square'), - (0x11A39, 0x11A39, 'Zanabazar_Square'), - (0x11A3A, 0x11A3A, 'Zanabazar_Square'), - (0x11A3B, 0x11A3E, 'Zanabazar_Square'), - (0x11A3F, 0x11A46, 'Zanabazar_Square'), - (0x11A47, 0x11A47, 'Zanabazar_Square'), - (0x11A50, 0x11A50, 'Soyombo'), - (0x11A51, 0x11A56, 'Soyombo'), - (0x11A57, 0x11A58, 'Soyombo'), - (0x11A59, 0x11A5B, 'Soyombo'), - (0x11A5C, 0x11A83, 'Soyombo'), - (0x11A86, 0x11A89, 'Soyombo'), - (0x11A8A, 0x11A96, 'Soyombo'), - (0x11A97, 0x11A97, 'Soyombo'), - (0x11A98, 0x11A99, 'Soyombo'), - (0x11A9A, 0x11A9C, 'Soyombo'), - (0x11A9E, 0x11AA2, 'Soyombo'), - (0x11AC0, 0x11AF8, 'Pau_Cin_Hau'), - (0x11C00, 0x11C08, 'Bhaiksuki'), - (0x11C0A, 0x11C2E, 'Bhaiksuki'), - (0x11C2F, 0x11C2F, 'Bhaiksuki'), - (0x11C30, 0x11C36, 'Bhaiksuki'), - (0x11C38, 0x11C3D, 'Bhaiksuki'), - (0x11C3E, 0x11C3E, 'Bhaiksuki'), - (0x11C3F, 0x11C3F, 'Bhaiksuki'), - (0x11C40, 0x11C40, 'Bhaiksuki'), - (0x11C41, 0x11C45, 'Bhaiksuki'), - (0x11C50, 0x11C59, 'Bhaiksuki'), - (0x11C5A, 0x11C6C, 'Bhaiksuki'), - (0x11C70, 0x11C71, 'Marchen'), - (0x11C72, 0x11C8F, 'Marchen'), - (0x11C92, 0x11CA7, 'Marchen'), - (0x11CA9, 0x11CA9, 'Marchen'), - (0x11CAA, 0x11CB0, 'Marchen'), - (0x11CB1, 0x11CB1, 'Marchen'), - (0x11CB2, 0x11CB3, 'Marchen'), - (0x11CB4, 0x11CB4, 'Marchen'), - (0x11CB5, 0x11CB6, 'Marchen'), - (0x11D00, 0x11D06, 'Masaram_Gondi'), - (0x11D08, 0x11D09, 'Masaram_Gondi'), - (0x11D0B, 0x11D30, 'Masaram_Gondi'), - (0x11D31, 0x11D36, 'Masaram_Gondi'), - (0x11D3A, 0x11D3A, 'Masaram_Gondi'), - (0x11D3C, 0x11D3D, 'Masaram_Gondi'), - (0x11D3F, 0x11D45, 'Masaram_Gondi'), - (0x11D46, 0x11D46, 'Masaram_Gondi'), - (0x11D47, 0x11D47, 'Masaram_Gondi'), - (0x11D50, 0x11D59, 'Masaram_Gondi'), - (0x12000, 0x12399, 'Cuneiform'), - (0x12400, 0x1246E, 'Cuneiform'), - (0x12470, 0x12474, 'Cuneiform'), - (0x12480, 0x12543, 'Cuneiform'), - (0x13000, 0x1342E, 'Egyptian_Hieroglyphs'), - (0x14400, 0x14646, 'Anatolian_Hieroglyphs'), - (0x16800, 0x16A38, 'Bamum'), - (0x16A40, 0x16A5E, 'Mro'), - (0x16A60, 0x16A69, 'Mro'), - (0x16A6E, 0x16A6F, 'Mro'), - (0x16AD0, 0x16AED, 'Bassa_Vah'), - (0x16AF0, 0x16AF4, 'Bassa_Vah'), - (0x16AF5, 0x16AF5, 'Bassa_Vah'), - (0x16B00, 0x16B2F, 'Pahawh_Hmong'), - (0x16B30, 0x16B36, 'Pahawh_Hmong'), - (0x16B37, 0x16B3B, 'Pahawh_Hmong'), - (0x16B3C, 0x16B3F, 'Pahawh_Hmong'), - (0x16B40, 0x16B43, 'Pahawh_Hmong'), - (0x16B44, 0x16B44, 'Pahawh_Hmong'), - (0x16B45, 0x16B45, 'Pahawh_Hmong'), - (0x16B50, 0x16B59, 'Pahawh_Hmong'), - (0x16B5B, 0x16B61, 'Pahawh_Hmong'), - (0x16B63, 0x16B77, 'Pahawh_Hmong'), - (0x16B7D, 0x16B8F, 'Pahawh_Hmong'), - (0x16F00, 0x16F44, 'Miao'), - (0x16F50, 0x16F50, 'Miao'), - (0x16F51, 0x16F7E, 'Miao'), - (0x16F8F, 0x16F92, 'Miao'), - (0x16F93, 0x16F9F, 'Miao'), - (0x16FE0, 0x16FE0, 'Tangut'), - (0x16FE1, 0x16FE1, 'Nushu'), - (0x17000, 0x187EC, 'Tangut'), - (0x18800, 0x18AF2, 'Tangut'), - (0x1B000, 0x1B000, 'Katakana'), - (0x1B001, 0x1B11E, 'Hiragana'), - (0x1B170, 0x1B2FB, 'Nushu'), - (0x1BC00, 0x1BC6A, 'Duployan'), - (0x1BC70, 0x1BC7C, 'Duployan'), - (0x1BC80, 0x1BC88, 'Duployan'), - (0x1BC90, 0x1BC99, 'Duployan'), - (0x1BC9C, 0x1BC9C, 'Duployan'), - (0x1BC9D, 0x1BC9E, 'Duployan'), - (0x1BC9F, 0x1BC9F, 'Duployan'), - (0x1BCA0, 0x1BCA3, 'Common'), - (0x1D000, 0x1D0F5, 'Common'), - (0x1D100, 0x1D126, 'Common'), - (0x1D129, 0x1D164, 'Common'), - (0x1D165, 0x1D166, 'Common'), - (0x1D167, 0x1D169, 'Inherited'), - (0x1D16A, 0x1D16C, 'Common'), - (0x1D16D, 0x1D172, 'Common'), - (0x1D173, 0x1D17A, 'Common'), - (0x1D17B, 0x1D182, 'Inherited'), - (0x1D183, 0x1D184, 'Common'), - (0x1D185, 0x1D18B, 'Inherited'), - (0x1D18C, 0x1D1A9, 'Common'), - (0x1D1AA, 0x1D1AD, 'Inherited'), - (0x1D1AE, 0x1D1E8, 'Common'), - (0x1D200, 0x1D241, 'Greek'), - (0x1D242, 0x1D244, 'Greek'), - (0x1D245, 0x1D245, 'Greek'), - (0x1D300, 0x1D356, 'Common'), - (0x1D360, 0x1D371, 'Common'), - (0x1D400, 0x1D454, 'Common'), - (0x1D456, 0x1D49C, 'Common'), - (0x1D49E, 0x1D49F, 'Common'), - (0x1D4A2, 0x1D4A2, 'Common'), - (0x1D4A5, 0x1D4A6, 'Common'), - (0x1D4A9, 0x1D4AC, 'Common'), - (0x1D4AE, 0x1D4B9, 'Common'), - (0x1D4BB, 0x1D4BB, 'Common'), - (0x1D4BD, 0x1D4C3, 'Common'), - (0x1D4C5, 0x1D505, 'Common'), - (0x1D507, 0x1D50A, 'Common'), - (0x1D50D, 0x1D514, 'Common'), - (0x1D516, 0x1D51C, 'Common'), - (0x1D51E, 0x1D539, 'Common'), - (0x1D53B, 0x1D53E, 'Common'), - (0x1D540, 0x1D544, 'Common'), - (0x1D546, 0x1D546, 'Common'), - (0x1D54A, 0x1D550, 'Common'), - (0x1D552, 0x1D6A5, 'Common'), - (0x1D6A8, 0x1D6C0, 'Common'), - (0x1D6C1, 0x1D6C1, 'Common'), - (0x1D6C2, 0x1D6DA, 'Common'), - (0x1D6DB, 0x1D6DB, 'Common'), - (0x1D6DC, 0x1D6FA, 'Common'), - (0x1D6FB, 0x1D6FB, 'Common'), - (0x1D6FC, 0x1D714, 'Common'), - (0x1D715, 0x1D715, 'Common'), - (0x1D716, 0x1D734, 'Common'), - (0x1D735, 0x1D735, 'Common'), - (0x1D736, 0x1D74E, 'Common'), - (0x1D74F, 0x1D74F, 'Common'), - (0x1D750, 0x1D76E, 'Common'), - (0x1D76F, 0x1D76F, 'Common'), - (0x1D770, 0x1D788, 'Common'), - (0x1D789, 0x1D789, 'Common'), - (0x1D78A, 0x1D7A8, 'Common'), - (0x1D7A9, 0x1D7A9, 'Common'), - (0x1D7AA, 0x1D7C2, 'Common'), - (0x1D7C3, 0x1D7C3, 'Common'), - (0x1D7C4, 0x1D7CB, 'Common'), - (0x1D7CE, 0x1D7FF, 'Common'), - (0x1D800, 0x1D9FF, 'SignWriting'), - (0x1DA00, 0x1DA36, 'SignWriting'), - (0x1DA37, 0x1DA3A, 'SignWriting'), - (0x1DA3B, 0x1DA6C, 'SignWriting'), - (0x1DA6D, 0x1DA74, 'SignWriting'), - (0x1DA75, 0x1DA75, 'SignWriting'), - (0x1DA76, 0x1DA83, 'SignWriting'), - (0x1DA84, 0x1DA84, 'SignWriting'), - (0x1DA85, 0x1DA86, 'SignWriting'), - (0x1DA87, 0x1DA8B, 'SignWriting'), - (0x1DA9B, 0x1DA9F, 'SignWriting'), - (0x1DAA1, 0x1DAAF, 'SignWriting'), - (0x1E000, 0x1E006, 'Glagolitic'), - (0x1E008, 0x1E018, 'Glagolitic'), - (0x1E01B, 0x1E021, 'Glagolitic'), - (0x1E023, 0x1E024, 'Glagolitic'), - (0x1E026, 0x1E02A, 'Glagolitic'), - (0x1E800, 0x1E8C4, 'Mende_Kikakui'), - (0x1E8C7, 0x1E8CF, 'Mende_Kikakui'), - (0x1E8D0, 0x1E8D6, 'Mende_Kikakui'), - (0x1E900, 0x1E943, 'Adlam'), - (0x1E944, 0x1E94A, 'Adlam'), - (0x1E950, 0x1E959, 'Adlam'), - (0x1E95E, 0x1E95F, 'Adlam'), - (0x1EE00, 0x1EE03, 'Arabic'), - (0x1EE05, 0x1EE1F, 'Arabic'), - (0x1EE21, 0x1EE22, 'Arabic'), - (0x1EE24, 0x1EE24, 'Arabic'), - (0x1EE27, 0x1EE27, 'Arabic'), - (0x1EE29, 0x1EE32, 'Arabic'), - (0x1EE34, 0x1EE37, 'Arabic'), - (0x1EE39, 0x1EE39, 'Arabic'), - (0x1EE3B, 0x1EE3B, 'Arabic'), - (0x1EE42, 0x1EE42, 'Arabic'), - (0x1EE47, 0x1EE47, 'Arabic'), - (0x1EE49, 0x1EE49, 'Arabic'), - (0x1EE4B, 0x1EE4B, 'Arabic'), - (0x1EE4D, 0x1EE4F, 'Arabic'), - (0x1EE51, 0x1EE52, 'Arabic'), - (0x1EE54, 0x1EE54, 'Arabic'), - (0x1EE57, 0x1EE57, 'Arabic'), - (0x1EE59, 0x1EE59, 'Arabic'), - (0x1EE5B, 0x1EE5B, 'Arabic'), - (0x1EE5D, 0x1EE5D, 'Arabic'), - (0x1EE5F, 0x1EE5F, 'Arabic'), - (0x1EE61, 0x1EE62, 'Arabic'), - (0x1EE64, 0x1EE64, 'Arabic'), - (0x1EE67, 0x1EE6A, 'Arabic'), - (0x1EE6C, 0x1EE72, 'Arabic'), - (0x1EE74, 0x1EE77, 'Arabic'), - (0x1EE79, 0x1EE7C, 'Arabic'), - (0x1EE7E, 0x1EE7E, 'Arabic'), - (0x1EE80, 0x1EE89, 'Arabic'), - (0x1EE8B, 0x1EE9B, 'Arabic'), - (0x1EEA1, 0x1EEA3, 'Arabic'), - (0x1EEA5, 0x1EEA9, 'Arabic'), - (0x1EEAB, 0x1EEBB, 'Arabic'), - (0x1EEF0, 0x1EEF1, 'Arabic'), - (0x1F000, 0x1F02B, 'Common'), - (0x1F030, 0x1F093, 'Common'), - (0x1F0A0, 0x1F0AE, 'Common'), - (0x1F0B1, 0x1F0BF, 'Common'), - (0x1F0C1, 0x1F0CF, 'Common'), - (0x1F0D1, 0x1F0F5, 'Common'), - (0x1F100, 0x1F10C, 'Common'), - (0x1F110, 0x1F12E, 'Common'), - (0x1F130, 0x1F16B, 'Common'), - (0x1F170, 0x1F1AC, 'Common'), - (0x1F1E6, 0x1F1FF, 'Common'), - (0x1F200, 0x1F200, 'Hiragana'), - (0x1F201, 0x1F202, 'Common'), - (0x1F210, 0x1F23B, 'Common'), - (0x1F240, 0x1F248, 'Common'), - (0x1F250, 0x1F251, 'Common'), - (0x1F260, 0x1F265, 'Common'), - (0x1F300, 0x1F3FA, 'Common'), - (0x1F3FB, 0x1F3FF, 'Common'), - (0x1F400, 0x1F6D4, 'Common'), - (0x1F6E0, 0x1F6EC, 'Common'), - (0x1F6F0, 0x1F6F8, 'Common'), - (0x1F700, 0x1F773, 'Common'), - (0x1F780, 0x1F7D4, 'Common'), - (0x1F800, 0x1F80B, 'Common'), - (0x1F810, 0x1F847, 'Common'), - (0x1F850, 0x1F859, 'Common'), - (0x1F860, 0x1F887, 'Common'), - (0x1F890, 0x1F8AD, 'Common'), - (0x1F900, 0x1F90B, 'Common'), - (0x1F910, 0x1F93E, 'Common'), - (0x1F940, 0x1F94C, 'Common'), - (0x1F950, 0x1F96B, 'Common'), - (0x1F980, 0x1F997, 'Common'), - (0x1F9C0, 0x1F9C0, 'Common'), - (0x1F9D0, 0x1F9E6, 'Common'), - (0x20000, 0x2A6D6, 'Han'), - (0x2A700, 0x2B734, 'Han'), - (0x2B740, 0x2B81D, 'Han'), - (0x2B820, 0x2CEA1, 'Han'), - (0x2CEB0, 0x2EBE0, 'Han'), - (0x2F800, 0x2FA1D, 'Han'), - (0xE0001, 0xE0001, 'Common'), - (0xE0020, 0xE007F, 'Common'), - (0xE0100, 0xE01EF, 'Inherited'), + 0x0000, # .. 0x0040 ; Common + 0x0041, # .. 0x005A ; Latin + 0x005B, # .. 0x0060 ; Common + 0x0061, # .. 0x007A ; Latin + 0x007B, # .. 0x00A9 ; Common + 0x00AA, # .. 0x00AA ; Latin + 0x00AB, # .. 0x00B9 ; Common + 0x00BA, # .. 0x00BA ; Latin + 0x00BB, # .. 0x00BF ; Common + 0x00C0, # .. 0x00D6 ; Latin + 0x00D7, # .. 0x00D7 ; Common + 0x00D8, # .. 0x00F6 ; Latin + 0x00F7, # .. 0x00F7 ; Common + 0x00F8, # .. 0x02B8 ; Latin + 0x02B9, # .. 0x02DF ; Common + 0x02E0, # .. 0x02E4 ; Latin + 0x02E5, # .. 0x02E9 ; Common + 0x02EA, # .. 0x02EB ; Bopomofo + 0x02EC, # .. 0x02FF ; Common + 0x0300, # .. 0x036F ; Inherited + 0x0370, # .. 0x0373 ; Greek + 0x0374, # .. 0x0374 ; Common + 0x0375, # .. 0x0377 ; Greek + 0x0378, # .. 0x0379 ; Unknown + 0x037A, # .. 0x037D ; Greek + 0x037E, # .. 0x037E ; Common + 0x037F, # .. 0x037F ; Greek + 0x0380, # .. 0x0383 ; Unknown + 0x0384, # .. 0x0384 ; Greek + 0x0385, # .. 0x0385 ; Common + 0x0386, # .. 0x0386 ; Greek + 0x0387, # .. 0x0387 ; Common + 0x0388, # .. 0x038A ; Greek + 0x038B, # .. 0x038B ; Unknown + 0x038C, # .. 0x038C ; Greek + 0x038D, # .. 0x038D ; Unknown + 0x038E, # .. 0x03A1 ; Greek + 0x03A2, # .. 0x03A2 ; Unknown + 0x03A3, # .. 0x03E1 ; Greek + 0x03E2, # .. 0x03EF ; Coptic + 0x03F0, # .. 0x03FF ; Greek + 0x0400, # .. 0x0484 ; Cyrillic + 0x0485, # .. 0x0486 ; Inherited + 0x0487, # .. 0x052F ; Cyrillic + 0x0530, # .. 0x0530 ; Unknown + 0x0531, # .. 0x0556 ; Armenian + 0x0557, # .. 0x0558 ; Unknown + 0x0559, # .. 0x055F ; Armenian + 0x0560, # .. 0x0560 ; Unknown + 0x0561, # .. 0x0587 ; Armenian + 0x0588, # .. 0x0588 ; Unknown + 0x0589, # .. 0x0589 ; Common + 0x058A, # .. 0x058A ; Armenian + 0x058B, # .. 0x058C ; Unknown + 0x058D, # .. 0x058F ; Armenian + 0x0590, # .. 0x0590 ; Unknown + 0x0591, # .. 0x05C7 ; Hebrew + 0x05C8, # .. 0x05CF ; Unknown + 0x05D0, # .. 0x05EA ; Hebrew + 0x05EB, # .. 0x05EF ; Unknown + 0x05F0, # .. 0x05F4 ; Hebrew + 0x05F5, # .. 0x05FF ; Unknown + 0x0600, # .. 0x0604 ; Arabic + 0x0605, # .. 0x0605 ; Common + 0x0606, # .. 0x060B ; Arabic + 0x060C, # .. 0x060C ; Common + 0x060D, # .. 0x061A ; Arabic + 0x061B, # .. 0x061B ; Common + 0x061C, # .. 0x061C ; Arabic + 0x061D, # .. 0x061D ; Unknown + 0x061E, # .. 0x061E ; Arabic + 0x061F, # .. 0x061F ; Common + 0x0620, # .. 0x063F ; Arabic + 0x0640, # .. 0x0640 ; Common + 0x0641, # .. 0x064A ; Arabic + 0x064B, # .. 0x0655 ; Inherited + 0x0656, # .. 0x066F ; Arabic + 0x0670, # .. 0x0670 ; Inherited + 0x0671, # .. 0x06DC ; Arabic + 0x06DD, # .. 0x06DD ; Common + 0x06DE, # .. 0x06FF ; Arabic + 0x0700, # .. 0x070D ; Syriac + 0x070E, # .. 0x070E ; Unknown + 0x070F, # .. 0x074A ; Syriac + 0x074B, # .. 0x074C ; Unknown + 0x074D, # .. 0x074F ; Syriac + 0x0750, # .. 0x077F ; Arabic + 0x0780, # .. 0x07B1 ; Thaana + 0x07B2, # .. 0x07BF ; Unknown + 0x07C0, # .. 0x07FA ; Nko + 0x07FB, # .. 0x07FF ; Unknown + 0x0800, # .. 0x082D ; Samaritan + 0x082E, # .. 0x082F ; Unknown + 0x0830, # .. 0x083E ; Samaritan + 0x083F, # .. 0x083F ; Unknown + 0x0840, # .. 0x085B ; Mandaic + 0x085C, # .. 0x085D ; Unknown + 0x085E, # .. 0x085E ; Mandaic + 0x085F, # .. 0x085F ; Unknown + 0x0860, # .. 0x086A ; Syriac + 0x086B, # .. 0x089F ; Unknown + 0x08A0, # .. 0x08B4 ; Arabic + 0x08B5, # .. 0x08B5 ; Unknown + 0x08B6, # .. 0x08BD ; Arabic + 0x08BE, # .. 0x08D3 ; Unknown + 0x08D4, # .. 0x08E1 ; Arabic + 0x08E2, # .. 0x08E2 ; Common + 0x08E3, # .. 0x08FF ; Arabic + 0x0900, # .. 0x0950 ; Devanagari + 0x0951, # .. 0x0952 ; Inherited + 0x0953, # .. 0x0963 ; Devanagari + 0x0964, # .. 0x0965 ; Common + 0x0966, # .. 0x097F ; Devanagari + 0x0980, # .. 0x0983 ; Bengali + 0x0984, # .. 0x0984 ; Unknown + 0x0985, # .. 0x098C ; Bengali + 0x098D, # .. 0x098E ; Unknown + 0x098F, # .. 0x0990 ; Bengali + 0x0991, # .. 0x0992 ; Unknown + 0x0993, # .. 0x09A8 ; Bengali + 0x09A9, # .. 0x09A9 ; Unknown + 0x09AA, # .. 0x09B0 ; Bengali + 0x09B1, # .. 0x09B1 ; Unknown + 0x09B2, # .. 0x09B2 ; Bengali + 0x09B3, # .. 0x09B5 ; Unknown + 0x09B6, # .. 0x09B9 ; Bengali + 0x09BA, # .. 0x09BB ; Unknown + 0x09BC, # .. 0x09C4 ; Bengali + 0x09C5, # .. 0x09C6 ; Unknown + 0x09C7, # .. 0x09C8 ; Bengali + 0x09C9, # .. 0x09CA ; Unknown + 0x09CB, # .. 0x09CE ; Bengali + 0x09CF, # .. 0x09D6 ; Unknown + 0x09D7, # .. 0x09D7 ; Bengali + 0x09D8, # .. 0x09DB ; Unknown + 0x09DC, # .. 0x09DD ; Bengali + 0x09DE, # .. 0x09DE ; Unknown + 0x09DF, # .. 0x09E3 ; Bengali + 0x09E4, # .. 0x09E5 ; Unknown + 0x09E6, # .. 0x09FD ; Bengali + 0x09FE, # .. 0x0A00 ; Unknown + 0x0A01, # .. 0x0A03 ; Gurmukhi + 0x0A04, # .. 0x0A04 ; Unknown + 0x0A05, # .. 0x0A0A ; Gurmukhi + 0x0A0B, # .. 0x0A0E ; Unknown + 0x0A0F, # .. 0x0A10 ; Gurmukhi + 0x0A11, # .. 0x0A12 ; Unknown + 0x0A13, # .. 0x0A28 ; Gurmukhi + 0x0A29, # .. 0x0A29 ; Unknown + 0x0A2A, # .. 0x0A30 ; Gurmukhi + 0x0A31, # .. 0x0A31 ; Unknown + 0x0A32, # .. 0x0A33 ; Gurmukhi + 0x0A34, # .. 0x0A34 ; Unknown + 0x0A35, # .. 0x0A36 ; Gurmukhi + 0x0A37, # .. 0x0A37 ; Unknown + 0x0A38, # .. 0x0A39 ; Gurmukhi + 0x0A3A, # .. 0x0A3B ; Unknown + 0x0A3C, # .. 0x0A3C ; Gurmukhi + 0x0A3D, # .. 0x0A3D ; Unknown + 0x0A3E, # .. 0x0A42 ; Gurmukhi + 0x0A43, # .. 0x0A46 ; Unknown + 0x0A47, # .. 0x0A48 ; Gurmukhi + 0x0A49, # .. 0x0A4A ; Unknown + 0x0A4B, # .. 0x0A4D ; Gurmukhi + 0x0A4E, # .. 0x0A50 ; Unknown + 0x0A51, # .. 0x0A51 ; Gurmukhi + 0x0A52, # .. 0x0A58 ; Unknown + 0x0A59, # .. 0x0A5C ; Gurmukhi + 0x0A5D, # .. 0x0A5D ; Unknown + 0x0A5E, # .. 0x0A5E ; Gurmukhi + 0x0A5F, # .. 0x0A65 ; Unknown + 0x0A66, # .. 0x0A75 ; Gurmukhi + 0x0A76, # .. 0x0A80 ; Unknown + 0x0A81, # .. 0x0A83 ; Gujarati + 0x0A84, # .. 0x0A84 ; Unknown + 0x0A85, # .. 0x0A8D ; Gujarati + 0x0A8E, # .. 0x0A8E ; Unknown + 0x0A8F, # .. 0x0A91 ; Gujarati + 0x0A92, # .. 0x0A92 ; Unknown + 0x0A93, # .. 0x0AA8 ; Gujarati + 0x0AA9, # .. 0x0AA9 ; Unknown + 0x0AAA, # .. 0x0AB0 ; Gujarati + 0x0AB1, # .. 0x0AB1 ; Unknown + 0x0AB2, # .. 0x0AB3 ; Gujarati + 0x0AB4, # .. 0x0AB4 ; Unknown + 0x0AB5, # .. 0x0AB9 ; Gujarati + 0x0ABA, # .. 0x0ABB ; Unknown + 0x0ABC, # .. 0x0AC5 ; Gujarati + 0x0AC6, # .. 0x0AC6 ; Unknown + 0x0AC7, # .. 0x0AC9 ; Gujarati + 0x0ACA, # .. 0x0ACA ; Unknown + 0x0ACB, # .. 0x0ACD ; Gujarati + 0x0ACE, # .. 0x0ACF ; Unknown + 0x0AD0, # .. 0x0AD0 ; Gujarati + 0x0AD1, # .. 0x0ADF ; Unknown + 0x0AE0, # .. 0x0AE3 ; Gujarati + 0x0AE4, # .. 0x0AE5 ; Unknown + 0x0AE6, # .. 0x0AF1 ; Gujarati + 0x0AF2, # .. 0x0AF8 ; Unknown + 0x0AF9, # .. 0x0AFF ; Gujarati + 0x0B00, # .. 0x0B00 ; Unknown + 0x0B01, # .. 0x0B03 ; Oriya + 0x0B04, # .. 0x0B04 ; Unknown + 0x0B05, # .. 0x0B0C ; Oriya + 0x0B0D, # .. 0x0B0E ; Unknown + 0x0B0F, # .. 0x0B10 ; Oriya + 0x0B11, # .. 0x0B12 ; Unknown + 0x0B13, # .. 0x0B28 ; Oriya + 0x0B29, # .. 0x0B29 ; Unknown + 0x0B2A, # .. 0x0B30 ; Oriya + 0x0B31, # .. 0x0B31 ; Unknown + 0x0B32, # .. 0x0B33 ; Oriya + 0x0B34, # .. 0x0B34 ; Unknown + 0x0B35, # .. 0x0B39 ; Oriya + 0x0B3A, # .. 0x0B3B ; Unknown + 0x0B3C, # .. 0x0B44 ; Oriya + 0x0B45, # .. 0x0B46 ; Unknown + 0x0B47, # .. 0x0B48 ; Oriya + 0x0B49, # .. 0x0B4A ; Unknown + 0x0B4B, # .. 0x0B4D ; Oriya + 0x0B4E, # .. 0x0B55 ; Unknown + 0x0B56, # .. 0x0B57 ; Oriya + 0x0B58, # .. 0x0B5B ; Unknown + 0x0B5C, # .. 0x0B5D ; Oriya + 0x0B5E, # .. 0x0B5E ; Unknown + 0x0B5F, # .. 0x0B63 ; Oriya + 0x0B64, # .. 0x0B65 ; Unknown + 0x0B66, # .. 0x0B77 ; Oriya + 0x0B78, # .. 0x0B81 ; Unknown + 0x0B82, # .. 0x0B83 ; Tamil + 0x0B84, # .. 0x0B84 ; Unknown + 0x0B85, # .. 0x0B8A ; Tamil + 0x0B8B, # .. 0x0B8D ; Unknown + 0x0B8E, # .. 0x0B90 ; Tamil + 0x0B91, # .. 0x0B91 ; Unknown + 0x0B92, # .. 0x0B95 ; Tamil + 0x0B96, # .. 0x0B98 ; Unknown + 0x0B99, # .. 0x0B9A ; Tamil + 0x0B9B, # .. 0x0B9B ; Unknown + 0x0B9C, # .. 0x0B9C ; Tamil + 0x0B9D, # .. 0x0B9D ; Unknown + 0x0B9E, # .. 0x0B9F ; Tamil + 0x0BA0, # .. 0x0BA2 ; Unknown + 0x0BA3, # .. 0x0BA4 ; Tamil + 0x0BA5, # .. 0x0BA7 ; Unknown + 0x0BA8, # .. 0x0BAA ; Tamil + 0x0BAB, # .. 0x0BAD ; Unknown + 0x0BAE, # .. 0x0BB9 ; Tamil + 0x0BBA, # .. 0x0BBD ; Unknown + 0x0BBE, # .. 0x0BC2 ; Tamil + 0x0BC3, # .. 0x0BC5 ; Unknown + 0x0BC6, # .. 0x0BC8 ; Tamil + 0x0BC9, # .. 0x0BC9 ; Unknown + 0x0BCA, # .. 0x0BCD ; Tamil + 0x0BCE, # .. 0x0BCF ; Unknown + 0x0BD0, # .. 0x0BD0 ; Tamil + 0x0BD1, # .. 0x0BD6 ; Unknown + 0x0BD7, # .. 0x0BD7 ; Tamil + 0x0BD8, # .. 0x0BE5 ; Unknown + 0x0BE6, # .. 0x0BFA ; Tamil + 0x0BFB, # .. 0x0BFF ; Unknown + 0x0C00, # .. 0x0C03 ; Telugu + 0x0C04, # .. 0x0C04 ; Unknown + 0x0C05, # .. 0x0C0C ; Telugu + 0x0C0D, # .. 0x0C0D ; Unknown + 0x0C0E, # .. 0x0C10 ; Telugu + 0x0C11, # .. 0x0C11 ; Unknown + 0x0C12, # .. 0x0C28 ; Telugu + 0x0C29, # .. 0x0C29 ; Unknown + 0x0C2A, # .. 0x0C39 ; Telugu + 0x0C3A, # .. 0x0C3C ; Unknown + 0x0C3D, # .. 0x0C44 ; Telugu + 0x0C45, # .. 0x0C45 ; Unknown + 0x0C46, # .. 0x0C48 ; Telugu + 0x0C49, # .. 0x0C49 ; Unknown + 0x0C4A, # .. 0x0C4D ; Telugu + 0x0C4E, # .. 0x0C54 ; Unknown + 0x0C55, # .. 0x0C56 ; Telugu + 0x0C57, # .. 0x0C57 ; Unknown + 0x0C58, # .. 0x0C5A ; Telugu + 0x0C5B, # .. 0x0C5F ; Unknown + 0x0C60, # .. 0x0C63 ; Telugu + 0x0C64, # .. 0x0C65 ; Unknown + 0x0C66, # .. 0x0C6F ; Telugu + 0x0C70, # .. 0x0C77 ; Unknown + 0x0C78, # .. 0x0C7F ; Telugu + 0x0C80, # .. 0x0C83 ; Kannada + 0x0C84, # .. 0x0C84 ; Unknown + 0x0C85, # .. 0x0C8C ; Kannada + 0x0C8D, # .. 0x0C8D ; Unknown + 0x0C8E, # .. 0x0C90 ; Kannada + 0x0C91, # .. 0x0C91 ; Unknown + 0x0C92, # .. 0x0CA8 ; Kannada + 0x0CA9, # .. 0x0CA9 ; Unknown + 0x0CAA, # .. 0x0CB3 ; Kannada + 0x0CB4, # .. 0x0CB4 ; Unknown + 0x0CB5, # .. 0x0CB9 ; Kannada + 0x0CBA, # .. 0x0CBB ; Unknown + 0x0CBC, # .. 0x0CC4 ; Kannada + 0x0CC5, # .. 0x0CC5 ; Unknown + 0x0CC6, # .. 0x0CC8 ; Kannada + 0x0CC9, # .. 0x0CC9 ; Unknown + 0x0CCA, # .. 0x0CCD ; Kannada + 0x0CCE, # .. 0x0CD4 ; Unknown + 0x0CD5, # .. 0x0CD6 ; Kannada + 0x0CD7, # .. 0x0CDD ; Unknown + 0x0CDE, # .. 0x0CDE ; Kannada + 0x0CDF, # .. 0x0CDF ; Unknown + 0x0CE0, # .. 0x0CE3 ; Kannada + 0x0CE4, # .. 0x0CE5 ; Unknown + 0x0CE6, # .. 0x0CEF ; Kannada + 0x0CF0, # .. 0x0CF0 ; Unknown + 0x0CF1, # .. 0x0CF2 ; Kannada + 0x0CF3, # .. 0x0CFF ; Unknown + 0x0D00, # .. 0x0D03 ; Malayalam + 0x0D04, # .. 0x0D04 ; Unknown + 0x0D05, # .. 0x0D0C ; Malayalam + 0x0D0D, # .. 0x0D0D ; Unknown + 0x0D0E, # .. 0x0D10 ; Malayalam + 0x0D11, # .. 0x0D11 ; Unknown + 0x0D12, # .. 0x0D44 ; Malayalam + 0x0D45, # .. 0x0D45 ; Unknown + 0x0D46, # .. 0x0D48 ; Malayalam + 0x0D49, # .. 0x0D49 ; Unknown + 0x0D4A, # .. 0x0D4F ; Malayalam + 0x0D50, # .. 0x0D53 ; Unknown + 0x0D54, # .. 0x0D63 ; Malayalam + 0x0D64, # .. 0x0D65 ; Unknown + 0x0D66, # .. 0x0D7F ; Malayalam + 0x0D80, # .. 0x0D81 ; Unknown + 0x0D82, # .. 0x0D83 ; Sinhala + 0x0D84, # .. 0x0D84 ; Unknown + 0x0D85, # .. 0x0D96 ; Sinhala + 0x0D97, # .. 0x0D99 ; Unknown + 0x0D9A, # .. 0x0DB1 ; Sinhala + 0x0DB2, # .. 0x0DB2 ; Unknown + 0x0DB3, # .. 0x0DBB ; Sinhala + 0x0DBC, # .. 0x0DBC ; Unknown + 0x0DBD, # .. 0x0DBD ; Sinhala + 0x0DBE, # .. 0x0DBF ; Unknown + 0x0DC0, # .. 0x0DC6 ; Sinhala + 0x0DC7, # .. 0x0DC9 ; Unknown + 0x0DCA, # .. 0x0DCA ; Sinhala + 0x0DCB, # .. 0x0DCE ; Unknown + 0x0DCF, # .. 0x0DD4 ; Sinhala + 0x0DD5, # .. 0x0DD5 ; Unknown + 0x0DD6, # .. 0x0DD6 ; Sinhala + 0x0DD7, # .. 0x0DD7 ; Unknown + 0x0DD8, # .. 0x0DDF ; Sinhala + 0x0DE0, # .. 0x0DE5 ; Unknown + 0x0DE6, # .. 0x0DEF ; Sinhala + 0x0DF0, # .. 0x0DF1 ; Unknown + 0x0DF2, # .. 0x0DF4 ; Sinhala + 0x0DF5, # .. 0x0E00 ; Unknown + 0x0E01, # .. 0x0E3A ; Thai + 0x0E3B, # .. 0x0E3E ; Unknown + 0x0E3F, # .. 0x0E3F ; Common + 0x0E40, # .. 0x0E5B ; Thai + 0x0E5C, # .. 0x0E80 ; Unknown + 0x0E81, # .. 0x0E82 ; Lao + 0x0E83, # .. 0x0E83 ; Unknown + 0x0E84, # .. 0x0E84 ; Lao + 0x0E85, # .. 0x0E86 ; Unknown + 0x0E87, # .. 0x0E88 ; Lao + 0x0E89, # .. 0x0E89 ; Unknown + 0x0E8A, # .. 0x0E8A ; Lao + 0x0E8B, # .. 0x0E8C ; Unknown + 0x0E8D, # .. 0x0E8D ; Lao + 0x0E8E, # .. 0x0E93 ; Unknown + 0x0E94, # .. 0x0E97 ; Lao + 0x0E98, # .. 0x0E98 ; Unknown + 0x0E99, # .. 0x0E9F ; Lao + 0x0EA0, # .. 0x0EA0 ; Unknown + 0x0EA1, # .. 0x0EA3 ; Lao + 0x0EA4, # .. 0x0EA4 ; Unknown + 0x0EA5, # .. 0x0EA5 ; Lao + 0x0EA6, # .. 0x0EA6 ; Unknown + 0x0EA7, # .. 0x0EA7 ; Lao + 0x0EA8, # .. 0x0EA9 ; Unknown + 0x0EAA, # .. 0x0EAB ; Lao + 0x0EAC, # .. 0x0EAC ; Unknown + 0x0EAD, # .. 0x0EB9 ; Lao + 0x0EBA, # .. 0x0EBA ; Unknown + 0x0EBB, # .. 0x0EBD ; Lao + 0x0EBE, # .. 0x0EBF ; Unknown + 0x0EC0, # .. 0x0EC4 ; Lao + 0x0EC5, # .. 0x0EC5 ; Unknown + 0x0EC6, # .. 0x0EC6 ; Lao + 0x0EC7, # .. 0x0EC7 ; Unknown + 0x0EC8, # .. 0x0ECD ; Lao + 0x0ECE, # .. 0x0ECF ; Unknown + 0x0ED0, # .. 0x0ED9 ; Lao + 0x0EDA, # .. 0x0EDB ; Unknown + 0x0EDC, # .. 0x0EDF ; Lao + 0x0EE0, # .. 0x0EFF ; Unknown + 0x0F00, # .. 0x0F47 ; Tibetan + 0x0F48, # .. 0x0F48 ; Unknown + 0x0F49, # .. 0x0F6C ; Tibetan + 0x0F6D, # .. 0x0F70 ; Unknown + 0x0F71, # .. 0x0F97 ; Tibetan + 0x0F98, # .. 0x0F98 ; Unknown + 0x0F99, # .. 0x0FBC ; Tibetan + 0x0FBD, # .. 0x0FBD ; Unknown + 0x0FBE, # .. 0x0FCC ; Tibetan + 0x0FCD, # .. 0x0FCD ; Unknown + 0x0FCE, # .. 0x0FD4 ; Tibetan + 0x0FD5, # .. 0x0FD8 ; Common + 0x0FD9, # .. 0x0FDA ; Tibetan + 0x0FDB, # .. 0x0FFF ; Unknown + 0x1000, # .. 0x109F ; Myanmar + 0x10A0, # .. 0x10C5 ; Georgian + 0x10C6, # .. 0x10C6 ; Unknown + 0x10C7, # .. 0x10C7 ; Georgian + 0x10C8, # .. 0x10CC ; Unknown + 0x10CD, # .. 0x10CD ; Georgian + 0x10CE, # .. 0x10CF ; Unknown + 0x10D0, # .. 0x10FA ; Georgian + 0x10FB, # .. 0x10FB ; Common + 0x10FC, # .. 0x10FF ; Georgian + 0x1100, # .. 0x11FF ; Hangul + 0x1200, # .. 0x1248 ; Ethiopic + 0x1249, # .. 0x1249 ; Unknown + 0x124A, # .. 0x124D ; Ethiopic + 0x124E, # .. 0x124F ; Unknown + 0x1250, # .. 0x1256 ; Ethiopic + 0x1257, # .. 0x1257 ; Unknown + 0x1258, # .. 0x1258 ; Ethiopic + 0x1259, # .. 0x1259 ; Unknown + 0x125A, # .. 0x125D ; Ethiopic + 0x125E, # .. 0x125F ; Unknown + 0x1260, # .. 0x1288 ; Ethiopic + 0x1289, # .. 0x1289 ; Unknown + 0x128A, # .. 0x128D ; Ethiopic + 0x128E, # .. 0x128F ; Unknown + 0x1290, # .. 0x12B0 ; Ethiopic + 0x12B1, # .. 0x12B1 ; Unknown + 0x12B2, # .. 0x12B5 ; Ethiopic + 0x12B6, # .. 0x12B7 ; Unknown + 0x12B8, # .. 0x12BE ; Ethiopic + 0x12BF, # .. 0x12BF ; Unknown + 0x12C0, # .. 0x12C0 ; Ethiopic + 0x12C1, # .. 0x12C1 ; Unknown + 0x12C2, # .. 0x12C5 ; Ethiopic + 0x12C6, # .. 0x12C7 ; Unknown + 0x12C8, # .. 0x12D6 ; Ethiopic + 0x12D7, # .. 0x12D7 ; Unknown + 0x12D8, # .. 0x1310 ; Ethiopic + 0x1311, # .. 0x1311 ; Unknown + 0x1312, # .. 0x1315 ; Ethiopic + 0x1316, # .. 0x1317 ; Unknown + 0x1318, # .. 0x135A ; Ethiopic + 0x135B, # .. 0x135C ; Unknown + 0x135D, # .. 0x137C ; Ethiopic + 0x137D, # .. 0x137F ; Unknown + 0x1380, # .. 0x1399 ; Ethiopic + 0x139A, # .. 0x139F ; Unknown + 0x13A0, # .. 0x13F5 ; Cherokee + 0x13F6, # .. 0x13F7 ; Unknown + 0x13F8, # .. 0x13FD ; Cherokee + 0x13FE, # .. 0x13FF ; Unknown + 0x1400, # .. 0x167F ; Canadian_Aboriginal + 0x1680, # .. 0x169C ; Ogham + 0x169D, # .. 0x169F ; Unknown + 0x16A0, # .. 0x16EA ; Runic + 0x16EB, # .. 0x16ED ; Common + 0x16EE, # .. 0x16F8 ; Runic + 0x16F9, # .. 0x16FF ; Unknown + 0x1700, # .. 0x170C ; Tagalog + 0x170D, # .. 0x170D ; Unknown + 0x170E, # .. 0x1714 ; Tagalog + 0x1715, # .. 0x171F ; Unknown + 0x1720, # .. 0x1734 ; Hanunoo + 0x1735, # .. 0x1736 ; Common + 0x1737, # .. 0x173F ; Unknown + 0x1740, # .. 0x1753 ; Buhid + 0x1754, # .. 0x175F ; Unknown + 0x1760, # .. 0x176C ; Tagbanwa + 0x176D, # .. 0x176D ; Unknown + 0x176E, # .. 0x1770 ; Tagbanwa + 0x1771, # .. 0x1771 ; Unknown + 0x1772, # .. 0x1773 ; Tagbanwa + 0x1774, # .. 0x177F ; Unknown + 0x1780, # .. 0x17DD ; Khmer + 0x17DE, # .. 0x17DF ; Unknown + 0x17E0, # .. 0x17E9 ; Khmer + 0x17EA, # .. 0x17EF ; Unknown + 0x17F0, # .. 0x17F9 ; Khmer + 0x17FA, # .. 0x17FF ; Unknown + 0x1800, # .. 0x1801 ; Mongolian + 0x1802, # .. 0x1803 ; Common + 0x1804, # .. 0x1804 ; Mongolian + 0x1805, # .. 0x1805 ; Common + 0x1806, # .. 0x180E ; Mongolian + 0x180F, # .. 0x180F ; Unknown + 0x1810, # .. 0x1819 ; Mongolian + 0x181A, # .. 0x181F ; Unknown + 0x1820, # .. 0x1877 ; Mongolian + 0x1878, # .. 0x187F ; Unknown + 0x1880, # .. 0x18AA ; Mongolian + 0x18AB, # .. 0x18AF ; Unknown + 0x18B0, # .. 0x18F5 ; Canadian_Aboriginal + 0x18F6, # .. 0x18FF ; Unknown + 0x1900, # .. 0x191E ; Limbu + 0x191F, # .. 0x191F ; Unknown + 0x1920, # .. 0x192B ; Limbu + 0x192C, # .. 0x192F ; Unknown + 0x1930, # .. 0x193B ; Limbu + 0x193C, # .. 0x193F ; Unknown + 0x1940, # .. 0x1940 ; Limbu + 0x1941, # .. 0x1943 ; Unknown + 0x1944, # .. 0x194F ; Limbu + 0x1950, # .. 0x196D ; Tai_Le + 0x196E, # .. 0x196F ; Unknown + 0x1970, # .. 0x1974 ; Tai_Le + 0x1975, # .. 0x197F ; Unknown + 0x1980, # .. 0x19AB ; New_Tai_Lue + 0x19AC, # .. 0x19AF ; Unknown + 0x19B0, # .. 0x19C9 ; New_Tai_Lue + 0x19CA, # .. 0x19CF ; Unknown + 0x19D0, # .. 0x19DA ; New_Tai_Lue + 0x19DB, # .. 0x19DD ; Unknown + 0x19DE, # .. 0x19DF ; New_Tai_Lue + 0x19E0, # .. 0x19FF ; Khmer + 0x1A00, # .. 0x1A1B ; Buginese + 0x1A1C, # .. 0x1A1D ; Unknown + 0x1A1E, # .. 0x1A1F ; Buginese + 0x1A20, # .. 0x1A5E ; Tai_Tham + 0x1A5F, # .. 0x1A5F ; Unknown + 0x1A60, # .. 0x1A7C ; Tai_Tham + 0x1A7D, # .. 0x1A7E ; Unknown + 0x1A7F, # .. 0x1A89 ; Tai_Tham + 0x1A8A, # .. 0x1A8F ; Unknown + 0x1A90, # .. 0x1A99 ; Tai_Tham + 0x1A9A, # .. 0x1A9F ; Unknown + 0x1AA0, # .. 0x1AAD ; Tai_Tham + 0x1AAE, # .. 0x1AAF ; Unknown + 0x1AB0, # .. 0x1ABE ; Inherited + 0x1ABF, # .. 0x1AFF ; Unknown + 0x1B00, # .. 0x1B4B ; Balinese + 0x1B4C, # .. 0x1B4F ; Unknown + 0x1B50, # .. 0x1B7C ; Balinese + 0x1B7D, # .. 0x1B7F ; Unknown + 0x1B80, # .. 0x1BBF ; Sundanese + 0x1BC0, # .. 0x1BF3 ; Batak + 0x1BF4, # .. 0x1BFB ; Unknown + 0x1BFC, # .. 0x1BFF ; Batak + 0x1C00, # .. 0x1C37 ; Lepcha + 0x1C38, # .. 0x1C3A ; Unknown + 0x1C3B, # .. 0x1C49 ; Lepcha + 0x1C4A, # .. 0x1C4C ; Unknown + 0x1C4D, # .. 0x1C4F ; Lepcha + 0x1C50, # .. 0x1C7F ; Ol_Chiki + 0x1C80, # .. 0x1C88 ; Cyrillic + 0x1C89, # .. 0x1CBF ; Unknown + 0x1CC0, # .. 0x1CC7 ; Sundanese + 0x1CC8, # .. 0x1CCF ; Unknown + 0x1CD0, # .. 0x1CD2 ; Inherited + 0x1CD3, # .. 0x1CD3 ; Common + 0x1CD4, # .. 0x1CE0 ; Inherited + 0x1CE1, # .. 0x1CE1 ; Common + 0x1CE2, # .. 0x1CE8 ; Inherited + 0x1CE9, # .. 0x1CEC ; Common + 0x1CED, # .. 0x1CED ; Inherited + 0x1CEE, # .. 0x1CF3 ; Common + 0x1CF4, # .. 0x1CF4 ; Inherited + 0x1CF5, # .. 0x1CF7 ; Common + 0x1CF8, # .. 0x1CF9 ; Inherited + 0x1CFA, # .. 0x1CFF ; Unknown + 0x1D00, # .. 0x1D25 ; Latin + 0x1D26, # .. 0x1D2A ; Greek + 0x1D2B, # .. 0x1D2B ; Cyrillic + 0x1D2C, # .. 0x1D5C ; Latin + 0x1D5D, # .. 0x1D61 ; Greek + 0x1D62, # .. 0x1D65 ; Latin + 0x1D66, # .. 0x1D6A ; Greek + 0x1D6B, # .. 0x1D77 ; Latin + 0x1D78, # .. 0x1D78 ; Cyrillic + 0x1D79, # .. 0x1DBE ; Latin + 0x1DBF, # .. 0x1DBF ; Greek + 0x1DC0, # .. 0x1DF9 ; Inherited + 0x1DFA, # .. 0x1DFA ; Unknown + 0x1DFB, # .. 0x1DFF ; Inherited + 0x1E00, # .. 0x1EFF ; Latin + 0x1F00, # .. 0x1F15 ; Greek + 0x1F16, # .. 0x1F17 ; Unknown + 0x1F18, # .. 0x1F1D ; Greek + 0x1F1E, # .. 0x1F1F ; Unknown + 0x1F20, # .. 0x1F45 ; Greek + 0x1F46, # .. 0x1F47 ; Unknown + 0x1F48, # .. 0x1F4D ; Greek + 0x1F4E, # .. 0x1F4F ; Unknown + 0x1F50, # .. 0x1F57 ; Greek + 0x1F58, # .. 0x1F58 ; Unknown + 0x1F59, # .. 0x1F59 ; Greek + 0x1F5A, # .. 0x1F5A ; Unknown + 0x1F5B, # .. 0x1F5B ; Greek + 0x1F5C, # .. 0x1F5C ; Unknown + 0x1F5D, # .. 0x1F5D ; Greek + 0x1F5E, # .. 0x1F5E ; Unknown + 0x1F5F, # .. 0x1F7D ; Greek + 0x1F7E, # .. 0x1F7F ; Unknown + 0x1F80, # .. 0x1FB4 ; Greek + 0x1FB5, # .. 0x1FB5 ; Unknown + 0x1FB6, # .. 0x1FC4 ; Greek + 0x1FC5, # .. 0x1FC5 ; Unknown + 0x1FC6, # .. 0x1FD3 ; Greek + 0x1FD4, # .. 0x1FD5 ; Unknown + 0x1FD6, # .. 0x1FDB ; Greek + 0x1FDC, # .. 0x1FDC ; Unknown + 0x1FDD, # .. 0x1FEF ; Greek + 0x1FF0, # .. 0x1FF1 ; Unknown + 0x1FF2, # .. 0x1FF4 ; Greek + 0x1FF5, # .. 0x1FF5 ; Unknown + 0x1FF6, # .. 0x1FFE ; Greek + 0x1FFF, # .. 0x1FFF ; Unknown + 0x2000, # .. 0x200B ; Common + 0x200C, # .. 0x200D ; Inherited + 0x200E, # .. 0x2064 ; Common + 0x2065, # .. 0x2065 ; Unknown + 0x2066, # .. 0x2070 ; Common + 0x2071, # .. 0x2071 ; Latin + 0x2072, # .. 0x2073 ; Unknown + 0x2074, # .. 0x207E ; Common + 0x207F, # .. 0x207F ; Latin + 0x2080, # .. 0x208E ; Common + 0x208F, # .. 0x208F ; Unknown + 0x2090, # .. 0x209C ; Latin + 0x209D, # .. 0x209F ; Unknown + 0x20A0, # .. 0x20BF ; Common + 0x20C0, # .. 0x20CF ; Unknown + 0x20D0, # .. 0x20F0 ; Inherited + 0x20F1, # .. 0x20FF ; Unknown + 0x2100, # .. 0x2125 ; Common + 0x2126, # .. 0x2126 ; Greek + 0x2127, # .. 0x2129 ; Common + 0x212A, # .. 0x212B ; Latin + 0x212C, # .. 0x2131 ; Common + 0x2132, # .. 0x2132 ; Latin + 0x2133, # .. 0x214D ; Common + 0x214E, # .. 0x214E ; Latin + 0x214F, # .. 0x215F ; Common + 0x2160, # .. 0x2188 ; Latin + 0x2189, # .. 0x218B ; Common + 0x218C, # .. 0x218F ; Unknown + 0x2190, # .. 0x2426 ; Common + 0x2427, # .. 0x243F ; Unknown + 0x2440, # .. 0x244A ; Common + 0x244B, # .. 0x245F ; Unknown + 0x2460, # .. 0x27FF ; Common + 0x2800, # .. 0x28FF ; Braille + 0x2900, # .. 0x2B73 ; Common + 0x2B74, # .. 0x2B75 ; Unknown + 0x2B76, # .. 0x2B95 ; Common + 0x2B96, # .. 0x2B97 ; Unknown + 0x2B98, # .. 0x2BB9 ; Common + 0x2BBA, # .. 0x2BBC ; Unknown + 0x2BBD, # .. 0x2BC8 ; Common + 0x2BC9, # .. 0x2BC9 ; Unknown + 0x2BCA, # .. 0x2BD2 ; Common + 0x2BD3, # .. 0x2BEB ; Unknown + 0x2BEC, # .. 0x2BEF ; Common + 0x2BF0, # .. 0x2BFF ; Unknown + 0x2C00, # .. 0x2C2E ; Glagolitic + 0x2C2F, # .. 0x2C2F ; Unknown + 0x2C30, # .. 0x2C5E ; Glagolitic + 0x2C5F, # .. 0x2C5F ; Unknown + 0x2C60, # .. 0x2C7F ; Latin + 0x2C80, # .. 0x2CF3 ; Coptic + 0x2CF4, # .. 0x2CF8 ; Unknown + 0x2CF9, # .. 0x2CFF ; Coptic + 0x2D00, # .. 0x2D25 ; Georgian + 0x2D26, # .. 0x2D26 ; Unknown + 0x2D27, # .. 0x2D27 ; Georgian + 0x2D28, # .. 0x2D2C ; Unknown + 0x2D2D, # .. 0x2D2D ; Georgian + 0x2D2E, # .. 0x2D2F ; Unknown + 0x2D30, # .. 0x2D67 ; Tifinagh + 0x2D68, # .. 0x2D6E ; Unknown + 0x2D6F, # .. 0x2D70 ; Tifinagh + 0x2D71, # .. 0x2D7E ; Unknown + 0x2D7F, # .. 0x2D7F ; Tifinagh + 0x2D80, # .. 0x2D96 ; Ethiopic + 0x2D97, # .. 0x2D9F ; Unknown + 0x2DA0, # .. 0x2DA6 ; Ethiopic + 0x2DA7, # .. 0x2DA7 ; Unknown + 0x2DA8, # .. 0x2DAE ; Ethiopic + 0x2DAF, # .. 0x2DAF ; Unknown + 0x2DB0, # .. 0x2DB6 ; Ethiopic + 0x2DB7, # .. 0x2DB7 ; Unknown + 0x2DB8, # .. 0x2DBE ; Ethiopic + 0x2DBF, # .. 0x2DBF ; Unknown + 0x2DC0, # .. 0x2DC6 ; Ethiopic + 0x2DC7, # .. 0x2DC7 ; Unknown + 0x2DC8, # .. 0x2DCE ; Ethiopic + 0x2DCF, # .. 0x2DCF ; Unknown + 0x2DD0, # .. 0x2DD6 ; Ethiopic + 0x2DD7, # .. 0x2DD7 ; Unknown + 0x2DD8, # .. 0x2DDE ; Ethiopic + 0x2DDF, # .. 0x2DDF ; Unknown + 0x2DE0, # .. 0x2DFF ; Cyrillic + 0x2E00, # .. 0x2E49 ; Common + 0x2E4A, # .. 0x2E7F ; Unknown + 0x2E80, # .. 0x2E99 ; Han + 0x2E9A, # .. 0x2E9A ; Unknown + 0x2E9B, # .. 0x2EF3 ; Han + 0x2EF4, # .. 0x2EFF ; Unknown + 0x2F00, # .. 0x2FD5 ; Han + 0x2FD6, # .. 0x2FEF ; Unknown + 0x2FF0, # .. 0x2FFB ; Common + 0x2FFC, # .. 0x2FFF ; Unknown + 0x3000, # .. 0x3004 ; Common + 0x3005, # .. 0x3005 ; Han + 0x3006, # .. 0x3006 ; Common + 0x3007, # .. 0x3007 ; Han + 0x3008, # .. 0x3020 ; Common + 0x3021, # .. 0x3029 ; Han + 0x302A, # .. 0x302D ; Inherited + 0x302E, # .. 0x302F ; Hangul + 0x3030, # .. 0x3037 ; Common + 0x3038, # .. 0x303B ; Han + 0x303C, # .. 0x303F ; Common + 0x3040, # .. 0x3040 ; Unknown + 0x3041, # .. 0x3096 ; Hiragana + 0x3097, # .. 0x3098 ; Unknown + 0x3099, # .. 0x309A ; Inherited + 0x309B, # .. 0x309C ; Common + 0x309D, # .. 0x309F ; Hiragana + 0x30A0, # .. 0x30A0 ; Common + 0x30A1, # .. 0x30FA ; Katakana + 0x30FB, # .. 0x30FC ; Common + 0x30FD, # .. 0x30FF ; Katakana + 0x3100, # .. 0x3104 ; Unknown + 0x3105, # .. 0x312E ; Bopomofo + 0x312F, # .. 0x3130 ; Unknown + 0x3131, # .. 0x318E ; Hangul + 0x318F, # .. 0x318F ; Unknown + 0x3190, # .. 0x319F ; Common + 0x31A0, # .. 0x31BA ; Bopomofo + 0x31BB, # .. 0x31BF ; Unknown + 0x31C0, # .. 0x31E3 ; Common + 0x31E4, # .. 0x31EF ; Unknown + 0x31F0, # .. 0x31FF ; Katakana + 0x3200, # .. 0x321E ; Hangul + 0x321F, # .. 0x321F ; Unknown + 0x3220, # .. 0x325F ; Common + 0x3260, # .. 0x327E ; Hangul + 0x327F, # .. 0x32CF ; Common + 0x32D0, # .. 0x32FE ; Katakana + 0x32FF, # .. 0x32FF ; Unknown + 0x3300, # .. 0x3357 ; Katakana + 0x3358, # .. 0x33FF ; Common + 0x3400, # .. 0x4DB5 ; Han + 0x4DB6, # .. 0x4DBF ; Unknown + 0x4DC0, # .. 0x4DFF ; Common + 0x4E00, # .. 0x9FEA ; Han + 0x9FEB, # .. 0x9FFF ; Unknown + 0xA000, # .. 0xA48C ; Yi + 0xA48D, # .. 0xA48F ; Unknown + 0xA490, # .. 0xA4C6 ; Yi + 0xA4C7, # .. 0xA4CF ; Unknown + 0xA4D0, # .. 0xA4FF ; Lisu + 0xA500, # .. 0xA62B ; Vai + 0xA62C, # .. 0xA63F ; Unknown + 0xA640, # .. 0xA69F ; Cyrillic + 0xA6A0, # .. 0xA6F7 ; Bamum + 0xA6F8, # .. 0xA6FF ; Unknown + 0xA700, # .. 0xA721 ; Common + 0xA722, # .. 0xA787 ; Latin + 0xA788, # .. 0xA78A ; Common + 0xA78B, # .. 0xA7AE ; Latin + 0xA7AF, # .. 0xA7AF ; Unknown + 0xA7B0, # .. 0xA7B7 ; Latin + 0xA7B8, # .. 0xA7F6 ; Unknown + 0xA7F7, # .. 0xA7FF ; Latin + 0xA800, # .. 0xA82B ; Syloti_Nagri + 0xA82C, # .. 0xA82F ; Unknown + 0xA830, # .. 0xA839 ; Common + 0xA83A, # .. 0xA83F ; Unknown + 0xA840, # .. 0xA877 ; Phags_Pa + 0xA878, # .. 0xA87F ; Unknown + 0xA880, # .. 0xA8C5 ; Saurashtra + 0xA8C6, # .. 0xA8CD ; Unknown + 0xA8CE, # .. 0xA8D9 ; Saurashtra + 0xA8DA, # .. 0xA8DF ; Unknown + 0xA8E0, # .. 0xA8FD ; Devanagari + 0xA8FE, # .. 0xA8FF ; Unknown + 0xA900, # .. 0xA92D ; Kayah_Li + 0xA92E, # .. 0xA92E ; Common + 0xA92F, # .. 0xA92F ; Kayah_Li + 0xA930, # .. 0xA953 ; Rejang + 0xA954, # .. 0xA95E ; Unknown + 0xA95F, # .. 0xA95F ; Rejang + 0xA960, # .. 0xA97C ; Hangul + 0xA97D, # .. 0xA97F ; Unknown + 0xA980, # .. 0xA9CD ; Javanese + 0xA9CE, # .. 0xA9CE ; Unknown + 0xA9CF, # .. 0xA9CF ; Common + 0xA9D0, # .. 0xA9D9 ; Javanese + 0xA9DA, # .. 0xA9DD ; Unknown + 0xA9DE, # .. 0xA9DF ; Javanese + 0xA9E0, # .. 0xA9FE ; Myanmar + 0xA9FF, # .. 0xA9FF ; Unknown + 0xAA00, # .. 0xAA36 ; Cham + 0xAA37, # .. 0xAA3F ; Unknown + 0xAA40, # .. 0xAA4D ; Cham + 0xAA4E, # .. 0xAA4F ; Unknown + 0xAA50, # .. 0xAA59 ; Cham + 0xAA5A, # .. 0xAA5B ; Unknown + 0xAA5C, # .. 0xAA5F ; Cham + 0xAA60, # .. 0xAA7F ; Myanmar + 0xAA80, # .. 0xAAC2 ; Tai_Viet + 0xAAC3, # .. 0xAADA ; Unknown + 0xAADB, # .. 0xAADF ; Tai_Viet + 0xAAE0, # .. 0xAAF6 ; Meetei_Mayek + 0xAAF7, # .. 0xAB00 ; Unknown + 0xAB01, # .. 0xAB06 ; Ethiopic + 0xAB07, # .. 0xAB08 ; Unknown + 0xAB09, # .. 0xAB0E ; Ethiopic + 0xAB0F, # .. 0xAB10 ; Unknown + 0xAB11, # .. 0xAB16 ; Ethiopic + 0xAB17, # .. 0xAB1F ; Unknown + 0xAB20, # .. 0xAB26 ; Ethiopic + 0xAB27, # .. 0xAB27 ; Unknown + 0xAB28, # .. 0xAB2E ; Ethiopic + 0xAB2F, # .. 0xAB2F ; Unknown + 0xAB30, # .. 0xAB5A ; Latin + 0xAB5B, # .. 0xAB5B ; Common + 0xAB5C, # .. 0xAB64 ; Latin + 0xAB65, # .. 0xAB65 ; Greek + 0xAB66, # .. 0xAB6F ; Unknown + 0xAB70, # .. 0xABBF ; Cherokee + 0xABC0, # .. 0xABED ; Meetei_Mayek + 0xABEE, # .. 0xABEF ; Unknown + 0xABF0, # .. 0xABF9 ; Meetei_Mayek + 0xABFA, # .. 0xABFF ; Unknown + 0xAC00, # .. 0xD7A3 ; Hangul + 0xD7A4, # .. 0xD7AF ; Unknown + 0xD7B0, # .. 0xD7C6 ; Hangul + 0xD7C7, # .. 0xD7CA ; Unknown + 0xD7CB, # .. 0xD7FB ; Hangul + 0xD7FC, # .. 0xF8FF ; Unknown + 0xF900, # .. 0xFA6D ; Han + 0xFA6E, # .. 0xFA6F ; Unknown + 0xFA70, # .. 0xFAD9 ; Han + 0xFADA, # .. 0xFAFF ; Unknown + 0xFB00, # .. 0xFB06 ; Latin + 0xFB07, # .. 0xFB12 ; Unknown + 0xFB13, # .. 0xFB17 ; Armenian + 0xFB18, # .. 0xFB1C ; Unknown + 0xFB1D, # .. 0xFB36 ; Hebrew + 0xFB37, # .. 0xFB37 ; Unknown + 0xFB38, # .. 0xFB3C ; Hebrew + 0xFB3D, # .. 0xFB3D ; Unknown + 0xFB3E, # .. 0xFB3E ; Hebrew + 0xFB3F, # .. 0xFB3F ; Unknown + 0xFB40, # .. 0xFB41 ; Hebrew + 0xFB42, # .. 0xFB42 ; Unknown + 0xFB43, # .. 0xFB44 ; Hebrew + 0xFB45, # .. 0xFB45 ; Unknown + 0xFB46, # .. 0xFB4F ; Hebrew + 0xFB50, # .. 0xFBC1 ; Arabic + 0xFBC2, # .. 0xFBD2 ; Unknown + 0xFBD3, # .. 0xFD3D ; Arabic + 0xFD3E, # .. 0xFD3F ; Common + 0xFD40, # .. 0xFD4F ; Unknown + 0xFD50, # .. 0xFD8F ; Arabic + 0xFD90, # .. 0xFD91 ; Unknown + 0xFD92, # .. 0xFDC7 ; Arabic + 0xFDC8, # .. 0xFDEF ; Unknown + 0xFDF0, # .. 0xFDFD ; Arabic + 0xFDFE, # .. 0xFDFF ; Unknown + 0xFE00, # .. 0xFE0F ; Inherited + 0xFE10, # .. 0xFE19 ; Common + 0xFE1A, # .. 0xFE1F ; Unknown + 0xFE20, # .. 0xFE2D ; Inherited + 0xFE2E, # .. 0xFE2F ; Cyrillic + 0xFE30, # .. 0xFE52 ; Common + 0xFE53, # .. 0xFE53 ; Unknown + 0xFE54, # .. 0xFE66 ; Common + 0xFE67, # .. 0xFE67 ; Unknown + 0xFE68, # .. 0xFE6B ; Common + 0xFE6C, # .. 0xFE6F ; Unknown + 0xFE70, # .. 0xFE74 ; Arabic + 0xFE75, # .. 0xFE75 ; Unknown + 0xFE76, # .. 0xFEFC ; Arabic + 0xFEFD, # .. 0xFEFE ; Unknown + 0xFEFF, # .. 0xFEFF ; Common + 0xFF00, # .. 0xFF00 ; Unknown + 0xFF01, # .. 0xFF20 ; Common + 0xFF21, # .. 0xFF3A ; Latin + 0xFF3B, # .. 0xFF40 ; Common + 0xFF41, # .. 0xFF5A ; Latin + 0xFF5B, # .. 0xFF65 ; Common + 0xFF66, # .. 0xFF6F ; Katakana + 0xFF70, # .. 0xFF70 ; Common + 0xFF71, # .. 0xFF9D ; Katakana + 0xFF9E, # .. 0xFF9F ; Common + 0xFFA0, # .. 0xFFBE ; Hangul + 0xFFBF, # .. 0xFFC1 ; Unknown + 0xFFC2, # .. 0xFFC7 ; Hangul + 0xFFC8, # .. 0xFFC9 ; Unknown + 0xFFCA, # .. 0xFFCF ; Hangul + 0xFFD0, # .. 0xFFD1 ; Unknown + 0xFFD2, # .. 0xFFD7 ; Hangul + 0xFFD8, # .. 0xFFD9 ; Unknown + 0xFFDA, # .. 0xFFDC ; Hangul + 0xFFDD, # .. 0xFFDF ; Unknown + 0xFFE0, # .. 0xFFE6 ; Common + 0xFFE7, # .. 0xFFE7 ; Unknown + 0xFFE8, # .. 0xFFEE ; Common + 0xFFEF, # .. 0xFFF8 ; Unknown + 0xFFF9, # .. 0xFFFD ; Common + 0xFFFE, # .. 0xFFFF ; Unknown + 0x10000, # .. 0x1000B ; Linear_B + 0x1000C, # .. 0x1000C ; Unknown + 0x1000D, # .. 0x10026 ; Linear_B + 0x10027, # .. 0x10027 ; Unknown + 0x10028, # .. 0x1003A ; Linear_B + 0x1003B, # .. 0x1003B ; Unknown + 0x1003C, # .. 0x1003D ; Linear_B + 0x1003E, # .. 0x1003E ; Unknown + 0x1003F, # .. 0x1004D ; Linear_B + 0x1004E, # .. 0x1004F ; Unknown + 0x10050, # .. 0x1005D ; Linear_B + 0x1005E, # .. 0x1007F ; Unknown + 0x10080, # .. 0x100FA ; Linear_B + 0x100FB, # .. 0x100FF ; Unknown + 0x10100, # .. 0x10102 ; Common + 0x10103, # .. 0x10106 ; Unknown + 0x10107, # .. 0x10133 ; Common + 0x10134, # .. 0x10136 ; Unknown + 0x10137, # .. 0x1013F ; Common + 0x10140, # .. 0x1018E ; Greek + 0x1018F, # .. 0x1018F ; Unknown + 0x10190, # .. 0x1019B ; Common + 0x1019C, # .. 0x1019F ; Unknown + 0x101A0, # .. 0x101A0 ; Greek + 0x101A1, # .. 0x101CF ; Unknown + 0x101D0, # .. 0x101FC ; Common + 0x101FD, # .. 0x101FD ; Inherited + 0x101FE, # .. 0x1027F ; Unknown + 0x10280, # .. 0x1029C ; Lycian + 0x1029D, # .. 0x1029F ; Unknown + 0x102A0, # .. 0x102D0 ; Carian + 0x102D1, # .. 0x102DF ; Unknown + 0x102E0, # .. 0x102E0 ; Inherited + 0x102E1, # .. 0x102FB ; Common + 0x102FC, # .. 0x102FF ; Unknown + 0x10300, # .. 0x10323 ; Old_Italic + 0x10324, # .. 0x1032C ; Unknown + 0x1032D, # .. 0x1032F ; Old_Italic + 0x10330, # .. 0x1034A ; Gothic + 0x1034B, # .. 0x1034F ; Unknown + 0x10350, # .. 0x1037A ; Old_Permic + 0x1037B, # .. 0x1037F ; Unknown + 0x10380, # .. 0x1039D ; Ugaritic + 0x1039E, # .. 0x1039E ; Unknown + 0x1039F, # .. 0x1039F ; Ugaritic + 0x103A0, # .. 0x103C3 ; Old_Persian + 0x103C4, # .. 0x103C7 ; Unknown + 0x103C8, # .. 0x103D5 ; Old_Persian + 0x103D6, # .. 0x103FF ; Unknown + 0x10400, # .. 0x1044F ; Deseret + 0x10450, # .. 0x1047F ; Shavian + 0x10480, # .. 0x1049D ; Osmanya + 0x1049E, # .. 0x1049F ; Unknown + 0x104A0, # .. 0x104A9 ; Osmanya + 0x104AA, # .. 0x104AF ; Unknown + 0x104B0, # .. 0x104D3 ; Osage + 0x104D4, # .. 0x104D7 ; Unknown + 0x104D8, # .. 0x104FB ; Osage + 0x104FC, # .. 0x104FF ; Unknown + 0x10500, # .. 0x10527 ; Elbasan + 0x10528, # .. 0x1052F ; Unknown + 0x10530, # .. 0x10563 ; Caucasian_Albanian + 0x10564, # .. 0x1056E ; Unknown + 0x1056F, # .. 0x1056F ; Caucasian_Albanian + 0x10570, # .. 0x105FF ; Unknown + 0x10600, # .. 0x10736 ; Linear_A + 0x10737, # .. 0x1073F ; Unknown + 0x10740, # .. 0x10755 ; Linear_A + 0x10756, # .. 0x1075F ; Unknown + 0x10760, # .. 0x10767 ; Linear_A + 0x10768, # .. 0x107FF ; Unknown + 0x10800, # .. 0x10805 ; Cypriot + 0x10806, # .. 0x10807 ; Unknown + 0x10808, # .. 0x10808 ; Cypriot + 0x10809, # .. 0x10809 ; Unknown + 0x1080A, # .. 0x10835 ; Cypriot + 0x10836, # .. 0x10836 ; Unknown + 0x10837, # .. 0x10838 ; Cypriot + 0x10839, # .. 0x1083B ; Unknown + 0x1083C, # .. 0x1083C ; Cypriot + 0x1083D, # .. 0x1083E ; Unknown + 0x1083F, # .. 0x1083F ; Cypriot + 0x10840, # .. 0x10855 ; Imperial_Aramaic + 0x10856, # .. 0x10856 ; Unknown + 0x10857, # .. 0x1085F ; Imperial_Aramaic + 0x10860, # .. 0x1087F ; Palmyrene + 0x10880, # .. 0x1089E ; Nabataean + 0x1089F, # .. 0x108A6 ; Unknown + 0x108A7, # .. 0x108AF ; Nabataean + 0x108B0, # .. 0x108DF ; Unknown + 0x108E0, # .. 0x108F2 ; Hatran + 0x108F3, # .. 0x108F3 ; Unknown + 0x108F4, # .. 0x108F5 ; Hatran + 0x108F6, # .. 0x108FA ; Unknown + 0x108FB, # .. 0x108FF ; Hatran + 0x10900, # .. 0x1091B ; Phoenician + 0x1091C, # .. 0x1091E ; Unknown + 0x1091F, # .. 0x1091F ; Phoenician + 0x10920, # .. 0x10939 ; Lydian + 0x1093A, # .. 0x1093E ; Unknown + 0x1093F, # .. 0x1093F ; Lydian + 0x10940, # .. 0x1097F ; Unknown + 0x10980, # .. 0x1099F ; Meroitic_Hieroglyphs + 0x109A0, # .. 0x109B7 ; Meroitic_Cursive + 0x109B8, # .. 0x109BB ; Unknown + 0x109BC, # .. 0x109CF ; Meroitic_Cursive + 0x109D0, # .. 0x109D1 ; Unknown + 0x109D2, # .. 0x109FF ; Meroitic_Cursive + 0x10A00, # .. 0x10A03 ; Kharoshthi + 0x10A04, # .. 0x10A04 ; Unknown + 0x10A05, # .. 0x10A06 ; Kharoshthi + 0x10A07, # .. 0x10A0B ; Unknown + 0x10A0C, # .. 0x10A13 ; Kharoshthi + 0x10A14, # .. 0x10A14 ; Unknown + 0x10A15, # .. 0x10A17 ; Kharoshthi + 0x10A18, # .. 0x10A18 ; Unknown + 0x10A19, # .. 0x10A33 ; Kharoshthi + 0x10A34, # .. 0x10A37 ; Unknown + 0x10A38, # .. 0x10A3A ; Kharoshthi + 0x10A3B, # .. 0x10A3E ; Unknown + 0x10A3F, # .. 0x10A47 ; Kharoshthi + 0x10A48, # .. 0x10A4F ; Unknown + 0x10A50, # .. 0x10A58 ; Kharoshthi + 0x10A59, # .. 0x10A5F ; Unknown + 0x10A60, # .. 0x10A7F ; Old_South_Arabian + 0x10A80, # .. 0x10A9F ; Old_North_Arabian + 0x10AA0, # .. 0x10ABF ; Unknown + 0x10AC0, # .. 0x10AE6 ; Manichaean + 0x10AE7, # .. 0x10AEA ; Unknown + 0x10AEB, # .. 0x10AF6 ; Manichaean + 0x10AF7, # .. 0x10AFF ; Unknown + 0x10B00, # .. 0x10B35 ; Avestan + 0x10B36, # .. 0x10B38 ; Unknown + 0x10B39, # .. 0x10B3F ; Avestan + 0x10B40, # .. 0x10B55 ; Inscriptional_Parthian + 0x10B56, # .. 0x10B57 ; Unknown + 0x10B58, # .. 0x10B5F ; Inscriptional_Parthian + 0x10B60, # .. 0x10B72 ; Inscriptional_Pahlavi + 0x10B73, # .. 0x10B77 ; Unknown + 0x10B78, # .. 0x10B7F ; Inscriptional_Pahlavi + 0x10B80, # .. 0x10B91 ; Psalter_Pahlavi + 0x10B92, # .. 0x10B98 ; Unknown + 0x10B99, # .. 0x10B9C ; Psalter_Pahlavi + 0x10B9D, # .. 0x10BA8 ; Unknown + 0x10BA9, # .. 0x10BAF ; Psalter_Pahlavi + 0x10BB0, # .. 0x10BFF ; Unknown + 0x10C00, # .. 0x10C48 ; Old_Turkic + 0x10C49, # .. 0x10C7F ; Unknown + 0x10C80, # .. 0x10CB2 ; Old_Hungarian + 0x10CB3, # .. 0x10CBF ; Unknown + 0x10CC0, # .. 0x10CF2 ; Old_Hungarian + 0x10CF3, # .. 0x10CF9 ; Unknown + 0x10CFA, # .. 0x10CFF ; Old_Hungarian + 0x10D00, # .. 0x10E5F ; Unknown + 0x10E60, # .. 0x10E7E ; Arabic + 0x10E7F, # .. 0x10FFF ; Unknown + 0x11000, # .. 0x1104D ; Brahmi + 0x1104E, # .. 0x11051 ; Unknown + 0x11052, # .. 0x1106F ; Brahmi + 0x11070, # .. 0x1107E ; Unknown + 0x1107F, # .. 0x1107F ; Brahmi + 0x11080, # .. 0x110C1 ; Kaithi + 0x110C2, # .. 0x110CF ; Unknown + 0x110D0, # .. 0x110E8 ; Sora_Sompeng + 0x110E9, # .. 0x110EF ; Unknown + 0x110F0, # .. 0x110F9 ; Sora_Sompeng + 0x110FA, # .. 0x110FF ; Unknown + 0x11100, # .. 0x11134 ; Chakma + 0x11135, # .. 0x11135 ; Unknown + 0x11136, # .. 0x11143 ; Chakma + 0x11144, # .. 0x1114F ; Unknown + 0x11150, # .. 0x11176 ; Mahajani + 0x11177, # .. 0x1117F ; Unknown + 0x11180, # .. 0x111CD ; Sharada + 0x111CE, # .. 0x111CF ; Unknown + 0x111D0, # .. 0x111DF ; Sharada + 0x111E0, # .. 0x111E0 ; Unknown + 0x111E1, # .. 0x111F4 ; Sinhala + 0x111F5, # .. 0x111FF ; Unknown + 0x11200, # .. 0x11211 ; Khojki + 0x11212, # .. 0x11212 ; Unknown + 0x11213, # .. 0x1123E ; Khojki + 0x1123F, # .. 0x1127F ; Unknown + 0x11280, # .. 0x11286 ; Multani + 0x11287, # .. 0x11287 ; Unknown + 0x11288, # .. 0x11288 ; Multani + 0x11289, # .. 0x11289 ; Unknown + 0x1128A, # .. 0x1128D ; Multani + 0x1128E, # .. 0x1128E ; Unknown + 0x1128F, # .. 0x1129D ; Multani + 0x1129E, # .. 0x1129E ; Unknown + 0x1129F, # .. 0x112A9 ; Multani + 0x112AA, # .. 0x112AF ; Unknown + 0x112B0, # .. 0x112EA ; Khudawadi + 0x112EB, # .. 0x112EF ; Unknown + 0x112F0, # .. 0x112F9 ; Khudawadi + 0x112FA, # .. 0x112FF ; Unknown + 0x11300, # .. 0x11303 ; Grantha + 0x11304, # .. 0x11304 ; Unknown + 0x11305, # .. 0x1130C ; Grantha + 0x1130D, # .. 0x1130E ; Unknown + 0x1130F, # .. 0x11310 ; Grantha + 0x11311, # .. 0x11312 ; Unknown + 0x11313, # .. 0x11328 ; Grantha + 0x11329, # .. 0x11329 ; Unknown + 0x1132A, # .. 0x11330 ; Grantha + 0x11331, # .. 0x11331 ; Unknown + 0x11332, # .. 0x11333 ; Grantha + 0x11334, # .. 0x11334 ; Unknown + 0x11335, # .. 0x11339 ; Grantha + 0x1133A, # .. 0x1133B ; Unknown + 0x1133C, # .. 0x11344 ; Grantha + 0x11345, # .. 0x11346 ; Unknown + 0x11347, # .. 0x11348 ; Grantha + 0x11349, # .. 0x1134A ; Unknown + 0x1134B, # .. 0x1134D ; Grantha + 0x1134E, # .. 0x1134F ; Unknown + 0x11350, # .. 0x11350 ; Grantha + 0x11351, # .. 0x11356 ; Unknown + 0x11357, # .. 0x11357 ; Grantha + 0x11358, # .. 0x1135C ; Unknown + 0x1135D, # .. 0x11363 ; Grantha + 0x11364, # .. 0x11365 ; Unknown + 0x11366, # .. 0x1136C ; Grantha + 0x1136D, # .. 0x1136F ; Unknown + 0x11370, # .. 0x11374 ; Grantha + 0x11375, # .. 0x113FF ; Unknown + 0x11400, # .. 0x11459 ; Newa + 0x1145A, # .. 0x1145A ; Unknown + 0x1145B, # .. 0x1145B ; Newa + 0x1145C, # .. 0x1145C ; Unknown + 0x1145D, # .. 0x1145D ; Newa + 0x1145E, # .. 0x1147F ; Unknown + 0x11480, # .. 0x114C7 ; Tirhuta + 0x114C8, # .. 0x114CF ; Unknown + 0x114D0, # .. 0x114D9 ; Tirhuta + 0x114DA, # .. 0x1157F ; Unknown + 0x11580, # .. 0x115B5 ; Siddham + 0x115B6, # .. 0x115B7 ; Unknown + 0x115B8, # .. 0x115DD ; Siddham + 0x115DE, # .. 0x115FF ; Unknown + 0x11600, # .. 0x11644 ; Modi + 0x11645, # .. 0x1164F ; Unknown + 0x11650, # .. 0x11659 ; Modi + 0x1165A, # .. 0x1165F ; Unknown + 0x11660, # .. 0x1166C ; Mongolian + 0x1166D, # .. 0x1167F ; Unknown + 0x11680, # .. 0x116B7 ; Takri + 0x116B8, # .. 0x116BF ; Unknown + 0x116C0, # .. 0x116C9 ; Takri + 0x116CA, # .. 0x116FF ; Unknown + 0x11700, # .. 0x11719 ; Ahom + 0x1171A, # .. 0x1171C ; Unknown + 0x1171D, # .. 0x1172B ; Ahom + 0x1172C, # .. 0x1172F ; Unknown + 0x11730, # .. 0x1173F ; Ahom + 0x11740, # .. 0x1189F ; Unknown + 0x118A0, # .. 0x118F2 ; Warang_Citi + 0x118F3, # .. 0x118FE ; Unknown + 0x118FF, # .. 0x118FF ; Warang_Citi + 0x11900, # .. 0x119FF ; Unknown + 0x11A00, # .. 0x11A47 ; Zanabazar_Square + 0x11A48, # .. 0x11A4F ; Unknown + 0x11A50, # .. 0x11A83 ; Soyombo + 0x11A84, # .. 0x11A85 ; Unknown + 0x11A86, # .. 0x11A9C ; Soyombo + 0x11A9D, # .. 0x11A9D ; Unknown + 0x11A9E, # .. 0x11AA2 ; Soyombo + 0x11AA3, # .. 0x11ABF ; Unknown + 0x11AC0, # .. 0x11AF8 ; Pau_Cin_Hau + 0x11AF9, # .. 0x11BFF ; Unknown + 0x11C00, # .. 0x11C08 ; Bhaiksuki + 0x11C09, # .. 0x11C09 ; Unknown + 0x11C0A, # .. 0x11C36 ; Bhaiksuki + 0x11C37, # .. 0x11C37 ; Unknown + 0x11C38, # .. 0x11C45 ; Bhaiksuki + 0x11C46, # .. 0x11C4F ; Unknown + 0x11C50, # .. 0x11C6C ; Bhaiksuki + 0x11C6D, # .. 0x11C6F ; Unknown + 0x11C70, # .. 0x11C8F ; Marchen + 0x11C90, # .. 0x11C91 ; Unknown + 0x11C92, # .. 0x11CA7 ; Marchen + 0x11CA8, # .. 0x11CA8 ; Unknown + 0x11CA9, # .. 0x11CB6 ; Marchen + 0x11CB7, # .. 0x11CFF ; Unknown + 0x11D00, # .. 0x11D06 ; Masaram_Gondi + 0x11D07, # .. 0x11D07 ; Unknown + 0x11D08, # .. 0x11D09 ; Masaram_Gondi + 0x11D0A, # .. 0x11D0A ; Unknown + 0x11D0B, # .. 0x11D36 ; Masaram_Gondi + 0x11D37, # .. 0x11D39 ; Unknown + 0x11D3A, # .. 0x11D3A ; Masaram_Gondi + 0x11D3B, # .. 0x11D3B ; Unknown + 0x11D3C, # .. 0x11D3D ; Masaram_Gondi + 0x11D3E, # .. 0x11D3E ; Unknown + 0x11D3F, # .. 0x11D47 ; Masaram_Gondi + 0x11D48, # .. 0x11D4F ; Unknown + 0x11D50, # .. 0x11D59 ; Masaram_Gondi + 0x11D5A, # .. 0x11FFF ; Unknown + 0x12000, # .. 0x12399 ; Cuneiform + 0x1239A, # .. 0x123FF ; Unknown + 0x12400, # .. 0x1246E ; Cuneiform + 0x1246F, # .. 0x1246F ; Unknown + 0x12470, # .. 0x12474 ; Cuneiform + 0x12475, # .. 0x1247F ; Unknown + 0x12480, # .. 0x12543 ; Cuneiform + 0x12544, # .. 0x12FFF ; Unknown + 0x13000, # .. 0x1342E ; Egyptian_Hieroglyphs + 0x1342F, # .. 0x143FF ; Unknown + 0x14400, # .. 0x14646 ; Anatolian_Hieroglyphs + 0x14647, # .. 0x167FF ; Unknown + 0x16800, # .. 0x16A38 ; Bamum + 0x16A39, # .. 0x16A3F ; Unknown + 0x16A40, # .. 0x16A5E ; Mro + 0x16A5F, # .. 0x16A5F ; Unknown + 0x16A60, # .. 0x16A69 ; Mro + 0x16A6A, # .. 0x16A6D ; Unknown + 0x16A6E, # .. 0x16A6F ; Mro + 0x16A70, # .. 0x16ACF ; Unknown + 0x16AD0, # .. 0x16AED ; Bassa_Vah + 0x16AEE, # .. 0x16AEF ; Unknown + 0x16AF0, # .. 0x16AF5 ; Bassa_Vah + 0x16AF6, # .. 0x16AFF ; Unknown + 0x16B00, # .. 0x16B45 ; Pahawh_Hmong + 0x16B46, # .. 0x16B4F ; Unknown + 0x16B50, # .. 0x16B59 ; Pahawh_Hmong + 0x16B5A, # .. 0x16B5A ; Unknown + 0x16B5B, # .. 0x16B61 ; Pahawh_Hmong + 0x16B62, # .. 0x16B62 ; Unknown + 0x16B63, # .. 0x16B77 ; Pahawh_Hmong + 0x16B78, # .. 0x16B7C ; Unknown + 0x16B7D, # .. 0x16B8F ; Pahawh_Hmong + 0x16B90, # .. 0x16EFF ; Unknown + 0x16F00, # .. 0x16F44 ; Miao + 0x16F45, # .. 0x16F4F ; Unknown + 0x16F50, # .. 0x16F7E ; Miao + 0x16F7F, # .. 0x16F8E ; Unknown + 0x16F8F, # .. 0x16F9F ; Miao + 0x16FA0, # .. 0x16FDF ; Unknown + 0x16FE0, # .. 0x16FE0 ; Tangut + 0x16FE1, # .. 0x16FE1 ; Nushu + 0x16FE2, # .. 0x16FFF ; Unknown + 0x17000, # .. 0x187EC ; Tangut + 0x187ED, # .. 0x187FF ; Unknown + 0x18800, # .. 0x18AF2 ; Tangut + 0x18AF3, # .. 0x1AFFF ; Unknown + 0x1B000, # .. 0x1B000 ; Katakana + 0x1B001, # .. 0x1B11E ; Hiragana + 0x1B11F, # .. 0x1B16F ; Unknown + 0x1B170, # .. 0x1B2FB ; Nushu + 0x1B2FC, # .. 0x1BBFF ; Unknown + 0x1BC00, # .. 0x1BC6A ; Duployan + 0x1BC6B, # .. 0x1BC6F ; Unknown + 0x1BC70, # .. 0x1BC7C ; Duployan + 0x1BC7D, # .. 0x1BC7F ; Unknown + 0x1BC80, # .. 0x1BC88 ; Duployan + 0x1BC89, # .. 0x1BC8F ; Unknown + 0x1BC90, # .. 0x1BC99 ; Duployan + 0x1BC9A, # .. 0x1BC9B ; Unknown + 0x1BC9C, # .. 0x1BC9F ; Duployan + 0x1BCA0, # .. 0x1BCA3 ; Common + 0x1BCA4, # .. 0x1CFFF ; Unknown + 0x1D000, # .. 0x1D0F5 ; Common + 0x1D0F6, # .. 0x1D0FF ; Unknown + 0x1D100, # .. 0x1D126 ; Common + 0x1D127, # .. 0x1D128 ; Unknown + 0x1D129, # .. 0x1D166 ; Common + 0x1D167, # .. 0x1D169 ; Inherited + 0x1D16A, # .. 0x1D17A ; Common + 0x1D17B, # .. 0x1D182 ; Inherited + 0x1D183, # .. 0x1D184 ; Common + 0x1D185, # .. 0x1D18B ; Inherited + 0x1D18C, # .. 0x1D1A9 ; Common + 0x1D1AA, # .. 0x1D1AD ; Inherited + 0x1D1AE, # .. 0x1D1E8 ; Common + 0x1D1E9, # .. 0x1D1FF ; Unknown + 0x1D200, # .. 0x1D245 ; Greek + 0x1D246, # .. 0x1D2FF ; Unknown + 0x1D300, # .. 0x1D356 ; Common + 0x1D357, # .. 0x1D35F ; Unknown + 0x1D360, # .. 0x1D371 ; Common + 0x1D372, # .. 0x1D3FF ; Unknown + 0x1D400, # .. 0x1D454 ; Common + 0x1D455, # .. 0x1D455 ; Unknown + 0x1D456, # .. 0x1D49C ; Common + 0x1D49D, # .. 0x1D49D ; Unknown + 0x1D49E, # .. 0x1D49F ; Common + 0x1D4A0, # .. 0x1D4A1 ; Unknown + 0x1D4A2, # .. 0x1D4A2 ; Common + 0x1D4A3, # .. 0x1D4A4 ; Unknown + 0x1D4A5, # .. 0x1D4A6 ; Common + 0x1D4A7, # .. 0x1D4A8 ; Unknown + 0x1D4A9, # .. 0x1D4AC ; Common + 0x1D4AD, # .. 0x1D4AD ; Unknown + 0x1D4AE, # .. 0x1D4B9 ; Common + 0x1D4BA, # .. 0x1D4BA ; Unknown + 0x1D4BB, # .. 0x1D4BB ; Common + 0x1D4BC, # .. 0x1D4BC ; Unknown + 0x1D4BD, # .. 0x1D4C3 ; Common + 0x1D4C4, # .. 0x1D4C4 ; Unknown + 0x1D4C5, # .. 0x1D505 ; Common + 0x1D506, # .. 0x1D506 ; Unknown + 0x1D507, # .. 0x1D50A ; Common + 0x1D50B, # .. 0x1D50C ; Unknown + 0x1D50D, # .. 0x1D514 ; Common + 0x1D515, # .. 0x1D515 ; Unknown + 0x1D516, # .. 0x1D51C ; Common + 0x1D51D, # .. 0x1D51D ; Unknown + 0x1D51E, # .. 0x1D539 ; Common + 0x1D53A, # .. 0x1D53A ; Unknown + 0x1D53B, # .. 0x1D53E ; Common + 0x1D53F, # .. 0x1D53F ; Unknown + 0x1D540, # .. 0x1D544 ; Common + 0x1D545, # .. 0x1D545 ; Unknown + 0x1D546, # .. 0x1D546 ; Common + 0x1D547, # .. 0x1D549 ; Unknown + 0x1D54A, # .. 0x1D550 ; Common + 0x1D551, # .. 0x1D551 ; Unknown + 0x1D552, # .. 0x1D6A5 ; Common + 0x1D6A6, # .. 0x1D6A7 ; Unknown + 0x1D6A8, # .. 0x1D7CB ; Common + 0x1D7CC, # .. 0x1D7CD ; Unknown + 0x1D7CE, # .. 0x1D7FF ; Common + 0x1D800, # .. 0x1DA8B ; SignWriting + 0x1DA8C, # .. 0x1DA9A ; Unknown + 0x1DA9B, # .. 0x1DA9F ; SignWriting + 0x1DAA0, # .. 0x1DAA0 ; Unknown + 0x1DAA1, # .. 0x1DAAF ; SignWriting + 0x1DAB0, # .. 0x1DFFF ; Unknown + 0x1E000, # .. 0x1E006 ; Glagolitic + 0x1E007, # .. 0x1E007 ; Unknown + 0x1E008, # .. 0x1E018 ; Glagolitic + 0x1E019, # .. 0x1E01A ; Unknown + 0x1E01B, # .. 0x1E021 ; Glagolitic + 0x1E022, # .. 0x1E022 ; Unknown + 0x1E023, # .. 0x1E024 ; Glagolitic + 0x1E025, # .. 0x1E025 ; Unknown + 0x1E026, # .. 0x1E02A ; Glagolitic + 0x1E02B, # .. 0x1E7FF ; Unknown + 0x1E800, # .. 0x1E8C4 ; Mende_Kikakui + 0x1E8C5, # .. 0x1E8C6 ; Unknown + 0x1E8C7, # .. 0x1E8D6 ; Mende_Kikakui + 0x1E8D7, # .. 0x1E8FF ; Unknown + 0x1E900, # .. 0x1E94A ; Adlam + 0x1E94B, # .. 0x1E94F ; Unknown + 0x1E950, # .. 0x1E959 ; Adlam + 0x1E95A, # .. 0x1E95D ; Unknown + 0x1E95E, # .. 0x1E95F ; Adlam + 0x1E960, # .. 0x1EDFF ; Unknown + 0x1EE00, # .. 0x1EE03 ; Arabic + 0x1EE04, # .. 0x1EE04 ; Unknown + 0x1EE05, # .. 0x1EE1F ; Arabic + 0x1EE20, # .. 0x1EE20 ; Unknown + 0x1EE21, # .. 0x1EE22 ; Arabic + 0x1EE23, # .. 0x1EE23 ; Unknown + 0x1EE24, # .. 0x1EE24 ; Arabic + 0x1EE25, # .. 0x1EE26 ; Unknown + 0x1EE27, # .. 0x1EE27 ; Arabic + 0x1EE28, # .. 0x1EE28 ; Unknown + 0x1EE29, # .. 0x1EE32 ; Arabic + 0x1EE33, # .. 0x1EE33 ; Unknown + 0x1EE34, # .. 0x1EE37 ; Arabic + 0x1EE38, # .. 0x1EE38 ; Unknown + 0x1EE39, # .. 0x1EE39 ; Arabic + 0x1EE3A, # .. 0x1EE3A ; Unknown + 0x1EE3B, # .. 0x1EE3B ; Arabic + 0x1EE3C, # .. 0x1EE41 ; Unknown + 0x1EE42, # .. 0x1EE42 ; Arabic + 0x1EE43, # .. 0x1EE46 ; Unknown + 0x1EE47, # .. 0x1EE47 ; Arabic + 0x1EE48, # .. 0x1EE48 ; Unknown + 0x1EE49, # .. 0x1EE49 ; Arabic + 0x1EE4A, # .. 0x1EE4A ; Unknown + 0x1EE4B, # .. 0x1EE4B ; Arabic + 0x1EE4C, # .. 0x1EE4C ; Unknown + 0x1EE4D, # .. 0x1EE4F ; Arabic + 0x1EE50, # .. 0x1EE50 ; Unknown + 0x1EE51, # .. 0x1EE52 ; Arabic + 0x1EE53, # .. 0x1EE53 ; Unknown + 0x1EE54, # .. 0x1EE54 ; Arabic + 0x1EE55, # .. 0x1EE56 ; Unknown + 0x1EE57, # .. 0x1EE57 ; Arabic + 0x1EE58, # .. 0x1EE58 ; Unknown + 0x1EE59, # .. 0x1EE59 ; Arabic + 0x1EE5A, # .. 0x1EE5A ; Unknown + 0x1EE5B, # .. 0x1EE5B ; Arabic + 0x1EE5C, # .. 0x1EE5C ; Unknown + 0x1EE5D, # .. 0x1EE5D ; Arabic + 0x1EE5E, # .. 0x1EE5E ; Unknown + 0x1EE5F, # .. 0x1EE5F ; Arabic + 0x1EE60, # .. 0x1EE60 ; Unknown + 0x1EE61, # .. 0x1EE62 ; Arabic + 0x1EE63, # .. 0x1EE63 ; Unknown + 0x1EE64, # .. 0x1EE64 ; Arabic + 0x1EE65, # .. 0x1EE66 ; Unknown + 0x1EE67, # .. 0x1EE6A ; Arabic + 0x1EE6B, # .. 0x1EE6B ; Unknown + 0x1EE6C, # .. 0x1EE72 ; Arabic + 0x1EE73, # .. 0x1EE73 ; Unknown + 0x1EE74, # .. 0x1EE77 ; Arabic + 0x1EE78, # .. 0x1EE78 ; Unknown + 0x1EE79, # .. 0x1EE7C ; Arabic + 0x1EE7D, # .. 0x1EE7D ; Unknown + 0x1EE7E, # .. 0x1EE7E ; Arabic + 0x1EE7F, # .. 0x1EE7F ; Unknown + 0x1EE80, # .. 0x1EE89 ; Arabic + 0x1EE8A, # .. 0x1EE8A ; Unknown + 0x1EE8B, # .. 0x1EE9B ; Arabic + 0x1EE9C, # .. 0x1EEA0 ; Unknown + 0x1EEA1, # .. 0x1EEA3 ; Arabic + 0x1EEA4, # .. 0x1EEA4 ; Unknown + 0x1EEA5, # .. 0x1EEA9 ; Arabic + 0x1EEAA, # .. 0x1EEAA ; Unknown + 0x1EEAB, # .. 0x1EEBB ; Arabic + 0x1EEBC, # .. 0x1EEEF ; Unknown + 0x1EEF0, # .. 0x1EEF1 ; Arabic + 0x1EEF2, # .. 0x1EFFF ; Unknown + 0x1F000, # .. 0x1F02B ; Common + 0x1F02C, # .. 0x1F02F ; Unknown + 0x1F030, # .. 0x1F093 ; Common + 0x1F094, # .. 0x1F09F ; Unknown + 0x1F0A0, # .. 0x1F0AE ; Common + 0x1F0AF, # .. 0x1F0B0 ; Unknown + 0x1F0B1, # .. 0x1F0BF ; Common + 0x1F0C0, # .. 0x1F0C0 ; Unknown + 0x1F0C1, # .. 0x1F0CF ; Common + 0x1F0D0, # .. 0x1F0D0 ; Unknown + 0x1F0D1, # .. 0x1F0F5 ; Common + 0x1F0F6, # .. 0x1F0FF ; Unknown + 0x1F100, # .. 0x1F10C ; Common + 0x1F10D, # .. 0x1F10F ; Unknown + 0x1F110, # .. 0x1F12E ; Common + 0x1F12F, # .. 0x1F12F ; Unknown + 0x1F130, # .. 0x1F16B ; Common + 0x1F16C, # .. 0x1F16F ; Unknown + 0x1F170, # .. 0x1F1AC ; Common + 0x1F1AD, # .. 0x1F1E5 ; Unknown + 0x1F1E6, # .. 0x1F1FF ; Common + 0x1F200, # .. 0x1F200 ; Hiragana + 0x1F201, # .. 0x1F202 ; Common + 0x1F203, # .. 0x1F20F ; Unknown + 0x1F210, # .. 0x1F23B ; Common + 0x1F23C, # .. 0x1F23F ; Unknown + 0x1F240, # .. 0x1F248 ; Common + 0x1F249, # .. 0x1F24F ; Unknown + 0x1F250, # .. 0x1F251 ; Common + 0x1F252, # .. 0x1F25F ; Unknown + 0x1F260, # .. 0x1F265 ; Common + 0x1F266, # .. 0x1F2FF ; Unknown + 0x1F300, # .. 0x1F6D4 ; Common + 0x1F6D5, # .. 0x1F6DF ; Unknown + 0x1F6E0, # .. 0x1F6EC ; Common + 0x1F6ED, # .. 0x1F6EF ; Unknown + 0x1F6F0, # .. 0x1F6F8 ; Common + 0x1F6F9, # .. 0x1F6FF ; Unknown + 0x1F700, # .. 0x1F773 ; Common + 0x1F774, # .. 0x1F77F ; Unknown + 0x1F780, # .. 0x1F7D4 ; Common + 0x1F7D5, # .. 0x1F7FF ; Unknown + 0x1F800, # .. 0x1F80B ; Common + 0x1F80C, # .. 0x1F80F ; Unknown + 0x1F810, # .. 0x1F847 ; Common + 0x1F848, # .. 0x1F84F ; Unknown + 0x1F850, # .. 0x1F859 ; Common + 0x1F85A, # .. 0x1F85F ; Unknown + 0x1F860, # .. 0x1F887 ; Common + 0x1F888, # .. 0x1F88F ; Unknown + 0x1F890, # .. 0x1F8AD ; Common + 0x1F8AE, # .. 0x1F8FF ; Unknown + 0x1F900, # .. 0x1F90B ; Common + 0x1F90C, # .. 0x1F90F ; Unknown + 0x1F910, # .. 0x1F93E ; Common + 0x1F93F, # .. 0x1F93F ; Unknown + 0x1F940, # .. 0x1F94C ; Common + 0x1F94D, # .. 0x1F94F ; Unknown + 0x1F950, # .. 0x1F96B ; Common + 0x1F96C, # .. 0x1F97F ; Unknown + 0x1F980, # .. 0x1F997 ; Common + 0x1F998, # .. 0x1F9BF ; Unknown + 0x1F9C0, # .. 0x1F9C0 ; Common + 0x1F9C1, # .. 0x1F9CF ; Unknown + 0x1F9D0, # .. 0x1F9E6 ; Common + 0x1F9E7, # .. 0x1FFFF ; Unknown + 0x20000, # .. 0x2A6D6 ; Han + 0x2A6D7, # .. 0x2A6FF ; Unknown + 0x2A700, # .. 0x2B734 ; Han + 0x2B735, # .. 0x2B73F ; Unknown + 0x2B740, # .. 0x2B81D ; Han + 0x2B81E, # .. 0x2B81F ; Unknown + 0x2B820, # .. 0x2CEA1 ; Han + 0x2CEA2, # .. 0x2CEAF ; Unknown + 0x2CEB0, # .. 0x2EBE0 ; Han + 0x2EBE1, # .. 0x2F7FF ; Unknown + 0x2F800, # .. 0x2FA1D ; Han + 0x2FA1E, # .. 0xE0000 ; Unknown + 0xE0001, # .. 0xE0001 ; Common + 0xE0002, # .. 0xE001F ; Unknown + 0xE0020, # .. 0xE007F ; Common + 0xE0080, # .. 0xE00FF ; Unknown + 0xE0100, # .. 0xE01EF ; Inherited + 0xE01F0, # .. 0x10FFFF ; Unknown +] + +SCRIPT_NAMES = [ + 'Common', # 0000..0040 + 'Latin', # 0041..005A + 'Common', # 005B..0060 + 'Latin', # 0061..007A + 'Common', # 007B..00A9 + 'Latin', # 00AA..00AA + 'Common', # 00AB..00B9 + 'Latin', # 00BA..00BA + 'Common', # 00BB..00BF + 'Latin', # 00C0..00D6 + 'Common', # 00D7..00D7 + 'Latin', # 00D8..00F6 + 'Common', # 00F7..00F7 + 'Latin', # 00F8..02B8 + 'Common', # 02B9..02DF + 'Latin', # 02E0..02E4 + 'Common', # 02E5..02E9 + 'Bopomofo', # 02EA..02EB + 'Common', # 02EC..02FF + 'Inherited', # 0300..036F + 'Greek', # 0370..0373 + 'Common', # 0374..0374 + 'Greek', # 0375..0377 + 'Unknown', # 0378..0379 + 'Greek', # 037A..037D + 'Common', # 037E..037E + 'Greek', # 037F..037F + 'Unknown', # 0380..0383 + 'Greek', # 0384..0384 + 'Common', # 0385..0385 + 'Greek', # 0386..0386 + 'Common', # 0387..0387 + 'Greek', # 0388..038A + 'Unknown', # 038B..038B + 'Greek', # 038C..038C + 'Unknown', # 038D..038D + 'Greek', # 038E..03A1 + 'Unknown', # 03A2..03A2 + 'Greek', # 03A3..03E1 + 'Coptic', # 03E2..03EF + 'Greek', # 03F0..03FF + 'Cyrillic', # 0400..0484 + 'Inherited', # 0485..0486 + 'Cyrillic', # 0487..052F + 'Unknown', # 0530..0530 + 'Armenian', # 0531..0556 + 'Unknown', # 0557..0558 + 'Armenian', # 0559..055F + 'Unknown', # 0560..0560 + 'Armenian', # 0561..0587 + 'Unknown', # 0588..0588 + 'Common', # 0589..0589 + 'Armenian', # 058A..058A + 'Unknown', # 058B..058C + 'Armenian', # 058D..058F + 'Unknown', # 0590..0590 + 'Hebrew', # 0591..05C7 + 'Unknown', # 05C8..05CF + 'Hebrew', # 05D0..05EA + 'Unknown', # 05EB..05EF + 'Hebrew', # 05F0..05F4 + 'Unknown', # 05F5..05FF + 'Arabic', # 0600..0604 + 'Common', # 0605..0605 + 'Arabic', # 0606..060B + 'Common', # 060C..060C + 'Arabic', # 060D..061A + 'Common', # 061B..061B + 'Arabic', # 061C..061C + 'Unknown', # 061D..061D + 'Arabic', # 061E..061E + 'Common', # 061F..061F + 'Arabic', # 0620..063F + 'Common', # 0640..0640 + 'Arabic', # 0641..064A + 'Inherited', # 064B..0655 + 'Arabic', # 0656..066F + 'Inherited', # 0670..0670 + 'Arabic', # 0671..06DC + 'Common', # 06DD..06DD + 'Arabic', # 06DE..06FF + 'Syriac', # 0700..070D + 'Unknown', # 070E..070E + 'Syriac', # 070F..074A + 'Unknown', # 074B..074C + 'Syriac', # 074D..074F + 'Arabic', # 0750..077F + 'Thaana', # 0780..07B1 + 'Unknown', # 07B2..07BF + 'Nko', # 07C0..07FA + 'Unknown', # 07FB..07FF + 'Samaritan', # 0800..082D + 'Unknown', # 082E..082F + 'Samaritan', # 0830..083E + 'Unknown', # 083F..083F + 'Mandaic', # 0840..085B + 'Unknown', # 085C..085D + 'Mandaic', # 085E..085E + 'Unknown', # 085F..085F + 'Syriac', # 0860..086A + 'Unknown', # 086B..089F + 'Arabic', # 08A0..08B4 + 'Unknown', # 08B5..08B5 + 'Arabic', # 08B6..08BD + 'Unknown', # 08BE..08D3 + 'Arabic', # 08D4..08E1 + 'Common', # 08E2..08E2 + 'Arabic', # 08E3..08FF + 'Devanagari', # 0900..0950 + 'Inherited', # 0951..0952 + 'Devanagari', # 0953..0963 + 'Common', # 0964..0965 + 'Devanagari', # 0966..097F + 'Bengali', # 0980..0983 + 'Unknown', # 0984..0984 + 'Bengali', # 0985..098C + 'Unknown', # 098D..098E + 'Bengali', # 098F..0990 + 'Unknown', # 0991..0992 + 'Bengali', # 0993..09A8 + 'Unknown', # 09A9..09A9 + 'Bengali', # 09AA..09B0 + 'Unknown', # 09B1..09B1 + 'Bengali', # 09B2..09B2 + 'Unknown', # 09B3..09B5 + 'Bengali', # 09B6..09B9 + 'Unknown', # 09BA..09BB + 'Bengali', # 09BC..09C4 + 'Unknown', # 09C5..09C6 + 'Bengali', # 09C7..09C8 + 'Unknown', # 09C9..09CA + 'Bengali', # 09CB..09CE + 'Unknown', # 09CF..09D6 + 'Bengali', # 09D7..09D7 + 'Unknown', # 09D8..09DB + 'Bengali', # 09DC..09DD + 'Unknown', # 09DE..09DE + 'Bengali', # 09DF..09E3 + 'Unknown', # 09E4..09E5 + 'Bengali', # 09E6..09FD + 'Unknown', # 09FE..0A00 + 'Gurmukhi', # 0A01..0A03 + 'Unknown', # 0A04..0A04 + 'Gurmukhi', # 0A05..0A0A + 'Unknown', # 0A0B..0A0E + 'Gurmukhi', # 0A0F..0A10 + 'Unknown', # 0A11..0A12 + 'Gurmukhi', # 0A13..0A28 + 'Unknown', # 0A29..0A29 + 'Gurmukhi', # 0A2A..0A30 + 'Unknown', # 0A31..0A31 + 'Gurmukhi', # 0A32..0A33 + 'Unknown', # 0A34..0A34 + 'Gurmukhi', # 0A35..0A36 + 'Unknown', # 0A37..0A37 + 'Gurmukhi', # 0A38..0A39 + 'Unknown', # 0A3A..0A3B + 'Gurmukhi', # 0A3C..0A3C + 'Unknown', # 0A3D..0A3D + 'Gurmukhi', # 0A3E..0A42 + 'Unknown', # 0A43..0A46 + 'Gurmukhi', # 0A47..0A48 + 'Unknown', # 0A49..0A4A + 'Gurmukhi', # 0A4B..0A4D + 'Unknown', # 0A4E..0A50 + 'Gurmukhi', # 0A51..0A51 + 'Unknown', # 0A52..0A58 + 'Gurmukhi', # 0A59..0A5C + 'Unknown', # 0A5D..0A5D + 'Gurmukhi', # 0A5E..0A5E + 'Unknown', # 0A5F..0A65 + 'Gurmukhi', # 0A66..0A75 + 'Unknown', # 0A76..0A80 + 'Gujarati', # 0A81..0A83 + 'Unknown', # 0A84..0A84 + 'Gujarati', # 0A85..0A8D + 'Unknown', # 0A8E..0A8E + 'Gujarati', # 0A8F..0A91 + 'Unknown', # 0A92..0A92 + 'Gujarati', # 0A93..0AA8 + 'Unknown', # 0AA9..0AA9 + 'Gujarati', # 0AAA..0AB0 + 'Unknown', # 0AB1..0AB1 + 'Gujarati', # 0AB2..0AB3 + 'Unknown', # 0AB4..0AB4 + 'Gujarati', # 0AB5..0AB9 + 'Unknown', # 0ABA..0ABB + 'Gujarati', # 0ABC..0AC5 + 'Unknown', # 0AC6..0AC6 + 'Gujarati', # 0AC7..0AC9 + 'Unknown', # 0ACA..0ACA + 'Gujarati', # 0ACB..0ACD + 'Unknown', # 0ACE..0ACF + 'Gujarati', # 0AD0..0AD0 + 'Unknown', # 0AD1..0ADF + 'Gujarati', # 0AE0..0AE3 + 'Unknown', # 0AE4..0AE5 + 'Gujarati', # 0AE6..0AF1 + 'Unknown', # 0AF2..0AF8 + 'Gujarati', # 0AF9..0AFF + 'Unknown', # 0B00..0B00 + 'Oriya', # 0B01..0B03 + 'Unknown', # 0B04..0B04 + 'Oriya', # 0B05..0B0C + 'Unknown', # 0B0D..0B0E + 'Oriya', # 0B0F..0B10 + 'Unknown', # 0B11..0B12 + 'Oriya', # 0B13..0B28 + 'Unknown', # 0B29..0B29 + 'Oriya', # 0B2A..0B30 + 'Unknown', # 0B31..0B31 + 'Oriya', # 0B32..0B33 + 'Unknown', # 0B34..0B34 + 'Oriya', # 0B35..0B39 + 'Unknown', # 0B3A..0B3B + 'Oriya', # 0B3C..0B44 + 'Unknown', # 0B45..0B46 + 'Oriya', # 0B47..0B48 + 'Unknown', # 0B49..0B4A + 'Oriya', # 0B4B..0B4D + 'Unknown', # 0B4E..0B55 + 'Oriya', # 0B56..0B57 + 'Unknown', # 0B58..0B5B + 'Oriya', # 0B5C..0B5D + 'Unknown', # 0B5E..0B5E + 'Oriya', # 0B5F..0B63 + 'Unknown', # 0B64..0B65 + 'Oriya', # 0B66..0B77 + 'Unknown', # 0B78..0B81 + 'Tamil', # 0B82..0B83 + 'Unknown', # 0B84..0B84 + 'Tamil', # 0B85..0B8A + 'Unknown', # 0B8B..0B8D + 'Tamil', # 0B8E..0B90 + 'Unknown', # 0B91..0B91 + 'Tamil', # 0B92..0B95 + 'Unknown', # 0B96..0B98 + 'Tamil', # 0B99..0B9A + 'Unknown', # 0B9B..0B9B + 'Tamil', # 0B9C..0B9C + 'Unknown', # 0B9D..0B9D + 'Tamil', # 0B9E..0B9F + 'Unknown', # 0BA0..0BA2 + 'Tamil', # 0BA3..0BA4 + 'Unknown', # 0BA5..0BA7 + 'Tamil', # 0BA8..0BAA + 'Unknown', # 0BAB..0BAD + 'Tamil', # 0BAE..0BB9 + 'Unknown', # 0BBA..0BBD + 'Tamil', # 0BBE..0BC2 + 'Unknown', # 0BC3..0BC5 + 'Tamil', # 0BC6..0BC8 + 'Unknown', # 0BC9..0BC9 + 'Tamil', # 0BCA..0BCD + 'Unknown', # 0BCE..0BCF + 'Tamil', # 0BD0..0BD0 + 'Unknown', # 0BD1..0BD6 + 'Tamil', # 0BD7..0BD7 + 'Unknown', # 0BD8..0BE5 + 'Tamil', # 0BE6..0BFA + 'Unknown', # 0BFB..0BFF + 'Telugu', # 0C00..0C03 + 'Unknown', # 0C04..0C04 + 'Telugu', # 0C05..0C0C + 'Unknown', # 0C0D..0C0D + 'Telugu', # 0C0E..0C10 + 'Unknown', # 0C11..0C11 + 'Telugu', # 0C12..0C28 + 'Unknown', # 0C29..0C29 + 'Telugu', # 0C2A..0C39 + 'Unknown', # 0C3A..0C3C + 'Telugu', # 0C3D..0C44 + 'Unknown', # 0C45..0C45 + 'Telugu', # 0C46..0C48 + 'Unknown', # 0C49..0C49 + 'Telugu', # 0C4A..0C4D + 'Unknown', # 0C4E..0C54 + 'Telugu', # 0C55..0C56 + 'Unknown', # 0C57..0C57 + 'Telugu', # 0C58..0C5A + 'Unknown', # 0C5B..0C5F + 'Telugu', # 0C60..0C63 + 'Unknown', # 0C64..0C65 + 'Telugu', # 0C66..0C6F + 'Unknown', # 0C70..0C77 + 'Telugu', # 0C78..0C7F + 'Kannada', # 0C80..0C83 + 'Unknown', # 0C84..0C84 + 'Kannada', # 0C85..0C8C + 'Unknown', # 0C8D..0C8D + 'Kannada', # 0C8E..0C90 + 'Unknown', # 0C91..0C91 + 'Kannada', # 0C92..0CA8 + 'Unknown', # 0CA9..0CA9 + 'Kannada', # 0CAA..0CB3 + 'Unknown', # 0CB4..0CB4 + 'Kannada', # 0CB5..0CB9 + 'Unknown', # 0CBA..0CBB + 'Kannada', # 0CBC..0CC4 + 'Unknown', # 0CC5..0CC5 + 'Kannada', # 0CC6..0CC8 + 'Unknown', # 0CC9..0CC9 + 'Kannada', # 0CCA..0CCD + 'Unknown', # 0CCE..0CD4 + 'Kannada', # 0CD5..0CD6 + 'Unknown', # 0CD7..0CDD + 'Kannada', # 0CDE..0CDE + 'Unknown', # 0CDF..0CDF + 'Kannada', # 0CE0..0CE3 + 'Unknown', # 0CE4..0CE5 + 'Kannada', # 0CE6..0CEF + 'Unknown', # 0CF0..0CF0 + 'Kannada', # 0CF1..0CF2 + 'Unknown', # 0CF3..0CFF + 'Malayalam', # 0D00..0D03 + 'Unknown', # 0D04..0D04 + 'Malayalam', # 0D05..0D0C + 'Unknown', # 0D0D..0D0D + 'Malayalam', # 0D0E..0D10 + 'Unknown', # 0D11..0D11 + 'Malayalam', # 0D12..0D44 + 'Unknown', # 0D45..0D45 + 'Malayalam', # 0D46..0D48 + 'Unknown', # 0D49..0D49 + 'Malayalam', # 0D4A..0D4F + 'Unknown', # 0D50..0D53 + 'Malayalam', # 0D54..0D63 + 'Unknown', # 0D64..0D65 + 'Malayalam', # 0D66..0D7F + 'Unknown', # 0D80..0D81 + 'Sinhala', # 0D82..0D83 + 'Unknown', # 0D84..0D84 + 'Sinhala', # 0D85..0D96 + 'Unknown', # 0D97..0D99 + 'Sinhala', # 0D9A..0DB1 + 'Unknown', # 0DB2..0DB2 + 'Sinhala', # 0DB3..0DBB + 'Unknown', # 0DBC..0DBC + 'Sinhala', # 0DBD..0DBD + 'Unknown', # 0DBE..0DBF + 'Sinhala', # 0DC0..0DC6 + 'Unknown', # 0DC7..0DC9 + 'Sinhala', # 0DCA..0DCA + 'Unknown', # 0DCB..0DCE + 'Sinhala', # 0DCF..0DD4 + 'Unknown', # 0DD5..0DD5 + 'Sinhala', # 0DD6..0DD6 + 'Unknown', # 0DD7..0DD7 + 'Sinhala', # 0DD8..0DDF + 'Unknown', # 0DE0..0DE5 + 'Sinhala', # 0DE6..0DEF + 'Unknown', # 0DF0..0DF1 + 'Sinhala', # 0DF2..0DF4 + 'Unknown', # 0DF5..0E00 + 'Thai', # 0E01..0E3A + 'Unknown', # 0E3B..0E3E + 'Common', # 0E3F..0E3F + 'Thai', # 0E40..0E5B + 'Unknown', # 0E5C..0E80 + 'Lao', # 0E81..0E82 + 'Unknown', # 0E83..0E83 + 'Lao', # 0E84..0E84 + 'Unknown', # 0E85..0E86 + 'Lao', # 0E87..0E88 + 'Unknown', # 0E89..0E89 + 'Lao', # 0E8A..0E8A + 'Unknown', # 0E8B..0E8C + 'Lao', # 0E8D..0E8D + 'Unknown', # 0E8E..0E93 + 'Lao', # 0E94..0E97 + 'Unknown', # 0E98..0E98 + 'Lao', # 0E99..0E9F + 'Unknown', # 0EA0..0EA0 + 'Lao', # 0EA1..0EA3 + 'Unknown', # 0EA4..0EA4 + 'Lao', # 0EA5..0EA5 + 'Unknown', # 0EA6..0EA6 + 'Lao', # 0EA7..0EA7 + 'Unknown', # 0EA8..0EA9 + 'Lao', # 0EAA..0EAB + 'Unknown', # 0EAC..0EAC + 'Lao', # 0EAD..0EB9 + 'Unknown', # 0EBA..0EBA + 'Lao', # 0EBB..0EBD + 'Unknown', # 0EBE..0EBF + 'Lao', # 0EC0..0EC4 + 'Unknown', # 0EC5..0EC5 + 'Lao', # 0EC6..0EC6 + 'Unknown', # 0EC7..0EC7 + 'Lao', # 0EC8..0ECD + 'Unknown', # 0ECE..0ECF + 'Lao', # 0ED0..0ED9 + 'Unknown', # 0EDA..0EDB + 'Lao', # 0EDC..0EDF + 'Unknown', # 0EE0..0EFF + 'Tibetan', # 0F00..0F47 + 'Unknown', # 0F48..0F48 + 'Tibetan', # 0F49..0F6C + 'Unknown', # 0F6D..0F70 + 'Tibetan', # 0F71..0F97 + 'Unknown', # 0F98..0F98 + 'Tibetan', # 0F99..0FBC + 'Unknown', # 0FBD..0FBD + 'Tibetan', # 0FBE..0FCC + 'Unknown', # 0FCD..0FCD + 'Tibetan', # 0FCE..0FD4 + 'Common', # 0FD5..0FD8 + 'Tibetan', # 0FD9..0FDA + 'Unknown', # 0FDB..0FFF + 'Myanmar', # 1000..109F + 'Georgian', # 10A0..10C5 + 'Unknown', # 10C6..10C6 + 'Georgian', # 10C7..10C7 + 'Unknown', # 10C8..10CC + 'Georgian', # 10CD..10CD + 'Unknown', # 10CE..10CF + 'Georgian', # 10D0..10FA + 'Common', # 10FB..10FB + 'Georgian', # 10FC..10FF + 'Hangul', # 1100..11FF + 'Ethiopic', # 1200..1248 + 'Unknown', # 1249..1249 + 'Ethiopic', # 124A..124D + 'Unknown', # 124E..124F + 'Ethiopic', # 1250..1256 + 'Unknown', # 1257..1257 + 'Ethiopic', # 1258..1258 + 'Unknown', # 1259..1259 + 'Ethiopic', # 125A..125D + 'Unknown', # 125E..125F + 'Ethiopic', # 1260..1288 + 'Unknown', # 1289..1289 + 'Ethiopic', # 128A..128D + 'Unknown', # 128E..128F + 'Ethiopic', # 1290..12B0 + 'Unknown', # 12B1..12B1 + 'Ethiopic', # 12B2..12B5 + 'Unknown', # 12B6..12B7 + 'Ethiopic', # 12B8..12BE + 'Unknown', # 12BF..12BF + 'Ethiopic', # 12C0..12C0 + 'Unknown', # 12C1..12C1 + 'Ethiopic', # 12C2..12C5 + 'Unknown', # 12C6..12C7 + 'Ethiopic', # 12C8..12D6 + 'Unknown', # 12D7..12D7 + 'Ethiopic', # 12D8..1310 + 'Unknown', # 1311..1311 + 'Ethiopic', # 1312..1315 + 'Unknown', # 1316..1317 + 'Ethiopic', # 1318..135A + 'Unknown', # 135B..135C + 'Ethiopic', # 135D..137C + 'Unknown', # 137D..137F + 'Ethiopic', # 1380..1399 + 'Unknown', # 139A..139F + 'Cherokee', # 13A0..13F5 + 'Unknown', # 13F6..13F7 + 'Cherokee', # 13F8..13FD + 'Unknown', # 13FE..13FF + 'Canadian_Aboriginal', # 1400..167F + 'Ogham', # 1680..169C + 'Unknown', # 169D..169F + 'Runic', # 16A0..16EA + 'Common', # 16EB..16ED + 'Runic', # 16EE..16F8 + 'Unknown', # 16F9..16FF + 'Tagalog', # 1700..170C + 'Unknown', # 170D..170D + 'Tagalog', # 170E..1714 + 'Unknown', # 1715..171F + 'Hanunoo', # 1720..1734 + 'Common', # 1735..1736 + 'Unknown', # 1737..173F + 'Buhid', # 1740..1753 + 'Unknown', # 1754..175F + 'Tagbanwa', # 1760..176C + 'Unknown', # 176D..176D + 'Tagbanwa', # 176E..1770 + 'Unknown', # 1771..1771 + 'Tagbanwa', # 1772..1773 + 'Unknown', # 1774..177F + 'Khmer', # 1780..17DD + 'Unknown', # 17DE..17DF + 'Khmer', # 17E0..17E9 + 'Unknown', # 17EA..17EF + 'Khmer', # 17F0..17F9 + 'Unknown', # 17FA..17FF + 'Mongolian', # 1800..1801 + 'Common', # 1802..1803 + 'Mongolian', # 1804..1804 + 'Common', # 1805..1805 + 'Mongolian', # 1806..180E + 'Unknown', # 180F..180F + 'Mongolian', # 1810..1819 + 'Unknown', # 181A..181F + 'Mongolian', # 1820..1877 + 'Unknown', # 1878..187F + 'Mongolian', # 1880..18AA + 'Unknown', # 18AB..18AF + 'Canadian_Aboriginal', # 18B0..18F5 + 'Unknown', # 18F6..18FF + 'Limbu', # 1900..191E + 'Unknown', # 191F..191F + 'Limbu', # 1920..192B + 'Unknown', # 192C..192F + 'Limbu', # 1930..193B + 'Unknown', # 193C..193F + 'Limbu', # 1940..1940 + 'Unknown', # 1941..1943 + 'Limbu', # 1944..194F + 'Tai_Le', # 1950..196D + 'Unknown', # 196E..196F + 'Tai_Le', # 1970..1974 + 'Unknown', # 1975..197F + 'New_Tai_Lue', # 1980..19AB + 'Unknown', # 19AC..19AF + 'New_Tai_Lue', # 19B0..19C9 + 'Unknown', # 19CA..19CF + 'New_Tai_Lue', # 19D0..19DA + 'Unknown', # 19DB..19DD + 'New_Tai_Lue', # 19DE..19DF + 'Khmer', # 19E0..19FF + 'Buginese', # 1A00..1A1B + 'Unknown', # 1A1C..1A1D + 'Buginese', # 1A1E..1A1F + 'Tai_Tham', # 1A20..1A5E + 'Unknown', # 1A5F..1A5F + 'Tai_Tham', # 1A60..1A7C + 'Unknown', # 1A7D..1A7E + 'Tai_Tham', # 1A7F..1A89 + 'Unknown', # 1A8A..1A8F + 'Tai_Tham', # 1A90..1A99 + 'Unknown', # 1A9A..1A9F + 'Tai_Tham', # 1AA0..1AAD + 'Unknown', # 1AAE..1AAF + 'Inherited', # 1AB0..1ABE + 'Unknown', # 1ABF..1AFF + 'Balinese', # 1B00..1B4B + 'Unknown', # 1B4C..1B4F + 'Balinese', # 1B50..1B7C + 'Unknown', # 1B7D..1B7F + 'Sundanese', # 1B80..1BBF + 'Batak', # 1BC0..1BF3 + 'Unknown', # 1BF4..1BFB + 'Batak', # 1BFC..1BFF + 'Lepcha', # 1C00..1C37 + 'Unknown', # 1C38..1C3A + 'Lepcha', # 1C3B..1C49 + 'Unknown', # 1C4A..1C4C + 'Lepcha', # 1C4D..1C4F + 'Ol_Chiki', # 1C50..1C7F + 'Cyrillic', # 1C80..1C88 + 'Unknown', # 1C89..1CBF + 'Sundanese', # 1CC0..1CC7 + 'Unknown', # 1CC8..1CCF + 'Inherited', # 1CD0..1CD2 + 'Common', # 1CD3..1CD3 + 'Inherited', # 1CD4..1CE0 + 'Common', # 1CE1..1CE1 + 'Inherited', # 1CE2..1CE8 + 'Common', # 1CE9..1CEC + 'Inherited', # 1CED..1CED + 'Common', # 1CEE..1CF3 + 'Inherited', # 1CF4..1CF4 + 'Common', # 1CF5..1CF7 + 'Inherited', # 1CF8..1CF9 + 'Unknown', # 1CFA..1CFF + 'Latin', # 1D00..1D25 + 'Greek', # 1D26..1D2A + 'Cyrillic', # 1D2B..1D2B + 'Latin', # 1D2C..1D5C + 'Greek', # 1D5D..1D61 + 'Latin', # 1D62..1D65 + 'Greek', # 1D66..1D6A + 'Latin', # 1D6B..1D77 + 'Cyrillic', # 1D78..1D78 + 'Latin', # 1D79..1DBE + 'Greek', # 1DBF..1DBF + 'Inherited', # 1DC0..1DF9 + 'Unknown', # 1DFA..1DFA + 'Inherited', # 1DFB..1DFF + 'Latin', # 1E00..1EFF + 'Greek', # 1F00..1F15 + 'Unknown', # 1F16..1F17 + 'Greek', # 1F18..1F1D + 'Unknown', # 1F1E..1F1F + 'Greek', # 1F20..1F45 + 'Unknown', # 1F46..1F47 + 'Greek', # 1F48..1F4D + 'Unknown', # 1F4E..1F4F + 'Greek', # 1F50..1F57 + 'Unknown', # 1F58..1F58 + 'Greek', # 1F59..1F59 + 'Unknown', # 1F5A..1F5A + 'Greek', # 1F5B..1F5B + 'Unknown', # 1F5C..1F5C + 'Greek', # 1F5D..1F5D + 'Unknown', # 1F5E..1F5E + 'Greek', # 1F5F..1F7D + 'Unknown', # 1F7E..1F7F + 'Greek', # 1F80..1FB4 + 'Unknown', # 1FB5..1FB5 + 'Greek', # 1FB6..1FC4 + 'Unknown', # 1FC5..1FC5 + 'Greek', # 1FC6..1FD3 + 'Unknown', # 1FD4..1FD5 + 'Greek', # 1FD6..1FDB + 'Unknown', # 1FDC..1FDC + 'Greek', # 1FDD..1FEF + 'Unknown', # 1FF0..1FF1 + 'Greek', # 1FF2..1FF4 + 'Unknown', # 1FF5..1FF5 + 'Greek', # 1FF6..1FFE + 'Unknown', # 1FFF..1FFF + 'Common', # 2000..200B + 'Inherited', # 200C..200D + 'Common', # 200E..2064 + 'Unknown', # 2065..2065 + 'Common', # 2066..2070 + 'Latin', # 2071..2071 + 'Unknown', # 2072..2073 + 'Common', # 2074..207E + 'Latin', # 207F..207F + 'Common', # 2080..208E + 'Unknown', # 208F..208F + 'Latin', # 2090..209C + 'Unknown', # 209D..209F + 'Common', # 20A0..20BF + 'Unknown', # 20C0..20CF + 'Inherited', # 20D0..20F0 + 'Unknown', # 20F1..20FF + 'Common', # 2100..2125 + 'Greek', # 2126..2126 + 'Common', # 2127..2129 + 'Latin', # 212A..212B + 'Common', # 212C..2131 + 'Latin', # 2132..2132 + 'Common', # 2133..214D + 'Latin', # 214E..214E + 'Common', # 214F..215F + 'Latin', # 2160..2188 + 'Common', # 2189..218B + 'Unknown', # 218C..218F + 'Common', # 2190..2426 + 'Unknown', # 2427..243F + 'Common', # 2440..244A + 'Unknown', # 244B..245F + 'Common', # 2460..27FF + 'Braille', # 2800..28FF + 'Common', # 2900..2B73 + 'Unknown', # 2B74..2B75 + 'Common', # 2B76..2B95 + 'Unknown', # 2B96..2B97 + 'Common', # 2B98..2BB9 + 'Unknown', # 2BBA..2BBC + 'Common', # 2BBD..2BC8 + 'Unknown', # 2BC9..2BC9 + 'Common', # 2BCA..2BD2 + 'Unknown', # 2BD3..2BEB + 'Common', # 2BEC..2BEF + 'Unknown', # 2BF0..2BFF + 'Glagolitic', # 2C00..2C2E + 'Unknown', # 2C2F..2C2F + 'Glagolitic', # 2C30..2C5E + 'Unknown', # 2C5F..2C5F + 'Latin', # 2C60..2C7F + 'Coptic', # 2C80..2CF3 + 'Unknown', # 2CF4..2CF8 + 'Coptic', # 2CF9..2CFF + 'Georgian', # 2D00..2D25 + 'Unknown', # 2D26..2D26 + 'Georgian', # 2D27..2D27 + 'Unknown', # 2D28..2D2C + 'Georgian', # 2D2D..2D2D + 'Unknown', # 2D2E..2D2F + 'Tifinagh', # 2D30..2D67 + 'Unknown', # 2D68..2D6E + 'Tifinagh', # 2D6F..2D70 + 'Unknown', # 2D71..2D7E + 'Tifinagh', # 2D7F..2D7F + 'Ethiopic', # 2D80..2D96 + 'Unknown', # 2D97..2D9F + 'Ethiopic', # 2DA0..2DA6 + 'Unknown', # 2DA7..2DA7 + 'Ethiopic', # 2DA8..2DAE + 'Unknown', # 2DAF..2DAF + 'Ethiopic', # 2DB0..2DB6 + 'Unknown', # 2DB7..2DB7 + 'Ethiopic', # 2DB8..2DBE + 'Unknown', # 2DBF..2DBF + 'Ethiopic', # 2DC0..2DC6 + 'Unknown', # 2DC7..2DC7 + 'Ethiopic', # 2DC8..2DCE + 'Unknown', # 2DCF..2DCF + 'Ethiopic', # 2DD0..2DD6 + 'Unknown', # 2DD7..2DD7 + 'Ethiopic', # 2DD8..2DDE + 'Unknown', # 2DDF..2DDF + 'Cyrillic', # 2DE0..2DFF + 'Common', # 2E00..2E49 + 'Unknown', # 2E4A..2E7F + 'Han', # 2E80..2E99 + 'Unknown', # 2E9A..2E9A + 'Han', # 2E9B..2EF3 + 'Unknown', # 2EF4..2EFF + 'Han', # 2F00..2FD5 + 'Unknown', # 2FD6..2FEF + 'Common', # 2FF0..2FFB + 'Unknown', # 2FFC..2FFF + 'Common', # 3000..3004 + 'Han', # 3005..3005 + 'Common', # 3006..3006 + 'Han', # 3007..3007 + 'Common', # 3008..3020 + 'Han', # 3021..3029 + 'Inherited', # 302A..302D + 'Hangul', # 302E..302F + 'Common', # 3030..3037 + 'Han', # 3038..303B + 'Common', # 303C..303F + 'Unknown', # 3040..3040 + 'Hiragana', # 3041..3096 + 'Unknown', # 3097..3098 + 'Inherited', # 3099..309A + 'Common', # 309B..309C + 'Hiragana', # 309D..309F + 'Common', # 30A0..30A0 + 'Katakana', # 30A1..30FA + 'Common', # 30FB..30FC + 'Katakana', # 30FD..30FF + 'Unknown', # 3100..3104 + 'Bopomofo', # 3105..312E + 'Unknown', # 312F..3130 + 'Hangul', # 3131..318E + 'Unknown', # 318F..318F + 'Common', # 3190..319F + 'Bopomofo', # 31A0..31BA + 'Unknown', # 31BB..31BF + 'Common', # 31C0..31E3 + 'Unknown', # 31E4..31EF + 'Katakana', # 31F0..31FF + 'Hangul', # 3200..321E + 'Unknown', # 321F..321F + 'Common', # 3220..325F + 'Hangul', # 3260..327E + 'Common', # 327F..32CF + 'Katakana', # 32D0..32FE + 'Unknown', # 32FF..32FF + 'Katakana', # 3300..3357 + 'Common', # 3358..33FF + 'Han', # 3400..4DB5 + 'Unknown', # 4DB6..4DBF + 'Common', # 4DC0..4DFF + 'Han', # 4E00..9FEA + 'Unknown', # 9FEB..9FFF + 'Yi', # A000..A48C + 'Unknown', # A48D..A48F + 'Yi', # A490..A4C6 + 'Unknown', # A4C7..A4CF + 'Lisu', # A4D0..A4FF + 'Vai', # A500..A62B + 'Unknown', # A62C..A63F + 'Cyrillic', # A640..A69F + 'Bamum', # A6A0..A6F7 + 'Unknown', # A6F8..A6FF + 'Common', # A700..A721 + 'Latin', # A722..A787 + 'Common', # A788..A78A + 'Latin', # A78B..A7AE + 'Unknown', # A7AF..A7AF + 'Latin', # A7B0..A7B7 + 'Unknown', # A7B8..A7F6 + 'Latin', # A7F7..A7FF + 'Syloti_Nagri', # A800..A82B + 'Unknown', # A82C..A82F + 'Common', # A830..A839 + 'Unknown', # A83A..A83F + 'Phags_Pa', # A840..A877 + 'Unknown', # A878..A87F + 'Saurashtra', # A880..A8C5 + 'Unknown', # A8C6..A8CD + 'Saurashtra', # A8CE..A8D9 + 'Unknown', # A8DA..A8DF + 'Devanagari', # A8E0..A8FD + 'Unknown', # A8FE..A8FF + 'Kayah_Li', # A900..A92D + 'Common', # A92E..A92E + 'Kayah_Li', # A92F..A92F + 'Rejang', # A930..A953 + 'Unknown', # A954..A95E + 'Rejang', # A95F..A95F + 'Hangul', # A960..A97C + 'Unknown', # A97D..A97F + 'Javanese', # A980..A9CD + 'Unknown', # A9CE..A9CE + 'Common', # A9CF..A9CF + 'Javanese', # A9D0..A9D9 + 'Unknown', # A9DA..A9DD + 'Javanese', # A9DE..A9DF + 'Myanmar', # A9E0..A9FE + 'Unknown', # A9FF..A9FF + 'Cham', # AA00..AA36 + 'Unknown', # AA37..AA3F + 'Cham', # AA40..AA4D + 'Unknown', # AA4E..AA4F + 'Cham', # AA50..AA59 + 'Unknown', # AA5A..AA5B + 'Cham', # AA5C..AA5F + 'Myanmar', # AA60..AA7F + 'Tai_Viet', # AA80..AAC2 + 'Unknown', # AAC3..AADA + 'Tai_Viet', # AADB..AADF + 'Meetei_Mayek', # AAE0..AAF6 + 'Unknown', # AAF7..AB00 + 'Ethiopic', # AB01..AB06 + 'Unknown', # AB07..AB08 + 'Ethiopic', # AB09..AB0E + 'Unknown', # AB0F..AB10 + 'Ethiopic', # AB11..AB16 + 'Unknown', # AB17..AB1F + 'Ethiopic', # AB20..AB26 + 'Unknown', # AB27..AB27 + 'Ethiopic', # AB28..AB2E + 'Unknown', # AB2F..AB2F + 'Latin', # AB30..AB5A + 'Common', # AB5B..AB5B + 'Latin', # AB5C..AB64 + 'Greek', # AB65..AB65 + 'Unknown', # AB66..AB6F + 'Cherokee', # AB70..ABBF + 'Meetei_Mayek', # ABC0..ABED + 'Unknown', # ABEE..ABEF + 'Meetei_Mayek', # ABF0..ABF9 + 'Unknown', # ABFA..ABFF + 'Hangul', # AC00..D7A3 + 'Unknown', # D7A4..D7AF + 'Hangul', # D7B0..D7C6 + 'Unknown', # D7C7..D7CA + 'Hangul', # D7CB..D7FB + 'Unknown', # D7FC..F8FF + 'Han', # F900..FA6D + 'Unknown', # FA6E..FA6F + 'Han', # FA70..FAD9 + 'Unknown', # FADA..FAFF + 'Latin', # FB00..FB06 + 'Unknown', # FB07..FB12 + 'Armenian', # FB13..FB17 + 'Unknown', # FB18..FB1C + 'Hebrew', # FB1D..FB36 + 'Unknown', # FB37..FB37 + 'Hebrew', # FB38..FB3C + 'Unknown', # FB3D..FB3D + 'Hebrew', # FB3E..FB3E + 'Unknown', # FB3F..FB3F + 'Hebrew', # FB40..FB41 + 'Unknown', # FB42..FB42 + 'Hebrew', # FB43..FB44 + 'Unknown', # FB45..FB45 + 'Hebrew', # FB46..FB4F + 'Arabic', # FB50..FBC1 + 'Unknown', # FBC2..FBD2 + 'Arabic', # FBD3..FD3D + 'Common', # FD3E..FD3F + 'Unknown', # FD40..FD4F + 'Arabic', # FD50..FD8F + 'Unknown', # FD90..FD91 + 'Arabic', # FD92..FDC7 + 'Unknown', # FDC8..FDEF + 'Arabic', # FDF0..FDFD + 'Unknown', # FDFE..FDFF + 'Inherited', # FE00..FE0F + 'Common', # FE10..FE19 + 'Unknown', # FE1A..FE1F + 'Inherited', # FE20..FE2D + 'Cyrillic', # FE2E..FE2F + 'Common', # FE30..FE52 + 'Unknown', # FE53..FE53 + 'Common', # FE54..FE66 + 'Unknown', # FE67..FE67 + 'Common', # FE68..FE6B + 'Unknown', # FE6C..FE6F + 'Arabic', # FE70..FE74 + 'Unknown', # FE75..FE75 + 'Arabic', # FE76..FEFC + 'Unknown', # FEFD..FEFE + 'Common', # FEFF..FEFF + 'Unknown', # FF00..FF00 + 'Common', # FF01..FF20 + 'Latin', # FF21..FF3A + 'Common', # FF3B..FF40 + 'Latin', # FF41..FF5A + 'Common', # FF5B..FF65 + 'Katakana', # FF66..FF6F + 'Common', # FF70..FF70 + 'Katakana', # FF71..FF9D + 'Common', # FF9E..FF9F + 'Hangul', # FFA0..FFBE + 'Unknown', # FFBF..FFC1 + 'Hangul', # FFC2..FFC7 + 'Unknown', # FFC8..FFC9 + 'Hangul', # FFCA..FFCF + 'Unknown', # FFD0..FFD1 + 'Hangul', # FFD2..FFD7 + 'Unknown', # FFD8..FFD9 + 'Hangul', # FFDA..FFDC + 'Unknown', # FFDD..FFDF + 'Common', # FFE0..FFE6 + 'Unknown', # FFE7..FFE7 + 'Common', # FFE8..FFEE + 'Unknown', # FFEF..FFF8 + 'Common', # FFF9..FFFD + 'Unknown', # FFFE..FFFF + 'Linear_B', # 10000..1000B + 'Unknown', # 1000C..1000C + 'Linear_B', # 1000D..10026 + 'Unknown', # 10027..10027 + 'Linear_B', # 10028..1003A + 'Unknown', # 1003B..1003B + 'Linear_B', # 1003C..1003D + 'Unknown', # 1003E..1003E + 'Linear_B', # 1003F..1004D + 'Unknown', # 1004E..1004F + 'Linear_B', # 10050..1005D + 'Unknown', # 1005E..1007F + 'Linear_B', # 10080..100FA + 'Unknown', # 100FB..100FF + 'Common', # 10100..10102 + 'Unknown', # 10103..10106 + 'Common', # 10107..10133 + 'Unknown', # 10134..10136 + 'Common', # 10137..1013F + 'Greek', # 10140..1018E + 'Unknown', # 1018F..1018F + 'Common', # 10190..1019B + 'Unknown', # 1019C..1019F + 'Greek', # 101A0..101A0 + 'Unknown', # 101A1..101CF + 'Common', # 101D0..101FC + 'Inherited', # 101FD..101FD + 'Unknown', # 101FE..1027F + 'Lycian', # 10280..1029C + 'Unknown', # 1029D..1029F + 'Carian', # 102A0..102D0 + 'Unknown', # 102D1..102DF + 'Inherited', # 102E0..102E0 + 'Common', # 102E1..102FB + 'Unknown', # 102FC..102FF + 'Old_Italic', # 10300..10323 + 'Unknown', # 10324..1032C + 'Old_Italic', # 1032D..1032F + 'Gothic', # 10330..1034A + 'Unknown', # 1034B..1034F + 'Old_Permic', # 10350..1037A + 'Unknown', # 1037B..1037F + 'Ugaritic', # 10380..1039D + 'Unknown', # 1039E..1039E + 'Ugaritic', # 1039F..1039F + 'Old_Persian', # 103A0..103C3 + 'Unknown', # 103C4..103C7 + 'Old_Persian', # 103C8..103D5 + 'Unknown', # 103D6..103FF + 'Deseret', # 10400..1044F + 'Shavian', # 10450..1047F + 'Osmanya', # 10480..1049D + 'Unknown', # 1049E..1049F + 'Osmanya', # 104A0..104A9 + 'Unknown', # 104AA..104AF + 'Osage', # 104B0..104D3 + 'Unknown', # 104D4..104D7 + 'Osage', # 104D8..104FB + 'Unknown', # 104FC..104FF + 'Elbasan', # 10500..10527 + 'Unknown', # 10528..1052F + 'Caucasian_Albanian', # 10530..10563 + 'Unknown', # 10564..1056E + 'Caucasian_Albanian', # 1056F..1056F + 'Unknown', # 10570..105FF + 'Linear_A', # 10600..10736 + 'Unknown', # 10737..1073F + 'Linear_A', # 10740..10755 + 'Unknown', # 10756..1075F + 'Linear_A', # 10760..10767 + 'Unknown', # 10768..107FF + 'Cypriot', # 10800..10805 + 'Unknown', # 10806..10807 + 'Cypriot', # 10808..10808 + 'Unknown', # 10809..10809 + 'Cypriot', # 1080A..10835 + 'Unknown', # 10836..10836 + 'Cypriot', # 10837..10838 + 'Unknown', # 10839..1083B + 'Cypriot', # 1083C..1083C + 'Unknown', # 1083D..1083E + 'Cypriot', # 1083F..1083F + 'Imperial_Aramaic', # 10840..10855 + 'Unknown', # 10856..10856 + 'Imperial_Aramaic', # 10857..1085F + 'Palmyrene', # 10860..1087F + 'Nabataean', # 10880..1089E + 'Unknown', # 1089F..108A6 + 'Nabataean', # 108A7..108AF + 'Unknown', # 108B0..108DF + 'Hatran', # 108E0..108F2 + 'Unknown', # 108F3..108F3 + 'Hatran', # 108F4..108F5 + 'Unknown', # 108F6..108FA + 'Hatran', # 108FB..108FF + 'Phoenician', # 10900..1091B + 'Unknown', # 1091C..1091E + 'Phoenician', # 1091F..1091F + 'Lydian', # 10920..10939 + 'Unknown', # 1093A..1093E + 'Lydian', # 1093F..1093F + 'Unknown', # 10940..1097F + 'Meroitic_Hieroglyphs', # 10980..1099F + 'Meroitic_Cursive', # 109A0..109B7 + 'Unknown', # 109B8..109BB + 'Meroitic_Cursive', # 109BC..109CF + 'Unknown', # 109D0..109D1 + 'Meroitic_Cursive', # 109D2..109FF + 'Kharoshthi', # 10A00..10A03 + 'Unknown', # 10A04..10A04 + 'Kharoshthi', # 10A05..10A06 + 'Unknown', # 10A07..10A0B + 'Kharoshthi', # 10A0C..10A13 + 'Unknown', # 10A14..10A14 + 'Kharoshthi', # 10A15..10A17 + 'Unknown', # 10A18..10A18 + 'Kharoshthi', # 10A19..10A33 + 'Unknown', # 10A34..10A37 + 'Kharoshthi', # 10A38..10A3A + 'Unknown', # 10A3B..10A3E + 'Kharoshthi', # 10A3F..10A47 + 'Unknown', # 10A48..10A4F + 'Kharoshthi', # 10A50..10A58 + 'Unknown', # 10A59..10A5F + 'Old_South_Arabian', # 10A60..10A7F + 'Old_North_Arabian', # 10A80..10A9F + 'Unknown', # 10AA0..10ABF + 'Manichaean', # 10AC0..10AE6 + 'Unknown', # 10AE7..10AEA + 'Manichaean', # 10AEB..10AF6 + 'Unknown', # 10AF7..10AFF + 'Avestan', # 10B00..10B35 + 'Unknown', # 10B36..10B38 + 'Avestan', # 10B39..10B3F + 'Inscriptional_Parthian', # 10B40..10B55 + 'Unknown', # 10B56..10B57 + 'Inscriptional_Parthian', # 10B58..10B5F + 'Inscriptional_Pahlavi', # 10B60..10B72 + 'Unknown', # 10B73..10B77 + 'Inscriptional_Pahlavi', # 10B78..10B7F + 'Psalter_Pahlavi', # 10B80..10B91 + 'Unknown', # 10B92..10B98 + 'Psalter_Pahlavi', # 10B99..10B9C + 'Unknown', # 10B9D..10BA8 + 'Psalter_Pahlavi', # 10BA9..10BAF + 'Unknown', # 10BB0..10BFF + 'Old_Turkic', # 10C00..10C48 + 'Unknown', # 10C49..10C7F + 'Old_Hungarian', # 10C80..10CB2 + 'Unknown', # 10CB3..10CBF + 'Old_Hungarian', # 10CC0..10CF2 + 'Unknown', # 10CF3..10CF9 + 'Old_Hungarian', # 10CFA..10CFF + 'Unknown', # 10D00..10E5F + 'Arabic', # 10E60..10E7E + 'Unknown', # 10E7F..10FFF + 'Brahmi', # 11000..1104D + 'Unknown', # 1104E..11051 + 'Brahmi', # 11052..1106F + 'Unknown', # 11070..1107E + 'Brahmi', # 1107F..1107F + 'Kaithi', # 11080..110C1 + 'Unknown', # 110C2..110CF + 'Sora_Sompeng', # 110D0..110E8 + 'Unknown', # 110E9..110EF + 'Sora_Sompeng', # 110F0..110F9 + 'Unknown', # 110FA..110FF + 'Chakma', # 11100..11134 + 'Unknown', # 11135..11135 + 'Chakma', # 11136..11143 + 'Unknown', # 11144..1114F + 'Mahajani', # 11150..11176 + 'Unknown', # 11177..1117F + 'Sharada', # 11180..111CD + 'Unknown', # 111CE..111CF + 'Sharada', # 111D0..111DF + 'Unknown', # 111E0..111E0 + 'Sinhala', # 111E1..111F4 + 'Unknown', # 111F5..111FF + 'Khojki', # 11200..11211 + 'Unknown', # 11212..11212 + 'Khojki', # 11213..1123E + 'Unknown', # 1123F..1127F + 'Multani', # 11280..11286 + 'Unknown', # 11287..11287 + 'Multani', # 11288..11288 + 'Unknown', # 11289..11289 + 'Multani', # 1128A..1128D + 'Unknown', # 1128E..1128E + 'Multani', # 1128F..1129D + 'Unknown', # 1129E..1129E + 'Multani', # 1129F..112A9 + 'Unknown', # 112AA..112AF + 'Khudawadi', # 112B0..112EA + 'Unknown', # 112EB..112EF + 'Khudawadi', # 112F0..112F9 + 'Unknown', # 112FA..112FF + 'Grantha', # 11300..11303 + 'Unknown', # 11304..11304 + 'Grantha', # 11305..1130C + 'Unknown', # 1130D..1130E + 'Grantha', # 1130F..11310 + 'Unknown', # 11311..11312 + 'Grantha', # 11313..11328 + 'Unknown', # 11329..11329 + 'Grantha', # 1132A..11330 + 'Unknown', # 11331..11331 + 'Grantha', # 11332..11333 + 'Unknown', # 11334..11334 + 'Grantha', # 11335..11339 + 'Unknown', # 1133A..1133B + 'Grantha', # 1133C..11344 + 'Unknown', # 11345..11346 + 'Grantha', # 11347..11348 + 'Unknown', # 11349..1134A + 'Grantha', # 1134B..1134D + 'Unknown', # 1134E..1134F + 'Grantha', # 11350..11350 + 'Unknown', # 11351..11356 + 'Grantha', # 11357..11357 + 'Unknown', # 11358..1135C + 'Grantha', # 1135D..11363 + 'Unknown', # 11364..11365 + 'Grantha', # 11366..1136C + 'Unknown', # 1136D..1136F + 'Grantha', # 11370..11374 + 'Unknown', # 11375..113FF + 'Newa', # 11400..11459 + 'Unknown', # 1145A..1145A + 'Newa', # 1145B..1145B + 'Unknown', # 1145C..1145C + 'Newa', # 1145D..1145D + 'Unknown', # 1145E..1147F + 'Tirhuta', # 11480..114C7 + 'Unknown', # 114C8..114CF + 'Tirhuta', # 114D0..114D9 + 'Unknown', # 114DA..1157F + 'Siddham', # 11580..115B5 + 'Unknown', # 115B6..115B7 + 'Siddham', # 115B8..115DD + 'Unknown', # 115DE..115FF + 'Modi', # 11600..11644 + 'Unknown', # 11645..1164F + 'Modi', # 11650..11659 + 'Unknown', # 1165A..1165F + 'Mongolian', # 11660..1166C + 'Unknown', # 1166D..1167F + 'Takri', # 11680..116B7 + 'Unknown', # 116B8..116BF + 'Takri', # 116C0..116C9 + 'Unknown', # 116CA..116FF + 'Ahom', # 11700..11719 + 'Unknown', # 1171A..1171C + 'Ahom', # 1171D..1172B + 'Unknown', # 1172C..1172F + 'Ahom', # 11730..1173F + 'Unknown', # 11740..1189F + 'Warang_Citi', # 118A0..118F2 + 'Unknown', # 118F3..118FE + 'Warang_Citi', # 118FF..118FF + 'Unknown', # 11900..119FF + 'Zanabazar_Square', # 11A00..11A47 + 'Unknown', # 11A48..11A4F + 'Soyombo', # 11A50..11A83 + 'Unknown', # 11A84..11A85 + 'Soyombo', # 11A86..11A9C + 'Unknown', # 11A9D..11A9D + 'Soyombo', # 11A9E..11AA2 + 'Unknown', # 11AA3..11ABF + 'Pau_Cin_Hau', # 11AC0..11AF8 + 'Unknown', # 11AF9..11BFF + 'Bhaiksuki', # 11C00..11C08 + 'Unknown', # 11C09..11C09 + 'Bhaiksuki', # 11C0A..11C36 + 'Unknown', # 11C37..11C37 + 'Bhaiksuki', # 11C38..11C45 + 'Unknown', # 11C46..11C4F + 'Bhaiksuki', # 11C50..11C6C + 'Unknown', # 11C6D..11C6F + 'Marchen', # 11C70..11C8F + 'Unknown', # 11C90..11C91 + 'Marchen', # 11C92..11CA7 + 'Unknown', # 11CA8..11CA8 + 'Marchen', # 11CA9..11CB6 + 'Unknown', # 11CB7..11CFF + 'Masaram_Gondi', # 11D00..11D06 + 'Unknown', # 11D07..11D07 + 'Masaram_Gondi', # 11D08..11D09 + 'Unknown', # 11D0A..11D0A + 'Masaram_Gondi', # 11D0B..11D36 + 'Unknown', # 11D37..11D39 + 'Masaram_Gondi', # 11D3A..11D3A + 'Unknown', # 11D3B..11D3B + 'Masaram_Gondi', # 11D3C..11D3D + 'Unknown', # 11D3E..11D3E + 'Masaram_Gondi', # 11D3F..11D47 + 'Unknown', # 11D48..11D4F + 'Masaram_Gondi', # 11D50..11D59 + 'Unknown', # 11D5A..11FFF + 'Cuneiform', # 12000..12399 + 'Unknown', # 1239A..123FF + 'Cuneiform', # 12400..1246E + 'Unknown', # 1246F..1246F + 'Cuneiform', # 12470..12474 + 'Unknown', # 12475..1247F + 'Cuneiform', # 12480..12543 + 'Unknown', # 12544..12FFF + 'Egyptian_Hieroglyphs', # 13000..1342E + 'Unknown', # 1342F..143FF + 'Anatolian_Hieroglyphs', # 14400..14646 + 'Unknown', # 14647..167FF + 'Bamum', # 16800..16A38 + 'Unknown', # 16A39..16A3F + 'Mro', # 16A40..16A5E + 'Unknown', # 16A5F..16A5F + 'Mro', # 16A60..16A69 + 'Unknown', # 16A6A..16A6D + 'Mro', # 16A6E..16A6F + 'Unknown', # 16A70..16ACF + 'Bassa_Vah', # 16AD0..16AED + 'Unknown', # 16AEE..16AEF + 'Bassa_Vah', # 16AF0..16AF5 + 'Unknown', # 16AF6..16AFF + 'Pahawh_Hmong', # 16B00..16B45 + 'Unknown', # 16B46..16B4F + 'Pahawh_Hmong', # 16B50..16B59 + 'Unknown', # 16B5A..16B5A + 'Pahawh_Hmong', # 16B5B..16B61 + 'Unknown', # 16B62..16B62 + 'Pahawh_Hmong', # 16B63..16B77 + 'Unknown', # 16B78..16B7C + 'Pahawh_Hmong', # 16B7D..16B8F + 'Unknown', # 16B90..16EFF + 'Miao', # 16F00..16F44 + 'Unknown', # 16F45..16F4F + 'Miao', # 16F50..16F7E + 'Unknown', # 16F7F..16F8E + 'Miao', # 16F8F..16F9F + 'Unknown', # 16FA0..16FDF + 'Tangut', # 16FE0..16FE0 + 'Nushu', # 16FE1..16FE1 + 'Unknown', # 16FE2..16FFF + 'Tangut', # 17000..187EC + 'Unknown', # 187ED..187FF + 'Tangut', # 18800..18AF2 + 'Unknown', # 18AF3..1AFFF + 'Katakana', # 1B000..1B000 + 'Hiragana', # 1B001..1B11E + 'Unknown', # 1B11F..1B16F + 'Nushu', # 1B170..1B2FB + 'Unknown', # 1B2FC..1BBFF + 'Duployan', # 1BC00..1BC6A + 'Unknown', # 1BC6B..1BC6F + 'Duployan', # 1BC70..1BC7C + 'Unknown', # 1BC7D..1BC7F + 'Duployan', # 1BC80..1BC88 + 'Unknown', # 1BC89..1BC8F + 'Duployan', # 1BC90..1BC99 + 'Unknown', # 1BC9A..1BC9B + 'Duployan', # 1BC9C..1BC9F + 'Common', # 1BCA0..1BCA3 + 'Unknown', # 1BCA4..1CFFF + 'Common', # 1D000..1D0F5 + 'Unknown', # 1D0F6..1D0FF + 'Common', # 1D100..1D126 + 'Unknown', # 1D127..1D128 + 'Common', # 1D129..1D166 + 'Inherited', # 1D167..1D169 + 'Common', # 1D16A..1D17A + 'Inherited', # 1D17B..1D182 + 'Common', # 1D183..1D184 + 'Inherited', # 1D185..1D18B + 'Common', # 1D18C..1D1A9 + 'Inherited', # 1D1AA..1D1AD + 'Common', # 1D1AE..1D1E8 + 'Unknown', # 1D1E9..1D1FF + 'Greek', # 1D200..1D245 + 'Unknown', # 1D246..1D2FF + 'Common', # 1D300..1D356 + 'Unknown', # 1D357..1D35F + 'Common', # 1D360..1D371 + 'Unknown', # 1D372..1D3FF + 'Common', # 1D400..1D454 + 'Unknown', # 1D455..1D455 + 'Common', # 1D456..1D49C + 'Unknown', # 1D49D..1D49D + 'Common', # 1D49E..1D49F + 'Unknown', # 1D4A0..1D4A1 + 'Common', # 1D4A2..1D4A2 + 'Unknown', # 1D4A3..1D4A4 + 'Common', # 1D4A5..1D4A6 + 'Unknown', # 1D4A7..1D4A8 + 'Common', # 1D4A9..1D4AC + 'Unknown', # 1D4AD..1D4AD + 'Common', # 1D4AE..1D4B9 + 'Unknown', # 1D4BA..1D4BA + 'Common', # 1D4BB..1D4BB + 'Unknown', # 1D4BC..1D4BC + 'Common', # 1D4BD..1D4C3 + 'Unknown', # 1D4C4..1D4C4 + 'Common', # 1D4C5..1D505 + 'Unknown', # 1D506..1D506 + 'Common', # 1D507..1D50A + 'Unknown', # 1D50B..1D50C + 'Common', # 1D50D..1D514 + 'Unknown', # 1D515..1D515 + 'Common', # 1D516..1D51C + 'Unknown', # 1D51D..1D51D + 'Common', # 1D51E..1D539 + 'Unknown', # 1D53A..1D53A + 'Common', # 1D53B..1D53E + 'Unknown', # 1D53F..1D53F + 'Common', # 1D540..1D544 + 'Unknown', # 1D545..1D545 + 'Common', # 1D546..1D546 + 'Unknown', # 1D547..1D549 + 'Common', # 1D54A..1D550 + 'Unknown', # 1D551..1D551 + 'Common', # 1D552..1D6A5 + 'Unknown', # 1D6A6..1D6A7 + 'Common', # 1D6A8..1D7CB + 'Unknown', # 1D7CC..1D7CD + 'Common', # 1D7CE..1D7FF + 'SignWriting', # 1D800..1DA8B + 'Unknown', # 1DA8C..1DA9A + 'SignWriting', # 1DA9B..1DA9F + 'Unknown', # 1DAA0..1DAA0 + 'SignWriting', # 1DAA1..1DAAF + 'Unknown', # 1DAB0..1DFFF + 'Glagolitic', # 1E000..1E006 + 'Unknown', # 1E007..1E007 + 'Glagolitic', # 1E008..1E018 + 'Unknown', # 1E019..1E01A + 'Glagolitic', # 1E01B..1E021 + 'Unknown', # 1E022..1E022 + 'Glagolitic', # 1E023..1E024 + 'Unknown', # 1E025..1E025 + 'Glagolitic', # 1E026..1E02A + 'Unknown', # 1E02B..1E7FF + 'Mende_Kikakui', # 1E800..1E8C4 + 'Unknown', # 1E8C5..1E8C6 + 'Mende_Kikakui', # 1E8C7..1E8D6 + 'Unknown', # 1E8D7..1E8FF + 'Adlam', # 1E900..1E94A + 'Unknown', # 1E94B..1E94F + 'Adlam', # 1E950..1E959 + 'Unknown', # 1E95A..1E95D + 'Adlam', # 1E95E..1E95F + 'Unknown', # 1E960..1EDFF + 'Arabic', # 1EE00..1EE03 + 'Unknown', # 1EE04..1EE04 + 'Arabic', # 1EE05..1EE1F + 'Unknown', # 1EE20..1EE20 + 'Arabic', # 1EE21..1EE22 + 'Unknown', # 1EE23..1EE23 + 'Arabic', # 1EE24..1EE24 + 'Unknown', # 1EE25..1EE26 + 'Arabic', # 1EE27..1EE27 + 'Unknown', # 1EE28..1EE28 + 'Arabic', # 1EE29..1EE32 + 'Unknown', # 1EE33..1EE33 + 'Arabic', # 1EE34..1EE37 + 'Unknown', # 1EE38..1EE38 + 'Arabic', # 1EE39..1EE39 + 'Unknown', # 1EE3A..1EE3A + 'Arabic', # 1EE3B..1EE3B + 'Unknown', # 1EE3C..1EE41 + 'Arabic', # 1EE42..1EE42 + 'Unknown', # 1EE43..1EE46 + 'Arabic', # 1EE47..1EE47 + 'Unknown', # 1EE48..1EE48 + 'Arabic', # 1EE49..1EE49 + 'Unknown', # 1EE4A..1EE4A + 'Arabic', # 1EE4B..1EE4B + 'Unknown', # 1EE4C..1EE4C + 'Arabic', # 1EE4D..1EE4F + 'Unknown', # 1EE50..1EE50 + 'Arabic', # 1EE51..1EE52 + 'Unknown', # 1EE53..1EE53 + 'Arabic', # 1EE54..1EE54 + 'Unknown', # 1EE55..1EE56 + 'Arabic', # 1EE57..1EE57 + 'Unknown', # 1EE58..1EE58 + 'Arabic', # 1EE59..1EE59 + 'Unknown', # 1EE5A..1EE5A + 'Arabic', # 1EE5B..1EE5B + 'Unknown', # 1EE5C..1EE5C + 'Arabic', # 1EE5D..1EE5D + 'Unknown', # 1EE5E..1EE5E + 'Arabic', # 1EE5F..1EE5F + 'Unknown', # 1EE60..1EE60 + 'Arabic', # 1EE61..1EE62 + 'Unknown', # 1EE63..1EE63 + 'Arabic', # 1EE64..1EE64 + 'Unknown', # 1EE65..1EE66 + 'Arabic', # 1EE67..1EE6A + 'Unknown', # 1EE6B..1EE6B + 'Arabic', # 1EE6C..1EE72 + 'Unknown', # 1EE73..1EE73 + 'Arabic', # 1EE74..1EE77 + 'Unknown', # 1EE78..1EE78 + 'Arabic', # 1EE79..1EE7C + 'Unknown', # 1EE7D..1EE7D + 'Arabic', # 1EE7E..1EE7E + 'Unknown', # 1EE7F..1EE7F + 'Arabic', # 1EE80..1EE89 + 'Unknown', # 1EE8A..1EE8A + 'Arabic', # 1EE8B..1EE9B + 'Unknown', # 1EE9C..1EEA0 + 'Arabic', # 1EEA1..1EEA3 + 'Unknown', # 1EEA4..1EEA4 + 'Arabic', # 1EEA5..1EEA9 + 'Unknown', # 1EEAA..1EEAA + 'Arabic', # 1EEAB..1EEBB + 'Unknown', # 1EEBC..1EEEF + 'Arabic', # 1EEF0..1EEF1 + 'Unknown', # 1EEF2..1EFFF + 'Common', # 1F000..1F02B + 'Unknown', # 1F02C..1F02F + 'Common', # 1F030..1F093 + 'Unknown', # 1F094..1F09F + 'Common', # 1F0A0..1F0AE + 'Unknown', # 1F0AF..1F0B0 + 'Common', # 1F0B1..1F0BF + 'Unknown', # 1F0C0..1F0C0 + 'Common', # 1F0C1..1F0CF + 'Unknown', # 1F0D0..1F0D0 + 'Common', # 1F0D1..1F0F5 + 'Unknown', # 1F0F6..1F0FF + 'Common', # 1F100..1F10C + 'Unknown', # 1F10D..1F10F + 'Common', # 1F110..1F12E + 'Unknown', # 1F12F..1F12F + 'Common', # 1F130..1F16B + 'Unknown', # 1F16C..1F16F + 'Common', # 1F170..1F1AC + 'Unknown', # 1F1AD..1F1E5 + 'Common', # 1F1E6..1F1FF + 'Hiragana', # 1F200..1F200 + 'Common', # 1F201..1F202 + 'Unknown', # 1F203..1F20F + 'Common', # 1F210..1F23B + 'Unknown', # 1F23C..1F23F + 'Common', # 1F240..1F248 + 'Unknown', # 1F249..1F24F + 'Common', # 1F250..1F251 + 'Unknown', # 1F252..1F25F + 'Common', # 1F260..1F265 + 'Unknown', # 1F266..1F2FF + 'Common', # 1F300..1F6D4 + 'Unknown', # 1F6D5..1F6DF + 'Common', # 1F6E0..1F6EC + 'Unknown', # 1F6ED..1F6EF + 'Common', # 1F6F0..1F6F8 + 'Unknown', # 1F6F9..1F6FF + 'Common', # 1F700..1F773 + 'Unknown', # 1F774..1F77F + 'Common', # 1F780..1F7D4 + 'Unknown', # 1F7D5..1F7FF + 'Common', # 1F800..1F80B + 'Unknown', # 1F80C..1F80F + 'Common', # 1F810..1F847 + 'Unknown', # 1F848..1F84F + 'Common', # 1F850..1F859 + 'Unknown', # 1F85A..1F85F + 'Common', # 1F860..1F887 + 'Unknown', # 1F888..1F88F + 'Common', # 1F890..1F8AD + 'Unknown', # 1F8AE..1F8FF + 'Common', # 1F900..1F90B + 'Unknown', # 1F90C..1F90F + 'Common', # 1F910..1F93E + 'Unknown', # 1F93F..1F93F + 'Common', # 1F940..1F94C + 'Unknown', # 1F94D..1F94F + 'Common', # 1F950..1F96B + 'Unknown', # 1F96C..1F97F + 'Common', # 1F980..1F997 + 'Unknown', # 1F998..1F9BF + 'Common', # 1F9C0..1F9C0 + 'Unknown', # 1F9C1..1F9CF + 'Common', # 1F9D0..1F9E6 + 'Unknown', # 1F9E7..1FFFF + 'Han', # 20000..2A6D6 + 'Unknown', # 2A6D7..2A6FF + 'Han', # 2A700..2B734 + 'Unknown', # 2B735..2B73F + 'Han', # 2B740..2B81D + 'Unknown', # 2B81E..2B81F + 'Han', # 2B820..2CEA1 + 'Unknown', # 2CEA2..2CEAF + 'Han', # 2CEB0..2EBE0 + 'Unknown', # 2EBE1..2F7FF + 'Han', # 2F800..2FA1D + 'Unknown', # 2FA1E..E0000 + 'Common', # E0001..E0001 + 'Unknown', # E0002..E001F + 'Common', # E0020..E007F + 'Unknown', # E0080..E00FF + 'Inherited', # E0100..E01EF + 'Unknown', # E01F0..10FFFF ] From 09f5f9176900f26efb6e8cbee0ac9b90c921bca2 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 13:40:25 +0100 Subject: [PATCH 09/17] [Tests] remove tests for old script impl --- Tests/unicodedata/scripts_test.py | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/Tests/unicodedata/scripts_test.py b/Tests/unicodedata/scripts_test.py index a641eb66a..a2471062a 100644 --- a/Tests/unicodedata/scripts_test.py +++ b/Tests/unicodedata/scripts_test.py @@ -2,39 +2,12 @@ from __future__ import ( print_function, division, absolute_import, unicode_literals) from fontTools.misc.py23 import * - from fontTools import unicodedata -def test__binary_search_range(): - ranges = [ - (0, 10, "foo"), - (11, 11, "bar"), - (12, 20, "baz"), - (21, 22, "bum"), - ] - search = unicodedata._binary_search_range - - for i in range(11): - assert search(1, ranges) == "foo" - - assert search(11, ranges) == "bar" - - for i in range(12, 21): - assert search(i, ranges) == "baz" - - for i in range(21, 23): - assert search(i, ranges) == "bum" - - assert search(23, ranges) is None - - def test_script(): assert unicodedata.script("a") == "Latin" - assert hasattr(unicodedata.script, "cache") - assert unicodedata.script("a") == unicodedata.script.cache["a"] - # these were randomly sampled, one character per script assert unicodedata.script(unichr(0x1E918)) == 'Adlam' assert unicodedata.script(unichr(0x1170D)) == 'Ahom' From a50967d79b760b1933ac580fb50dfed7cbcf868d Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 15:39:07 +0100 Subject: [PATCH 10/17] [Tests] add tests for 'Unknown' script --- Tests/unicodedata/scripts_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/unicodedata/scripts_test.py b/Tests/unicodedata/scripts_test.py index a2471062a..abc9f7b74 100644 --- a/Tests/unicodedata/scripts_test.py +++ b/Tests/unicodedata/scripts_test.py @@ -7,6 +7,9 @@ from fontTools import unicodedata def test_script(): assert unicodedata.script("a") == "Latin" + assert unicodedata.script(unichr(0)) == "Common" + assert unicodedata.script(unichr(0x0378)) == "Unknown" + assert unicodedata.script(unichr(0x10FFFF)) == "Unknown" # these were randomly sampled, one character per script assert unicodedata.script(unichr(0x1E918)) == 'Adlam' From 203d1c6f892c025465c70734bc1605d8c640936b Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 15:40:56 +0100 Subject: [PATCH 11/17] [buildUCD] fix docstring --- MetaTools/buildUCD.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MetaTools/buildUCD.py b/MetaTools/buildUCD.py index e053e897d..f7db29ebf 100755 --- a/MetaTools/buildUCD.py +++ b/MetaTools/buildUCD.py @@ -124,8 +124,8 @@ def parse_range_properties(infile, default="Unknown"): def build_scripts(local_ucd=None, output_path=None): """Fetch "Scripts.txt" data file from Unicode official website, parse - the script ranges and write them as a list of Python tuples to - 'fontTools.unicodedata.scripts'. + the script ranges and names and write them as two Python lists + to 'fontTools.unicodedata.scripts'. To load "Scripts.txt" from a local directory, you can use the 'local_ucd' argument. From 1ed78b12f532f53e4e359dc3ccc460bc963f6c4f Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 17:37:45 +0100 Subject: [PATCH 12/17] [unicodedata] rename scripts.py to Scripts.py let's use the same names as the original UCD data files for simplicity --- Lib/fontTools/unicodedata/{scripts.py => Scripts.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Lib/fontTools/unicodedata/{scripts.py => Scripts.py} (100%) diff --git a/Lib/fontTools/unicodedata/scripts.py b/Lib/fontTools/unicodedata/Scripts.py similarity index 100% rename from Lib/fontTools/unicodedata/scripts.py rename to Lib/fontTools/unicodedata/Scripts.py From 6d8813c00adaef07cafd58c389fab57bc5fbab06 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 18:09:56 +0100 Subject: [PATCH 13/17] [Tests] move unicodedata/scripts_test to unicodedata_test --- Tests/{unicodedata/scripts_test.py => unicodedata_test.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Tests/{unicodedata/scripts_test.py => unicodedata_test.py} (100%) diff --git a/Tests/unicodedata/scripts_test.py b/Tests/unicodedata_test.py similarity index 100% rename from Tests/unicodedata/scripts_test.py rename to Tests/unicodedata_test.py From 541e7b92d3c2054180be7598ac569e76dc44d370 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 18:12:15 +0100 Subject: [PATCH 14/17] [buildUCD] also parse Blocks.txt and ScriptExtensions.txt --- MetaTools/buildUCD.py | 79 ++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/MetaTools/buildUCD.py b/MetaTools/buildUCD.py index f7db29ebf..af36f69a8 100755 --- a/MetaTools/buildUCD.py +++ b/MetaTools/buildUCD.py @@ -55,7 +55,7 @@ def parse_unidata_header(infile): return "".join(header) -def parse_range_properties(infile, default="Unknown"): +def parse_range_properties(infile, default=None, is_set=False): """Parse a Unicode data file containing a column with one character or a range of characters, and another column containing a property value separated by a semicolon. Comments after '#' are ignored. @@ -83,69 +83,80 @@ def parse_range_properties(infile, default="Unknown"): first = int(first, 16) last = int(last, 16) - data = data.rstrip() + data = tostr(data.rstrip(), encoding="ascii") ranges.append((first, last, data)) ranges.sort() + if isinstance(default, unicode): + default = tostr(default, encoding="ascii") + # fill the gaps between explicitly defined ranges last_start, last_end = -1, -1 full_ranges = [] - for start, end, name in ranges: + for start, end, value in ranges: assert last_end < start assert start <= end if start - last_end > 1: full_ranges.append((last_end+1, start-1, default)) - full_ranges.append((start, end, name)) + if is_set: + value = set(value.split()) + full_ranges.append((start, end, value)) last_start, last_end = start, end if last_end != MAX_UNICODE: full_ranges.append((last_end+1, MAX_UNICODE, default)) # reduce total number of ranges by combining continuous ones - last_start, last_end, last_name = full_ranges.pop(0) + last_start, last_end, last_value = full_ranges.pop(0) merged_ranges = [] - for start, end, name in full_ranges: - if name == last_name: + for start, end, value in full_ranges: + if value == last_value: continue else: - merged_ranges.append((last_start, start-1, last_name)) - last_start, line_end, last_name = start, end, name - merged_ranges.append((last_start, MAX_UNICODE, last_name)) + merged_ranges.append((last_start, start-1, last_value)) + last_start, line_end, last_value = start, end, value + merged_ranges.append((last_start, MAX_UNICODE, last_value)) # make sure that the ranges cover the full unicode repertoire assert merged_ranges[0][0] == 0 - for (cs, ce, cn), (ns, ne, nn) in zip(merged_ranges, merged_ranges[1:]): + for (cs, ce, cv), (ns, ne, nv) in zip(merged_ranges, merged_ranges[1:]): assert ce+1 == ns assert merged_ranges[-1][1] == MAX_UNICODE return merged_ranges -def build_scripts(local_ucd=None, output_path=None): - """Fetch "Scripts.txt" data file from Unicode official website, parse - the script ranges and names and write them as two Python lists - to 'fontTools.unicodedata.scripts'. +def _set_repr(value): + return 'None' if value is None else "{{{}}}".format( + ", ".join(repr(v) for v in sorted(value))) - To load "Scripts.txt" from a local directory, you can use the + +def build_ranges(filename, local_ucd=None, output_path=None, + default=None, is_set=False): + """Fetch 'filename' UCD data file from Unicode official website, parse + the ranges and properties and write them as two Python lists + to 'fontTools.unicodedata..py'. + + To load the data file from a local directory, you can use the 'local_ucd' argument. """ + modname = os.path.splitext(filename)[0] + ".py" if not output_path: - output_path = UNIDATA_PATH + "scripts.py" + output_path = UNIDATA_PATH + modname - filename = "Scripts.txt" if local_ucd: - log.info("loading %r from local directory %r", filename, local_ucd) + log.info("loading '%s' from local directory '%s'", filename, local_ucd) cm = open(pjoin(local_ucd, filename), "r", encoding="utf-8") else: - log.info("downloading %r from %r", filename, UNIDATA_URL) + log.info("downloading '%s' from '%s'", filename, UNIDATA_URL) cm = open_unidata_file(filename) with cm as f: header = parse_unidata_header(f) - ranges = parse_range_properties(f) + ranges = parse_range_properties(f, default=default, is_set=is_set) - max_name_length = max(len(n) for _, _, n in ranges) + max_value_length = min(56, max(len(repr(v)) for _, _, v in ranges)) with open(output_path, "w", encoding="utf-8") as f: f.write(SRC_ENCODING) @@ -156,21 +167,24 @@ def build_scripts(local_ucd=None, output_path=None): f.write("#\n") f.write(header+"\n\n") - f.write("SCRIPT_RANGES = [\n") - for first, last, script_name in ranges: + f.write("RANGES = [\n") + for first, last, value in ranges: f.write(" 0x{:0>4X}, # .. 0x{:0>4X} ; {}\n".format( - first, last, tostr(script_name))) + first, last, _set_repr(value) if is_set else value)) f.write("]\n") f.write("\n") - f.write("SCRIPT_NAMES = [\n") - for first, last, script_name in ranges: - script_name = "'{}',".format(script_name) + f.write("VALUES = [\n") + for first, last, value in ranges: + if is_set: + value_repr = "{},".format(_set_repr(value)) + else: + value_repr = "{!r},".format(value) f.write(" {} # {:0>4X}..{:0>4X}\n".format( - script_name.ljust(max_name_length+3), first, last)) + value_repr.ljust(max_value_length+1), first, last)) f.write("]\n") - log.info("saved new file: %r", os.path.normpath(output_path)) + log.info("saved new file: '%s'", os.path.normpath(output_path)) def main(): @@ -186,7 +200,10 @@ def main(): level = "WARNING" if options.quiet else "INFO" logging.basicConfig(level=level, format="%(message)s") - build_scripts(local_ucd=options.ucd_path) + build_ranges("Blocks.txt", local_ucd=options.ucd_path, default="No_Block") + build_ranges("Scripts.txt", local_ucd=options.ucd_path, default="Unknown") + build_ranges("ScriptExtensions.txt", local_ucd=options.ucd_path, + is_set=True) if __name__ == "__main__": From 8b50ed56d96f491a206f9329720df586c2fc9e86 Mon Sep 17 00:00:00 2001 From: Cosimo Lupo Date: Mon, 20 Nov 2017 18:15:09 +0100 Subject: [PATCH 15/17] add auto-generated Blocks.py and ScriptsExtensions.py --- Lib/fontTools/unicodedata/Blocks.py | 677 ++++++++++++++++++ Lib/fontTools/unicodedata/ScriptExtensions.py | 389 ++++++++++ Lib/fontTools/unicodedata/Scripts.py | 4 +- 3 files changed, 1068 insertions(+), 2 deletions(-) create mode 100644 Lib/fontTools/unicodedata/Blocks.py create mode 100644 Lib/fontTools/unicodedata/ScriptExtensions.py diff --git a/Lib/fontTools/unicodedata/Blocks.py b/Lib/fontTools/unicodedata/Blocks.py new file mode 100644 index 000000000..cba4e9e94 --- /dev/null +++ b/Lib/fontTools/unicodedata/Blocks.py @@ -0,0 +1,677 @@ +# -*- coding: utf-8 -*- +# +# NOTE: This file was auto-generated with MetaTools/buildUCD.py. +# Source: https://unicode.org/Public/UNIDATA/Blocks.txt +# License: http://unicode.org/copyright.html#License +# +# Blocks-10.0.0.txt +# Date: 2017-04-12, 17:30:00 GMT [KW] +# © 2017 Unicode®, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Format: +# Start Code..End Code; Block Name + + +RANGES = [ + 0x0000, # .. 0x007F ; Basic Latin + 0x0080, # .. 0x00FF ; Latin-1 Supplement + 0x0100, # .. 0x017F ; Latin Extended-A + 0x0180, # .. 0x024F ; Latin Extended-B + 0x0250, # .. 0x02AF ; IPA Extensions + 0x02B0, # .. 0x02FF ; Spacing Modifier Letters + 0x0300, # .. 0x036F ; Combining Diacritical Marks + 0x0370, # .. 0x03FF ; Greek and Coptic + 0x0400, # .. 0x04FF ; Cyrillic + 0x0500, # .. 0x052F ; Cyrillic Supplement + 0x0530, # .. 0x058F ; Armenian + 0x0590, # .. 0x05FF ; Hebrew + 0x0600, # .. 0x06FF ; Arabic + 0x0700, # .. 0x074F ; Syriac + 0x0750, # .. 0x077F ; Arabic Supplement + 0x0780, # .. 0x07BF ; Thaana + 0x07C0, # .. 0x07FF ; NKo + 0x0800, # .. 0x083F ; Samaritan + 0x0840, # .. 0x085F ; Mandaic + 0x0860, # .. 0x086F ; Syriac Supplement + 0x0870, # .. 0x089F ; No_Block + 0x08A0, # .. 0x08FF ; Arabic Extended-A + 0x0900, # .. 0x097F ; Devanagari + 0x0980, # .. 0x09FF ; Bengali + 0x0A00, # .. 0x0A7F ; Gurmukhi + 0x0A80, # .. 0x0AFF ; Gujarati + 0x0B00, # .. 0x0B7F ; Oriya + 0x0B80, # .. 0x0BFF ; Tamil + 0x0C00, # .. 0x0C7F ; Telugu + 0x0C80, # .. 0x0CFF ; Kannada + 0x0D00, # .. 0x0D7F ; Malayalam + 0x0D80, # .. 0x0DFF ; Sinhala + 0x0E00, # .. 0x0E7F ; Thai + 0x0E80, # .. 0x0EFF ; Lao + 0x0F00, # .. 0x0FFF ; Tibetan + 0x1000, # .. 0x109F ; Myanmar + 0x10A0, # .. 0x10FF ; Georgian + 0x1100, # .. 0x11FF ; Hangul Jamo + 0x1200, # .. 0x137F ; Ethiopic + 0x1380, # .. 0x139F ; Ethiopic Supplement + 0x13A0, # .. 0x13FF ; Cherokee + 0x1400, # .. 0x167F ; Unified Canadian Aboriginal Syllabics + 0x1680, # .. 0x169F ; Ogham + 0x16A0, # .. 0x16FF ; Runic + 0x1700, # .. 0x171F ; Tagalog + 0x1720, # .. 0x173F ; Hanunoo + 0x1740, # .. 0x175F ; Buhid + 0x1760, # .. 0x177F ; Tagbanwa + 0x1780, # .. 0x17FF ; Khmer + 0x1800, # .. 0x18AF ; Mongolian + 0x18B0, # .. 0x18FF ; Unified Canadian Aboriginal Syllabics Extended + 0x1900, # .. 0x194F ; Limbu + 0x1950, # .. 0x197F ; Tai Le + 0x1980, # .. 0x19DF ; New Tai Lue + 0x19E0, # .. 0x19FF ; Khmer Symbols + 0x1A00, # .. 0x1A1F ; Buginese + 0x1A20, # .. 0x1AAF ; Tai Tham + 0x1AB0, # .. 0x1AFF ; Combining Diacritical Marks Extended + 0x1B00, # .. 0x1B7F ; Balinese + 0x1B80, # .. 0x1BBF ; Sundanese + 0x1BC0, # .. 0x1BFF ; Batak + 0x1C00, # .. 0x1C4F ; Lepcha + 0x1C50, # .. 0x1C7F ; Ol Chiki + 0x1C80, # .. 0x1C8F ; Cyrillic Extended-C + 0x1C90, # .. 0x1CBF ; No_Block + 0x1CC0, # .. 0x1CCF ; Sundanese Supplement + 0x1CD0, # .. 0x1CFF ; Vedic Extensions + 0x1D00, # .. 0x1D7F ; Phonetic Extensions + 0x1D80, # .. 0x1DBF ; Phonetic Extensions Supplement + 0x1DC0, # .. 0x1DFF ; Combining Diacritical Marks Supplement + 0x1E00, # .. 0x1EFF ; Latin Extended Additional + 0x1F00, # .. 0x1FFF ; Greek Extended + 0x2000, # .. 0x206F ; General Punctuation + 0x2070, # .. 0x209F ; Superscripts and Subscripts + 0x20A0, # .. 0x20CF ; Currency Symbols + 0x20D0, # .. 0x20FF ; Combining Diacritical Marks for Symbols + 0x2100, # .. 0x214F ; Letterlike Symbols + 0x2150, # .. 0x218F ; Number Forms + 0x2190, # .. 0x21FF ; Arrows + 0x2200, # .. 0x22FF ; Mathematical Operators + 0x2300, # .. 0x23FF ; Miscellaneous Technical + 0x2400, # .. 0x243F ; Control Pictures + 0x2440, # .. 0x245F ; Optical Character Recognition + 0x2460, # .. 0x24FF ; Enclosed Alphanumerics + 0x2500, # .. 0x257F ; Box Drawing + 0x2580, # .. 0x259F ; Block Elements + 0x25A0, # .. 0x25FF ; Geometric Shapes + 0x2600, # .. 0x26FF ; Miscellaneous Symbols + 0x2700, # .. 0x27BF ; Dingbats + 0x27C0, # .. 0x27EF ; Miscellaneous Mathematical Symbols-A + 0x27F0, # .. 0x27FF ; Supplemental Arrows-A + 0x2800, # .. 0x28FF ; Braille Patterns + 0x2900, # .. 0x297F ; Supplemental Arrows-B + 0x2980, # .. 0x29FF ; Miscellaneous Mathematical Symbols-B + 0x2A00, # .. 0x2AFF ; Supplemental Mathematical Operators + 0x2B00, # .. 0x2BFF ; Miscellaneous Symbols and Arrows + 0x2C00, # .. 0x2C5F ; Glagolitic + 0x2C60, # .. 0x2C7F ; Latin Extended-C + 0x2C80, # .. 0x2CFF ; Coptic + 0x2D00, # .. 0x2D2F ; Georgian Supplement + 0x2D30, # .. 0x2D7F ; Tifinagh + 0x2D80, # .. 0x2DDF ; Ethiopic Extended + 0x2DE0, # .. 0x2DFF ; Cyrillic Extended-A + 0x2E00, # .. 0x2E7F ; Supplemental Punctuation + 0x2E80, # .. 0x2EFF ; CJK Radicals Supplement + 0x2F00, # .. 0x2FDF ; Kangxi Radicals + 0x2FE0, # .. 0x2FEF ; No_Block + 0x2FF0, # .. 0x2FFF ; Ideographic Description Characters + 0x3000, # .. 0x303F ; CJK Symbols and Punctuation + 0x3040, # .. 0x309F ; Hiragana + 0x30A0, # .. 0x30FF ; Katakana + 0x3100, # .. 0x312F ; Bopomofo + 0x3130, # .. 0x318F ; Hangul Compatibility Jamo + 0x3190, # .. 0x319F ; Kanbun + 0x31A0, # .. 0x31BF ; Bopomofo Extended + 0x31C0, # .. 0x31EF ; CJK Strokes + 0x31F0, # .. 0x31FF ; Katakana Phonetic Extensions + 0x3200, # .. 0x32FF ; Enclosed CJK Letters and Months + 0x3300, # .. 0x33FF ; CJK Compatibility + 0x3400, # .. 0x4DBF ; CJK Unified Ideographs Extension A + 0x4DC0, # .. 0x4DFF ; Yijing Hexagram Symbols + 0x4E00, # .. 0x9FFF ; CJK Unified Ideographs + 0xA000, # .. 0xA48F ; Yi Syllables + 0xA490, # .. 0xA4CF ; Yi Radicals + 0xA4D0, # .. 0xA4FF ; Lisu + 0xA500, # .. 0xA63F ; Vai + 0xA640, # .. 0xA69F ; Cyrillic Extended-B + 0xA6A0, # .. 0xA6FF ; Bamum + 0xA700, # .. 0xA71F ; Modifier Tone Letters + 0xA720, # .. 0xA7FF ; Latin Extended-D + 0xA800, # .. 0xA82F ; Syloti Nagri + 0xA830, # .. 0xA83F ; Common Indic Number Forms + 0xA840, # .. 0xA87F ; Phags-pa + 0xA880, # .. 0xA8DF ; Saurashtra + 0xA8E0, # .. 0xA8FF ; Devanagari Extended + 0xA900, # .. 0xA92F ; Kayah Li + 0xA930, # .. 0xA95F ; Rejang + 0xA960, # .. 0xA97F ; Hangul Jamo Extended-A + 0xA980, # .. 0xA9DF ; Javanese + 0xA9E0, # .. 0xA9FF ; Myanmar Extended-B + 0xAA00, # .. 0xAA5F ; Cham + 0xAA60, # .. 0xAA7F ; Myanmar Extended-A + 0xAA80, # .. 0xAADF ; Tai Viet + 0xAAE0, # .. 0xAAFF ; Meetei Mayek Extensions + 0xAB00, # .. 0xAB2F ; Ethiopic Extended-A + 0xAB30, # .. 0xAB6F ; Latin Extended-E + 0xAB70, # .. 0xABBF ; Cherokee Supplement + 0xABC0, # .. 0xABFF ; Meetei Mayek + 0xAC00, # .. 0xD7AF ; Hangul Syllables + 0xD7B0, # .. 0xD7FF ; Hangul Jamo Extended-B + 0xD800, # .. 0xDB7F ; High Surrogates + 0xDB80, # .. 0xDBFF ; High Private Use Surrogates + 0xDC00, # .. 0xDFFF ; Low Surrogates + 0xE000, # .. 0xF8FF ; Private Use Area + 0xF900, # .. 0xFAFF ; CJK Compatibility Ideographs + 0xFB00, # .. 0xFB4F ; Alphabetic Presentation Forms + 0xFB50, # .. 0xFDFF ; Arabic Presentation Forms-A + 0xFE00, # .. 0xFE0F ; Variation Selectors + 0xFE10, # .. 0xFE1F ; Vertical Forms + 0xFE20, # .. 0xFE2F ; Combining Half Marks + 0xFE30, # .. 0xFE4F ; CJK Compatibility Forms + 0xFE50, # .. 0xFE6F ; Small Form Variants + 0xFE70, # .. 0xFEFF ; Arabic Presentation Forms-B + 0xFF00, # .. 0xFFEF ; Halfwidth and Fullwidth Forms + 0xFFF0, # .. 0xFFFF ; Specials + 0x10000, # .. 0x1007F ; Linear B Syllabary + 0x10080, # .. 0x100FF ; Linear B Ideograms + 0x10100, # .. 0x1013F ; Aegean Numbers + 0x10140, # .. 0x1018F ; Ancient Greek Numbers + 0x10190, # .. 0x101CF ; Ancient Symbols + 0x101D0, # .. 0x101FF ; Phaistos Disc + 0x10200, # .. 0x1027F ; No_Block + 0x10280, # .. 0x1029F ; Lycian + 0x102A0, # .. 0x102DF ; Carian + 0x102E0, # .. 0x102FF ; Coptic Epact Numbers + 0x10300, # .. 0x1032F ; Old Italic + 0x10330, # .. 0x1034F ; Gothic + 0x10350, # .. 0x1037F ; Old Permic + 0x10380, # .. 0x1039F ; Ugaritic + 0x103A0, # .. 0x103DF ; Old Persian + 0x103E0, # .. 0x103FF ; No_Block + 0x10400, # .. 0x1044F ; Deseret + 0x10450, # .. 0x1047F ; Shavian + 0x10480, # .. 0x104AF ; Osmanya + 0x104B0, # .. 0x104FF ; Osage + 0x10500, # .. 0x1052F ; Elbasan + 0x10530, # .. 0x1056F ; Caucasian Albanian + 0x10570, # .. 0x105FF ; No_Block + 0x10600, # .. 0x1077F ; Linear A + 0x10780, # .. 0x107FF ; No_Block + 0x10800, # .. 0x1083F ; Cypriot Syllabary + 0x10840, # .. 0x1085F ; Imperial Aramaic + 0x10860, # .. 0x1087F ; Palmyrene + 0x10880, # .. 0x108AF ; Nabataean + 0x108B0, # .. 0x108DF ; No_Block + 0x108E0, # .. 0x108FF ; Hatran + 0x10900, # .. 0x1091F ; Phoenician + 0x10920, # .. 0x1093F ; Lydian + 0x10940, # .. 0x1097F ; No_Block + 0x10980, # .. 0x1099F ; Meroitic Hieroglyphs + 0x109A0, # .. 0x109FF ; Meroitic Cursive + 0x10A00, # .. 0x10A5F ; Kharoshthi + 0x10A60, # .. 0x10A7F ; Old South Arabian + 0x10A80, # .. 0x10A9F ; Old North Arabian + 0x10AA0, # .. 0x10ABF ; No_Block + 0x10AC0, # .. 0x10AFF ; Manichaean + 0x10B00, # .. 0x10B3F ; Avestan + 0x10B40, # .. 0x10B5F ; Inscriptional Parthian + 0x10B60, # .. 0x10B7F ; Inscriptional Pahlavi + 0x10B80, # .. 0x10BAF ; Psalter Pahlavi + 0x10BB0, # .. 0x10BFF ; No_Block + 0x10C00, # .. 0x10C4F ; Old Turkic + 0x10C50, # .. 0x10C7F ; No_Block + 0x10C80, # .. 0x10CFF ; Old Hungarian + 0x10D00, # .. 0x10E5F ; No_Block + 0x10E60, # .. 0x10E7F ; Rumi Numeral Symbols + 0x10E80, # .. 0x10FFF ; No_Block + 0x11000, # .. 0x1107F ; Brahmi + 0x11080, # .. 0x110CF ; Kaithi + 0x110D0, # .. 0x110FF ; Sora Sompeng + 0x11100, # .. 0x1114F ; Chakma + 0x11150, # .. 0x1117F ; Mahajani + 0x11180, # .. 0x111DF ; Sharada + 0x111E0, # .. 0x111FF ; Sinhala Archaic Numbers + 0x11200, # .. 0x1124F ; Khojki + 0x11250, # .. 0x1127F ; No_Block + 0x11280, # .. 0x112AF ; Multani + 0x112B0, # .. 0x112FF ; Khudawadi + 0x11300, # .. 0x1137F ; Grantha + 0x11380, # .. 0x113FF ; No_Block + 0x11400, # .. 0x1147F ; Newa + 0x11480, # .. 0x114DF ; Tirhuta + 0x114E0, # .. 0x1157F ; No_Block + 0x11580, # .. 0x115FF ; Siddham + 0x11600, # .. 0x1165F ; Modi + 0x11660, # .. 0x1167F ; Mongolian Supplement + 0x11680, # .. 0x116CF ; Takri + 0x116D0, # .. 0x116FF ; No_Block + 0x11700, # .. 0x1173F ; Ahom + 0x11740, # .. 0x1189F ; No_Block + 0x118A0, # .. 0x118FF ; Warang Citi + 0x11900, # .. 0x119FF ; No_Block + 0x11A00, # .. 0x11A4F ; Zanabazar Square + 0x11A50, # .. 0x11AAF ; Soyombo + 0x11AB0, # .. 0x11ABF ; No_Block + 0x11AC0, # .. 0x11AFF ; Pau Cin Hau + 0x11B00, # .. 0x11BFF ; No_Block + 0x11C00, # .. 0x11C6F ; Bhaiksuki + 0x11C70, # .. 0x11CBF ; Marchen + 0x11CC0, # .. 0x11CFF ; No_Block + 0x11D00, # .. 0x11D5F ; Masaram Gondi + 0x11D60, # .. 0x11FFF ; No_Block + 0x12000, # .. 0x123FF ; Cuneiform + 0x12400, # .. 0x1247F ; Cuneiform Numbers and Punctuation + 0x12480, # .. 0x1254F ; Early Dynastic Cuneiform + 0x12550, # .. 0x12FFF ; No_Block + 0x13000, # .. 0x1342F ; Egyptian Hieroglyphs + 0x13430, # .. 0x143FF ; No_Block + 0x14400, # .. 0x1467F ; Anatolian Hieroglyphs + 0x14680, # .. 0x167FF ; No_Block + 0x16800, # .. 0x16A3F ; Bamum Supplement + 0x16A40, # .. 0x16A6F ; Mro + 0x16A70, # .. 0x16ACF ; No_Block + 0x16AD0, # .. 0x16AFF ; Bassa Vah + 0x16B00, # .. 0x16B8F ; Pahawh Hmong + 0x16B90, # .. 0x16EFF ; No_Block + 0x16F00, # .. 0x16F9F ; Miao + 0x16FA0, # .. 0x16FDF ; No_Block + 0x16FE0, # .. 0x16FFF ; Ideographic Symbols and Punctuation + 0x17000, # .. 0x187FF ; Tangut + 0x18800, # .. 0x18AFF ; Tangut Components + 0x18B00, # .. 0x1AFFF ; No_Block + 0x1B000, # .. 0x1B0FF ; Kana Supplement + 0x1B100, # .. 0x1B12F ; Kana Extended-A + 0x1B130, # .. 0x1B16F ; No_Block + 0x1B170, # .. 0x1B2FF ; Nushu + 0x1B300, # .. 0x1BBFF ; No_Block + 0x1BC00, # .. 0x1BC9F ; Duployan + 0x1BCA0, # .. 0x1BCAF ; Shorthand Format Controls + 0x1BCB0, # .. 0x1CFFF ; No_Block + 0x1D000, # .. 0x1D0FF ; Byzantine Musical Symbols + 0x1D100, # .. 0x1D1FF ; Musical Symbols + 0x1D200, # .. 0x1D24F ; Ancient Greek Musical Notation + 0x1D250, # .. 0x1D2FF ; No_Block + 0x1D300, # .. 0x1D35F ; Tai Xuan Jing Symbols + 0x1D360, # .. 0x1D37F ; Counting Rod Numerals + 0x1D380, # .. 0x1D3FF ; No_Block + 0x1D400, # .. 0x1D7FF ; Mathematical Alphanumeric Symbols + 0x1D800, # .. 0x1DAAF ; Sutton SignWriting + 0x1DAB0, # .. 0x1DFFF ; No_Block + 0x1E000, # .. 0x1E02F ; Glagolitic Supplement + 0x1E030, # .. 0x1E7FF ; No_Block + 0x1E800, # .. 0x1E8DF ; Mende Kikakui + 0x1E8E0, # .. 0x1E8FF ; No_Block + 0x1E900, # .. 0x1E95F ; Adlam + 0x1E960, # .. 0x1EDFF ; No_Block + 0x1EE00, # .. 0x1EEFF ; Arabic Mathematical Alphabetic Symbols + 0x1EF00, # .. 0x1EFFF ; No_Block + 0x1F000, # .. 0x1F02F ; Mahjong Tiles + 0x1F030, # .. 0x1F09F ; Domino Tiles + 0x1F0A0, # .. 0x1F0FF ; Playing Cards + 0x1F100, # .. 0x1F1FF ; Enclosed Alphanumeric Supplement + 0x1F200, # .. 0x1F2FF ; Enclosed Ideographic Supplement + 0x1F300, # .. 0x1F5FF ; Miscellaneous Symbols and Pictographs + 0x1F600, # .. 0x1F64F ; Emoticons + 0x1F650, # .. 0x1F67F ; Ornamental Dingbats + 0x1F680, # .. 0x1F6FF ; Transport and Map Symbols + 0x1F700, # .. 0x1F77F ; Alchemical Symbols + 0x1F780, # .. 0x1F7FF ; Geometric Shapes Extended + 0x1F800, # .. 0x1F8FF ; Supplemental Arrows-C + 0x1F900, # .. 0x1F9FF ; Supplemental Symbols and Pictographs + 0x1FA00, # .. 0x1FFFF ; No_Block + 0x20000, # .. 0x2A6DF ; CJK Unified Ideographs Extension B + 0x2A6E0, # .. 0x2A6FF ; No_Block + 0x2A700, # .. 0x2B73F ; CJK Unified Ideographs Extension C + 0x2B740, # .. 0x2B81F ; CJK Unified Ideographs Extension D + 0x2B820, # .. 0x2CEAF ; CJK Unified Ideographs Extension E + 0x2CEB0, # .. 0x2EBEF ; CJK Unified Ideographs Extension F + 0x2EBF0, # .. 0x2F7FF ; No_Block + 0x2F800, # .. 0x2FA1F ; CJK Compatibility Ideographs Supplement + 0x2FA20, # .. 0xDFFFF ; No_Block + 0xE0000, # .. 0xE007F ; Tags + 0xE0080, # .. 0xE00FF ; No_Block + 0xE0100, # .. 0xE01EF ; Variation Selectors Supplement + 0xE01F0, # .. 0xEFFFF ; No_Block + 0xF0000, # .. 0xFFFFF ; Supplementary Private Use Area-A + 0x100000, # .. 0x10FFFF ; Supplementary Private Use Area-B +] + +VALUES = [ + 'Basic Latin', # 0000..007F + 'Latin-1 Supplement', # 0080..00FF + 'Latin Extended-A', # 0100..017F + 'Latin Extended-B', # 0180..024F + 'IPA Extensions', # 0250..02AF + 'Spacing Modifier Letters', # 02B0..02FF + 'Combining Diacritical Marks', # 0300..036F + 'Greek and Coptic', # 0370..03FF + 'Cyrillic', # 0400..04FF + 'Cyrillic Supplement', # 0500..052F + 'Armenian', # 0530..058F + 'Hebrew', # 0590..05FF + 'Arabic', # 0600..06FF + 'Syriac', # 0700..074F + 'Arabic Supplement', # 0750..077F + 'Thaana', # 0780..07BF + 'NKo', # 07C0..07FF + 'Samaritan', # 0800..083F + 'Mandaic', # 0840..085F + 'Syriac Supplement', # 0860..086F + 'No_Block', # 0870..089F + 'Arabic Extended-A', # 08A0..08FF + 'Devanagari', # 0900..097F + 'Bengali', # 0980..09FF + 'Gurmukhi', # 0A00..0A7F + 'Gujarati', # 0A80..0AFF + 'Oriya', # 0B00..0B7F + 'Tamil', # 0B80..0BFF + 'Telugu', # 0C00..0C7F + 'Kannada', # 0C80..0CFF + 'Malayalam', # 0D00..0D7F + 'Sinhala', # 0D80..0DFF + 'Thai', # 0E00..0E7F + 'Lao', # 0E80..0EFF + 'Tibetan', # 0F00..0FFF + 'Myanmar', # 1000..109F + 'Georgian', # 10A0..10FF + 'Hangul Jamo', # 1100..11FF + 'Ethiopic', # 1200..137F + 'Ethiopic Supplement', # 1380..139F + 'Cherokee', # 13A0..13FF + 'Unified Canadian Aboriginal Syllabics', # 1400..167F + 'Ogham', # 1680..169F + 'Runic', # 16A0..16FF + 'Tagalog', # 1700..171F + 'Hanunoo', # 1720..173F + 'Buhid', # 1740..175F + 'Tagbanwa', # 1760..177F + 'Khmer', # 1780..17FF + 'Mongolian', # 1800..18AF + 'Unified Canadian Aboriginal Syllabics Extended', # 18B0..18FF + 'Limbu', # 1900..194F + 'Tai Le', # 1950..197F + 'New Tai Lue', # 1980..19DF + 'Khmer Symbols', # 19E0..19FF + 'Buginese', # 1A00..1A1F + 'Tai Tham', # 1A20..1AAF + 'Combining Diacritical Marks Extended', # 1AB0..1AFF + 'Balinese', # 1B00..1B7F + 'Sundanese', # 1B80..1BBF + 'Batak', # 1BC0..1BFF + 'Lepcha', # 1C00..1C4F + 'Ol Chiki', # 1C50..1C7F + 'Cyrillic Extended-C', # 1C80..1C8F + 'No_Block', # 1C90..1CBF + 'Sundanese Supplement', # 1CC0..1CCF + 'Vedic Extensions', # 1CD0..1CFF + 'Phonetic Extensions', # 1D00..1D7F + 'Phonetic Extensions Supplement', # 1D80..1DBF + 'Combining Diacritical Marks Supplement', # 1DC0..1DFF + 'Latin Extended Additional', # 1E00..1EFF + 'Greek Extended', # 1F00..1FFF + 'General Punctuation', # 2000..206F + 'Superscripts and Subscripts', # 2070..209F + 'Currency Symbols', # 20A0..20CF + 'Combining Diacritical Marks for Symbols', # 20D0..20FF + 'Letterlike Symbols', # 2100..214F + 'Number Forms', # 2150..218F + 'Arrows', # 2190..21FF + 'Mathematical Operators', # 2200..22FF + 'Miscellaneous Technical', # 2300..23FF + 'Control Pictures', # 2400..243F + 'Optical Character Recognition', # 2440..245F + 'Enclosed Alphanumerics', # 2460..24FF + 'Box Drawing', # 2500..257F + 'Block Elements', # 2580..259F + 'Geometric Shapes', # 25A0..25FF + 'Miscellaneous Symbols', # 2600..26FF + 'Dingbats', # 2700..27BF + 'Miscellaneous Mathematical Symbols-A', # 27C0..27EF + 'Supplemental Arrows-A', # 27F0..27FF + 'Braille Patterns', # 2800..28FF + 'Supplemental Arrows-B', # 2900..297F + 'Miscellaneous Mathematical Symbols-B', # 2980..29FF + 'Supplemental Mathematical Operators', # 2A00..2AFF + 'Miscellaneous Symbols and Arrows', # 2B00..2BFF + 'Glagolitic', # 2C00..2C5F + 'Latin Extended-C', # 2C60..2C7F + 'Coptic', # 2C80..2CFF + 'Georgian Supplement', # 2D00..2D2F + 'Tifinagh', # 2D30..2D7F + 'Ethiopic Extended', # 2D80..2DDF + 'Cyrillic Extended-A', # 2DE0..2DFF + 'Supplemental Punctuation', # 2E00..2E7F + 'CJK Radicals Supplement', # 2E80..2EFF + 'Kangxi Radicals', # 2F00..2FDF + 'No_Block', # 2FE0..2FEF + 'Ideographic Description Characters', # 2FF0..2FFF + 'CJK Symbols and Punctuation', # 3000..303F + 'Hiragana', # 3040..309F + 'Katakana', # 30A0..30FF + 'Bopomofo', # 3100..312F + 'Hangul Compatibility Jamo', # 3130..318F + 'Kanbun', # 3190..319F + 'Bopomofo Extended', # 31A0..31BF + 'CJK Strokes', # 31C0..31EF + 'Katakana Phonetic Extensions', # 31F0..31FF + 'Enclosed CJK Letters and Months', # 3200..32FF + 'CJK Compatibility', # 3300..33FF + 'CJK Unified Ideographs Extension A', # 3400..4DBF + 'Yijing Hexagram Symbols', # 4DC0..4DFF + 'CJK Unified Ideographs', # 4E00..9FFF + 'Yi Syllables', # A000..A48F + 'Yi Radicals', # A490..A4CF + 'Lisu', # A4D0..A4FF + 'Vai', # A500..A63F + 'Cyrillic Extended-B', # A640..A69F + 'Bamum', # A6A0..A6FF + 'Modifier Tone Letters', # A700..A71F + 'Latin Extended-D', # A720..A7FF + 'Syloti Nagri', # A800..A82F + 'Common Indic Number Forms', # A830..A83F + 'Phags-pa', # A840..A87F + 'Saurashtra', # A880..A8DF + 'Devanagari Extended', # A8E0..A8FF + 'Kayah Li', # A900..A92F + 'Rejang', # A930..A95F + 'Hangul Jamo Extended-A', # A960..A97F + 'Javanese', # A980..A9DF + 'Myanmar Extended-B', # A9E0..A9FF + 'Cham', # AA00..AA5F + 'Myanmar Extended-A', # AA60..AA7F + 'Tai Viet', # AA80..AADF + 'Meetei Mayek Extensions', # AAE0..AAFF + 'Ethiopic Extended-A', # AB00..AB2F + 'Latin Extended-E', # AB30..AB6F + 'Cherokee Supplement', # AB70..ABBF + 'Meetei Mayek', # ABC0..ABFF + 'Hangul Syllables', # AC00..D7AF + 'Hangul Jamo Extended-B', # D7B0..D7FF + 'High Surrogates', # D800..DB7F + 'High Private Use Surrogates', # DB80..DBFF + 'Low Surrogates', # DC00..DFFF + 'Private Use Area', # E000..F8FF + 'CJK Compatibility Ideographs', # F900..FAFF + 'Alphabetic Presentation Forms', # FB00..FB4F + 'Arabic Presentation Forms-A', # FB50..FDFF + 'Variation Selectors', # FE00..FE0F + 'Vertical Forms', # FE10..FE1F + 'Combining Half Marks', # FE20..FE2F + 'CJK Compatibility Forms', # FE30..FE4F + 'Small Form Variants', # FE50..FE6F + 'Arabic Presentation Forms-B', # FE70..FEFF + 'Halfwidth and Fullwidth Forms', # FF00..FFEF + 'Specials', # FFF0..FFFF + 'Linear B Syllabary', # 10000..1007F + 'Linear B Ideograms', # 10080..100FF + 'Aegean Numbers', # 10100..1013F + 'Ancient Greek Numbers', # 10140..1018F + 'Ancient Symbols', # 10190..101CF + 'Phaistos Disc', # 101D0..101FF + 'No_Block', # 10200..1027F + 'Lycian', # 10280..1029F + 'Carian', # 102A0..102DF + 'Coptic Epact Numbers', # 102E0..102FF + 'Old Italic', # 10300..1032F + 'Gothic', # 10330..1034F + 'Old Permic', # 10350..1037F + 'Ugaritic', # 10380..1039F + 'Old Persian', # 103A0..103DF + 'No_Block', # 103E0..103FF + 'Deseret', # 10400..1044F + 'Shavian', # 10450..1047F + 'Osmanya', # 10480..104AF + 'Osage', # 104B0..104FF + 'Elbasan', # 10500..1052F + 'Caucasian Albanian', # 10530..1056F + 'No_Block', # 10570..105FF + 'Linear A', # 10600..1077F + 'No_Block', # 10780..107FF + 'Cypriot Syllabary', # 10800..1083F + 'Imperial Aramaic', # 10840..1085F + 'Palmyrene', # 10860..1087F + 'Nabataean', # 10880..108AF + 'No_Block', # 108B0..108DF + 'Hatran', # 108E0..108FF + 'Phoenician', # 10900..1091F + 'Lydian', # 10920..1093F + 'No_Block', # 10940..1097F + 'Meroitic Hieroglyphs', # 10980..1099F + 'Meroitic Cursive', # 109A0..109FF + 'Kharoshthi', # 10A00..10A5F + 'Old South Arabian', # 10A60..10A7F + 'Old North Arabian', # 10A80..10A9F + 'No_Block', # 10AA0..10ABF + 'Manichaean', # 10AC0..10AFF + 'Avestan', # 10B00..10B3F + 'Inscriptional Parthian', # 10B40..10B5F + 'Inscriptional Pahlavi', # 10B60..10B7F + 'Psalter Pahlavi', # 10B80..10BAF + 'No_Block', # 10BB0..10BFF + 'Old Turkic', # 10C00..10C4F + 'No_Block', # 10C50..10C7F + 'Old Hungarian', # 10C80..10CFF + 'No_Block', # 10D00..10E5F + 'Rumi Numeral Symbols', # 10E60..10E7F + 'No_Block', # 10E80..10FFF + 'Brahmi', # 11000..1107F + 'Kaithi', # 11080..110CF + 'Sora Sompeng', # 110D0..110FF + 'Chakma', # 11100..1114F + 'Mahajani', # 11150..1117F + 'Sharada', # 11180..111DF + 'Sinhala Archaic Numbers', # 111E0..111FF + 'Khojki', # 11200..1124F + 'No_Block', # 11250..1127F + 'Multani', # 11280..112AF + 'Khudawadi', # 112B0..112FF + 'Grantha', # 11300..1137F + 'No_Block', # 11380..113FF + 'Newa', # 11400..1147F + 'Tirhuta', # 11480..114DF + 'No_Block', # 114E0..1157F + 'Siddham', # 11580..115FF + 'Modi', # 11600..1165F + 'Mongolian Supplement', # 11660..1167F + 'Takri', # 11680..116CF + 'No_Block', # 116D0..116FF + 'Ahom', # 11700..1173F + 'No_Block', # 11740..1189F + 'Warang Citi', # 118A0..118FF + 'No_Block', # 11900..119FF + 'Zanabazar Square', # 11A00..11A4F + 'Soyombo', # 11A50..11AAF + 'No_Block', # 11AB0..11ABF + 'Pau Cin Hau', # 11AC0..11AFF + 'No_Block', # 11B00..11BFF + 'Bhaiksuki', # 11C00..11C6F + 'Marchen', # 11C70..11CBF + 'No_Block', # 11CC0..11CFF + 'Masaram Gondi', # 11D00..11D5F + 'No_Block', # 11D60..11FFF + 'Cuneiform', # 12000..123FF + 'Cuneiform Numbers and Punctuation', # 12400..1247F + 'Early Dynastic Cuneiform', # 12480..1254F + 'No_Block', # 12550..12FFF + 'Egyptian Hieroglyphs', # 13000..1342F + 'No_Block', # 13430..143FF + 'Anatolian Hieroglyphs', # 14400..1467F + 'No_Block', # 14680..167FF + 'Bamum Supplement', # 16800..16A3F + 'Mro', # 16A40..16A6F + 'No_Block', # 16A70..16ACF + 'Bassa Vah', # 16AD0..16AFF + 'Pahawh Hmong', # 16B00..16B8F + 'No_Block', # 16B90..16EFF + 'Miao', # 16F00..16F9F + 'No_Block', # 16FA0..16FDF + 'Ideographic Symbols and Punctuation', # 16FE0..16FFF + 'Tangut', # 17000..187FF + 'Tangut Components', # 18800..18AFF + 'No_Block', # 18B00..1AFFF + 'Kana Supplement', # 1B000..1B0FF + 'Kana Extended-A', # 1B100..1B12F + 'No_Block', # 1B130..1B16F + 'Nushu', # 1B170..1B2FF + 'No_Block', # 1B300..1BBFF + 'Duployan', # 1BC00..1BC9F + 'Shorthand Format Controls', # 1BCA0..1BCAF + 'No_Block', # 1BCB0..1CFFF + 'Byzantine Musical Symbols', # 1D000..1D0FF + 'Musical Symbols', # 1D100..1D1FF + 'Ancient Greek Musical Notation', # 1D200..1D24F + 'No_Block', # 1D250..1D2FF + 'Tai Xuan Jing Symbols', # 1D300..1D35F + 'Counting Rod Numerals', # 1D360..1D37F + 'No_Block', # 1D380..1D3FF + 'Mathematical Alphanumeric Symbols', # 1D400..1D7FF + 'Sutton SignWriting', # 1D800..1DAAF + 'No_Block', # 1DAB0..1DFFF + 'Glagolitic Supplement', # 1E000..1E02F + 'No_Block', # 1E030..1E7FF + 'Mende Kikakui', # 1E800..1E8DF + 'No_Block', # 1E8E0..1E8FF + 'Adlam', # 1E900..1E95F + 'No_Block', # 1E960..1EDFF + 'Arabic Mathematical Alphabetic Symbols', # 1EE00..1EEFF + 'No_Block', # 1EF00..1EFFF + 'Mahjong Tiles', # 1F000..1F02F + 'Domino Tiles', # 1F030..1F09F + 'Playing Cards', # 1F0A0..1F0FF + 'Enclosed Alphanumeric Supplement', # 1F100..1F1FF + 'Enclosed Ideographic Supplement', # 1F200..1F2FF + 'Miscellaneous Symbols and Pictographs', # 1F300..1F5FF + 'Emoticons', # 1F600..1F64F + 'Ornamental Dingbats', # 1F650..1F67F + 'Transport and Map Symbols', # 1F680..1F6FF + 'Alchemical Symbols', # 1F700..1F77F + 'Geometric Shapes Extended', # 1F780..1F7FF + 'Supplemental Arrows-C', # 1F800..1F8FF + 'Supplemental Symbols and Pictographs', # 1F900..1F9FF + 'No_Block', # 1FA00..1FFFF + 'CJK Unified Ideographs Extension B', # 20000..2A6DF + 'No_Block', # 2A6E0..2A6FF + 'CJK Unified Ideographs Extension C', # 2A700..2B73F + 'CJK Unified Ideographs Extension D', # 2B740..2B81F + 'CJK Unified Ideographs Extension E', # 2B820..2CEAF + 'CJK Unified Ideographs Extension F', # 2CEB0..2EBEF + 'No_Block', # 2EBF0..2F7FF + 'CJK Compatibility Ideographs Supplement', # 2F800..2FA1F + 'No_Block', # 2FA20..DFFFF + 'Tags', # E0000..E007F + 'No_Block', # E0080..E00FF + 'Variation Selectors Supplement', # E0100..E01EF + 'No_Block', # E01F0..EFFFF + 'Supplementary Private Use Area-A', # F0000..FFFFF + 'Supplementary Private Use Area-B', # 100000..10FFFF +] diff --git a/Lib/fontTools/unicodedata/ScriptExtensions.py b/Lib/fontTools/unicodedata/ScriptExtensions.py new file mode 100644 index 000000000..a92cc80c9 --- /dev/null +++ b/Lib/fontTools/unicodedata/ScriptExtensions.py @@ -0,0 +1,389 @@ +# -*- coding: utf-8 -*- +# +# NOTE: This file was auto-generated with MetaTools/buildUCD.py. +# Source: https://unicode.org/Public/UNIDATA/ScriptExtensions.txt +# License: http://unicode.org/copyright.html#License +# +# ScriptExtensions-10.0.0.txt +# Date: 2017-05-31, 01:07:00 GMT [RP] +# © 2017 Unicode®, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Unicode Character Database +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# The Script_Extensions property indicates which characters are commonly used +# with more than one script, but with a limited number of scripts. +# For each code point, there is one or more property values. Each such value is a Script property value. +# For more information, see: +# UAX #24, Unicode Script Property: http://www.unicode.org/reports/tr24/ +# Especially the sections: +# http://www.unicode.org/reports/tr24/#Assignment_Script_Values +# http://www.unicode.org/reports/tr24/#Assignment_ScriptX_Values +# +# Each Script_Extensions value in this file consists of a set +# of one or more abbreviated Script property values. The ordering of the +# values in that set is not material, but for stability in presentation +# it is given here as alphabetical. +# +# The Script_Extensions values are presented in sorted order in the file. +# They are sorted first by the number of Script property values in their sets, +# and then alphabetically by first differing Script property value. +# +# Following each distinct Script_Extensions value is the list of code +# points associated with that value, listed in code point order. +# +# All code points not explicitly listed for Script_Extensions +# have as their value the corresponding Script property value +# +# @missing: 0000..10FFFF;