diff --git a/eng/Versions.props b/eng/Versions.props index 6938c1b5e09bfb..919ce843b1f0ab 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -61,6 +61,7 @@ 5.0.0-beta.19608.5 5.0.0-beta.19608.5 5.0.0-beta.19608.5 + 5.0.0-beta.19610.1 5.0.0-beta.19608.5 5.0.0-beta.19608.5 diff --git a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/CategoryCasingInfo.cs b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/CategoryCasingInfo.cs new file mode 100644 index 00000000000000..f889fad3d1d1ea --- /dev/null +++ b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/CategoryCasingInfo.cs @@ -0,0 +1,119 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Buffers.Binary; +using System.Globalization; +using System.Text; +using System.Text.Unicode; + +namespace GenUnicodeProp +{ + /// + /// Contains information about a code point's Unicode category, + /// bidi class, and simple case mapping / folding. + /// + internal sealed class CategoryCasingInfo : IEquatable + { + private readonly (UnicodeCategory generalCategory, + StrongBidiCategory strongBidiCategory, + ushort offsetToSimpleUppercase, + ushort offsetToSimpleLowercase, + ushort offsetToSimpleTitlecase, + ushort offsetToSimpleCasefold, + bool isWhitespace) _data; + + public CategoryCasingInfo(CodePoint codePoint) + { + _data.generalCategory = codePoint.GeneralCategory; + + switch (codePoint.BidiClass) + { + case BidiClass.Left_To_Right: + _data.strongBidiCategory = StrongBidiCategory.StrongLeftToRight; + break; + + case BidiClass.Right_To_Left: + case BidiClass.Arabic_Letter: + _data.strongBidiCategory = StrongBidiCategory.StrongRightToLeft; + break; + + default: + _data.strongBidiCategory = StrongBidiCategory.Other; + break; + } + + if (Program.IncludeCasingData) + { + _data.offsetToSimpleUppercase = (ushort)(codePoint.SimpleUppercaseMapping - codePoint.Value); + _data.offsetToSimpleLowercase = (ushort)(codePoint.SimpleLowercaseMapping - codePoint.Value); + _data.offsetToSimpleTitlecase = (ushort)(codePoint.SimpleTitlecaseMapping - codePoint.Value); + _data.offsetToSimpleCasefold = (ushort)(codePoint.SimpleCaseFoldMapping - codePoint.Value); + } + else + { + _data.offsetToSimpleUppercase = default; + _data.offsetToSimpleLowercase = default; + _data.offsetToSimpleTitlecase = default; + _data.offsetToSimpleCasefold = default; + } + + _data.isWhitespace = codePoint.Flags.HasFlag(CodePointFlags.White_Space); + } + + public override bool Equals(object obj) => Equals(obj as CategoryCasingInfo); + + public bool Equals(CategoryCasingInfo other) + { + return !(other is null) && this._data.Equals(other._data); + } + + public override int GetHashCode() + { + return _data.GetHashCode(); + } + + public static byte[] ToCategoryBytes(CategoryCasingInfo input) + { + // We're storing 3 pieces of information in 8 bits: + // bit 7 (high bit) = isWhitespace? + // bits 6..5 = restricted bidi class + // bits 4..0 = Unicode category + + int combinedValue = Convert.ToInt32(input._data.isWhitespace) << 7; + combinedValue += (int)input._data.strongBidiCategory << 5; + combinedValue += (int)input._data.generalCategory; + + return new byte[] { checked((byte)combinedValue) }; + } + + public static byte[] ToUpperBytes(CategoryCasingInfo input) + { + byte[] bytes = new byte[sizeof(ushort)]; + BinaryPrimitives.WriteUInt16LittleEndian(bytes, input._data.offsetToSimpleUppercase); + return bytes; + } + + public static byte[] ToLowerBytes(CategoryCasingInfo input) + { + byte[] bytes = new byte[sizeof(ushort)]; + BinaryPrimitives.WriteUInt16LittleEndian(bytes, input._data.offsetToSimpleLowercase); + return bytes; + } + + public static byte[] ToTitleBytes(CategoryCasingInfo input) + { + byte[] bytes = new byte[sizeof(ushort)]; + BinaryPrimitives.WriteUInt16LittleEndian(bytes, input._data.offsetToSimpleTitlecase); + return bytes; + } + + public static byte[] ToCaseFoldBytes(CategoryCasingInfo input) + { + byte[] bytes = new byte[sizeof(ushort)]; + BinaryPrimitives.WriteUInt16LittleEndian(bytes, input._data.offsetToSimpleCasefold); + return bytes; + } + } +} diff --git a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/DataTable.cs b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/DataTable.cs index d2bc25364e7555..c49c3660defc66 100644 --- a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/DataTable.cs +++ b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/DataTable.cs @@ -170,30 +170,4 @@ public byte[][] GetBytes() return new[] { Level1Index.ToArray(), level2.ToArray(), Level3Data.ToArray() }; } } - - internal sealed class FlatDataTable - { - // If a codepoint does not have data, this specifies the default value. - private readonly string DefaultValue; - private readonly Func GetValueBytesCallback; - - // This contains the data mapping between codepoints and values. - private readonly SortedDictionary RawData = new SortedDictionary(); - - public FlatDataTable(string defaultValue, Func getValueBytesCallback) - { - DefaultValue = defaultValue; - GetValueBytesCallback = getValueBytesCallback; - } - - public void AddData(uint codepoint, string value) => RawData[codepoint] = value; - - public byte[] GetBytesFlat() - { - var str = new List(); - foreach (var v in RawData.Values) - str.AddRange(GetValueBytesCallback(v ?? DefaultValue)); - return str.ToArray(); - } - } } diff --git a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/GenUnicodeProp.csproj b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/GenUnicodeProp.csproj index b4c010bfc67b6d..68c616ea14ab7b 100644 --- a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/GenUnicodeProp.csproj +++ b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/GenUnicodeProp.csproj @@ -2,7 +2,51 @@ Exe - $(NetCoreAppCurrent) + netcoreapp3.0 + 12.1 + + + + + + + + UnicodeData\CaseFolding.txt + CaseFolding.txt + + + UnicodeData\PropList.txt + PropList.txt + + + UnicodeData\UnicodeData.txt + UnicodeData.txt + + + UnicodeData\GraphemeBreakProperty.txt + GraphemeBreakProperty.txt + + + UnicodeData\DerivedBidiClass.txt + DerivedBidiClass.txt + + + UnicodeData\DerivedName.txt + DerivedName.txt + + + UnicodeData\emoji-data.txt + emoji-data.txt + + + + + + + + + + diff --git a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/NumericGraphemeInfo.cs b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/NumericGraphemeInfo.cs new file mode 100644 index 00000000000000..9f0e4673914fed --- /dev/null +++ b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/NumericGraphemeInfo.cs @@ -0,0 +1,69 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Buffers.Binary; +using System.Runtime.CompilerServices; +using System.Text.Unicode; + +namespace GenUnicodeProp +{ + /// + /// Contains information about a code point's numeric representation + /// and the manner in which it's treated for grapheme cluster segmentation + /// purposes. + /// + internal sealed class NumericGraphemeInfo : IEquatable + { + public readonly (int decimalDigitValue, + int digitValue, + double numericValue, + GraphemeClusterBreakProperty graphemeClusterBreakProperty) _data; + + public NumericGraphemeInfo(CodePoint codePoint) + { + _data.decimalDigitValue = codePoint.DecimalDigitValue; + _data.digitValue = codePoint.DigitValue; + _data.numericValue = codePoint.NumericValue; + _data.graphemeClusterBreakProperty = codePoint.GraphemeClusterBreakProperty; + } + + public override bool Equals(object obj) => Equals(obj as NumericGraphemeInfo); + + public bool Equals(NumericGraphemeInfo other) + { + return !(other is null) && this._data.Equals(other._data); + } + + public override int GetHashCode() + { + return _data.GetHashCode(); + } + + public static byte[] ToDigitBytes(NumericGraphemeInfo input) + { + // Bits 4 .. 7 contain (decimalDigitValue + 1). + // Bits 0 .. 3 contain (digitValue + 1). + // This means that each nibble will have a value 0x0 .. 0xa, inclusive. + + int adjustedDecimalDigitValue = input._data.decimalDigitValue + 1; + int adjustedDigitValue = input._data.digitValue + 1; + + return new byte[] { (byte)((adjustedDecimalDigitValue << 4) | adjustedDigitValue) }; + } + + public static byte[] ToNumericBytes(NumericGraphemeInfo input) + { + byte[] bytes = new byte[sizeof(double)]; + double value = input._data.numericValue; + BinaryPrimitives.WriteUInt64LittleEndian(bytes, Unsafe.As(ref value)); + return bytes; + } + + public static byte[] ToGraphemeBytes(NumericGraphemeInfo input) + { + return new byte[] { checked((byte)input._data.graphemeClusterBreakProperty) }; + } + } +} diff --git a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/Program.cs b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/Program.cs index f731190f856b31..3c1156e7e35e58 100644 --- a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/Program.cs +++ b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/Program.cs @@ -4,358 +4,165 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.IO; +using System.Linq; +using System.Text.Unicode; namespace GenUnicodeProp { internal static class Program { + internal static bool Verbose = false; + internal static bool IncludeCasingData = false; + + private const string SOURCE_NAME = "CharUnicodeInfoData.cs"; + private static void Main(string[] args) { - Verbose = false; - // TODO: parse args - - var defaultCategoryValues = "Cn,L"; - - // Create a 12:4:4 table for Unicode category - // "Cn", Not assigned. The value is 1 byte to indicate Unicode category - // Make sure to put the default value into the slot 0 in $categoriesValueTable - var categoriesIndexTable = new DataTable(); - // Create a 12:4:4 table for decimal digit value/digit value/numeric value - var numericIndexTable = new DataTable(); - // Create a flat table for Unicode category and BiDi category - var categoriesValueTable = new FlatDataTable(defaultCategoryValues, GetCategoriesValueBytes); - // Create a flat table. - // GetNumericValueBytes() is the callback used to generate the bytes of each item. - var numericValueTable = new FlatDataTable("-1", GetNumericValueBytes); - // Create a flat table for digit values - // GetDigitValueBytes() is the callback used to generate the bytes of each item. - var digitValueTable = new FlatDataTable("255,255", GetDigitValueBytes); - - // Add a default item into the category value table. This will be the item 0 in the category value table. - GetCategoryValueItem(categoriesValueTable, defaultCategoryValues); - NumberValues.Add("-1,255,255", 0); - numericValueTable.AddData(0, "-1"); - digitValueTable.AddData(0, "255,255"); - - ReadSourceFile("UnicodeData.txt", categoriesIndexTable, categoriesValueTable, numericIndexTable, numericValueTable, digitValueTable); - - categoriesIndexTable.GenerateTable(nameof(categoriesIndexTable), 5, 4); - //categoriesIndexTable.CalculateTableVariants(); - numericIndexTable.GenerateTable(nameof(numericIndexTable), 4, 4, cutOff: true); - //numericIndexTable.CalculateTableVariants(cutOff: true); - - // generate the data C# source + Verbose = args.Contains("-Verbose", StringComparer.OrdinalIgnoreCase); + IncludeCasingData = args.Contains("-IncludeCasingData", StringComparer.OrdinalIgnoreCase); + + // First, read the data files and build up a list of all + // assigned code points. + + Console.WriteLine("Reading Unicode data files..."); + + _ = UnicodeData.GetData(0); // processes files + + Console.WriteLine("Finished."); + Console.WriteLine(); + + Console.WriteLine("Initializing maps..."); + Dictionary categoryCasingMap = new Dictionary(); + Dictionary numericGraphemeMap = new Dictionary(); + + // Next, iterate though all assigned code points, populating + // the category casing & numeric grapheme maps. Also put the + // data into the the DataTable structure, which will compute + // the tiered offset tables. + + DataTable categoryCasingTable = new DataTable(); + DataTable numericGraphemeTable = new DataTable(); + + for (int i = 0; i <= 0x10_FFFF; i++) + { + CodePoint thisCodePoint = UnicodeData.GetData(i); + + CategoryCasingInfo categoryCasingInfo = new CategoryCasingInfo(thisCodePoint); + if (!categoryCasingMap.TryGetValue(categoryCasingInfo, out byte cciValue)) + { + cciValue = (byte)categoryCasingMap.Count; + categoryCasingMap[categoryCasingInfo] = cciValue; + } + categoryCasingTable.AddData((uint)i, cciValue); + + NumericGraphemeInfo numericGraphemeInfo = new NumericGraphemeInfo(thisCodePoint); + if (!numericGraphemeMap.TryGetValue(numericGraphemeInfo, out byte ngiValue)) + { + ngiValue = (byte)numericGraphemeMap.Count; + numericGraphemeMap[numericGraphemeInfo] = ngiValue; + } + numericGraphemeTable.AddData((uint)i, ngiValue); + } + + // Did anything overflow? + + Console.WriteLine($"CategoryCasingMap contains {categoryCasingMap.Count} entries."); + if (categoryCasingMap.Count > 256) + { + throw new Exception("CategoryCasingMap exceeds max count of 256 entries!"); + } + + Console.WriteLine($"NumericGraphemeMap contains {numericGraphemeMap.Count} entries."); + if (numericGraphemeMap.Count > 256) + { + throw new Exception("NumericGraphemeMap exceeds max count of 256 entries!"); + } + + Console.WriteLine(); + + // Choose default ratios for the data tables we'll be generating. + + TableLevels categoryCasingTableLevelBits = new TableLevels(5, 4); + TableLevels numericGraphemeTableLevelBits = new TableLevels(5, 4); + + // Now generate the tables. + + categoryCasingTable.GenerateTable("CategoryCasingTable", categoryCasingTableLevelBits.Level2Bits, categoryCasingTableLevelBits.Level3Bits); + numericGraphemeTable.GenerateTable("NumericGraphemeTable", numericGraphemeTableLevelBits.Level2Bits, numericGraphemeTableLevelBits.Level3Bits); + + // If you want to see if a different ratio would have better compression + // statistics, uncomment the lines below and re-run the application. + // categoryCasingTable.CalculateTableVariants(); + // numericGraphemeTable.CalculateTableVariants(); + + // Now generate the C# source file. + using (StreamWriter file = File.CreateText(SOURCE_NAME)) { file.Write("// Licensed to the .NET Foundation under one or more agreements.\n"); file.Write("// The .NET Foundation licenses this file to you under the MIT license.\n"); file.Write("// See the LICENSE file in the project root for more information.\n\n"); + file.Write("using System.Diagnostics;\n\n"); + file.Write("namespace System.Globalization\n"); file.Write("{\n"); file.Write(" public static partial class CharUnicodeInfo\n {\n"); file.Write(" // THE FOLLOWING DATA IS AUTO GENERATED BY GenUnicodeProp program UNDER THE TOOLS FOLDER\n"); - file.Write(" // PLEASE DON'T MODIFY BY HAND\n\n\n"); - - file.Write(" // 11:5:4 index table of the Unicode category data."); - PrintSourceIndexArray("CategoryLevel1Index", categoriesIndexTable, file); - - PrintValueArray("CategoriesValue", categoriesValueTable, file); + file.Write(" // PLEASE DON'T MODIFY BY HAND\n"); - file.Write("\n // 12:4:4 index table of the Unicode numeric data."); - PrintSourceIndexArray("NumericLevel1Index", numericIndexTable, file); + PrintAssertTableLevelsBitCountRoutine("CategoryCasing", file, categoryCasingTableLevelBits); - file.Write("\n // Every item contains the value for numeric value."); - PrintValueArray("NumericValues", numericValueTable, file); + file.Write($"\n // {categoryCasingTableLevelBits} index table of the Unicode category & casing data."); + PrintSourceIndexArray("CategoryCasingLevel1Index", categoryCasingTable, file); - PrintValueArray("DigitValues", digitValueTable, file); + file.Write("\n // Contains Unicode category & bidi class information"); + PrintValueArray("CategoriesValues", categoryCasingMap, CategoryCasingInfo.ToCategoryBytes, file); - file.Write("\n }\n}"); - } - } + if (IncludeCasingData) + { + // Only write out the casing data if we have been asked to do so. - private static bool Verbose; + file.Write("\n // Contains simple culture-invariant uppercase mappings"); + PrintValueArray("UppercaseValues", categoryCasingMap, CategoryCasingInfo.ToUpperBytes, file); - private const string SOURCE_NAME = "CharUnicodeInfoData.cs"; + file.Write("\n // Contains simple culture-invariant lowercase mappings"); + PrintValueArray("LowercaseValues", categoryCasingMap, CategoryCasingInfo.ToLowerBytes, file); - private static readonly Dictionary UnicodeCategoryMap = new Dictionary - { - ["Lu"] = (byte)UnicodeCategory.UppercaseLetter, - ["Ll"] = (byte)UnicodeCategory.LowercaseLetter, - ["Lt"] = (byte)UnicodeCategory.TitlecaseLetter, - ["Lm"] = (byte)UnicodeCategory.ModifierLetter, - ["Lo"] = (byte)UnicodeCategory.OtherLetter, - ["Mn"] = (byte)UnicodeCategory.NonSpacingMark, - ["Mc"] = (byte)UnicodeCategory.SpacingCombiningMark, - ["Me"] = (byte)UnicodeCategory.EnclosingMark, - ["Nd"] = (byte)UnicodeCategory.DecimalDigitNumber, - ["Nl"] = (byte)UnicodeCategory.LetterNumber, - ["No"] = (byte)UnicodeCategory.OtherNumber, - ["Zs"] = (byte)UnicodeCategory.SpaceSeparator, - ["Zl"] = (byte)UnicodeCategory.LineSeparator, - ["Zp"] = (byte)UnicodeCategory.ParagraphSeparator, - ["Cc"] = (byte)UnicodeCategory.Control, - ["Cf"] = (byte)UnicodeCategory.Format, - ["Cs"] = (byte)UnicodeCategory.Surrogate, - ["Co"] = (byte)UnicodeCategory.PrivateUse, - ["Pc"] = (byte)UnicodeCategory.ConnectorPunctuation, - ["Pd"] = (byte)UnicodeCategory.DashPunctuation, - ["Ps"] = (byte)UnicodeCategory.OpenPunctuation, - ["Pe"] = (byte)UnicodeCategory.ClosePunctuation, - ["Pi"] = (byte)UnicodeCategory.InitialQuotePunctuation, - ["Pf"] = (byte)UnicodeCategory.FinalQuotePunctuation, - ["Po"] = (byte)UnicodeCategory.OtherPunctuation, - ["Sm"] = (byte)UnicodeCategory.MathSymbol, - ["Sc"] = (byte)UnicodeCategory.CurrencySymbol, - ["Sk"] = (byte)UnicodeCategory.ModifierSymbol, - ["So"] = (byte)UnicodeCategory.OtherSymbol, - ["Cn"] = (byte)UnicodeCategory.OtherNotAssigned, - }; - - /// - /// Map BiDi symbols in UnicodeData.txt to their numeric values stored in the output table. - /// - private static readonly Dictionary BiDiCategory = new Dictionary - { - ["L"] = 0, // Left-to-Right - ["LRE"] = 1, // Left-to-Right Embedding - ["LRO"] = 2, // Left-to-Right Override - ["R"] = 3, // Right-to-Left - ["AL"] = 4, // Right-to-Left Arabic - ["RLE"] = 5, // Right-to-Left Embedding - ["RLO"] = 6, // Right-to-Left Override - ["PDF"] = 7, // Pop Directional Format - ["EN"] = 8, // European Number - ["ES"] = 9, // European Number Separator - ["ET"] = 10, // European Number Terminator - ["AN"] = 11, // Arabic Number - ["CS"] = 12, // Common Number Separator - ["NSM"] = 13, // Non-Spacing Mark - ["BN"] = 14, // Boundary Neutral - ["B"] = 15, // Paragraph Separator - ["S"] = 16, // Segment Separator - ["WS"] = 17, // Whitespace - ["ON"] = 18, // Other Neutrals - ["LRI"] = 19, // LeftToRightIsolate - ["RLI"] = 20, // RightToLeftIsolate - ["FSI"] = 21, // FirstStrongIsolate - ["PDI"] = 22, // PopDirectionIsolate - }; - - // Store the current combinations of categories (Unicode category, BiDi category) - private static readonly Dictionary CategoryValues = new Dictionary(); - - private static readonly Dictionary NumberValues = new Dictionary(); - - /// - /// Check if we need to add a new item in the categoriesValueTable. If yes, - /// add one item and return the new item number. Otherwise, return the existing - /// item number. - /// - /// - /// The combination of Unicode category and BiDi category. - /// They should use the original form in UnicodeData.txt (such as "Cn" for not assigned and "L" for Left-To-Right") - /// and are separated by a comma. - /// The item number in the categoriesValueTable - private static byte GetCategoryValueItem(FlatDataTable categoriesValueTable, string allCategoryValues) - { - if (!CategoryValues.TryGetValue(allCategoryValues, out var categoryItem)) - { - // This combination of Unicode category and BiDi category has not shown up before. - if (CategoryValues.Count >= 255) - throw new InvalidOperationException("The possible number of values exceeds 255."); - - // Get the current element count of the hash table and update the category item - categoryItem = (byte)CategoryValues.Count; - CategoryValues.Add(allCategoryValues, categoryItem); - // Add the category values. - categoriesValueTable.AddData(categoryItem, allCategoryValues); - } - return categoryItem; - } + file.Write("\n // Contains simple culture-invariant titlecase mappings"); + PrintValueArray("TitlecaseValues", categoryCasingMap, CategoryCasingInfo.ToTitleBytes, file); - /// - /// Read UnicodeData.txt and call DataTable.AddData() to add values for codepoints. - /// - private static void ReadSourceFile(string sourceFileName, DataTable categoriesIndexTable, FlatDataTable categoriesValueTable, DataTable numericIndexTable, FlatDataTable numericValueTable, FlatDataTable digitValueTable) - { - var lineCount = 0; // The line count - var codePointCount = 0; // The count of the total characters in the file. - - Console.Write($"Read {sourceFileName}"); - - // Field Name in UnicodeData.txt - // 0 Code value - // 1 Character name - // 2 General Category - // - // 3 Canonical Combining Classes - // 4 Bidirectional Category - // 5 Character Decomposition Mapping - // 6 Decimal digit value - // 7 Digit value - // 8 Numeric value - // 9 Mirrored - // 10 Unicode 1.0 Name - // 11 10646 comment field - // 12 Uppercase Mapping - // 13 Lowercase Mapping - // 14 Titlecase Mapping - - using (StreamReader sourceFile = File.OpenText(sourceFileName)) - while (sourceFile.ReadLine() is string line) - { - var fields = line.Split(';'); - var code = uint.Parse(fields[0], NumberStyles.HexNumber); - var comments = fields[1]; - var category = fields[2]; - - var bidiCategory = fields[4]; - var decimalDigitValue = fields[6]; - var digitValue = fields[7]; - var numericValue = fields[8]; - - var allCategoryValues = category + "," + bidiCategory; - var allDigitValue = (decimalDigitValue == "" ? "255" : decimalDigitValue) + "," + (digitValue == "" ? "255" : digitValue); - var allNumValues = numericValue == "" ? "-1" : numericValue; - var allValues = allNumValues + "," + allDigitValue; - - if (Verbose) - { - Console.WriteLine($"[{code:X4}]- Cat: [{category}], BiDi Category: [{bidiCategory}], Numeric: [{numericValue}], Comments: [{comments}]"); - } - - if (!NumberValues.TryGetValue(allValues, out var numItem)) - { - if (NumberValues.Count >= 255) - throw new InvalidOperationException("The possible number of values exceeds 255."); - // Get the current element count of the hash table - numItem = (byte)NumberValues.Count; - NumberValues[allValues] = numItem; - numericValueTable.AddData(numItem, allNumValues); - digitValueTable.AddData(numItem, allDigitValue); - } - - var categoryItem = GetCategoryValueItem(categoriesValueTable, allCategoryValues); - - if (comments[0] == '<' && comments.EndsWith(", First>", StringComparison.Ordinal)) - { - if (Verbose) - { - Console.WriteLine($"Range start: {code:X4} [{category}] [{comments}]"); - } - - // Read the next line to get the end of the range. - var endFields = sourceFile.ReadLine().Split(';'); - var codeEndRange = uint.Parse(endFields[0], NumberStyles.HexNumber); - var valueEndRange = endFields[2]; - var commentsEndRange = endFields[1]; - - if (Verbose) - { - Console.WriteLine($"Range end: {codeEndRange:X4} [{valueEndRange}] [{commentsEndRange}]"); - } - - if (category != valueEndRange) - { - Console.WriteLine("Different categories in the beginning of the range and the end of the range"); - Environment.Exit(1); - } - - // Add data for a range of code points - for (var i = code; i <= codeEndRange; i++) - { - categoriesIndexTable.AddData(i, categoryItem); - numericIndexTable.AddData(i, numItem); - codePointCount++; - if (Verbose) - { - Console.WriteLine($"Read: {i:X8} [{allCategoryValues}]"); - } - } - } - else - { - // Add data for a single code point. - categoriesIndexTable.AddData(code, categoryItem); - numericIndexTable.AddData(code, numItem); - codePointCount++; - if (Verbose) - { - Console.WriteLine($"Read: {code:X8} [{allCategoryValues}]"); - } - } - lineCount++; - if (lineCount % 256 == 0) - { - Console.Write('.'); - } + file.Write("\n // Contains simple culture-invariant case fold mappings"); + PrintValueArray("CaseFoldValues", categoryCasingMap, CategoryCasingInfo.ToCaseFoldBytes, file); } - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine($" Total lines in the file: {lineCount}"); - Console.WriteLine($" Total characters: {codePointCount}"); - - var allValueCount = CategoryValues.Count; - Console.WriteLine($" Total possible categories values: {allValueCount + 1}. Maximum allowed: 256"); - - allValueCount = NumberValues.Count; - Console.WriteLine($" Total possible number values: {allValueCount + 1}. Maximum allowed: 256"); - Console.WriteLine($" Finish reading {sourceFileName}."); - } - - private static byte[] GetCategoriesValueBytes(string value) - { - if (Verbose) - Console.WriteLine($"[{value}]"); + PrintAssertTableLevelsBitCountRoutine("NumericGrapheme", file, numericGraphemeTableLevelBits); - var values = value.Split(','); - var unicodeCategoryValue = values[0]; - var bidiCategoryValue = values[1]; + file.Write($"\n // {numericGraphemeTableLevelBits} index table of the Unicode numeric & text segmentation data."); + PrintSourceIndexArray("NumericGraphemeLevel1Index", numericGraphemeTable, file); - return new[] { GetUnicodeCategoryValue(unicodeCategoryValue), GetBiDiCategoryValue(bidiCategoryValue) }; - } + file.Write("\n // Contains decimal digit values in high nibble; digit values in low nibble"); + PrintValueArray("DigitValues", numericGraphemeMap, NumericGraphemeInfo.ToDigitBytes, file); - private static byte[] GetNumericValueBytes(string value) - { - double d; - var i = value.IndexOf('/'); - if (i < 0) - d = double.Parse(value, CultureInfo.InvariantCulture); - else - d = double.Parse(value.Substring(0, i), CultureInfo.InvariantCulture) / double.Parse(value.Substring(i + 1), CultureInfo.InvariantCulture); - return BitConverter.GetBytes(d); - } + file.Write("\n // Contains numeric values"); + PrintValueArray("NumericValues", numericGraphemeMap, NumericGraphemeInfo.ToNumericBytes, file); - private static byte[] GetDigitValueBytes(string value) - { - if (Verbose) - Console.WriteLine($"[{value}]"); + file.Write("\n // Contains grapheme cluster segmentation values"); + PrintValueArray("GraphemeSegmentationValues", numericGraphemeMap, NumericGraphemeInfo.ToGraphemeBytes, file); - var values = value.Split(','); - var decimalDigitValue = values[0]; - var digitValue = values[1]; + file.Write("\n }\n}\n"); + } - return new[] { byte.Parse(decimalDigitValue), byte.Parse(digitValue) }; - } + // Quick fixup: Replace \n with \r\n on Windows. - /// - /// Map a Unicode category symbol in UnicodeData.txt to a numeric value - /// - /// A two-letter abbreviation of Unicode category - /// A numeric value for the corresponding two-letter Unicode category - private static byte GetUnicodeCategoryValue(string str) - { - return UnicodeCategoryMap.TryGetValue(str, out var v) ? v : throw new ArgumentException($"The str [{str}] is not a valid two-letter Unicode category."); - } + if (Environment.NewLine != "\n") + { + File.WriteAllText(SOURCE_NAME, File.ReadAllText(SOURCE_NAME).Replace("\n", Environment.NewLine)); + } - private static byte GetBiDiCategoryValue(string str) - { - return BiDiCategory.TryGetValue(str, out var v) ? v : throw new ArgumentException($"The str [{str}] is not a valid BiDi category."); + Console.WriteLine("Completed!"); } private static void PrintSourceIndexArray(string tableName, DataTable d, StreamWriter file) @@ -369,10 +176,31 @@ private static void PrintSourceIndexArray(string tableName, DataTable d, StreamW PrintByteArray(tableName.Replace('1', '3'), file, levels[2]); } - private static void PrintValueArray(string tableName, FlatDataTable d, StreamWriter file) + private static void PrintValueArray(string tableName, Dictionary d, Func getBytesCallback, StreamWriter file) { Console.WriteLine(" ******************************** ."); - PrintByteArray(tableName, file, d.GetBytesFlat()); + + // Create reverse mapping of byte -> T, + // then dump each T to the response (as binary). + + byte highestByteSeen = 0; + Dictionary reverseMap = new Dictionary(); + foreach (var entry in d) + { + reverseMap.Add(entry.Value, entry.Key); + if (entry.Value > highestByteSeen) + { + highestByteSeen = entry.Value; + } + } + + List binaryOutput = new List(); + for (int i = 0; i <= highestByteSeen; i++) + { + binaryOutput.AddRange(getBytesCallback(reverseMap[(byte)i])); + } + + PrintByteArray(tableName, file, binaryOutput.ToArray()); } private static void PrintByteArray(string tableName, StreamWriter file, byte[] str) @@ -386,5 +214,18 @@ private static void PrintByteArray(string tableName, StreamWriter file, byte[] s } file.Write("\n };\n"); } + + private static void PrintAssertTableLevelsBitCountRoutine(string tableName, StreamWriter file, TableLevels expectedLevels) + { + file.Write("\n"); + file.Write(" [Conditional(\"DEBUG\")]\n"); + file.Write($" private static void Assert{tableName}TableLevels(int level1BitCount, int level2BitCount, int level3BitCount)\n"); + file.Write(" {\n"); + file.Write(" // Ensures that the caller expects the same L1:L2:L3 count as the actual backing data.\n"); + file.Write($" Debug.Assert(level1BitCount == {expectedLevels.Level1Bits}, \"Unexpected level 1 bit count.\");\n"); + file.Write($" Debug.Assert(level2BitCount == {expectedLevels.Level2Bits}, \"Unexpected level 2 bit count.\");\n"); + file.Write($" Debug.Assert(level3BitCount == {expectedLevels.Level3Bits}, \"Unexpected level 3 bit count.\");\n"); + file.Write(" }\n"); + } } } diff --git a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/Readme.md b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/Readme.md index 1fc856e33fb42e..5033103117ad53 100644 --- a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/Readme.md +++ b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/Readme.md @@ -1,3 +1,22 @@ This folder contains the program used to generate the Unicode character categories file CharUnicodeInfoData.cs. -The required UnicodeData.txt file can be obtained from https://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt -To generate the file execute: `dotnet run` + +Before running this tool, ensure the following are all in sync: + + - The package at https://github.com/dotnet/runtime-assets/tree/master/src/System.Private.Runtime.UnicodeData contains + the up-to-date Unicode data you want to process. + + - The element in $(REPOROOT)\eng\Versions.props contains the correct version + of the package mentioned above. + + - The element in .\GenUnicodeProp.csproj contains the UCD version of the files you wish to process. + +Once this has been configured, from this directory, invoke: + +> `dotnet run` + +If you want to include casing data (simple case mappings + case folding) in the generated file, execute: + +> `dotnet run -- -IncludeCasingData` + +Then move the generated CharUnicodeInfoData.cs file to $(LIBRARIESROOT)\System.Private.CoreLib\src\System\Globalization, +overwriting the file in that directory, and commit it. DO NOT commit the file to this directory. diff --git a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/StrongBidiCategory.cs b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/StrongBidiCategory.cs new file mode 100644 index 00000000000000..e8c90c46b06b57 --- /dev/null +++ b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/StrongBidiCategory.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace GenUnicodeProp +{ + // Corresponds to the "strong" categories from https://www.unicode.org/reports/tr44/#Bidi_Class_Values. + // For our purposes, each code point is strongly left-to-right ("L"), strongly right-to-left ("R", "AL"), + // or other (all remaining code points). This is only used internally by IDN processing, and since our + // IDN processing logic only cares about "strong" values we don't carry the rest of the data. + internal enum StrongBidiCategory + { + Other = 0, + StrongLeftToRight = 1, + StrongRightToLeft = 2, + } +} diff --git a/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/TableLevels.cs b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/TableLevels.cs new file mode 100644 index 00000000000000..66a2693078765e --- /dev/null +++ b/src/coreclr/src/System.Private.CoreLib/Tools/GenUnicodeProp/TableLevels.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; + +namespace GenUnicodeProp +{ + internal class TableLevels + { + public readonly int Level1Bits; + public readonly int Level2Bits; + public readonly int Level3Bits; + + public TableLevels(int level2Bits, int level3Bits) + { + if ((uint)level2Bits > 20) { throw new ArgumentOutOfRangeException(nameof(level2Bits)); } + if ((uint)level3Bits > 20) { throw new ArgumentOutOfRangeException(nameof(level3Bits)); } + + Level1Bits = 20 - level2Bits - level3Bits; + if (Level1Bits < 0) { throw new Exception("Level2Bits + Level3Bits cannot exceed 20."); } + + Level2Bits = level2Bits; + Level3Bits = level3Bits; + } + + public override string ToString() + { + return FormattableString.Invariant($"{Level1Bits}:{Level2Bits}:{Level3Bits}"); + } + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/Configurations.props b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/Configurations.props new file mode 100644 index 00000000000000..a9976accf42453 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/Configurations.props @@ -0,0 +1,7 @@ + + + + $(NetCoreAppCurrent); + + + diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/CoreFx.Private.TestUtilities.Unicode.csproj b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/CoreFx.Private.TestUtilities.Unicode.csproj new file mode 100644 index 00000000000000..e1b316f6c4b7e8 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/CoreFx.Private.TestUtilities.Unicode.csproj @@ -0,0 +1,55 @@ + + + true + $(NetCoreAppCurrent)-Debug;$(NetCoreAppCurrent)-Release + 12.1 + + + + + + + + + + + + + + + + UnicodeData\CaseFolding.txt + CaseFolding.txt + + + UnicodeData\PropList.txt + PropList.txt + + + UnicodeData\UnicodeData.txt + UnicodeData.txt + + + UnicodeData\GraphemeBreakProperty.txt + GraphemeBreakProperty.txt + + + UnicodeData\DerivedBidiClass.txt + DerivedBidiClass.txt + + + UnicodeData\DerivedName.txt + DerivedName.txt + + + UnicodeData\emoji-data.txt + emoji-data.txt + + + + + + + + + diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/BidiClass.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/BidiClass.cs new file mode 100644 index 00000000000000..07d389813dcbc6 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/BidiClass.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace System.Text.Unicode +{ + /// + /// Bidi class values from UAX#44. + /// + /// + /// See https://www.unicode.org/reports/tr44/#BC_Values_Table + /// and https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt (bc). + /// + public enum BidiClass + { + Arabic_Letter, + Arabic_Number, + Paragraph_Separator, + Boundary_Neutral, + Common_Separator, + European_Number, + European_Separator, + European_Terminator, + First_Strong_Isolate, + Left_To_Right, + Left_To_Right_Embedding, + Left_To_Right_Isolate, + Left_To_Right_Override, + Nonspacing_Mark, + Other_Neutral, + Pop_Directional_Format, + Pop_Directional_Isolate, + Right_To_Left, + Right_To_Left_Embedding, + Right_To_Left_Isolate, + Right_To_Left_Override, + Segment_Separator, + White_Space, + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/CodePoint.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/CodePoint.cs new file mode 100644 index 00000000000000..6f8300a594f275 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/CodePoint.cs @@ -0,0 +1,208 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Globalization; +using Xunit; + +namespace System.Text.Unicode +{ + /// + /// Represents a Unicode code point (U+0000..U+10FFFF). + /// + public sealed class CodePoint : IEquatable + { + internal CodePoint(int value, ParsedUnicodeData parsedData) + { + if ((uint)value > 0x10_FFFF) + { + throw new ArgumentOutOfRangeException( + message: FormattableString.Invariant($"Value U+{(uint)value:X4} is not a valid code point."), + paramName: nameof(value)); + } + + Assert.NotNull(parsedData); + + Value = value; + + if (parsedData.DerivedBidiClassData.TryGetValue(value, out BidiClass bidiClass)) + { + BidiClass = bidiClass; + } + + if (parsedData.PropListData.TryGetValue(value, out CodePointFlags flags)) + { + Flags = flags; + } + + // All code points by default case convert to themselves. + + SimpleLowercaseMapping = value; + SimpleTitlecaseMapping = value; + SimpleUppercaseMapping = value; + + if (parsedData.UnicodeDataData.TryGetValue(value, out UnicodeDataFileEntry entry)) + { + GeneralCategory = entry.GeneralCategory; + DecimalDigitValue = entry.DecimalDigitValue; + DigitValue = entry.DigitValue; + Name = entry.Name; + NumericValue = entry.NumericValue; + SimpleLowercaseMapping = entry.SimpleLowercaseMapping; + SimpleTitlecaseMapping = entry.SimpleTitlecaseMapping; + SimpleUppercaseMapping = entry.SimpleUppercaseMapping; + } + + // All code points by default case fold to themselves. + + SimpleCaseFoldMapping = value; + + if (parsedData.CaseFoldingData.TryGetValue(value, out int caseFoldsTo)) + { + SimpleCaseFoldMapping = caseFoldsTo; + } + + // Can we get a better name for this code point? + + if (parsedData.DerivedNameData.TryGetValue(value, out string preferredName)) + { + Name = preferredName; + } + + // Finally, get the grapheme cluster break value. + + if (parsedData.GraphemeBreakPropertyData.TryGetValue(value, out GraphemeClusterBreakProperty graphemeProperty)) + { + GraphemeClusterBreakProperty = graphemeProperty; + } + } + + /// + /// The bidi class of this code point. Note that even unassigned code points can + /// have a non-default bidi class. + /// + /// + /// See https://www.unicode.org/reports/tr44/#Bidi_Class. + /// + public BidiClass BidiClass { get; } = BidiClass.Left_To_Right; // default is "L" (strong left-to-right) + + /// + /// The decimal digit value (0..9) of this code point, or -1 if this code point + /// does not have a decimal digit value. + /// + /// + /// See https://www.unicode.org/reports/tr44/#Numeric_Value, field (6). + /// + public int DecimalDigitValue { get; } = -1; // default is "not a decimal digit" + + /// + /// The digit value (0..9) of this code point, or -1 if this code point + /// does not have a digit value. + /// + /// + /// See https://www.unicode.org/reports/tr44/#Numeric_Value, field (7). + /// + public int DigitValue { get; } = -1; // default is "not a digit" + + /// + /// Any flags associated with this code point, such as "is white space?" + /// + /// + /// See https://www.unicode.org/reports/tr44/#PropList.txt. + /// + public CodePointFlags Flags { get; } = default; // default is "no flags" + + /// + /// The general Unicode category of this code point. + /// + /// + /// See https://www.unicode.org/reports/tr44/#UnicodeData.txt. + /// + public UnicodeCategory GeneralCategory { get; } = UnicodeCategory.OtherNotAssigned; // default is "Unassigned" + + /// + /// The grapheme cluster break property of this code point. + /// + /// + /// See https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Break_Property_Values. + /// + public GraphemeClusterBreakProperty GraphemeClusterBreakProperty { get; } = GraphemeClusterBreakProperty.Other; // default is "Other" + + /// + /// The name of this code point. + /// + /// + /// See https://www.unicode.org/Public/UCD/latest/ucd/extracted/DerivedName.txt. + /// + public string Name { get; } = ""; + + /// + /// The numeric value of this code point, or -1 if this code point + /// does not have a numeric value. + /// + /// + /// See https://www.unicode.org/reports/tr44/#Numeric_Value, field (8). + /// + public double NumericValue { get; } = -1; // default is "not a numeric value" + + /// + /// The code point that results from performing a simple case fold mapping of this code point. + /// + /// + /// See https://www.unicode.org/reports/tr44/#CaseFolding.txt + /// and https://www.unicode.org/Public/UCD/latest/ucd/CaseFolding.txt. + /// + public int SimpleCaseFoldMapping { get; } + + /// + /// The code point that results from performing a simple lowercase mapping of this code point. + /// + /// + /// See https://www.unicode.org/reports/tr44/#Simple_Lowercase_Mapping. + /// + public int SimpleLowercaseMapping { get; } + + /// + /// The code point that results from performing a simple titlecase mapping of this code point. + /// + /// + /// See https://www.unicode.org/reports/tr44/#Simple_Titlecase_Mapping. + /// + public int SimpleTitlecaseMapping { get; } + + /// + /// The code point that results from performing a simple uppercase mapping of this code point. + /// + /// + /// See https://www.unicode.org/reports/tr44/#Simple_Uppercase_Mapping. + /// + public int SimpleUppercaseMapping { get; } + + /// + /// The value (0000..10FFFF) of this code point. + /// + public int Value { get; } + + public override bool Equals(object obj) => Equals(obj as CodePoint); + + public bool Equals(CodePoint obj) + { + if (obj is null) + { + return false; + } + + return this.Value == obj.Value; + } + + public override int GetHashCode() + { + return Value; + } + + public override string ToString() + { + return FormattableString.Invariant($"U+{(uint)Value:X4} {Name}"); + } + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/CodePointFlags.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/CodePointFlags.cs new file mode 100644 index 00000000000000..63d0a27846b289 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/CodePointFlags.cs @@ -0,0 +1,52 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace System.Text.Unicode +{ + /// + /// Code point properties from UAX#44. + /// + /// + /// See https://www.unicode.org/reports/tr44/#PropList.txt + /// and https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt. + /// + [Flags] + public enum CodePointFlags : ulong + { + ASCII_Hex_Digit = 1ul << 0, + Bidi_Control = 1ul << 1, + Dash = 1ul << 2, + Deprecated = 1ul << 3, + Diacritic = 1ul << 4, + Extender = 1ul << 5, + Hex_Digit = 1ul << 6, + Hyphen = 1ul << 7, + Ideographic = 1ul << 8, + IDS_Binary_Operator = 1ul << 9, + IDS_Trinary_Operator = 1ul << 10, + Join_Control = 1ul << 11, + Logical_Order_Exception = 1ul << 12, + Noncharacter_Code_Point = 1ul << 13, + Other_Alphabetic = 1ul << 14, + Other_Default_Ignorable_Code_Point = 1ul << 15, + Other_Grapheme_Extend = 1ul << 16, + Other_ID_Continue = 1ul << 17, + Other_ID_Start = 1ul << 18, + Other_Lowercase = 1ul << 19, + Other_Math = 1ul << 20, + Other_Uppercase = 1ul << 21, + Pattern_Syntax = 1ul << 22, + Pattern_White_Space = 1ul << 23, + Prepended_Concatenation_Mark = 1ul << 24, + Quotation_Mark = 1ul << 25, + Radical = 1ul << 26, + Regional_Indicator = 1ul << 27, + Sentence_Terminal = 1ul << 28, + Soft_Dotted = 1ul << 29, + Terminal_Punctuation = 1ul << 30, + Unified_Ideograph = 1ul << 31, + Variation_Selector = 1ul << 32, + White_Space = 1ul << 33, + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/GraphemeClusterBreakProperty.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/GraphemeClusterBreakProperty.cs new file mode 100644 index 00000000000000..5ebcbde0fb9be8 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/GraphemeClusterBreakProperty.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace System.Text.Unicode +{ + /// + /// Grapheme cluster break property values from UAX#29. + /// + /// + /// See https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Break_Property_Values + /// and https://www.unicode.org/Public/emoji/12.1/emoji-data.txt. + /// + public enum GraphemeClusterBreakProperty + { + Other, + CR, + LF, + Control, + Extend, + ZWJ, + Regional_Indicator, + Prepend, + SpacingMark, + L, + V, + T, + LV, + LVT, + Extended_Pictographic, + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/ParsedUnicodeData.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/ParsedUnicodeData.cs new file mode 100644 index 00000000000000..12991652135a6e --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/ParsedUnicodeData.cs @@ -0,0 +1,270 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using Xunit; + +namespace System.Text.Unicode +{ + internal sealed class ParsedUnicodeData + { + // Mappings from https://www.unicode.org/Public/UCD/latest/ucd/PropertyValueAliases.txt (bc). + private static readonly Dictionary BidiClassMap = new Dictionary() + { + ["AL"] = BidiClass.Arabic_Letter, + ["AN"] = BidiClass.Arabic_Number, + ["B"] = BidiClass.Paragraph_Separator, + ["BN"] = BidiClass.Boundary_Neutral, + ["CS"] = BidiClass.Common_Separator, + ["EN"] = BidiClass.European_Number, + ["ES"] = BidiClass.European_Separator, + ["ET"] = BidiClass.European_Terminator, + ["FSI"] = BidiClass.First_Strong_Isolate, + ["L"] = BidiClass.Left_To_Right, + ["LRE"] = BidiClass.Left_To_Right_Embedding, + ["LRI"] = BidiClass.Left_To_Right_Isolate, + ["LRO"] = BidiClass.Left_To_Right_Override, + ["NSM"] = BidiClass.Nonspacing_Mark, + ["ON"] = BidiClass.Other_Neutral, + ["PDF"] = BidiClass.Pop_Directional_Format, + ["PDI"] = BidiClass.Pop_Directional_Isolate, + ["R"] = BidiClass.Right_To_Left, + ["RLE"] = BidiClass.Right_To_Left_Embedding, + ["RLI"] = BidiClass.Right_To_Left_Isolate, + ["RLO"] = BidiClass.Right_To_Left_Override, + ["S"] = BidiClass.Segment_Separator, + ["WS"] = BidiClass.White_Space, + }; + + internal readonly Dictionary CaseFoldingData; + internal readonly Dictionary DerivedBidiClassData; + internal readonly Dictionary DerivedNameData; + internal readonly Dictionary GraphemeBreakPropertyData; + internal readonly Dictionary PropListData; + internal readonly Dictionary UnicodeDataData; + + public ParsedUnicodeData() + { + CaseFoldingData = ProcessCaseFoldingFile(); + DerivedBidiClassData = ProcessDerivedBidiClassFile(); + DerivedNameData = ProcessDerivedNameFile(); + GraphemeBreakPropertyData = ProcessGraphemeClusterBreakAndEmojiDataFiles(); + PropListData = ProcessPropListFile(); + UnicodeDataData = ProcessUnicodeDataFile(); + } + + /// + /// Reads CaseFolding.txt and parses each entry in that file. + /// + private static Dictionary ProcessCaseFoldingFile() + { + using Stream stream = Resources.OpenResource(Resources.CaseFolding); + using StreamReader reader = new StreamReader(stream); + + Dictionary dict = new Dictionary(); + + string thisLine; + while ((thisLine = reader.ReadLine()) != null) + { + // Ignore blank lines or comment lines + + if (string.IsNullOrEmpty(thisLine) || thisLine[0] == '#') { continue; } + + // Line should be in format "; ; ; # " + + string[] split = thisLine.Split(';'); + Assert.Equal(4, split.Length); + + // We only support common and simple case folding; ignore everything else. + + char status = split[1].AsSpan().Trim()[0]; + if (status != 'C' && status != 'S') + { + continue; + } + + int fromCodePoint = (int)uint.Parse(split[0], NumberStyles.HexNumber, CultureInfo.InvariantCulture); + int toCodePoint = (int)uint.Parse(split[2], NumberStyles.HexNumber, CultureInfo.InvariantCulture); + dict.Add(fromCodePoint, toCodePoint); + } + + return dict; + } + + /// + /// Reads DerivedBidiClass.txt and parses each entry in that file. + /// + private static Dictionary ProcessDerivedBidiClassFile() + { + using Stream stream = Resources.OpenResource(Resources.DerivedBidiClass); + using StreamReader reader = new StreamReader(stream); + + Dictionary dict = new Dictionary(); + + string thisLine; + while ((thisLine = reader.ReadLine()) != null) + { + if (PropsFileEntry.TryParseLine(thisLine, out PropsFileEntry value)) + { + BidiClass bidiClass = BidiClassMap[value.PropName]; + + for (int i = value.FirstCodePoint; i <= value.LastCodePoint /* inclusive */; i++) + { + dict.Add(i, bidiClass); + } + } + } + + return dict; + } + + /// + /// Reads DerivedName.txt and parses each entry in that file. + /// + private static Dictionary ProcessDerivedNameFile() + { + using Stream stream = Resources.OpenResource(Resources.DerivedName); + using StreamReader reader = new StreamReader(stream); + + Dictionary dict = new Dictionary(); + + string thisLine; + while ((thisLine = reader.ReadLine()) != null) + { + if (PropsFileEntry.TryParseLine(thisLine, out PropsFileEntry value)) + { + if (value.IsSingleCodePoint) + { + // Single code point of format "XXXX ; " (name shouldn't end with '*') + + Assert.False(value.PropName.EndsWith('*')); + dict.Add(value.FirstCodePoint, value.PropName); + } + else + { + // Range of format "XXXX..YYYY ; -*" + + Assert.True(value.PropName.EndsWith('*')); + + string baseName = value.PropName[..^1]; + for (int i = value.FirstCodePoint; i <= value.LastCodePoint /* inclusive */; i++) + { + dict.Add(i, baseName + i.ToString("X4", CultureInfo.InvariantCulture)); + } + } + } + } + + return dict; + } + + /// + /// Reads GraphemeBreakProperty.txt and emoji-data.txt and parses each entry in those files. + /// + private static Dictionary ProcessGraphemeClusterBreakAndEmojiDataFiles() + { + Dictionary dict = new Dictionary(); + + foreach (string resourceName in new[] { Resources.GraphemeBreakProperty, Resources.EmojiData }) + { + using Stream stream = Resources.OpenResource(resourceName); + using StreamReader reader = new StreamReader(stream); + + string thisLine; + while ((thisLine = reader.ReadLine()) != null) + { + if (PropsFileEntry.TryParseLine(thisLine, out PropsFileEntry value)) + { + if (Enum.TryParse(value.PropName, out GraphemeClusterBreakProperty property)) + { + for (int i = value.FirstCodePoint; i <= value.LastCodePoint /* inclusive */; i++) + { + dict.Add(i, property); + } + } + } + } + } + + return dict; + } + + /// + /// Reads PropList.txt and parses each entry in that file. + /// + private static Dictionary ProcessPropListFile() + { + using Stream stream = Resources.OpenResource(Resources.PropList); + using StreamReader reader = new StreamReader(stream); + + Dictionary dict = new Dictionary(); + + string thisLine; + while ((thisLine = reader.ReadLine()) != null) + { + // Expect "XXXX[..YYYY] ; # " + + if (PropsFileEntry.TryParseLine(thisLine, out PropsFileEntry value)) + { + CodePointFlags newFlag = Enum.Parse(value.PropName); + for (int i = value.FirstCodePoint; i <= value.LastCodePoint /* inclusive */; i++) + { + dict.TryGetValue(i, out CodePointFlags flagsForThisCodePoint /* could be default(T) */); + flagsForThisCodePoint |= newFlag; + dict[i] = flagsForThisCodePoint; + } + } + } + + return dict; + } + + /// + /// Reads UnicodeData.txt and parses each entry in that file. + /// + private static Dictionary ProcessUnicodeDataFile() + { + using Stream stream = Resources.OpenResource(Resources.UnicodeData); + using StreamReader reader = new StreamReader(stream); + + Dictionary dict = new Dictionary(); + + string thisLine; + while ((thisLine = reader.ReadLine()) != null) + { + // Skip blank lines at beginning or end of the file + + if (thisLine.Length == 0) { continue; } + + UnicodeDataFileEntry entry = new UnicodeDataFileEntry(thisLine); + + if (entry.Name.EndsWith(", First>", StringComparison.Ordinal)) + { + // This is an entry of the form XXXX;;... + // We expect it to be followed by YYYY;;... + + UnicodeDataFileEntry nextEntry = new UnicodeDataFileEntry(reader.ReadLine()); + Assert.EndsWith(", Last>", nextEntry.Name, StringComparison.Ordinal); + Assert.Equal(entry.Name[..^", First>".Length], nextEntry.Name[..^", Last>".Length]); + + string baseName = entry.Name.Remove(entry.Name.Length - ", First>".Length, ", First".Length); // remove the ", First" part of the name + for (int i = entry.CodePoint; i <= nextEntry.CodePoint /* inclusive */; i++) + { + dict.Add(i, new UnicodeDataFileEntry(i, baseName, entry.GeneralCategory)); + } + } + else + { + // This is a single code point entry, not a range. + + dict.Add(entry.CodePoint, entry); + } + } + + return dict; + } + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/PropsFileEntry.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/PropsFileEntry.cs new file mode 100644 index 00000000000000..ac56ffbe8ca743 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/PropsFileEntry.cs @@ -0,0 +1,57 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Globalization; +using System.Security.Policy; +using System.Text.RegularExpressions; +using Xunit; + +namespace System.Text.Unicode +{ + // Represents an entry in a Unicode props file. + // The expected format is "XXXX[..YYYY] ; [# ]". + internal sealed class PropsFileEntry + { + private static readonly Regex _regex = new Regex(@"^\s*(?[0-9a-f]{4,})(\.\.(?[0-9a-f]{4,}))?\s*;\s*(?.+?)\s*(#\s*(?.*))?$", RegexOptions.IgnoreCase); + + public readonly int FirstCodePoint; + public readonly int LastCodePoint; + public readonly string PropName; + + private PropsFileEntry(uint firstCodePoint, uint lastCodePoint, string propName) + { + Assert.True(firstCodePoint <= 0x10FFFF, "First code point is out of range."); + Assert.True(lastCodePoint <= 0x10FFFF, "Last code point is out of range."); + Assert.True(firstCodePoint <= lastCodePoint, "First code point is after last code point."); + + FirstCodePoint = (int)firstCodePoint; + LastCodePoint = (int)lastCodePoint; + PropName = propName; + } + + public bool IsSingleCodePoint => (FirstCodePoint == LastCodePoint); + + public static bool TryParseLine(string line, out PropsFileEntry value) + { + Match match = _regex.Match(line); + + if (!match.Success) + { + value = default; // no match + return false; + } + + uint firstCodePoint = uint.Parse(match.Groups["firstCodePoint"].Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture); + uint lastCodePoint = firstCodePoint; // assume no "..YYYY" segment for now + + if (match.Groups["lastCodePoint"].Success) + { + lastCodePoint = uint.Parse(match.Groups["lastCodePoint"].Value, NumberStyles.HexNumber, CultureInfo.InvariantCulture); + } + + value = new PropsFileEntry(firstCodePoint, lastCodePoint, match.Groups["propName"].Value); + return true; + } + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/Resources.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/Resources.cs new file mode 100644 index 00000000000000..af473c7a3ddf80 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/Resources.cs @@ -0,0 +1,25 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.IO; + +namespace System.Text.Unicode +{ + internal static class Resources + { + public const string CaseFolding = "CaseFolding.txt"; + public const string DerivedBidiClass = "DerivedBidiClass.txt"; + public const string DerivedName = "DerivedName.txt"; + public const string EmojiData = "emoji-data.txt"; + public const string GraphemeBreakProperty = "GraphemeBreakProperty.txt"; + public const string PropList = "PropList.txt"; + public const string UnicodeData = "UnicodeData.txt"; + + public static Stream OpenResource(string resourceName) + { + return typeof(Resources).Assembly.GetManifestResourceStream(resourceName) + ?? throw new ArgumentException(message: $"Resource {resourceName} not found.", paramName: nameof(resourceName)); + } + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/UnicodeData.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/UnicodeData.cs new file mode 100644 index 00000000000000..f5bba3856d6824 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/UnicodeData.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Threading; + +namespace System.Text.Unicode +{ + public static class UnicodeData + { + private static readonly CodePoint[] _codePointData = new CodePoint[0x11_0000]; // an array for all code points + private static readonly Lazy _lazyParsedData = new Lazy(); + + public static CodePoint GetData(int codePoint) + { + if ((uint)codePoint >= _codePointData.Length) + { + throw new ArgumentOutOfRangeException( + message: FormattableString.Invariant($"Value U+{(uint)codePoint:X4} is not a valid code point."), + paramName: nameof(codePoint)); + } + + CodePoint data = _codePointData[codePoint]; + + if (data is null) + { + // generate on-demand + + data = new CodePoint(codePoint, _lazyParsedData.Value); + data ??= Interlocked.CompareExchange(ref _codePointData[codePoint], data, null); + } + + return data; + } + + public static CodePoint GetData(uint codePoint) => GetData((int)codePoint); + + public static CodePoint GetData(Rune rune) => GetData(rune.Value); + } +} diff --git a/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/UnicodeDataFileEntry.cs b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/UnicodeDataFileEntry.cs new file mode 100644 index 00000000000000..0659769159b065 --- /dev/null +++ b/src/libraries/Common/tests/CoreFx.Private.TestUtilities.Unicode/System/Text/Unicode/UnicodeDataFileEntry.cs @@ -0,0 +1,132 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Globalization; +using Xunit; + +namespace System.Text.Unicode +{ + // Represents an entry from UnicodeData.txt. + internal sealed class UnicodeDataFileEntry + { + private static readonly Dictionary UnicodeCategoryMap = new Dictionary + { + ["Lu"] = UnicodeCategory.UppercaseLetter, + ["Ll"] = UnicodeCategory.LowercaseLetter, + ["Lt"] = UnicodeCategory.TitlecaseLetter, + ["Lm"] = UnicodeCategory.ModifierLetter, + ["Lo"] = UnicodeCategory.OtherLetter, + ["Mn"] = UnicodeCategory.NonSpacingMark, + ["Mc"] = UnicodeCategory.SpacingCombiningMark, + ["Me"] = UnicodeCategory.EnclosingMark, + ["Nd"] = UnicodeCategory.DecimalDigitNumber, + ["Nl"] = UnicodeCategory.LetterNumber, + ["No"] = UnicodeCategory.OtherNumber, + ["Zs"] = UnicodeCategory.SpaceSeparator, + ["Zl"] = UnicodeCategory.LineSeparator, + ["Zp"] = UnicodeCategory.ParagraphSeparator, + ["Cc"] = UnicodeCategory.Control, + ["Cf"] = UnicodeCategory.Format, + ["Cs"] = UnicodeCategory.Surrogate, + ["Co"] = UnicodeCategory.PrivateUse, + ["Pc"] = UnicodeCategory.ConnectorPunctuation, + ["Pd"] = UnicodeCategory.DashPunctuation, + ["Ps"] = UnicodeCategory.OpenPunctuation, + ["Pe"] = UnicodeCategory.ClosePunctuation, + ["Pi"] = UnicodeCategory.InitialQuotePunctuation, + ["Pf"] = UnicodeCategory.FinalQuotePunctuation, + ["Po"] = UnicodeCategory.OtherPunctuation, + ["Sm"] = UnicodeCategory.MathSymbol, + ["Sc"] = UnicodeCategory.CurrencySymbol, + ["Sk"] = UnicodeCategory.ModifierSymbol, + ["So"] = UnicodeCategory.OtherSymbol, + ["Cn"] = UnicodeCategory.OtherNotAssigned, + }; + + public readonly int CodePoint; + public readonly string Name; + public readonly UnicodeCategory GeneralCategory; + public readonly int DecimalDigitValue; + public readonly int DigitValue; + public readonly double NumericValue; + public readonly int SimpleUppercaseMapping; + public readonly int SimpleLowercaseMapping; + public readonly int SimpleTitlecaseMapping; + + // ctor used when UnicodeData.txt contains a range + public UnicodeDataFileEntry(int codePoint, string baseName, UnicodeCategory generalCategory) + { + CodePoint = codePoint; + Name = baseName; + GeneralCategory = generalCategory; + + DecimalDigitValue = -1; + DigitValue = -1; + NumericValue = -1; + + SimpleUppercaseMapping = codePoint; + SimpleLowercaseMapping = codePoint; + SimpleTitlecaseMapping = codePoint; + } + + public UnicodeDataFileEntry(string line) + { + // The format of each line is listed at https://www.unicode.org/reports/tr44/#UnicodeData.txt. + // ';' is used as a separator, and we should have exactly 15 entries per line. + + string[] split = line.Split(';'); + Assert.Equal(15, split.Length); + + CodePoint = (int)uint.Parse(split[0], NumberStyles.HexNumber, CultureInfo.InvariantCulture); + Name = split[1]; + GeneralCategory = UnicodeCategoryMap[split[2]]; + + if (!int.TryParse(split[6], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out DecimalDigitValue)) + { + DecimalDigitValue = -1; + } + + if (!int.TryParse(split[7], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out DigitValue)) + { + DigitValue = -1; + } + + NumericValue = -1; + if (!string.IsNullOrEmpty(split[8])) + { + // Data is in the format "[-]M[/N]" + + string numericValue = split[8]; + int indexOfSlash = numericValue.IndexOf('/'); + + if (indexOfSlash < 0) + { + NumericValue = double.Parse(numericValue, NumberStyles.Integer, CultureInfo.InvariantCulture); + } + else + { + double numerator = double.Parse(numericValue.AsSpan(0, indexOfSlash), NumberStyles.Integer, CultureInfo.InvariantCulture); + double denominator = double.Parse(numericValue.AsSpan(indexOfSlash + 1), NumberStyles.Integer, CultureInfo.InvariantCulture); + NumericValue = numerator / denominator; + } + } + + if (!int.TryParse(split[12], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out SimpleUppercaseMapping)) + { + SimpleUppercaseMapping = CodePoint; + } + + if (!int.TryParse(split[13], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out SimpleLowercaseMapping)) + { + SimpleLowercaseMapping = CodePoint; + } + + if (!int.TryParse(split[14], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out SimpleTitlecaseMapping)) + { + SimpleTitlecaseMapping = CodePoint; + } + } + } +} diff --git a/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/Strings.vb b/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/Strings.vb index e49fed8a11222b..44f7678cbdcf67 100644 --- a/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/Strings.vb +++ b/src/libraries/Microsoft.VisualBasic.Core/src/Microsoft/VisualBasic/Strings.vb @@ -1008,90 +1008,35 @@ RedimAndExit: If (Expression Is Nothing) Then Return "" + ElseIf Expression.Length <= 1 Then + Return Expression End If - Dim chars As Char() - Dim uc As UnicodeCategory - Dim ch As Char - Dim SrcIndex, Length As Integer - - Length = Expression.Length - If Length = 0 Then - Return "" - End If - - 'Detect if there are any graphemes that need special handling - For SrcIndex = 0 To Length - 1 - ch = Expression.Chars(SrcIndex) - uc = Char.GetUnicodeCategory(ch) - If uc = UnicodeCategory.Surrogate OrElse - uc = UnicodeCategory.NonSpacingMark OrElse - uc = UnicodeCategory.SpacingCombiningMark OrElse - uc = UnicodeCategory.EnclosingMark Then - 'Need to use special handling - Return InternalStrReverse(Expression, SrcIndex, Length) - End If - Next SrcIndex - - chars = Expression.ToCharArray() - System.Array.Reverse(chars) - Return New String(chars) - - End Function - - 'This routine handles reversing Strings containing graphemes - ' GRAPHEME: a text element that is displayed as a single character - ' - Private Function InternalStrReverse(ByVal Expression As String, ByVal SrcIndex As Integer, ByVal Length As Integer) As String - - Dim TextEnum As TextElementEnumerator - Dim DestIndex, LastSrcIndex, NextSrcIndex As Integer - Dim sb As StringBuilder - - 'This code can only be hit one time - sb = New StringBuilder(Length) - sb.Length = Length - - TextEnum = StringInfo.GetTextElementEnumerator(Expression, SrcIndex) - - 'Init enumerator position - If Not TextEnum.MoveNext() Then - Return "" - End If + 'Use TextElementEnumerator to iterate through the grapheme clusters, then + 'add them to the destination array in reverse order. A grapheme cluster + 'is a text element that displays as a single character; it might consist + 'of multiple chars. + Dim TextEnum As TextElementEnumerator = StringInfo.GetTextElementEnumerator(Expression) + Dim Output(Expression.Length - 1) As Char + Dim LastSrcIndex As Integer + 'Initialize the enumerator + TextEnum.MoveNext() LastSrcIndex = 0 - DestIndex = Length - 1 - 'Copy up the first surrogate found - Do While LastSrcIndex < SrcIndex - sb.Chars(DestIndex) = Expression.Chars(LastSrcIndex) - DestIndex -= 1 - LastSrcIndex += 1 + 'Iterate through the enumerator, performing a forward-copy of the source + 'expression to the end of the StringBuilder. + ' Example: input = [ (ABC) (D) (EFGH) (IJ) (K) ] + ' output = [ (K) (IJ) (EFGH) (D) (ABC) ] + Do While TextEnum.MoveNext() + Expression.CopyTo(LastSrcIndex, Output, Output.Length - TextEnum.ElementIndex, TextEnum.ElementIndex - LastSrcIndex) + LastSrcIndex = TextEnum.ElementIndex Loop - 'Now iterate through the text elements and copy them to the reversed string - NextSrcIndex = TextEnum.ElementIndex - - Do While DestIndex >= 0 - SrcIndex = NextSrcIndex + 'The above loop won't hit the last element - we need to copy the remaining data manually + Expression.CopyTo(LastSrcIndex, Output, 0, Expression.Length - LastSrcIndex) - 'Move to next element - If (TextEnum.MoveNext()) Then - NextSrcIndex = TextEnum.ElementIndex - Else - 'Point NextSrcIndex to end of string - NextSrcIndex = Length - End If - LastSrcIndex = NextSrcIndex - 1 - - Do While LastSrcIndex >= SrcIndex - sb.Chars(DestIndex) = Expression.Chars(LastSrcIndex) - DestIndex -= 1 - LastSrcIndex -= 1 - Loop - Loop - - Return sb.ToString() + Return New String(Output) End Function diff --git a/src/libraries/System.Globalization/tests/System.Globalization.Tests.csproj b/src/libraries/System.Globalization/tests/System.Globalization.Tests.csproj index 888ebb272e3036..04fab88cbfab25 100644 --- a/src/libraries/System.Globalization/tests/System.Globalization.Tests.csproj +++ b/src/libraries/System.Globalization/tests/System.Globalization.Tests.csproj @@ -101,7 +101,9 @@ + + @@ -114,17 +116,17 @@ - - CharUnicodeInfo\UnicodeData.11.0.txt - UnicodeData.11.0.txt + + + CharUnicodeInfo\UnicodeData.12.1.txt + UnicodeData.12.1.txt - - CharUnicodeInfo\UnicodeData8.0.txt - UnicodeData.8.0.txt - - - CharUnicodeInfo\UnicodeData6.3.txt - UnicodeData6.3.txt + + CharUnicodeInfo\GraphemeBreakTest-12.1.0.txt + GraphemeBreakTest-12.1.0.txt + + + diff --git a/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTestData.cs b/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTestData.cs index 24b90192c32f9b..0ee520683008a0 100644 --- a/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTestData.cs +++ b/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTestData.cs @@ -13,10 +13,8 @@ public static class CharUnicodeInfoTestData private static readonly Lazy> s_testCases = new Lazy>(() => { List testCases = new List(); - string fileName = - CharUnicodeInfo.GetUnicodeCategory('\u10D0') == UnicodeCategory.LowercaseLetter ? "UnicodeData.11.0.txt" : - CharUnicodeInfo.GetUnicodeCategory('\u037f') == UnicodeCategory.OtherNotAssigned ? "UnicodeData6.3.txt" : "UnicodeData.8.0.txt"; - Stream stream = typeof(CharUnicodeInfoGetUnicodeCategoryTests).GetTypeInfo().Assembly.GetManifestResourceStream(fileName); + string fileName = "UnicodeData.12.1.txt"; + Stream stream = typeof(CharUnicodeInfoTestData).GetTypeInfo().Assembly.GetManifestResourceStream(fileName); using (StreamReader reader = new StreamReader(stream)) { while (!reader.EndOfStream) diff --git a/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTests.Generated.cs b/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTests.Generated.cs new file mode 100644 index 00000000000000..d8c34a581b727e --- /dev/null +++ b/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTests.Generated.cs @@ -0,0 +1,93 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Text.Unicode; +using Xunit; +using Xunit.Sdk; + +namespace System.Globalization.Tests +{ + public partial class CharUnicodeInfoTests + { + [Fact] + public void GetDecimalDigitValue_Char() + { + for (int i = 0; i <= char.MaxValue; i++) + { + char ch = (char)i; + + CodePoint knownGoodData = UnicodeData.GetData(ch); + int actualValue = CharUnicodeInfo.GetDecimalDigitValue(ch); + + AssertEqual(knownGoodData.DecimalDigitValue, actualValue, nameof(CharUnicodeInfo.GetDecimalDigitValue), knownGoodData); + } + } + + [Fact] + public void GetDigitValue_Char() + { + for (int i = 0; i <= char.MaxValue; i++) + { + char ch = (char)i; + + CodePoint knownGoodData = UnicodeData.GetData(ch); + int actualValue = CharUnicodeInfo.GetDigitValue(ch); + + AssertEqual(knownGoodData.DigitValue, actualValue, nameof(CharUnicodeInfo.GetDigitValue), knownGoodData); + } + } + + [Fact] + public void GetNumericValue_Char() + { + for (int i = 0; i <= char.MaxValue; i++) + { + char ch = (char)i; + + CodePoint knownGoodData = UnicodeData.GetData(ch); + double actualValue = CharUnicodeInfo.GetNumericValue(ch); + + AssertEqual(knownGoodData.NumericValue, actualValue, nameof(CharUnicodeInfo.GetNumericValue), knownGoodData); + } + } + + [Fact] + public void GetUnicodeCategory_Char() + { + for (int i = 0; i <= char.MaxValue; i++) + { + char ch = (char)i; + + CodePoint knownGoodData = UnicodeData.GetData(ch); + UnicodeCategory actualCategory = CharUnicodeInfo.GetUnicodeCategory(ch); + + AssertEqual(knownGoodData.GeneralCategory, actualCategory, nameof(CharUnicodeInfo.GetUnicodeCategory), knownGoodData); + } + } + + [Fact] + public void GetUnicodeCategory_Int32() + { + for (int i = 0; i <= HIGHEST_CODE_POINT; i++) + { + CodePoint knownGoodData = UnicodeData.GetData(i); + UnicodeCategory actualCategory = CharUnicodeInfo.GetUnicodeCategory(i); + + AssertEqual(knownGoodData.GeneralCategory, actualCategory, nameof(CharUnicodeInfo.GetUnicodeCategory), knownGoodData); + } + } + + private static void AssertEqual(T expected, T actual, string methodName, CodePoint codePoint) + { + if (!EqualityComparer.Default.Equals(expected, actual)) + { + throw new AssertActualExpectedException( + expected: expected, + actual: actual, + userMessage: FormattableString.Invariant($"CharUnicodeInfo.{methodName}({codePoint}) returned unexpected value.")); + } + } + } +} diff --git a/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTests.cs b/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTests.cs index 1abde82c1f817b..a4e49945a1095d 100644 --- a/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTests.cs +++ b/src/libraries/System.Globalization/tests/System/Globalization/CharUnicodeInfoTests.cs @@ -6,8 +6,10 @@ namespace System.Globalization.Tests { - public class CharUnicodeInfoGetUnicodeCategoryTests + public partial class CharUnicodeInfoTests { + private const int HIGHEST_CODE_POINT = 0x10_FFFF; + [Fact] public void GetUnicodeCategory() { @@ -20,9 +22,7 @@ public void GetUnicodeCategory() } // Test the string overload for a surrogate pair or a single char GetUnicodeCategory(testCase.Utf32CodeValue, new UnicodeCategory[] { testCase.GeneralCategory }); -#if NETCOREAPP Assert.Equal(testCase.GeneralCategory, CharUnicodeInfo.GetUnicodeCategory(testCase.CodePoint)); -#endif } } @@ -104,10 +104,10 @@ public void GetNumericValue(string s, double[] expected) public static readonly object[][] s_GetNumericValueData = { new object[] {"aA1!", new double[] { -1, -1, 1, -1 }}, - // Numeric surrogate (CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM) + // Numeric supplementary plane code point (U+12455 CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM) new object[] {"\uD809\uDC55", new double[] { 5, -1 }}, new object[] {"a\uD809\uDC55a", new double[] { -1, 5, -1 , -1 }}, - // Numeric surrogate (CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM) + // Non-numeric supplementary plane code point (U+1236C CUNEIFORM SIGN ZU5 TIMES A) new object[] {"\uD808\uDF6C", new double[] { -1, -1 }}, new object[] {"a\uD808\uDF6Ca", new double[] { -1, -1, -1, -1 }}, }; diff --git a/src/libraries/System.Globalization/tests/System/Globalization/GraphemeBreakTest.cs b/src/libraries/System.Globalization/tests/System/Globalization/GraphemeBreakTest.cs new file mode 100644 index 00000000000000..b0400026acbb9c --- /dev/null +++ b/src/libraries/System.Globalization/tests/System/Globalization/GraphemeBreakTest.cs @@ -0,0 +1,168 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Unicode; +using Microsoft.VisualBasic; +using Xunit; +using Xunit.Sdk; + +namespace System.Globalization.Tests +{ + public class GraphemeBreakTest + { + private const char BREAK_REQUIRED = '\u00F7'; // DIVISION SIGN + private const char BREAK_FORBIDDEN = '\u00D7'; // MULTIPLICATION SIGN + + [Fact] + public void CompareRuntimeImplementationAgainstUnicodeTestData() + { + foreach ((Rune[][] clusters, string line) in GetGraphemeBreakTestData()) + { + // Arrange + + List expected = new List(); + StringBuilder input = new StringBuilder(); + + foreach (Rune[] cluster in clusters) + { + expected.Add(input.Length); // we're about to start a new cluster + foreach (Rune scalar in cluster) + { + input.Append(scalar); + } + } + + // Act + + int[] actual = StringInfo.ParseCombiningCharacters(input.ToString()); + + // Assert + + if (!expected.SequenceEqual(actual)) + { + throw new AssertActualExpectedException( + expected: expected.ToArray(), + actual: actual, + userMessage: "Grapheme break test failed on test case: " + line); + } + } + } + + [Fact] + public void VisualBasicReverseString() + { + foreach ((Rune[][] clusters, string line) in GetGraphemeBreakTestData()) + { + // Arrange + + string forwardActual = string.Concat(clusters.SelectMany(cluster => cluster).Select(rune => rune.ToString())); + string reverseExpected = string.Concat(clusters.Reverse().SelectMany(cluster => cluster).Select(rune => rune.ToString())); + + // Act + + string reverseActual = Strings.StrReverse(forwardActual); + + // Assert + + if (reverseExpected != reverseActual) + { + throw new AssertActualExpectedException( + expected: PrintCodePointsForDebug(reverseExpected), + actual: PrintCodePointsForDebug(reverseActual), + userMessage: "Grapheme break test failed on test case: " + line); + } + } + } + + [Fact] + public void ReplacementCharHasTypeOther() + { + // We rely on U+FFFD REPLACEMENT CHARACTER having certain properties + // (such as a grapheme boundary property of "Other-XX"), since unpaired + // UTF-16 surrogate code points and other ill-formed subsequences are normalized + // to this character. If we ingest a new version of the UCD files where this + // has been changed, we probably need to update the logic in StringInfo + // and related types. + + Assert.Equal(GraphemeClusterBreakProperty.Other, UnicodeData.GetData('\ud800').GraphemeClusterBreakProperty); + } + + private static IEnumerable<(Rune[][] clusters, string line)> GetGraphemeBreakTestData() + { + using Stream stream = typeof(GraphemeBreakTest).Assembly.GetManifestResourceStream("GraphemeBreakTest-12.1.0.txt"); + using StreamReader reader = new StreamReader(stream); + + string line; + while ((line = reader.ReadLine()) != null) + { + // Skip blank or comment-only lines + + if (string.IsNullOrEmpty(line) || line[0] == '#') + { + continue; + } + + // Line has format "÷ (XXXX (× YYYY)* ÷)+ # " + // We'll yield return a Rune[][], representing a collection of clusters, where each cluster contains a collection of Runes. + // + // Example: "÷ AAAA ÷ BBBB × CCCC × DDDD ÷ EEEE × FFFF ÷ # " + // -> [ [ AAAA ], [ BBBB, CCCC, DDDD ], [ EEEE, FFFF ] ] + // + // We also return the line for ease of debugging any test failures. + + string[] clusters = line[..line.IndexOf('#')].Trim().Split(BREAK_REQUIRED, StringSplitOptions.RemoveEmptyEntries); + + yield return (Array.ConvertAll(clusters, cluster => + { + string[] scalarsWithinClusterAsStrings = cluster.Split(BREAK_FORBIDDEN, StringSplitOptions.RemoveEmptyEntries); + uint[] scalarsWithinClusterAsUInt32s = Array.ConvertAll(scalarsWithinClusterAsStrings, scalar => uint.Parse(scalar, NumberStyles.HexNumber, CultureInfo.InvariantCulture)); + Rune[] scalarsWithinClusterAsRunes = Array.ConvertAll(scalarsWithinClusterAsUInt32s, scalar => new Rune(scalar)); + return scalarsWithinClusterAsRunes; + }), line); + } + } + + // Given a sequence of UTF-16 code points, prints them in "[ XXXX YYYY ZZZZ ]" form, combining surrogates where possible + private static string PrintCodePointsForDebug(IEnumerable input) + { + StringBuilder sb = new StringBuilder(); + sb.Append("[ "); + + IEnumerator enumerator = input.GetEnumerator(); + while (enumerator.MoveNext()) + { + SawStandaloneChar: + char thisChar = enumerator.Current; + + if (!char.IsHighSurrogate(thisChar) || !enumerator.MoveNext()) + { + // not a high surrogate, or a high surrogate at the end of the sequence - it goes as-is + sb.AppendFormat(CultureInfo.InvariantCulture, "{0:X4} ", (uint)thisChar); + } + else + { + char secondChar = enumerator.Current; + if (!char.IsLowSurrogate(secondChar)) + { + // previous char was a standalone high surrogate char - send it as-is + sb.AppendFormat(CultureInfo.InvariantCulture, "{0:X4} ", (uint)thisChar); + goto SawStandaloneChar; + } + else + { + // surrogate pair - extract supplementary code point + sb.AppendFormat(CultureInfo.InvariantCulture, "{0:X4} ", (uint)char.ConvertToUtf32(thisChar, secondChar)); + } + } + } + + sb.Append("]"); + return sb.ToString(); + } + } +} diff --git a/src/libraries/System.Globalization/tests/System/Globalization/StringInfoTests.cs b/src/libraries/System.Globalization/tests/System/Globalization/StringInfoTests.cs index e97a71300b8ca7..070d8dd4853d8e 100644 --- a/src/libraries/System.Globalization/tests/System/Globalization/StringInfoTests.cs +++ b/src/libraries/System.Globalization/tests/System/Globalization/StringInfoTests.cs @@ -3,7 +3,6 @@ // See the LICENSE file in the project root for more information. using System.Collections.Generic; -using System.Reflection; using Xunit; namespace System.Globalization.Tests @@ -143,7 +142,7 @@ public static IEnumerable GetNextTextElement_TestData() yield return new object[] { "a\u0300", 1, "\u0300" }; // Lone combining character - yield return new object[] { "\u0300\u0300", 0, "\u0300" }; + yield return new object[] { "\u0300\u0300", 0, "\u0300\u0300" }; // second U+0300 extends first U+0300 yield return new object[] { "\u0300\u0300", 1, "\u0300" }; } @@ -185,8 +184,8 @@ public static IEnumerable GetTextElementEnumerator_TestData() yield return new object[] { "a\u0300", 0, new string[] { "a\u0300" } }; yield return new object[] { "a\u0300", 1, new string[] { "\u0300" } }; - // Lone combining character - yield return new object[] { "\u0300\u0300", 0, new string[] { "\u0300", "\u0300" } }; + // Extending chars can extend other extending chars + yield return new object[] { "\u0300\u0300", 0, new string[] { "\u0300\u0300" } }; } [Theory] @@ -226,28 +225,71 @@ public void GetTextElementEnumerator_Invalid() public static IEnumerable ParseCombiningCharacters_TestData() { + // When "rules" are mentioned in this function, they refer to: + // https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules + + // ,-- Other (U+4F00 CJK UNIFIED IDEOGRAPH-4F00) + // | ,-- Extend (U+302A IDEOGRAPHIC LEVEL TONE MARK) + // | | ,-- Other (U+10000 LINEAR B SYLLABLE B008 A) + // | | | ,-- Other (U+4F01 CJK UNIFIED IDEOGRAPH-4F01) yield return new object[] { "\u4f00\u302a\ud800\udc00\u4f01", new int[] { 0, 2, 4 } }; + yield return new object[] { "abcdefgh", new int[] { 0, 1, 2, 3, 4, 5, 6, 7 } }; yield return new object[] { "!@#$%^&", new int[] { 0, 1, 2, 3, 4, 5, 6 } }; + + // ,-- Extend (U+20D1 COMBINING RIGHT HARPOON ABOVE) + // | ,-- Extend (U+FE22 COMBINING DOUBLE TILDE LEFT HALF) + // | | ,-- Extend (U+20D1 COMBINING RIGHT HARPOON ABOVE) + // | | | ,-- Extend (U+20EB COMBINING LONG DOUBLE SOLIDUS OVERLAY) yield return new object[] { "!\u20D1bo\uFE22\u20D1\u20EB|", new int[] { 0, 2, 3, 7 } }; + + // ,-- Other (U+10FFFF ) yield return new object[] { "1\uDBFF\uDFFF@\uFE22\u20D1\u20EB9", new int[] { 0, 1, 3, 7 } }; + + // ,-- Extend (U+0300 COMBINING GRAVE ACCENT) yield return new object[] { "a\u0300", new int[] { 0 } }; - yield return new object[] { "\u0300\u0300", new int[] { 0, 1 } }; + yield return new object[] { "\u0300\u0300", new int[] { 0 } }; // second U+0300 extends first U+0300 + yield return new object[] { " ", new int[] { 0, 1, 2 } }; yield return new object[] { "", new int[0] }; - // Invalid Unicode - yield return new object[] { "\u0000\uFFFFa", new int[] { 0, 1, 2 } }; // Control chars - yield return new object[] { "\uD800a", new int[] { 0, 1 } }; // Unmatched high surrogate - yield return new object[] { "\uDC00a", new int[] { 0, 1 } }; // Unmatched low surrogate - yield return new object[] { "\u00ADa", new int[] { 0, 1 } }; // Format character + // Control characters (such as U+0000) should never be followable by another character (rule GB4). + // (CR and LF are treated specially and will be handled later.) + + yield return new object[] { "\u0000\u0000\u0000", new int[] { 0, 1, 2 } }; + yield return new object[] { "\u0000\u0300\u0300", new int[] { 0, 1 } }; // first U+0300 does not extend the U+0000, but second U+0300 extends first U+0300 + + // Prepend characters (like U+0600 ARABIC NUMBER SIGN) may combine with non-control characters, + // but never with control characters (rule GB5). + + yield return new object[] { "\u0600a", new int[] { 0 } }; + yield return new object[] { "\u0600\r", new int[] { 0, 1 } }; + yield return new object[] { "\u0600\u0000", new int[] { 0, 1 } }; + + // Nothing can come after CR (except LF), and nothing can come after LF (rules GB3, GB4). + + yield return new object[] { "\t\r\n", new int[] { 0, 1 } }; + yield return new object[] { "\t\r\r\n", new int[] { 0, 1, 2 } }; + yield return new object[] { "\r\u0300\r\n\u0300", new int[] { 0, 1, 2, 4 } }; - yield return new object[] { "\u0000\u0300\uFFFF\u0300", new int[] { 0, 1, 2, 3 } }; // Control chars + combining char - yield return new object[] { "\uD800\u0300", new int[] { 0, 1 } }; // Unmatched high surrogate + combining char - yield return new object[] { "\uDC00\u0300", new int[] { 0, 1 } }; // Unmatched low surrogate + combing char - yield return new object[] { "\u00AD\u0300", new int[] { 0, 1 } }; // Format character + combining char + // Now test complex emoji and symbols - yield return new object[] { "\u0300\u0300", new int[] { 0, 1 } }; // Two combining chars + // (woman dancing; medium skin tone) + // ,-- Extended_Pictographic (U+1F483 DANCER) + // | ,-- Extend (U+1F3FD EMOJI MODIFIER FITZPATRICK TYPE-4) + yield return new object[] { "\U0001F483\U0001F3FD", new int[] { 0 } }; + + // (flag: Antarctica) + // ,-- Regional_Indicator (U+1F1E6 REGIONAL INDICATOR SYMBOL LETTER A) + // | ,-- Regional_Indicator (U+1F1F6 REGIONAL INDICATOR SYMBOL LETTER Q) + yield return new object[] { "\U0001F1E6\U0001F1F6", new int[] { 0 } }; + + // (man golfing) + // ,-- Extended_Pictographic (U+1F3CC GOLFER) + // | ,-- Extend (U+FE0F VARIATION SELECTOR-16) + // | | ,-- ZWJ (U+200D ZERO WIDTH JOINER) + // | | | ,-- Extended_Pictographic (U+2642 MALE SIGN) + yield return new object[] { "\U0001F3CC\uFE0F\u200D\u2642\uFE0F", new int[] { 0 } }; } [Theory] @@ -257,6 +299,27 @@ public void ParseCombiningCharacters(string str, int[] expected) Assert.Equal(expected, StringInfo.ParseCombiningCharacters(str)); } + [Fact] + public void ParseCombiningChars_UnpairedSurrogates() + { + // Unpaired surrogates should be treated as U+FFFD REPLACEMENT CHAR ("Other"), + // so prepend and extend can affect them. We can't use [Theory] because the + // unit test runner may corrupt malformed UTF-16 constant data. + + ParseCombiningCharacters("\u0600\uD800", new int[] { 0 }); // prepend + unpaired surrogate + ParseCombiningCharacters("\udfff\ud800\u0300", new int[] { 0, 1 }); // unpaired | unpaired + extender + ParseCombiningCharacters("\udfff\ud800", new int[] { 0, 1 }); // unpaired | unpaired + } + + [Fact] + public void ParseCombiningChars_LargeStrings() + { + string s = "\u0600x" /* prepend + 'x' */ + new string('\u0300' /* extend */, 9_999_998); + s = string.Concat(s, s, s, s); // 40 million characters + + ParseCombiningCharacters(s, new int[] { 0, 10_000_000, 20_000_000, 30_000_000 }); + } + [Fact] public void ParseCombiningCharacters_Null_ThrowsArgumentNullException() { diff --git a/src/libraries/System.Globalization/tests/System/Globalization/TextElementEnumeratorTests.cs b/src/libraries/System.Globalization/tests/System/Globalization/TextElementEnumeratorTests.cs index 64aff33eb59032..2c1186b2cfa168 100644 --- a/src/libraries/System.Globalization/tests/System/Globalization/TextElementEnumeratorTests.cs +++ b/src/libraries/System.Globalization/tests/System/Globalization/TextElementEnumeratorTests.cs @@ -11,35 +11,34 @@ public class TextElementEnumeratorTests { public static IEnumerable Enumerate_TestData() { - yield return new object[] { "", new string[] { "" }, new int[0] }; - yield return new object[] { "Hello", new string[] { "H", "e", "l", "l", "o" }, new int[] { 0, 1, 2, 3, 4 } }; + yield return new object[] { new string[] { /* empty */ } }; + yield return new object[] { new string[] { "H", "e", "l", "l", "o" } }; // Creates and initializes a string containing the following: // - a surrogate pair (high surrogate U+D800 and low surrogate U+DC00) // - a combining character sequence (the Latin small letter "a" followed by the combining grave accent) // - a base character (the ligature "") - yield return new object[] { "\uD800\uDC00\u0061\u0300\u00C6", new string[] { "\uD800\uDC00", "\uD800\uDC00", "\u0061\u0300", "\u0061\u0300", "\u00C6" }, new int[] { 0, 2, 4 } }; + yield return new object[] { new string[] { "\uD800\uDC00", "\uD800\uDC00", "\u0061\u0300", "\u0061\u0300", "\u00C6" } }; } [Theory] [MemberData(nameof(Enumerate_TestData))] - public void Enumerate(string str, string[] expectedElements, int[] expectedElementIndices) + public void Enumerate(string[] expectedElements) { - TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator(str); + TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator(string.Concat(expectedElements)); for (int i = 0; i < 2; i++) { - int counter = 0; - while (enumerator.MoveNext()) - { - string currentTextElement = enumerator.GetTextElement(); - Assert.Equal(expectedElements[enumerator.ElementIndex], currentTextElement); - Assert.Equal(currentTextElement, enumerator.Current); + int charsProcessedSoFar = 0; - Assert.Equal(expectedElementIndices[counter], enumerator.ElementIndex); - counter++; + foreach (string expectedElement in expectedElements) + { + Assert.True(enumerator.MoveNext()); + Assert.Equal(charsProcessedSoFar, enumerator.ElementIndex); + Assert.Equal(expectedElement, enumerator.Current); + charsProcessedSoFar += expectedElement.Length; } - Assert.Equal(expectedElementIndices.Length, counter); + Assert.False(enumerator.MoveNext()); enumerator.Reset(); } } @@ -60,11 +59,11 @@ public void AccessingMembersAfterEnumeration_ThrowsInvalidOperationException() { TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator("abc"); - // Cannot access Current or GetTextElement() after the enumerator has finished - // enumerating, but ElementIndex does not + // Cannot access Current, ElementIndex, or GetTextElement() after the enumerator has finished + // enumerating. while (enumerator.MoveNext()) ; Assert.Throws(() => enumerator.Current); - Assert.Equal(3, enumerator.ElementIndex); + Assert.Throws(() => enumerator.ElementIndex); Assert.Throws(() => enumerator.GetTextElement()); } diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems index 9abfcc44c9b300..6ff25dc739471b 100644 --- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems +++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems @@ -229,7 +229,6 @@ - @@ -272,6 +271,7 @@ + @@ -820,6 +820,8 @@ + + diff --git a/src/libraries/System.Private.CoreLib/src/System/Char.cs b/src/libraries/System.Private.CoreLib/src/System/Char.cs index da9e1224f98065..cf8d8f63c0388f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Char.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Char.cs @@ -259,7 +259,8 @@ public static bool IsWhiteSpace(char c) { return IsWhiteSpaceLatin1(c); } - return CheckSeparator(CharUnicodeInfo.GetUnicodeCategory(c)); + + return CharUnicodeInfo.GetIsWhiteSpace(c); } /*===================================IsUpper==================================== @@ -745,14 +746,10 @@ public static bool IsWhiteSpace(string s, int index) throw new ArgumentOutOfRangeException(nameof(index)); } - char ch = s[index]; - - if (IsLatin1(ch)) - { - return IsWhiteSpaceLatin1(ch); - } + // All white space code points are within the BMP, + // so we don't need to handle surrogate pairs here. - return CheckSeparator(CharUnicodeInfo.GetUnicodeCategory(s, index)); + return IsWhiteSpace(s[index]); } public static UnicodeCategory GetUnicodeCategory(char c) @@ -776,7 +773,7 @@ public static UnicodeCategory GetUnicodeCategory(string s, int index) { return GetLatin1UnicodeCategory(s[index]); } - return CharUnicodeInfo.InternalGetUnicodeCategory(s, index); + return CharUnicodeInfo.GetUnicodeCategoryInternal(s, index); } public static double GetNumericValue(char c) diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/BidiCategory.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/BidiCategory.cs deleted file mode 100644 index abe695089320ee..00000000000000 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/BidiCategory.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -namespace System.Globalization -{ - internal enum BidiCategory - { - LeftToRight = 0, - LeftToRightEmbedding = 1, - LeftToRightOverride = 2, - RightToLeft = 3, - RightToLeftArabic = 4, - RightToLeftEmbedding = 5, - RightToLeftOverride = 6, - PopDirectionalFormat = 7, - EuropeanNumber = 8, - EuropeanNumberSeparator = 9, - EuropeanNumberTerminator = 10, - ArabicNumber = 11, - CommonNumberSeparator = 12, - NonSpacingMark = 13, - BoundaryNeutral = 14, - ParagraphSeparator = 15, - SegmentSeparator = 16, - Whitespace = 17, - OtherNeutrals = 18, - LeftToRightIsolate = 19, - RightToLeftIsolate = 20, - FirstStrongIsolate = 21, - PopDirectionIsolate = 22, - } -} diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/CharUnicodeInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/CharUnicodeInfo.cs index 59ccd9e30da0a0..6dba1a1d49d4f5 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/CharUnicodeInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/CharUnicodeInfo.cs @@ -4,9 +4,18 @@ using System.Buffers.Binary; using System.Diagnostics; +using System.Runtime.InteropServices; using System.Text; +using System.Text.Unicode; using Internal.Runtime.CompilerServices; +#pragma warning disable SA1121 // explicitly using type aliases instead of built-in types +#if BIT64 +using nuint = System.UInt64; +#else +using nuint = System.UInt32; +#endif + namespace System.Globalization { /// @@ -28,294 +37,414 @@ public static partial class CharUnicodeInfo // The starting codepoint for Unicode plane 1. Plane 1 contains 0x010000 ~ 0x01ffff. internal const int UNICODE_PLANE01_START = 0x10000; - /// - /// Convert the BMP character or surrogate pointed by index to a UTF32 value. - /// This is similar to char.ConvertToUTF32, but the difference is that - /// it does not throw exceptions when invalid surrogate characters are passed in. - /// - /// WARNING: since it doesn't throw an exception it CAN return a value - /// in the surrogate range D800-DFFF, which are not legal unicode values. - /// - internal static int InternalConvertToUtf32(string s, int index) + /* + * GetBidiCategory + * =============== + * Data derived from https://www.unicode.org/reports/tr9/#Bidirectional_Character_Types. This data + * is encoded in DerivedBidiClass.txt. We map "L" to "strong left-to-right"; and we map "R" and "AL" + * to "strong right-to-left". All other (non-strong) code points are "other" for our purposes. + */ + + internal static StrongBidiCategory GetBidiCategory(string s, int index) { - Debug.Assert(s != null, "s != null"); - Debug.Assert(index >= 0 && index < s.Length, "index < s.Length"); - if (index < s.Length - 1) + if (s is null) { - int temp1 = (int)s[index] - HIGH_SURROGATE_START; - if ((uint)temp1 <= HIGH_SURROGATE_RANGE) - { - int temp2 = (int)s[index + 1] - LOW_SURROGATE_START; - if ((uint)temp2 <= HIGH_SURROGATE_RANGE) - { - // Convert the surrogate to UTF32 and get the result. - return (temp1 * 0x400) + temp2 + UNICODE_PLANE01_START; - } - } + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.s); + } + if ((uint)index >= (uint)s.Length) + { + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index); } - return (int)s[index]; + + return GetBidiCategoryNoBoundsChecks((uint)GetCodePointFromString(s, index)); } - internal static int InternalConvertToUtf32(StringBuilder s, int index) + internal static StrongBidiCategory GetBidiCategory(StringBuilder s, int index) { Debug.Assert(s != null, "s != null"); Debug.Assert(index >= 0 && index < s.Length, "index < s.Length"); + // The logic below follows Table 3-5 in the Unicode Standard, Sec. 3.9. + // First char (high surrogate) = 110110wwwwxxxxxx + // Second char (low surrogate) = 110111xxxxxxxxxx + int c = (int)s[index]; if (index < s.Length - 1) { - int temp1 = c - HIGH_SURROGATE_START; + int temp1 = c - HIGH_SURROGATE_START; // temp1 = 000000wwwwxxxxxx if ((uint)temp1 <= HIGH_SURROGATE_RANGE) { - int temp2 = (int)s[index + 1] - LOW_SURROGATE_START; + int temp2 = (int)s[index + 1] - LOW_SURROGATE_START; // temp2 = 000000xxxxxxxxxx if ((uint)temp2 <= HIGH_SURROGATE_RANGE) { - // Convert the surrogate to UTF32 and get the result. - return (temp1 * 0x400) + temp2 + UNICODE_PLANE01_START; + // |--------temp1--||-temp2--| + // 00000uuuuuuxxxxxxxxxxxxxxxx (where uuuuu = wwww + 1) + c = (temp1 << 10) + temp2 + UNICODE_PLANE01_START; } } } - return c; + + return GetBidiCategoryNoBoundsChecks((uint)c); } - /// - /// Convert a character or a surrogate pair starting at index of string s - /// to UTF32 value. - /// WARNING: since it doesn't throw an exception it CAN return a value - /// in the surrogate range D800-DFFF, which are not legal unicode values. - /// - internal static int InternalConvertToUtf32(string s, int index, out int charLength) + private static StrongBidiCategory GetBidiCategoryNoBoundsChecks(uint codePoint) { - Debug.Assert(s != null, "s != null"); - Debug.Assert(s.Length > 0, "s.Length > 0"); - Debug.Assert(index >= 0 && index < s.Length, "index >= 0 && index < s.Length"); - charLength = 1; - if (index < s.Length - 1) - { - int temp1 = (int)s[index] - HIGH_SURROGATE_START; - if ((uint)temp1 <= HIGH_SURROGATE_RANGE) - { - int temp2 = (int)s[index + 1] - LOW_SURROGATE_START; - if ((uint)temp2 <= HIGH_SURROGATE_RANGE) - { - // Convert the surrogate to UTF32 and get the result. - charLength++; - return (temp1 * 0x400) + temp2 + UNICODE_PLANE01_START; - } - } - } - return (int)s[index]; + nuint offset = GetCategoryCasingTableOffsetNoBoundsChecks(codePoint); + + // Each entry of the 'CategoryValues' table uses bits 5 - 6 to store the strong bidi information. + + StrongBidiCategory bidiCategory = (StrongBidiCategory)(Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(CategoriesValues), offset) & 0b_0110_0000); + Debug.Assert(bidiCategory == StrongBidiCategory.Other || bidiCategory == StrongBidiCategory.StrongLeftToRight || bidiCategory == StrongBidiCategory.StrongRightToLeft, "Unknown StrongBidiCategory value."); + + return bidiCategory; } - /// - /// This is called by the public char and string, index versions - /// Note that for ch in the range D800-DFFF we just treat it as any - /// other non-numeric character - /// - internal static double InternalGetNumericValue(int ch) - { - Debug.Assert(ch >= 0 && ch <= 0x10ffff, "ch is not in valid Unicode range."); - // Get the level 2 item from the highest 12 bit (8 - 19) of ch. - int index = ch >> 8; - if ((uint)index < (uint)NumericLevel1Index.Length) - { - index = NumericLevel1Index[index]; - // Get the level 2 offset from the 4 - 7 bit of ch. This provides the base offset of the level 3 table. - // Note that & has the lower precedence than addition, so don't forget the parathesis. - index = NumericLevel2Index[(index << 4) + ((ch >> 4) & 0x000f)]; - index = NumericLevel3Index[(index << 4) + (ch & 0x000f)]; - ref byte value = ref Unsafe.AsRef(in NumericValues[index * 8]); - - if (BitConverter.IsLittleEndian) - { - return Unsafe.ReadUnaligned(ref value); - } + /* + * GetDecimalDigitValue + * ==================== + * Data derived from https://www.unicode.org/reports/tr44/#UnicodeData.txt. If Numeric_Type=Decimal, + * then retrieves the Numeric_Value (0..9) for this code point. If Numeric_Type!=Decimal, returns -1. + * This data is encoded in field 6 of UnicodeData.txt. + */ - return BitConverter.Int64BitsToDouble(BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned(ref value))); - } - return -1; + public static int GetDecimalDigitValue(char ch) + { + return GetDecimalDigitValueInternalNoBoundsCheck(ch); } - internal static byte InternalGetDigitValues(int ch, int offset) + public static int GetDecimalDigitValue(string s, int index) { - Debug.Assert(ch >= 0 && ch <= 0x10ffff, "ch is not in valid Unicode range."); - // Get the level 2 item from the highest 12 bit (8 - 19) of ch. - int index = ch >> 8; - if ((uint)index < (uint)NumericLevel1Index.Length) + if (s is null) { - index = NumericLevel1Index[index]; - // Get the level 2 offset from the 4 - 7 bit of ch. This provides the base offset of the level 3 table. - // Note that & has the lower precedence than addition, so don't forget the parathesis. - index = NumericLevel2Index[(index << 4) + ((ch >> 4) & 0x000f)]; - index = NumericLevel3Index[(index << 4) + (ch & 0x000f)]; - return DigitValues[index * 2 + offset]; + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.s); } - return 0xff; + if ((uint)index >= (uint)s.Length) + { + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index); + } + + return GetDecimalDigitValueInternalNoBoundsCheck((uint)GetCodePointFromString(s, index)); } - /// - /// Returns the numeric value associated with the character c. - /// If the character is a fraction, the return value will not be an - /// integer. If the character does not have a numeric value, the return - /// value is -1. - /// - public static double GetNumericValue(char ch) + private static int GetDecimalDigitValueInternalNoBoundsCheck(uint codePoint) { - return InternalGetNumericValue(ch); + nuint offset = GetNumericGraphemeTableOffsetNoBoundsChecks(codePoint); + uint rawValue = Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(DigitValues), offset); + return (int)(rawValue >> 4) - 1; // return the high nibble of the result, minus 1 so that "not a decimal digit value" gets normalized to -1 } - public static double GetNumericValue(string s, int index) + /* + * GetDigitValue + * ============= + * Data derived from https://www.unicode.org/reports/tr44/#UnicodeData.txt. If Numeric_Type=Decimal + * or Numeric_Type=Digit, then retrieves the Numeric_Value (0..9) for this code point. Otherwise + * returns -1. This data is encoded in field 7 of UnicodeData.txt. + */ + + public static int GetDigitValue(char ch) + { + return GetDigitValueInternalNoBoundsCheck(ch); + } + + public static int GetDigitValue(string s, int index) { - if (s == null) + if (s is null) { - throw new ArgumentNullException(nameof(s)); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.s); } - if (index < 0 || index >= s.Length) + if ((uint)index >= (uint)s.Length) { - throw new ArgumentOutOfRangeException(nameof(index), SR.ArgumentOutOfRange_Index); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index); } - return InternalGetNumericValue(InternalConvertToUtf32(s, index)); + return GetDigitValueInternalNoBoundsCheck((uint)GetCodePointFromString(s, index)); } - public static int GetDecimalDigitValue(char ch) + private static int GetDigitValueInternalNoBoundsCheck(uint codePoint) { - return (sbyte)InternalGetDigitValues(ch, 0); + nuint offset = GetNumericGraphemeTableOffsetNoBoundsChecks(codePoint); + int rawValue = Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(DigitValues), offset); + return (rawValue & 0xF) - 1; // return the low nibble of the result, minus 1 so that "not a digit value" gets normalized to -1 } - public static int GetDecimalDigitValue(string s, int index) + /* + * GetGraphemeBreakClusterType + * =========================== + * Data derived from https://unicode.org/reports/tr29/#Default_Grapheme_Cluster_Table. Represents + * grapheme cluster boundary information for the given code point. + */ + + internal static GraphemeClusterBreakType GetGraphemeClusterBreakType(Rune rune) { - if (s == null) - { - throw new ArgumentNullException(nameof(s)); - } - if (index < 0 || index >= s.Length) + nuint offset = GetNumericGraphemeTableOffsetNoBoundsChecks((uint)rune.Value); + return (GraphemeClusterBreakType)Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(GraphemeSegmentationValues), offset); + } + + /* + * GetIsWhiteSpace + * =========================== + * Data derived from https://unicode.org/reports/tr44/#White_Space. Represents whether a code point + * is listed as White_Space per PropList.txt. + */ + + internal static bool GetIsWhiteSpace(char ch) + { + // We don't need a (string, int) overload because all current white space chars are in the BMP. + + nuint offset = GetCategoryCasingTableOffsetNoBoundsChecks(ch); + + // High bit of each value in the 'CategoriesValues' array denotes whether this code point is white space. + + return (sbyte)Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(CategoriesValues), offset) < 0; + } + + /* + * GetNumericValue + * =============== + * Data derived from https://www.unicode.org/reports/tr44/#UnicodeData.txt. If Numeric_Type=Decimal + * or Numeric_Type=Digit or Numeric_Type=Numeric, then retrieves the Numeric_Value for this code point. + * Otherwise returns -1. This data is encoded in field 8 of UnicodeData.txt. + */ + + public static double GetNumericValue(char ch) + { + return GetNumericValueNoBoundsCheck(ch); + } + + internal static double GetNumericValue(int codePoint) + { + if (!UnicodeUtility.IsValidCodePoint((uint)codePoint)) { - throw new ArgumentOutOfRangeException(nameof(index), SR.ArgumentOutOfRange_Index); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.codePoint); } - return (sbyte)InternalGetDigitValues(InternalConvertToUtf32(s, index), 0); + return GetNumericValueNoBoundsCheck((uint)codePoint); } - public static int GetDigitValue(char ch) + public static double GetNumericValue(string s, int index) { - return (sbyte)InternalGetDigitValues(ch, 1); + if (s is null) + { + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.s); + } + if ((uint)index >= (uint)s.Length) + { + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index); + } + + return GetNumericValueNoBoundsCheck((uint)GetCodePointFromString(s, index)); } - public static int GetDigitValue(string s, int index) + private static double GetNumericValueNoBoundsCheck(uint codePoint) { - if (s == null) + nuint offset = GetNumericGraphemeTableOffsetNoBoundsChecks(codePoint); + ref byte refToValue = ref Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(NumericValues), offset * 8 /* sizeof(double) */); + + // 'refToValue' points to a little-endian 64-bit double. + + if (BitConverter.IsLittleEndian) { - throw new ArgumentNullException(nameof(s)); + return Unsafe.ReadUnaligned(ref refToValue); } - if (index < 0 || index >= s.Length) + else { - throw new ArgumentOutOfRangeException(nameof(index), SR.ArgumentOutOfRange_Index); + ulong temp = Unsafe.ReadUnaligned(ref refToValue); + temp = BinaryPrimitives.ReverseEndianness(temp); + return Unsafe.As(ref temp); } - - return (sbyte)InternalGetDigitValues(InternalConvertToUtf32(s, index), 1); } + /* + * GetUnicodeCategory + * ================== + * Data derived from https://www.unicode.org/reports/tr44/#UnicodeData.txt. Returns the + * General_Category of this code point as encoded in field 2 of UnicodeData.txt, or "Cn" + * if the code point has not been assigned. + */ + public static UnicodeCategory GetUnicodeCategory(char ch) { - return GetUnicodeCategory((int)ch); + return GetUnicodeCategoryNoBoundsChecks(ch); + } + + public static UnicodeCategory GetUnicodeCategory(int codePoint) + { + if (!UnicodeUtility.IsValidCodePoint((uint)codePoint)) + { + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.codePoint); + } + + return GetUnicodeCategoryNoBoundsChecks((uint)codePoint); } public static UnicodeCategory GetUnicodeCategory(string s, int index) { - if (s == null) + if (s is null) { - throw new ArgumentNullException(nameof(s)); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.s); } - if (((uint)index) >= ((uint)s.Length)) + if ((uint)index >= (uint)s.Length) { - throw new ArgumentOutOfRangeException(nameof(index)); + ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index); } - return InternalGetUnicodeCategory(s, index); + return GetUnicodeCategoryInternal(s, index); } - public static UnicodeCategory GetUnicodeCategory(int codePoint) + /// + /// Similar to , but skips argument checks. + /// For internal use only. + /// + internal static UnicodeCategory GetUnicodeCategoryInternal(string value, int index) { - return (UnicodeCategory)InternalGetCategoryValue(codePoint, UNICODE_CATEGORY_OFFSET); + Debug.Assert(value != null, "value can not be null"); + Debug.Assert(index < value.Length, "index < value.Length"); + + return GetUnicodeCategoryNoBoundsChecks((uint)GetCodePointFromString(value, index)); } /// - /// Returns the Unicode Category property for the character c. - /// Note that this API will return values for D800-DF00 surrogate halves. + /// Get the Unicode category of the character starting at index. If the character is in BMP, charLength will return 1. + /// If the character is a valid surrogate pair, charLength will return 2. /// - internal static byte InternalGetCategoryValue(int ch, int offset) + internal static UnicodeCategory GetUnicodeCategoryInternal(string str, int index, out int charLength) { - Debug.Assert(ch >= 0 && ch <= 0x10ffff, "ch is not in valid Unicode range."); - // Get the level 2 item from the highest 11 bits of ch. - int index = CategoryLevel1Index[ch >> 9]; - // Get the level 2 WORD offset from the next 5 bits of ch. This provides the base offset of the level 3 table. - // Note that & has the lower precedence than addition, so don't forget the parathesis. - index = Unsafe.ReadUnaligned(ref Unsafe.AsRef(in CategoryLevel2Index[(index << 6) + ((ch >> 3) & 0b111110)])); - if (!BitConverter.IsLittleEndian) - { - index = BinaryPrimitives.ReverseEndianness((ushort)index); - } + Debug.Assert(str != null, "str can not be null"); + Debug.Assert(str.Length > 0, "str.Length > 0"); + Debug.Assert(index >= 0 && index < str.Length, "index >= 0 && index < str.Length"); + + uint codePoint = (uint)GetCodePointFromString(str, index); + UnicodeDebug.AssertIsValidCodePoint(codePoint); - // Get the result from the 0 -3 bit of ch. - index = CategoryLevel3Index[(index << 4) + (ch & 0x000f)]; - return CategoriesValue[index * 2 + offset]; + charLength = (codePoint >= UNICODE_PLANE01_START) ? 2 /* surrogate pair */ : 1 /* BMP char */; + return GetUnicodeCategoryNoBoundsChecks(codePoint); } + private static UnicodeCategory GetUnicodeCategoryNoBoundsChecks(uint codePoint) + { + nuint offset = GetCategoryCasingTableOffsetNoBoundsChecks(codePoint); + + // Each entry of the 'CategoriesValues' table uses the low 5 bits to store the UnicodeCategory information. + + return (UnicodeCategory)(Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(CategoriesValues), offset) & 0x1F); + } + + /* + * HELPER AND TABLE LOOKUP ROUTINES + */ + /// - /// Returns the Unicode Category property for the character c. + /// Returns the code point pointed to by index, decoding any surrogate sequence if possible. + /// This is similar to char.ConvertToUTF32, but the difference is that + /// it does not throw exceptions when invalid surrogate characters are passed in. + /// + /// WARNING: since it doesn't throw an exception it CAN return a value + /// in the surrogate range D800-DFFF, which is not a legal scalar value. /// - internal static UnicodeCategory InternalGetUnicodeCategory(string value, int index) + private static int GetCodePointFromString(string s, int index) { - Debug.Assert(value != null, "value can not be null"); - Debug.Assert(index < value.Length, "index < value.Length"); + Debug.Assert(s != null, "s != null"); + Debug.Assert((uint)index < (uint)s.Length, "index < s.Length"); - return GetUnicodeCategory(InternalConvertToUtf32(value, index)); + int codePoint = 0; + + // We know the 'if' block below will always succeed, but it allows the + // JIT to optimize the codegen of this method. + + if ((uint)index < (uint)s.Length) + { + codePoint = s[index]; + int temp1 = codePoint - HIGH_SURROGATE_START; + if ((uint)temp1 <= HIGH_SURROGATE_RANGE) + { + index++; + if ((uint)index < (uint)s.Length) + { + int temp2 = s[index] - LOW_SURROGATE_START; + if ((uint)temp2 <= HIGH_SURROGATE_RANGE) + { + // Combine these surrogate code points into a supplementary code point + codePoint = (temp1 << 10) + temp2 + UNICODE_PLANE01_START; + } + } + } + } + + return codePoint; } - internal static BidiCategory GetBidiCategory(string s, int index) + /// + /// Retrieves the offset into the "CategoryCasing" arrays where this code point's + /// information is stored. Used for getting the Unicode category, bidi information, + /// and whitespace information. + /// + private static nuint GetCategoryCasingTableOffsetNoBoundsChecks(uint codePoint) { - if (s == null) + UnicodeDebug.AssertIsValidCodePoint(codePoint); + + // The code below is written with the assumption that the backing store is 11:5:4. + AssertCategoryCasingTableLevels(11, 5, 4); + + // Get the level index item from the high 11 bits of the code point. + + uint index = Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(CategoryCasingLevel1Index), codePoint >> 9); + + // Get the level 2 WORD offset from the next 5 bits of the code point. + // This provides the base offset of the level 3 table. + // Note that & has lower precedence than +, so remember the parens. + + ref byte level2Ref = ref Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(CategoryCasingLevel2Index), (index << 6) + ((codePoint >> 3) & 0b_0011_1110)); + + if (BitConverter.IsLittleEndian) { - throw new ArgumentNullException(nameof(s)); + index = Unsafe.ReadUnaligned(ref level2Ref); } - if (((uint)index) >= ((uint)s.Length)) + else { - throw new ArgumentOutOfRangeException(nameof(index)); + index = BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned(ref level2Ref)); } - return (BidiCategory)InternalGetCategoryValue(InternalConvertToUtf32(s, index), BIDI_CATEGORY_OFFSET); - } - - internal static BidiCategory GetBidiCategory(StringBuilder s, int index) - { - Debug.Assert(s != null, "s can not be null"); - Debug.Assert(index >= 0 && index < s.Length, "invalid index"); + // Get the result from the low 4 bits of the code point. + // This is the offset into the values table where the data is stored. - return (BidiCategory)InternalGetCategoryValue(InternalConvertToUtf32(s, index), BIDI_CATEGORY_OFFSET); + return Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(CategoryCasingLevel3Index), (index << 4) + (codePoint & 0x0F)); } /// - /// Get the Unicode category of the character starting at index. If the character is in BMP, charLength will return 1. - /// If the character is a valid surrogate pair, charLength will return 2. + /// Retrieves the offset into the "NumericGrapheme" arrays where this code point's + /// information is stored. Used for getting numeric information and grapheme boundary + /// information. /// - internal static UnicodeCategory InternalGetUnicodeCategory(string str, int index, out int charLength) + private static nuint GetNumericGraphemeTableOffsetNoBoundsChecks(uint codePoint) { - Debug.Assert(str != null, "str can not be null"); - Debug.Assert(str.Length > 0, "str.Length > 0"); - Debug.Assert(index >= 0 && index < str.Length, "index >= 0 && index < str.Length"); + UnicodeDebug.AssertIsValidCodePoint(codePoint); - return GetUnicodeCategory(InternalConvertToUtf32(str, index, out charLength)); - } + // The code below is written with the assumption that the backing store is 11:5:4. + AssertNumericGraphemeTableLevels(11, 5, 4); - internal static bool IsCombiningCategory(UnicodeCategory uc) - { - Debug.Assert(uc >= 0, "uc >= 0"); - return - uc == UnicodeCategory.NonSpacingMark || - uc == UnicodeCategory.SpacingCombiningMark || - uc == UnicodeCategory.EnclosingMark - ; + // Get the level index item from the high 11 bits of the code point. + + uint index = Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(NumericGraphemeLevel1Index), codePoint >> 9); + + // Get the level 2 WORD offset from the next 5 bits of the code point. + // This provides the base offset of the level 3 table. + // Note that & has lower precedence than +, so remember the parens. + + ref byte level2Ref = ref Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(NumericGraphemeLevel2Index), (index << 6) + ((codePoint >> 3) & 0b_0011_1110)); + + if (BitConverter.IsLittleEndian) + { + index = Unsafe.ReadUnaligned(ref level2Ref); + } + else + { + index = BinaryPrimitives.ReverseEndianness(Unsafe.ReadUnaligned(ref level2Ref)); + } + + // Get the result from the low 4 bits of the code point. + // This is the offset into the values table where the data is stored. + + return Unsafe.AddByteOffset(ref MemoryMarshal.GetReference(NumericGraphemeLevel3Index), (index << 4) + (codePoint & 0x0F)); } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/CharUnicodeInfoData.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/CharUnicodeInfoData.cs index 522c33004a4024..287ceb28a716ec 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/CharUnicodeInfoData.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/CharUnicodeInfoData.cs @@ -2,6 +2,8 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics; + namespace System.Globalization { public static partial class CharUnicodeInfo @@ -9,9 +11,17 @@ public static partial class CharUnicodeInfo // THE FOLLOWING DATA IS AUTO GENERATED BY GenUnicodeProp program UNDER THE TOOLS FOLDER // PLEASE DON'T MODIFY BY HAND + [Conditional("DEBUG")] + private static void AssertCategoryCasingTableLevels(int level1BitCount, int level2BitCount, int level3BitCount) + { + // Ensures that the caller expects the same L1:L2:L3 count as the actual backing data. + Debug.Assert(level1BitCount == 11, "Unexpected level 1 bit count."); + Debug.Assert(level2BitCount == 5, "Unexpected level 2 bit count."); + Debug.Assert(level3BitCount == 4, "Unexpected level 3 bit count."); + } - // 11:5:4 index table of the Unicode category data. - private static ReadOnlySpan CategoryLevel1Index => new byte[2176] + // 11:5:4 index table of the Unicode category & casing data. + private static ReadOnlySpan CategoryCasingLevel1Index => new byte[2176] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, @@ -28,21 +38,15 @@ public static partial class CharUnicodeInfo 0x1a, 0x1a, 0x1a, 0x40, 0x1a, 0x41, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x42, 0x43, 0x3b, 0x3b, 0x3b, 0x3b, 0x44, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x3b, 0x3b, - 0x4b, 0x3b, 0x3b, 0x3b, 0x4c, 0x3b, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x3b, 0x3b, + 0x4b, 0x4c, 0x3b, 0x3b, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x3b, 0x57, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, - 0x1a, 0x1a, 0x1a, 0x55, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x56, 0x57, 0x1a, 0x1a, 0x1a, - 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x58, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, - 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x59, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1a, 0x5a, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x1a, 0x1a, 0x1a, 0x58, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x59, 0x5a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x5b, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, + 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x5c, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x1a, 0x5d, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -50,6 +54,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -57,6 +62,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -64,6 +70,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -71,6 +78,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -78,6 +86,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -85,6 +94,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -92,6 +102,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -99,6 +110,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -106,6 +118,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -113,6 +126,7 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, @@ -120,19 +134,15 @@ public static partial class CharUnicodeInfo 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x5b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, - 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, + 0x5e, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x5f, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, + 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x57, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, @@ -140,7 +150,7 @@ public static partial class CharUnicodeInfo 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x5c, + 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x60, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, @@ -148,1343 +158,1991 @@ public static partial class CharUnicodeInfo 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x5c + 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x60 }; - private static ReadOnlySpan CategoryLevel2Index => new byte[5952] + private static ReadOnlySpan CategoryCasingLevel2Index => new byte[6208] { 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, - 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x10, 0x00, 0x10, 0x00, 0x13, 0x00, - 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x10, 0x00, 0x1a, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, - 0x0e, 0x00, 0x1d, 0x00, 0x0e, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, - 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x24, 0x00, - 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x0e, 0x00, 0x28, 0x00, 0x29, 0x00, 0x10, 0x00, 0x2a, 0x00, - 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x2b, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x2c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x2d, 0x00, 0x0c, 0x00, 0x2e, 0x00, 0x0e, 0x00, 0x0e, 0x00, - 0x2f, 0x00, 0x30, 0x00, 0x23, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, - 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x38, 0x00, 0x39, 0x00, 0x23, 0x00, 0x3a, 0x00, 0x3b, 0x00, - 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, - 0x3f, 0x00, 0x40, 0x00, 0x38, 0x00, 0x23, 0x00, 0x41, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, - 0x38, 0x00, 0x38, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x33, 0x00, 0x45, 0x00, 0x46, 0x00, - 0x33, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x33, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x38, 0x00, 0x4d, 0x00, 0x4c, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x23, 0x00, - 0x50, 0x00, 0x51, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, - 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, - 0x5f, 0x00, 0x58, 0x00, 0x59, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, - 0x65, 0x00, 0x66, 0x00, 0x59, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x5d, 0x00, 0x6a, 0x00, - 0x6b, 0x00, 0x58, 0x00, 0x59, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x5d, 0x00, 0x6f, 0x00, - 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x63, 0x00, 0x76, 0x00, - 0x77, 0x00, 0x78, 0x00, 0x59, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x5d, 0x00, 0x7c, 0x00, - 0x7d, 0x00, 0x78, 0x00, 0x59, 0x00, 0x7e, 0x00, 0x7f, 0x00, 0x80, 0x00, 0x5d, 0x00, 0x81, 0x00, - 0x82, 0x00, 0x78, 0x00, 0x51, 0x00, 0x83, 0x00, 0x84, 0x00, 0x85, 0x00, 0x5d, 0x00, 0x86, 0x00, - 0x87, 0x00, 0x88, 0x00, 0x51, 0x00, 0x89, 0x00, 0x8a, 0x00, 0x8b, 0x00, 0x63, 0x00, 0x8c, 0x00, - 0x8d, 0x00, 0x51, 0x00, 0x51, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x96, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x51, 0x00, 0x9c, 0x00, 0x9d, 0x00, - 0x9e, 0x00, 0x9f, 0x00, 0x23, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, 0xa7, 0x00, 0xa8, 0x00, - 0xa9, 0x00, 0xaa, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xab, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0xac, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xad, 0x00, 0xae, 0x00, 0x51, 0x00, 0x51, 0x00, - 0xad, 0x00, 0x51, 0x00, 0x51, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0xb0, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xb2, 0x00, 0xb3, 0x00, 0xb4, 0x00, - 0x51, 0x00, 0xb5, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xb6, 0x00, - 0xb7, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xb8, 0x00, 0x51, 0x00, - 0xb9, 0x00, 0xba, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xbb, 0x00, 0xbc, 0x00, - 0xbd, 0x00, 0xbe, 0x00, 0x51, 0x00, 0xbf, 0x00, 0x51, 0x00, 0xc0, 0x00, 0xbd, 0x00, 0xc1, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0xc6, 0x00, - 0xc7, 0x00, 0xc5, 0x00, 0x51, 0x00, 0x51, 0x00, 0xc8, 0x00, 0x51, 0x00, 0x51, 0x00, 0xc9, 0x00, - 0xca, 0x00, 0x51, 0x00, 0xcb, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xcc, 0x00, - 0x51, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcf, 0x00, 0xd0, 0x00, 0x51, 0x00, 0xd1, 0x00, 0xd2, 0x00, - 0x51, 0x00, 0x51, 0x00, 0xd3, 0x00, 0x51, 0x00, 0xd4, 0x00, 0xd5, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0x51, 0x00, 0xd7, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xd8, 0x00, 0xd9, 0x00, 0xda, 0x00, - 0xc5, 0x00, 0xc5, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0xdd, 0x00, 0x51, 0x00, 0x51, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xa5, 0x00, 0xe0, 0x00, 0xe1, 0x00, - 0xe2, 0x00, 0x51, 0x00, 0xe3, 0x00, 0xe4, 0x00, 0x51, 0x00, 0x51, 0x00, 0xe5, 0x00, 0xe6, 0x00, - 0x51, 0x00, 0x51, 0x00, 0xe7, 0x00, 0xe8, 0x00, 0xe9, 0x00, 0xe4, 0x00, 0x51, 0x00, 0xea, 0x00, - 0xeb, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, 0xef, 0x00, 0xf0, 0x00, - 0x0e, 0x00, 0x0e, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0xf3, 0x00, 0xf4, 0x00, - 0x0e, 0x00, 0xf5, 0x00, 0xf2, 0x00, 0xf2, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0xf6, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0xf7, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, - 0xf8, 0x00, 0xf9, 0x00, 0xf8, 0x00, 0xf8, 0x00, 0xf9, 0x00, 0xfa, 0x00, 0xf8, 0x00, 0xfb, 0x00, - 0xfc, 0x00, 0xfc, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xff, 0x00, 0x00, 0x01, 0x01, 0x01, - 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0x08, 0x01, 0x09, 0x01, - 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x0c, 0x01, 0x4c, 0x00, 0x0d, 0x01, 0x0e, 0x01, 0x0f, 0x01, - 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x16, 0x01, 0x16, 0x01, - 0x17, 0x01, 0x18, 0x01, 0x19, 0x01, 0xd6, 0x00, 0x1a, 0x01, 0x1b, 0x01, 0xd6, 0x00, 0x1c, 0x01, - 0x1d, 0x01, 0x1e, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, - 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, - 0x1f, 0x01, 0xd6, 0x00, 0x20, 0x01, 0x21, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x23, 0x01, - 0xd6, 0x00, 0x24, 0x01, 0x1d, 0x01, 0x25, 0x01, 0xd6, 0x00, 0x26, 0x01, 0x27, 0x01, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0x28, 0x01, 0x4c, 0x00, 0x29, 0x01, 0x4c, 0x00, 0x15, 0x01, 0x15, 0x01, - 0x2a, 0x01, 0x2b, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x2c, 0x01, 0x15, 0x01, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x2d, 0x01, 0x2e, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0x2f, 0x01, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x30, 0x01, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0x31, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x32, 0x01, 0x33, 0x01, - 0x15, 0x01, 0x34, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0x35, 0x01, 0x1d, 0x01, 0x36, 0x01, 0x1d, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, - 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, - 0x37, 0x01, 0x38, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x39, 0x01, 0x1d, 0x01, 0x3a, 0x01, - 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, - 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, 0x1d, 0x01, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x1d, 0x01, 0x3b, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0x3c, 0x01, - 0xd6, 0x00, 0x3d, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0x3e, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0x3f, 0x01, - 0x0c, 0x00, 0x0c, 0x00, 0x40, 0x01, 0x0e, 0x00, 0x0e, 0x00, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, - 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x44, 0x01, 0x45, 0x01, - 0x0e, 0x00, 0x0e, 0x00, 0x46, 0x01, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x47, 0x01, 0x48, 0x01, - 0x51, 0x00, 0x49, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x4a, 0x01, 0x23, 0x00, 0x23, 0x00, - 0x4b, 0x01, 0x4c, 0x01, 0x4d, 0x01, 0x4e, 0x01, 0x4f, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0xd6, 0x00, 0x50, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x51, 0x01, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x52, 0x01, 0x4c, 0x00, 0x53, 0x01, - 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, 0x8d, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x58, 0x01, 0xb7, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x59, 0x01, - 0x5a, 0x01, 0x51, 0x00, 0x51, 0x00, 0x8d, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0xcd, 0x00, 0x5b, 0x01, 0x51, 0x00, 0x5c, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0x51, 0x01, 0x51, 0x00, - 0x22, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x22, 0x01, 0x5f, 0x01, 0x60, 0x01, 0x22, 0x01, 0x61, 0x01, - 0x5e, 0x01, 0x22, 0x01, 0x22, 0x01, 0x62, 0x01, 0x63, 0x01, 0x22, 0x01, 0x22, 0x01, 0x64, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x65, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x66, 0x01, 0x22, 0x01, 0x67, 0x01, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xcc, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x68, 0x01, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x9c, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x28, 0x01, 0x51, 0x00, 0x51, 0x00, 0xea, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x69, 0x01, 0x51, 0x00, 0x6a, 0x01, 0x4c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x6b, 0x01, 0x6c, 0x01, - 0x10, 0x00, 0x6d, 0x01, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x6e, 0x01, 0x6f, 0x01, - 0x22, 0x00, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x73, 0x01, - 0x74, 0x01, 0x75, 0x01, 0x76, 0x01, 0x77, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x78, 0x01, - 0x79, 0x01, 0x51, 0x00, 0x7a, 0x01, 0x7b, 0x01, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x7c, 0x01, - 0x7d, 0x01, 0x51, 0x00, 0x51, 0x00, 0x7e, 0x01, 0x7f, 0x01, 0xc5, 0x00, 0x23, 0x00, 0x80, 0x01, - 0xe4, 0x00, 0x51, 0x00, 0x81, 0x01, 0x51, 0x00, 0x82, 0x01, 0x83, 0x01, 0x51, 0x00, 0x9c, 0x00, - 0x50, 0x00, 0x51, 0x00, 0x51, 0x00, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x88, 0x01, - 0x51, 0x00, 0x51, 0x00, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x51, 0x00, 0x8d, 0x01, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x8e, 0x01, 0x8f, 0x01, 0x90, 0x01, 0x91, 0x01, 0x92, 0x01, - 0x93, 0x01, 0x94, 0x01, 0x4a, 0x01, 0x0e, 0x00, 0x0e, 0x00, 0x95, 0x01, 0x96, 0x01, 0x0e, 0x00, - 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x51, 0x00, 0x51, 0x00, 0x97, 0x01, 0xc5, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x98, 0x01, 0x51, 0x00, 0x99, 0x01, 0x51, 0x00, 0x51, 0x00, 0xd3, 0x00, - 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, - 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, - 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, - 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, 0x9a, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xd1, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xd4, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x9f, 0x01, 0xa0, 0x01, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, - 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0xa1, 0x01, 0xa2, 0x01, 0xa3, 0x01, 0x38, 0x00, 0x38, 0x00, - 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, - 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, - 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0xa4, 0x01, 0x4c, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, - 0x38, 0x00, 0xa5, 0x01, 0x38, 0x00, 0x38, 0x00, 0xa6, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0xa7, 0x01, - 0x23, 0x00, 0xa8, 0x01, 0x23, 0x00, 0xa9, 0x01, 0xaa, 0x01, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, - 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0x38, 0x00, 0xae, 0x01, - 0xaf, 0x01, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, - 0x51, 0x00, 0xb3, 0x01, 0x51, 0x00, 0xcd, 0x00, 0xb4, 0x01, 0xb5, 0x01, 0xb6, 0x01, 0xb7, 0x01, - 0xb8, 0x01, 0x51, 0x00, 0xb1, 0x00, 0xb9, 0x01, 0xd1, 0x00, 0xd1, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x5c, 0x01, - 0xba, 0x01, 0xbb, 0x01, 0xbb, 0x01, 0xbc, 0x01, 0xbd, 0x01, 0xbd, 0x01, 0xbd, 0x01, 0xbe, 0x01, - 0xbf, 0x01, 0x53, 0x01, 0xc0, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x22, 0x01, 0x22, 0x01, 0xc1, 0x01, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x9c, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x69, 0x00, 0xc2, 0x01, 0xc3, 0x01, - 0x51, 0x00, 0x51, 0x00, 0xc4, 0x01, 0x51, 0x00, 0xc5, 0x01, 0x51, 0x00, 0x51, 0x00, 0xc6, 0x01, - 0x51, 0x00, 0xc7, 0x01, 0x51, 0x00, 0x51, 0x00, 0xc8, 0x01, 0xc9, 0x01, 0x4c, 0x00, 0x4c, 0x00, - 0x0c, 0x00, 0x0c, 0x00, 0xca, 0x01, 0x0e, 0x00, 0x0e, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0xd1, 0x00, 0xc5, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0xcb, 0x01, 0x0e, 0x00, 0xcc, 0x01, - 0x51, 0x00, 0x51, 0x00, 0xcd, 0x01, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xce, 0x01, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x49, 0x01, 0x51, 0x00, 0xcc, 0x00, 0xcd, 0x01, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0xcf, 0x01, 0x33, 0x00, 0x33, 0x00, 0xd0, 0x01, 0x33, 0x00, 0xd1, 0x01, 0x33, 0x00, 0xd2, 0x01, - 0x33, 0x00, 0xd3, 0x01, 0xd4, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x33, 0x00, 0xd5, 0x01, - 0x33, 0x00, 0xd6, 0x01, 0x33, 0x00, 0xd7, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0xd9, 0x01, 0xd9, 0x01, - 0xdb, 0x01, 0xdc, 0x01, 0x33, 0x00, 0xdd, 0x01, 0xde, 0x01, 0xdf, 0x01, 0x33, 0x00, 0xe0, 0x01, - 0x33, 0x00, 0xe1, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0xe2, 0x01, 0x33, 0x00, 0xe3, 0x01, 0xe4, 0x01, - 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0xe5, 0x01, 0x33, 0x00, 0xe6, 0x01, 0x33, 0x00, 0xe7, 0x01, - 0x33, 0x00, 0xe8, 0x01, 0xe9, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0xea, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0xeb, 0x01, 0xeb, 0x01, 0xeb, 0x01, 0xec, 0x01, 0xed, 0x01, 0xed, 0x01, 0xed, 0x01, 0xee, 0x01, - 0x38, 0x00, 0x38, 0x00, 0xef, 0x01, 0xf0, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0xf1, 0x01, 0xf2, 0x01, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x33, 0x00, 0xe1, 0x01, 0xf3, 0x01, 0x38, 0x00, 0x42, 0x00, 0xf4, 0x01, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0xf5, 0x01, 0x51, 0x00, 0x51, 0x00, 0xf6, 0x01, 0xf7, 0x01, 0xf8, 0x01, 0xf9, 0x01, 0xfa, 0x01, - 0xe2, 0x00, 0x51, 0x00, 0x51, 0x00, 0xfb, 0x01, 0xfc, 0x01, 0x51, 0x00, 0xc9, 0x00, 0xc5, 0x00, - 0xfd, 0x01, 0x51, 0x00, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x51, 0x00, 0x51, 0x00, 0x01, 0x02, - 0xe2, 0x00, 0x51, 0x00, 0x51, 0x00, 0x02, 0x02, 0x03, 0x02, 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, - 0x51, 0x00, 0x66, 0x00, 0x07, 0x02, 0x08, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x09, 0x02, 0x0a, 0x02, 0x0b, 0x02, 0x51, 0x00, 0x51, 0x00, 0x0c, 0x02, 0x0d, 0x02, 0xc5, 0x00, - 0x0e, 0x02, 0x58, 0x00, 0x59, 0x00, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x12, 0x02, 0x13, 0x02, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x17, 0x02, 0x18, 0x02, 0xc5, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x19, 0x02, 0x1a, 0x02, 0x1b, 0x02, 0x1c, 0x02, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x1d, 0x02, 0x1e, 0x02, 0xc5, 0x00, 0x1f, 0x02, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x20, 0x02, 0x21, 0x02, 0xc5, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0xb2, 0x00, 0x22, 0x02, 0x23, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x07, 0x02, 0x24, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, 0x99, 0x00, 0x25, 0x02, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x26, 0x02, 0x51, 0x00, 0x51, 0x00, 0x27, 0x02, 0x28, 0x02, 0x29, 0x02, 0x51, 0x00, 0x51, 0x00, - 0x2a, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x4c, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xc9, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x59, 0x00, 0x51, 0x00, 0x19, 0x02, 0x2d, 0x02, 0x2e, 0x02, 0x99, 0x00, 0xb4, 0x00, 0x2f, 0x02, - 0x51, 0x00, 0x30, 0x02, 0x31, 0x02, 0x32, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x33, 0x02, 0x51, 0x00, 0x51, 0x00, 0x34, 0x02, 0x35, 0x02, 0xc5, 0x00, 0x36, 0x02, 0x51, 0x00, - 0x37, 0x02, 0x38, 0x02, 0xc5, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x51, 0x00, 0x39, 0x02, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0xd4, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x16, 0x01, 0x16, 0x01, 0x16, 0x01, 0x16, 0x01, 0x16, 0x01, 0x16, 0x01, 0x3a, 0x02, 0x3b, 0x02, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x98, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0xcd, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x49, 0x01, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xc9, 0x00, 0x51, 0x00, 0xcd, 0x00, 0x86, 0x01, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x51, 0x00, 0xd1, 0x00, 0x3c, 0x02, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x3d, 0x02, 0x3e, 0x02, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, - 0x51, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x0e, 0x00, - 0xbb, 0x01, 0x42, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xd2, 0x00, 0x43, 0x02, 0x44, 0x02, 0x45, 0x02, - 0xfa, 0x01, 0x46, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x47, 0x02, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x48, 0x02, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x49, 0x02, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0xcd, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xd3, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x5c, 0x01, 0x9c, 0x00, - 0xc9, 0x00, 0x4a, 0x02, 0x4b, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x4c, 0x02, - 0x22, 0x01, 0x22, 0x01, 0x4d, 0x02, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x4e, 0x02, 0x4f, 0x02, - 0x50, 0x02, 0x22, 0x01, 0x51, 0x02, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x52, 0x02, 0x4c, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x53, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0xbb, 0x01, 0x54, 0x02, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x28, 0x01, 0xbb, 0x01, 0x55, 0x02, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x0c, 0x00, 0x56, 0x02, 0x0e, 0x00, 0x57, 0x02, 0x58, 0x02, 0x59, 0x02, 0xf8, 0x00, 0x0c, 0x00, - 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0x5d, 0x02, 0x5e, 0x02, 0x0c, 0x00, 0x56, 0x02, 0x0e, 0x00, - 0x5f, 0x02, 0x60, 0x02, 0x0e, 0x00, 0x61, 0x02, 0x62, 0x02, 0x63, 0x02, 0x64, 0x02, 0x0c, 0x00, - 0x65, 0x02, 0x0e, 0x00, 0x0c, 0x00, 0x56, 0x02, 0x0e, 0x00, 0x57, 0x02, 0x58, 0x02, 0x0e, 0x00, - 0xf8, 0x00, 0x0c, 0x00, 0x5a, 0x02, 0x64, 0x02, 0x0c, 0x00, 0x65, 0x02, 0x0e, 0x00, 0x0c, 0x00, - 0x56, 0x02, 0x0e, 0x00, 0x66, 0x02, 0x0c, 0x00, 0x67, 0x02, 0x68, 0x02, 0x69, 0x02, 0x6a, 0x02, - 0x0e, 0x00, 0x6b, 0x02, 0x0c, 0x00, 0x6c, 0x02, 0x6d, 0x02, 0x6e, 0x02, 0x6f, 0x02, 0x0e, 0x00, - 0x70, 0x02, 0x0c, 0x00, 0x71, 0x02, 0x0e, 0x00, 0x72, 0x02, 0x73, 0x02, 0x73, 0x02, 0x73, 0x02, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, - 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x74, 0x02, 0x23, 0x00, 0x23, 0x00, 0x75, 0x02, 0x76, 0x02, - 0x77, 0x02, 0x78, 0x02, 0x30, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x79, 0x02, 0x7a, 0x02, 0x7b, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, - 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x33, 0x00, 0x7c, 0x02, 0x7d, 0x02, 0x4c, 0x00, 0x4c, 0x00, - 0xeb, 0x01, 0xeb, 0x01, 0x7e, 0x02, 0xed, 0x01, 0x7f, 0x02, 0x80, 0x02, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x81, 0x02, - 0x82, 0x02, 0x82, 0x02, 0x83, 0x02, 0x84, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x85, 0x02, 0x38, 0x00, 0x86, 0x02, 0x87, 0x02, 0x88, 0x02, 0x89, 0x02, 0x8a, 0x02, 0x8b, 0x02, - 0x8c, 0x02, 0x8d, 0x02, 0x8e, 0x02, 0x8d, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x8f, 0x02, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0x53, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0x51, 0x01, 0x3f, 0x01, 0x90, 0x02, 0x90, 0x02, 0x90, 0x02, 0xd6, 0x00, 0x52, 0x01, - 0x91, 0x02, 0x22, 0x01, 0x67, 0x01, 0x22, 0x01, 0x22, 0x01, 0x22, 0x01, 0x92, 0x02, 0x22, 0x01, - 0x22, 0x01, 0x22, 0x01, 0x93, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x94, 0x02, 0x22, 0x01, - 0x95, 0x02, 0x22, 0x01, 0x22, 0x01, 0x96, 0x02, 0x52, 0x02, 0x97, 0x02, 0x52, 0x01, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x98, 0x02, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x99, 0x02, 0x9a, 0x02, 0xb5, 0x00, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x51, 0x01, - 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x9b, 0x02, 0x4c, 0x00, 0x4c, 0x00, - 0x53, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x9c, 0x02, 0xb5, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0x9c, 0x02, 0xd6, 0x00, 0x9d, 0x02, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x53, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0x3f, 0x01, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, 0x9e, 0x02, - 0xd6, 0x00, 0xd6, 0x00, 0x9f, 0x02, 0xb5, 0x00, 0x9f, 0x02, 0xd6, 0x00, 0xd6, 0x00, 0xd6, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x9d, 0x02, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x49, 0x01, 0x4c, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0xd2, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0xd1, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x48, 0x02, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, - 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x51, 0x00, 0x69, 0x00, 0x4c, 0x00, - 0x51, 0x00, 0xd1, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0xa0, 0x02, 0x4c, 0x00, 0xa1, 0x02, 0xa1, 0x02, 0xa1, 0x02, 0xa1, 0x02, 0xa1, 0x02, 0xa1, 0x02, - 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, 0x4c, 0x00, - 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, - 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x23, 0x00, 0x4c, 0x00, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, - 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0x9b, 0x01, 0xa2, 0x02 + 0x08, 0x00, 0x01, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, + 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x12, 0x00, + 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x0f, 0x00, 0x19, 0x00, + 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0d, 0x00, + 0x0d, 0x00, 0x1c, 0x00, 0x0d, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, + 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x23, 0x00, + 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x0d, 0x00, 0x27, 0x00, 0x28, 0x00, 0x0f, 0x00, 0x29, 0x00, + 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0f, 0x00, 0x0f, 0x00, + 0x2a, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x2b, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, + 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x2c, 0x00, 0x0b, 0x00, 0x2d, 0x00, 0x0d, 0x00, 0x0d, 0x00, + 0x2e, 0x00, 0x2f, 0x00, 0x22, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, + 0x35, 0x00, 0x36, 0x00, 0x32, 0x00, 0x32, 0x00, 0x37, 0x00, 0x22, 0x00, 0x38, 0x00, 0x39, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, + 0x3d, 0x00, 0x3e, 0x00, 0x32, 0x00, 0x22, 0x00, 0x3f, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x32, 0x00, 0x43, 0x00, 0x44, 0x00, + 0x32, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x32, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x32, 0x00, 0x4b, 0x00, 0x4a, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x22, 0x00, + 0x4e, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, + 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, + 0x5d, 0x00, 0x56, 0x00, 0x57, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, + 0x63, 0x00, 0x64, 0x00, 0x57, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x5b, 0x00, 0x68, 0x00, + 0x69, 0x00, 0x56, 0x00, 0x57, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x5b, 0x00, 0x6d, 0x00, + 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x61, 0x00, 0x74, 0x00, + 0x75, 0x00, 0x76, 0x00, 0x57, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x5b, 0x00, 0x7a, 0x00, + 0x7b, 0x00, 0x76, 0x00, 0x57, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0x00, 0x5b, 0x00, 0x7f, 0x00, + 0x80, 0x00, 0x76, 0x00, 0x4f, 0x00, 0x81, 0x00, 0x82, 0x00, 0x83, 0x00, 0x5b, 0x00, 0x84, 0x00, + 0x85, 0x00, 0x86, 0x00, 0x4f, 0x00, 0x87, 0x00, 0x88, 0x00, 0x89, 0x00, 0x61, 0x00, 0x8a, 0x00, + 0x8b, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x8c, 0x00, 0x8d, 0x00, 0x8e, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x90, 0x00, 0x4f, 0x00, 0x91, 0x00, 0x92, 0x00, 0x93, 0x00, 0x94, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x95, 0x00, 0x96, 0x00, 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x4f, 0x00, 0x9a, 0x00, 0x9b, 0x00, + 0x9c, 0x00, 0x9d, 0x00, 0x22, 0x00, 0x9e, 0x00, 0x9f, 0x00, 0xa0, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0xa3, 0x00, 0xa4, 0x00, 0xa5, 0x00, 0xa6, 0x00, + 0xa7, 0x00, 0xa8, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xa9, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0xaa, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xab, 0x00, 0xac, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0xab, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xad, 0x00, 0xae, 0x00, 0xaf, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0xae, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xb0, 0x00, 0xb1, 0x00, 0xb2, 0x00, + 0x4f, 0x00, 0xb3, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xb4, 0x00, + 0xb5, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xb6, 0x00, 0x4f, 0x00, + 0xb7, 0x00, 0xb8, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xb9, 0x00, 0xba, 0x00, + 0xbb, 0x00, 0xbc, 0x00, 0x4f, 0x00, 0xbd, 0x00, 0x4f, 0x00, 0xbe, 0x00, 0xbb, 0x00, 0xbf, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0xc2, 0x00, 0xc3, 0x00, 0xc4, 0x00, + 0xc5, 0x00, 0xc3, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xc6, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xc7, 0x00, + 0xc8, 0x00, 0x4f, 0x00, 0xc9, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xca, 0x00, + 0x4f, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0x4f, 0x00, 0xcf, 0x00, 0xd0, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0xd1, 0x00, 0x4f, 0x00, 0xd2, 0x00, 0xd3, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0x4f, 0x00, 0xd5, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xd6, 0x00, 0xd7, 0x00, 0xd8, 0x00, + 0xc3, 0x00, 0xc3, 0x00, 0xd9, 0x00, 0xda, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0xdb, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xa3, 0x00, 0xde, 0x00, 0xdf, 0x00, + 0xe0, 0x00, 0x4f, 0x00, 0xe1, 0x00, 0xe2, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xe3, 0x00, 0xe4, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0xe5, 0x00, 0xe6, 0x00, 0xe7, 0x00, 0xe2, 0x00, 0x4f, 0x00, 0xe8, 0x00, + 0xe9, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xea, 0x00, 0xeb, 0x00, 0xec, 0x00, 0xed, 0x00, 0xee, 0x00, + 0x0d, 0x00, 0x0d, 0x00, 0xef, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, + 0x0d, 0x00, 0xf3, 0x00, 0xf0, 0x00, 0xf0, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0xf4, 0x00, + 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, + 0x0f, 0x00, 0xf5, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, + 0xf6, 0x00, 0xf7, 0x00, 0xf6, 0x00, 0xf6, 0x00, 0xf7, 0x00, 0xf8, 0x00, 0xf6, 0x00, 0xf9, 0x00, + 0xfa, 0x00, 0xfa, 0x00, 0xfa, 0x00, 0xfb, 0x00, 0xfc, 0x00, 0xfd, 0x00, 0xfe, 0x00, 0xff, 0x00, + 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, + 0x08, 0x01, 0x09, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0b, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x0e, 0x01, + 0x0f, 0x01, 0x10, 0x01, 0x11, 0x01, 0x12, 0x01, 0x13, 0x01, 0x14, 0x01, 0x15, 0x01, 0x15, 0x01, + 0x16, 0x01, 0x17, 0x01, 0x18, 0x01, 0xd4, 0x00, 0x19, 0x01, 0x1a, 0x01, 0xd4, 0x00, 0x1b, 0x01, + 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, + 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, + 0x1d, 0x01, 0xd4, 0x00, 0x1e, 0x01, 0x1f, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x21, 0x01, + 0xd4, 0x00, 0x22, 0x01, 0x1c, 0x01, 0x23, 0x01, 0xd4, 0x00, 0x24, 0x01, 0x25, 0x01, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0x26, 0x01, 0x8f, 0x00, 0x27, 0x01, 0x8f, 0x00, 0x14, 0x01, 0x14, 0x01, + 0x14, 0x01, 0x28, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x29, 0x01, 0x14, 0x01, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x2a, 0x01, 0x2b, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0x2c, 0x01, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x2d, 0x01, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0x2e, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x2f, 0x01, 0x30, 0x01, + 0x14, 0x01, 0x31, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0x32, 0x01, 0x1c, 0x01, 0x33, 0x01, 0x1c, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, + 0x34, 0x01, 0x35, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x36, 0x01, 0x1c, 0x01, 0x37, 0x01, + 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, + 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, 0x1c, 0x01, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x1c, 0x01, 0x38, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0x39, 0x01, + 0xd4, 0x00, 0x3a, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0x0b, 0x00, 0x0b, 0x00, 0x3b, 0x01, 0x0d, 0x00, 0x0d, 0x00, 0x3c, 0x01, 0x3d, 0x01, 0x3e, 0x01, + 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x3f, 0x01, 0x40, 0x01, + 0x0d, 0x00, 0x0d, 0x00, 0x41, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x42, 0x01, 0x43, 0x01, + 0x4f, 0x00, 0x44, 0x01, 0x45, 0x01, 0x45, 0x01, 0x45, 0x01, 0x45, 0x01, 0x22, 0x00, 0x22, 0x00, + 0x46, 0x01, 0x47, 0x01, 0x48, 0x01, 0x49, 0x01, 0x4a, 0x01, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0xd4, 0x00, 0x4b, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x4c, 0x01, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x4d, 0x01, 0x8f, 0x00, 0x4e, 0x01, + 0x4f, 0x01, 0x50, 0x01, 0x51, 0x01, 0x52, 0x01, 0x8b, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x53, 0x01, 0xb5, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x54, 0x01, + 0x55, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0x8b, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0xcb, 0x00, 0x56, 0x01, 0x4f, 0x00, 0x57, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0x4c, 0x01, 0x4f, 0x00, + 0x20, 0x01, 0x58, 0x01, 0x59, 0x01, 0x20, 0x01, 0x5a, 0x01, 0x5b, 0x01, 0x20, 0x01, 0x5c, 0x01, + 0x59, 0x01, 0x20, 0x01, 0x20, 0x01, 0x5d, 0x01, 0x5e, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x5f, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x60, 0x01, 0x20, 0x01, 0x61, 0x01, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xca, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x62, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x9a, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x26, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0xe8, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x63, 0x01, 0x4f, 0x00, 0x64, 0x01, 0x8f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x65, 0x01, 0x66, 0x01, + 0x0f, 0x00, 0x67, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x68, 0x01, 0x69, 0x01, + 0x21, 0x00, 0x6a, 0x01, 0x6b, 0x01, 0x6c, 0x01, 0x0f, 0x00, 0x0f, 0x00, 0x0f, 0x00, 0x6d, 0x01, + 0x6e, 0x01, 0x6f, 0x01, 0x70, 0x01, 0x71, 0x01, 0x72, 0x01, 0x8f, 0x00, 0x8f, 0x00, 0x73, 0x01, + 0x74, 0x01, 0x4f, 0x00, 0x75, 0x01, 0x76, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x77, 0x01, + 0x78, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0x79, 0x01, 0x7a, 0x01, 0xc3, 0x00, 0x22, 0x00, 0x7b, 0x01, + 0xe2, 0x00, 0x4f, 0x00, 0x7c, 0x01, 0x4f, 0x00, 0x7d, 0x01, 0x7e, 0x01, 0x4f, 0x00, 0x9a, 0x00, + 0x4e, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x7f, 0x01, 0x80, 0x01, 0x81, 0x01, 0x82, 0x01, 0x83, 0x01, + 0x4f, 0x00, 0x4f, 0x00, 0x84, 0x01, 0x85, 0x01, 0x86, 0x01, 0x87, 0x01, 0x4f, 0x00, 0x88, 0x01, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x89, 0x01, 0x8a, 0x01, 0x8b, 0x01, 0x8c, 0x01, 0x8d, 0x01, + 0x8e, 0x01, 0x8f, 0x01, 0x45, 0x01, 0x0d, 0x00, 0x0d, 0x00, 0x90, 0x01, 0x91, 0x01, 0x0d, 0x00, + 0x0d, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x92, 0x01, 0xc3, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x93, 0x01, 0x4f, 0x00, 0x94, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0xd1, 0x00, + 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, 0x95, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xcf, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xd2, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x97, 0x01, 0x98, 0x01, 0x99, 0x01, 0x9a, 0x01, 0x9b, 0x01, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x9c, 0x01, 0x9d, 0x01, 0x9e, 0x01, 0x32, 0x00, 0x32, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x9f, 0x01, 0x4a, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, + 0x32, 0x00, 0xa0, 0x01, 0x32, 0x00, 0x32, 0x00, 0xa1, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0xa2, 0x01, + 0x22, 0x00, 0xa3, 0x01, 0x22, 0x00, 0xa4, 0x01, 0xa5, 0x01, 0xa6, 0x01, 0xa7, 0x01, 0xa8, 0x01, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0xa9, 0x01, + 0xaa, 0x01, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0xab, 0x01, 0xac, 0x01, 0xad, 0x01, + 0x4f, 0x00, 0xae, 0x01, 0x4f, 0x00, 0xcb, 0x00, 0xaf, 0x01, 0xb0, 0x01, 0xb1, 0x01, 0xb2, 0x01, + 0xb3, 0x01, 0x4f, 0x00, 0xaf, 0x00, 0xb4, 0x01, 0xcf, 0x00, 0xcf, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x57, 0x01, + 0xb5, 0x01, 0xb6, 0x01, 0xb6, 0x01, 0xb7, 0x01, 0xb8, 0x01, 0xb8, 0x01, 0xb8, 0x01, 0xb9, 0x01, + 0xba, 0x01, 0x4e, 0x01, 0xbb, 0x01, 0x8f, 0x00, 0x8f, 0x00, 0x20, 0x01, 0x20, 0x01, 0xbc, 0x01, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x9a, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x67, 0x00, 0xbd, 0x01, 0xbe, 0x01, + 0x4f, 0x00, 0x4f, 0x00, 0xbf, 0x01, 0x4f, 0x00, 0xc0, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0xc1, 0x01, + 0x4f, 0x00, 0xc2, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0xc3, 0x01, 0xc4, 0x01, 0x8f, 0x00, 0x8f, 0x00, + 0x0b, 0x00, 0x0b, 0x00, 0xc5, 0x01, 0x0d, 0x00, 0x0d, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0xcf, 0x00, 0xc3, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0xc6, 0x01, 0x0d, 0x00, 0xc7, 0x01, + 0x4f, 0x00, 0x4f, 0x00, 0xc8, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xc9, 0x01, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x44, 0x01, 0x4f, 0x00, 0xca, 0x00, 0xc8, 0x01, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0xca, 0x01, 0x32, 0x00, 0x32, 0x00, 0xcb, 0x01, 0x32, 0x00, 0xcc, 0x01, 0x32, 0x00, 0xcd, 0x01, + 0x32, 0x00, 0xce, 0x01, 0xcf, 0x01, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x32, 0x00, 0xd0, 0x01, + 0x32, 0x00, 0xd1, 0x01, 0x32, 0x00, 0xd2, 0x01, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0xd3, 0x01, 0xd4, 0x01, 0xd5, 0x01, 0xd4, 0x01, 0xd4, 0x01, + 0xd6, 0x01, 0xd7, 0x01, 0x32, 0x00, 0xd8, 0x01, 0xd9, 0x01, 0xda, 0x01, 0x32, 0x00, 0xdb, 0x01, + 0x32, 0x00, 0xdc, 0x01, 0x4a, 0x00, 0x4a, 0x00, 0xdd, 0x01, 0x32, 0x00, 0xde, 0x01, 0xdf, 0x01, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0xe0, 0x01, 0x32, 0x00, 0xe1, 0x01, 0x32, 0x00, 0xe2, 0x01, + 0x32, 0x00, 0xe3, 0x01, 0xe4, 0x01, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0xe5, 0x01, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0xe6, 0x01, 0xe6, 0x01, 0xe6, 0x01, 0xe7, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0xe8, 0x01, 0xe9, 0x01, + 0x32, 0x00, 0x32, 0x00, 0xea, 0x01, 0xeb, 0x01, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x14, 0x01, 0xec, 0x01, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x32, 0x00, 0xdc, 0x01, 0xed, 0x01, 0x32, 0x00, 0x40, 0x00, 0xee, 0x01, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x32, 0x00, 0xef, 0x01, + 0xf0, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0xf1, 0x01, 0xf2, 0x01, 0xf3, 0x01, 0xf4, 0x01, 0xf5, 0x01, + 0xe0, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xf6, 0x01, 0xf7, 0x01, 0x4f, 0x00, 0xc7, 0x00, 0xc3, 0x00, + 0xf8, 0x01, 0x4f, 0x00, 0xf9, 0x01, 0xfa, 0x01, 0xfb, 0x01, 0x4f, 0x00, 0x4f, 0x00, 0xfc, 0x01, + 0xe0, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xfd, 0x01, 0xfe, 0x01, 0xff, 0x01, 0x00, 0x02, 0x01, 0x02, + 0x4f, 0x00, 0x64, 0x00, 0x02, 0x02, 0x03, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x04, 0x02, 0x05, 0x02, 0x06, 0x02, 0x4f, 0x00, 0x4f, 0x00, 0x07, 0x02, 0x08, 0x02, 0xc3, 0x00, + 0x09, 0x02, 0x56, 0x00, 0x57, 0x00, 0x0a, 0x02, 0x0b, 0x02, 0x0c, 0x02, 0x0d, 0x02, 0x0e, 0x02, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x0f, 0x02, 0x10, 0x02, 0x11, 0x02, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x12, 0x02, 0x13, 0x02, 0xc3, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x14, 0x02, 0x15, 0x02, 0x16, 0x02, 0x17, 0x02, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x18, 0x02, 0x19, 0x02, 0xc3, 0x00, 0x1a, 0x02, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x1b, 0x02, 0x1c, 0x02, 0xc3, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0xb0, 0x00, 0x1d, 0x02, 0x1e, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x02, 0x02, 0x1f, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0d, 0x00, 0x97, 0x00, 0x20, 0x02, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x21, 0x02, 0x4f, 0x00, 0x4f, 0x00, 0x22, 0x02, 0x23, 0x02, 0x8f, 0x00, + 0x24, 0x02, 0x4f, 0x00, 0x4f, 0x00, 0x25, 0x02, 0x26, 0x02, 0x27, 0x02, 0x4f, 0x00, 0x4f, 0x00, + 0x28, 0x02, 0x29, 0x02, 0x2a, 0x02, 0x8f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xc7, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x57, 0x00, 0x4f, 0x00, 0x14, 0x02, 0x2b, 0x02, 0x2c, 0x02, 0x97, 0x00, 0xb2, 0x00, 0x2d, 0x02, + 0x4f, 0x00, 0x2e, 0x02, 0x2f, 0x02, 0x30, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x31, 0x02, 0x4f, 0x00, 0x4f, 0x00, 0x32, 0x02, 0x33, 0x02, 0xc3, 0x00, 0x34, 0x02, 0x4f, 0x00, + 0x35, 0x02, 0x36, 0x02, 0xc3, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x4f, 0x00, 0x37, 0x02, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0xb6, 0x01, 0x38, 0x02, 0x39, 0x02, 0x3a, 0x02, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0xd2, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x15, 0x01, 0x15, 0x01, 0x15, 0x01, 0x15, 0x01, 0x15, 0x01, 0x15, 0x01, 0x3b, 0x02, 0x3c, 0x02, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x93, 0x01, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0xcb, 0x00, 0x3d, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x44, 0x01, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xc7, 0x00, 0x4f, 0x00, 0xcb, 0x00, 0x81, 0x01, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x4f, 0x00, 0xcf, 0x00, 0x3e, 0x02, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x3f, 0x02, 0x40, 0x02, 0x41, 0x02, 0x42, 0x02, 0x43, 0x02, + 0x4f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x0b, 0x00, 0x0b, 0x00, 0x0d, 0x00, 0x0d, 0x00, + 0xb6, 0x01, 0x44, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x45, 0x02, 0x46, 0x02, 0x47, 0x02, 0x47, 0x02, + 0x48, 0x02, 0x49, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x4a, 0x02, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xc8, 0x01, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4b, 0x02, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0xcb, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x4b, 0x02, 0x4c, 0x02, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xd1, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x57, 0x01, 0x9a, 0x00, + 0xc7, 0x00, 0x4d, 0x02, 0x4e, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x4f, 0x02, + 0x20, 0x01, 0x20, 0x01, 0x50, 0x02, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x51, 0x02, 0x52, 0x02, + 0x53, 0x02, 0x20, 0x01, 0x54, 0x02, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x55, 0x02, 0x8f, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x56, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0xb6, 0x01, 0x57, 0x02, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x26, 0x01, 0xb6, 0x01, 0x58, 0x02, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x0b, 0x00, 0x59, 0x02, 0x0d, 0x00, 0x5a, 0x02, 0x5b, 0x02, 0x5c, 0x02, 0xf6, 0x00, 0x0b, 0x00, + 0x5d, 0x02, 0x5e, 0x02, 0x5f, 0x02, 0x60, 0x02, 0x61, 0x02, 0x0b, 0x00, 0x59, 0x02, 0x0d, 0x00, + 0x62, 0x02, 0x63, 0x02, 0x0d, 0x00, 0x64, 0x02, 0x65, 0x02, 0x66, 0x02, 0x67, 0x02, 0x0b, 0x00, + 0x68, 0x02, 0x0d, 0x00, 0x0b, 0x00, 0x59, 0x02, 0x0d, 0x00, 0x5a, 0x02, 0x5b, 0x02, 0x0d, 0x00, + 0xf6, 0x00, 0x0b, 0x00, 0x5d, 0x02, 0x67, 0x02, 0x0b, 0x00, 0x68, 0x02, 0x0d, 0x00, 0x0b, 0x00, + 0x59, 0x02, 0x0d, 0x00, 0x69, 0x02, 0x0b, 0x00, 0x6a, 0x02, 0x6b, 0x02, 0x6c, 0x02, 0x6d, 0x02, + 0x0d, 0x00, 0x6e, 0x02, 0x0b, 0x00, 0x6f, 0x02, 0x70, 0x02, 0x71, 0x02, 0x72, 0x02, 0x0d, 0x00, + 0x73, 0x02, 0x0b, 0x00, 0x74, 0x02, 0x0d, 0x00, 0x75, 0x02, 0x76, 0x02, 0x76, 0x02, 0x76, 0x02, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, + 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x77, 0x02, 0x22, 0x00, 0x22, 0x00, 0x78, 0x02, 0x79, 0x02, + 0x7a, 0x02, 0x7b, 0x02, 0x7c, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x7d, 0x02, 0x7e, 0x02, 0x7f, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x9a, 0x00, 0x80, 0x02, 0x81, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x82, 0x02, 0x83, 0x02, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, + 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x32, 0x00, 0x84, 0x02, 0x85, 0x02, 0x4a, 0x00, 0x4a, 0x00, + 0xe6, 0x01, 0xe6, 0x01, 0x86, 0x02, 0xe8, 0x01, 0x87, 0x02, 0x88, 0x02, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x89, 0x02, + 0xd4, 0x01, 0xd4, 0x01, 0x8a, 0x02, 0x8b, 0x02, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x89, 0x02, 0xd4, 0x01, 0x8c, 0x02, 0x8d, 0x02, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x8e, 0x02, 0x32, 0x00, 0x8f, 0x02, 0x90, 0x02, 0x91, 0x02, 0x92, 0x02, 0x93, 0x02, 0x94, 0x02, + 0x95, 0x02, 0x96, 0x02, 0x97, 0x02, 0x96, 0x02, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x98, 0x02, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, 0x4a, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0x4e, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0x4c, 0x01, 0x99, 0x02, 0x9a, 0x02, 0x9a, 0x02, 0x9a, 0x02, 0xd4, 0x00, 0x4d, 0x01, + 0x9b, 0x02, 0x20, 0x01, 0x61, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x9c, 0x02, 0x20, 0x01, + 0x20, 0x01, 0x20, 0x01, 0x9d, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x9e, 0x02, 0x20, 0x01, + 0x9f, 0x02, 0x20, 0x01, 0x20, 0x01, 0xa0, 0x02, 0x55, 0x02, 0xa1, 0x02, 0x4d, 0x01, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xa2, 0x02, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x4d, 0x01, 0xa3, 0x02, 0x27, 0x01, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x4c, 0x01, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xa4, 0x02, 0x4e, 0x01, 0x8f, 0x00, + 0x4e, 0x01, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xa5, 0x02, 0xb3, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xa5, 0x02, 0xd4, 0x00, 0xa6, 0x02, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0xa7, 0x02, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xa8, 0x02, + 0xd4, 0x00, 0xd4, 0x00, 0xa9, 0x02, 0xd4, 0x00, 0xaa, 0x02, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, + 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0xd4, 0x00, 0x4c, 0x01, 0xa6, 0x02, 0xab, 0x02, + 0xac, 0x02, 0x4d, 0x01, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0xad, 0x02, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x44, 0x01, 0x8f, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0xd0, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0xcf, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0xae, 0x02, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, + 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x4f, 0x00, 0x67, 0x00, 0x8f, 0x00, + 0x4f, 0x00, 0xcf, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, 0x8f, 0x00, + 0xaf, 0x02, 0x0b, 0x01, 0xb0, 0x02, 0xb0, 0x02, 0xb0, 0x02, 0xb0, 0x02, 0xb0, 0x02, 0xb0, 0x02, + 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, + 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, + 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x22, 0x00, 0x0b, 0x01, + 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, + 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, + 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, + 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, 0x0b, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, + 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0x96, 0x01, 0xb1, 0x02 }; - private static ReadOnlySpan CategoryLevel3Index => new byte[10800] + private static ReadOnlySpan CategoryCasingLevel3Index => new byte[11040] { - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x02, 0x04, 0x03, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x03, 0x03, 0x02, - 0x05, 0x06, 0x06, 0x07, 0x08, 0x07, 0x06, 0x06, 0x09, 0x0a, 0x06, 0x0b, 0x0c, 0x0d, 0x0c, 0x0c, - 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0c, 0x06, 0x0f, 0x0f, 0x0f, 0x06, - 0x06, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x09, 0x06, 0x0a, 0x11, 0x12, - 0x11, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x09, 0x0f, 0x0a, 0x0f, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x14, 0x06, 0x08, 0x08, 0x08, 0x08, 0x15, 0x06, 0x11, 0x15, 0x16, 0x17, 0x0f, 0x18, 0x15, 0x11, - 0x19, 0x1a, 0x1b, 0x1b, 0x11, 0x13, 0x06, 0x06, 0x11, 0x1b, 0x16, 0x1c, 0x1d, 0x1d, 0x1d, 0x06, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x0f, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, - 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x13, - 0x13, 0x10, 0x10, 0x13, 0x10, 0x13, 0x10, 0x10, 0x13, 0x10, 0x10, 0x10, 0x13, 0x13, 0x10, 0x10, - 0x10, 0x10, 0x13, 0x10, 0x10, 0x13, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x10, 0x10, 0x13, 0x10, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x10, 0x13, 0x10, 0x13, 0x13, 0x10, 0x13, 0x10, 0x10, - 0x13, 0x10, 0x10, 0x10, 0x13, 0x10, 0x13, 0x10, 0x10, 0x13, 0x13, 0x16, 0x10, 0x13, 0x13, 0x13, - 0x16, 0x16, 0x16, 0x16, 0x10, 0x1e, 0x13, 0x10, 0x1e, 0x13, 0x10, 0x1e, 0x13, 0x10, 0x13, 0x10, - 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x13, 0x10, 0x13, - 0x13, 0x10, 0x1e, 0x13, 0x10, 0x13, 0x10, 0x10, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x10, 0x13, 0x10, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x13, 0x10, 0x10, 0x13, - 0x13, 0x10, 0x13, 0x10, 0x10, 0x10, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x16, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x20, 0x20, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, - 0x1f, 0x1f, 0x11, 0x11, 0x11, 0x11, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x1f, 0x1f, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x20, 0x11, 0x1f, 0x11, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x10, 0x13, 0x10, 0x13, 0x20, 0x11, 0x10, 0x13, 0x00, 0x00, 0x1f, 0x13, 0x13, 0x13, 0x06, 0x10, - 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x10, 0x06, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, - 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, - 0x13, 0x13, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x10, 0x13, 0x0f, 0x10, 0x13, 0x10, 0x10, 0x13, 0x13, 0x10, 0x10, 0x10, - 0x10, 0x13, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x23, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x10, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x13, - 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x1f, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x24, 0x25, 0x00, 0x00, 0x15, 0x15, 0x08, - 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x26, 0x21, - 0x27, 0x21, 0x21, 0x27, 0x21, 0x21, 0x27, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x28, - 0x28, 0x28, 0x28, 0x27, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x0f, 0x0f, 0x2a, 0x07, 0x07, 0x2b, 0x0c, 0x2c, 0x15, 0x15, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x2c, 0x2d, 0x00, 0x2c, 0x2c, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2f, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x07, 0x31, 0x31, 0x2c, 0x2e, 0x2e, - 0x21, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2c, 0x2e, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x29, 0x15, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x2f, 0x2f, 0x21, 0x21, 0x15, 0x21, 0x21, 0x21, 0x21, 0x2e, 0x2e, - 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x2e, 0x2e, 0x2e, 0x32, 0x32, 0x2e, - 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x00, 0x2d, - 0x2e, 0x21, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x34, 0x34, 0x15, 0x06, 0x06, 0x06, 0x34, 0x00, 0x00, 0x21, 0x35, 0x35, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x21, 0x21, 0x21, 0x21, 0x34, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x34, 0x21, 0x21, 0x21, 0x34, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x00, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x21, 0x21, 0x21, 0x00, 0x00, 0x27, 0x00, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x29, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x36, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x36, 0x21, 0x16, 0x36, 0x36, - 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, 0x36, 0x36, 0x21, 0x36, 0x36, - 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x21, 0x21, 0x24, 0x24, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, - 0x24, 0x1f, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x21, 0x36, 0x36, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, - 0x16, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x00, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x21, 0x16, 0x36, 0x36, - 0x36, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x36, 0x36, 0x21, 0x16, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x00, 0x16, - 0x16, 0x16, 0x21, 0x21, 0x00, 0x00, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, - 0x16, 0x16, 0x08, 0x08, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x22, 0x08, 0x16, 0x24, 0x21, 0x00, - 0x00, 0x21, 0x21, 0x36, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x16, - 0x16, 0x00, 0x16, 0x16, 0x00, 0x16, 0x16, 0x00, 0x16, 0x16, 0x00, 0x00, 0x21, 0x00, 0x36, 0x36, - 0x36, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x21, 0x21, 0x00, 0x00, 0x21, 0x21, 0x21, 0x00, 0x00, - 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, - 0x21, 0x21, 0x16, 0x16, 0x16, 0x21, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x21, 0x21, 0x36, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, - 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x00, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x21, 0x16, 0x36, 0x36, - 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x21, 0x21, 0x36, 0x00, 0x36, 0x36, 0x21, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x00, 0x21, 0x36, 0x36, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, - 0x16, 0x00, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x21, 0x16, 0x36, 0x21, - 0x36, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x36, 0x36, 0x21, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x36, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x00, 0x16, - 0x22, 0x16, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x21, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, - 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x16, - 0x00, 0x00, 0x00, 0x16, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, - 0x21, 0x36, 0x36, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x00, 0x36, 0x36, 0x36, 0x21, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x38, 0x38, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x08, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x36, 0x36, 0x36, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, - 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x16, 0x21, 0x21, - 0x21, 0x36, 0x36, 0x36, 0x36, 0x00, 0x21, 0x21, 0x21, 0x00, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x21, 0x00, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x22, - 0x16, 0x21, 0x36, 0x36, 0x24, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x21, 0x16, 0x36, 0x39, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x39, 0x36, 0x36, 0x00, 0x36, 0x36, 0x21, 0x21, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, - 0x00, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x21, 0x36, 0x36, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x16, 0x36, 0x36, - 0x36, 0x21, 0x21, 0x21, 0x21, 0x00, 0x36, 0x36, 0x36, 0x00, 0x36, 0x36, 0x36, 0x21, 0x16, 0x22, - 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x36, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x16, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x22, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x00, 0x00, 0x36, 0x36, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x36, - 0x36, 0x36, 0x21, 0x21, 0x21, 0x00, 0x21, 0x00, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x00, 0x00, 0x36, 0x36, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x21, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x08, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x1f, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x00, 0x16, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x00, 0x00, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, - 0x16, 0x21, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x21, 0x21, 0x16, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x1f, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x22, 0x22, 0x22, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x24, 0x24, 0x24, 0x22, 0x24, 0x22, 0x22, 0x22, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x22, 0x21, 0x22, 0x21, 0x22, 0x21, 0x09, 0x0a, 0x09, 0x0a, 0x36, 0x36, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, - 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x22, 0x22, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x22, 0x22, 0x22, 0x22, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x36, 0x36, 0x21, 0x21, 0x21, - 0x21, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x21, 0x36, 0x36, 0x21, 0x21, 0x16, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x36, 0x36, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, - 0x21, 0x16, 0x36, 0x36, 0x36, 0x16, 0x16, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x16, 0x16, - 0x16, 0x21, 0x21, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x21, 0x36, 0x36, 0x21, 0x21, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x16, 0x36, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x36, 0x36, 0x36, 0x21, 0x22, 0x22, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x24, 0x1f, 0x13, 0x13, 0x13, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, - 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, - 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x21, 0x21, 0x21, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, - 0x25, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x24, 0x24, 0x16, - 0x05, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x09, 0x0a, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x24, 0x24, 0x24, 0x3a, 0x3a, - 0x3a, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, - 0x16, 0x16, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x21, 0x21, 0x21, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x00, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, 0x24, 0x1f, 0x24, 0x24, 0x24, 0x08, 0x16, 0x21, 0x00, 0x00, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x25, 0x06, 0x06, 0x06, 0x06, 0x21, 0x21, 0x21, 0x18, 0x00, - 0x16, 0x16, 0x16, 0x1f, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, - 0x21, 0x21, 0x21, 0x36, 0x36, 0x36, 0x36, 0x21, 0x21, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x21, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x06, 0x06, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x00, 0x00, 0x00, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x36, 0x36, 0x21, 0x00, 0x00, 0x24, 0x24, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x36, 0x21, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, - 0x21, 0x36, 0x21, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x21, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x1f, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x00, - 0x21, 0x21, 0x21, 0x21, 0x36, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x21, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x21, 0x36, 0x36, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, - 0x21, 0x21, 0x36, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x36, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, 0x21, 0x21, 0x36, 0x21, 0x21, 0x21, 0x16, 0x16, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x36, 0x21, 0x21, 0x36, 0x36, 0x36, 0x21, 0x36, 0x21, - 0x21, 0x21, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, - 0x16, 0x16, 0x16, 0x16, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, 0x21, 0x21, 0x00, 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x24, 0x24, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x21, 0x21, 0x24, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x21, 0x16, 0x16, - 0x16, 0x16, 0x36, 0x36, 0x21, 0x16, 0x16, 0x36, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x1f, 0x1f, 0x1f, 0x1f, + 0x02, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x03, 0x05, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x03, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x03, 0x03, 0x07, 0x07, 0x07, 0x03, + 0x03, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x05, 0x03, 0x06, 0x0b, 0x0c, + 0x0b, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x05, 0x07, 0x06, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x03, 0x04, 0x04, 0x04, 0x04, 0x0e, 0x03, 0x0b, 0x0e, 0x0f, 0x10, 0x07, 0x11, 0x0e, 0x0b, + 0x0e, 0x07, 0x12, 0x12, 0x0b, 0x0d, 0x03, 0x03, 0x0b, 0x12, 0x0f, 0x13, 0x12, 0x12, 0x12, 0x03, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x07, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x07, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, + 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, + 0x0d, 0x0a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0d, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0d, 0x0a, 0x0a, 0x0d, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0d, 0x0a, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, + 0x0d, 0x0a, 0x0a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0d, 0x0d, 0x0f, 0x0a, 0x0d, 0x0d, 0x0d, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0a, 0x14, 0x0d, 0x0a, 0x14, 0x0d, 0x0a, 0x14, 0x0d, 0x0a, 0x0d, 0x0a, + 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0a, 0x0d, + 0x0d, 0x0a, 0x14, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0d, 0x0a, 0x0a, 0x0d, + 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0f, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x0b, 0x0b, 0x0b, 0x0b, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x15, 0x15, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x16, 0x0b, 0x15, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x0a, 0x0d, 0x0a, 0x0d, 0x16, 0x0b, 0x0a, 0x0d, 0x18, 0x18, 0x15, 0x0d, 0x0d, 0x0d, 0x03, 0x0a, + 0x18, 0x18, 0x18, 0x18, 0x0b, 0x0b, 0x0a, 0x03, 0x0a, 0x0a, 0x0a, 0x18, 0x0a, 0x18, 0x0a, 0x0a, + 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, + 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0d, 0x07, 0x0a, 0x0d, 0x0a, 0x0a, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0d, 0x19, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1a, 0x1a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x0a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, + 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x18, 0x15, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x1b, 0x08, 0x18, 0x18, 0x0e, 0x0e, 0x04, + 0x1c, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1d, 0x17, + 0x1e, 0x17, 0x17, 0x1e, 0x17, 0x17, 0x1e, 0x17, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, - 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x1f, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x1e, 0x11, 0x13, 0x11, - 0x11, 0x11, 0x13, 0x13, 0x13, 0x00, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x1e, 0x11, 0x11, 0x11, - 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x00, 0x11, 0x11, 0x11, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, - 0x00, 0x00, 0x13, 0x13, 0x13, 0x00, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x1e, 0x11, 0x11, 0x00, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x18, 0x18, 0x18, 0x3b, 0x3c, - 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x06, 0x06, 0x17, 0x1c, 0x09, 0x17, 0x17, 0x1c, 0x09, 0x17, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x14, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x06, 0x06, 0x06, 0x06, 0x17, 0x1c, 0x06, 0x06, 0x06, 0x06, 0x12, - 0x12, 0x06, 0x06, 0x06, 0x44, 0x09, 0x0a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x0f, 0x06, 0x12, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x05, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x45, 0x46, 0x47, 0x48, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x1b, 0x1f, 0x00, 0x00, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x0b, 0x0b, 0x0f, 0x09, 0x0a, 0x1f, - 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x0b, 0x0b, 0x0f, 0x09, 0x0a, 0x00, - 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x00, 0x00, 0x00, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x23, 0x23, - 0x23, 0x21, 0x23, 0x23, 0x23, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x10, 0x15, 0x15, 0x15, 0x15, 0x10, 0x15, 0x15, 0x13, 0x10, 0x10, 0x10, 0x13, 0x13, - 0x10, 0x10, 0x10, 0x13, 0x15, 0x10, 0x15, 0x15, 0x0f, 0x10, 0x10, 0x10, 0x10, 0x10, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x10, 0x15, 0x10, 0x15, 0x10, 0x15, 0x10, 0x10, 0x10, 0x10, 0x19, 0x13, - 0x10, 0x10, 0x10, 0x10, 0x13, 0x16, 0x16, 0x16, 0x16, 0x13, 0x15, 0x15, 0x13, 0x13, 0x10, 0x10, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x10, 0x13, 0x13, 0x13, 0x13, 0x15, 0x0f, 0x15, 0x15, 0x13, 0x22, - 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, - 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, - 0x3a, 0x3a, 0x3a, 0x10, 0x13, 0x3a, 0x3a, 0x3a, 0x3a, 0x1d, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0f, 0x0f, 0x15, 0x15, 0x15, 0x15, - 0x0f, 0x15, 0x15, 0x0f, 0x15, 0x15, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0f, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0f, 0x0f, - 0x15, 0x15, 0x0f, 0x15, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x07, 0x07, 0x20, 0x03, 0x03, 0x21, 0x03, 0x1e, 0x0e, 0x0e, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1e, 0x22, 0x1c, 0x1e, 0x1e, + 0x23, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x03, 0x03, 0x03, 0x1e, 0x1f, 0x1f, + 0x17, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1e, 0x1f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x11, 0x0e, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x23, 0x23, 0x17, 0x17, 0x0e, 0x17, 0x17, 0x17, 0x17, 0x1f, 0x1f, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x1f, 0x1f, 0x1f, 0x24, 0x24, 0x1f, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1c, 0x22, + 0x1f, 0x17, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1c, 0x1c, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x23, 0x23, 0x0e, 0x03, 0x03, 0x03, 0x23, 0x1c, 0x1c, 0x17, 0x21, 0x21, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x17, 0x17, 0x17, 0x17, 0x23, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x23, 0x17, 0x17, 0x17, 0x23, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1c, 0x1c, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x17, 0x17, 0x17, 0x1c, 0x1c, 0x1e, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x11, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x26, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0b, 0x1a, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x09, 0x0a, 0x09, 0x0a, 0x15, 0x15, 0x15, 0x15, - 0x0f, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x09, 0x0a, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x15, 0x0f, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x22, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, - 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0f, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x22, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, - 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, - 0x1d, 0x1d, 0x1d, 0x1d, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x09, 0x0a, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, - 0x0f, 0x0f, 0x0f, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, - 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x09, 0x0a, 0x09, 0x0a, 0x0f, 0x0f, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x09, 0x0a, 0x0f, 0x0f, - 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, - 0x10, 0x13, 0x10, 0x10, 0x10, 0x13, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x10, 0x10, - 0x10, 0x13, 0x10, 0x13, 0x13, 0x10, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x1f, 0x1f, 0x10, 0x10, - 0x10, 0x13, 0x10, 0x13, 0x13, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x10, 0x13, 0x10, 0x13, 0x21, - 0x21, 0x21, 0x10, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x1d, 0x06, 0x06, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, - 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, - 0x06, 0x06, 0x17, 0x1c, 0x17, 0x1c, 0x06, 0x06, 0x06, 0x17, 0x1c, 0x06, 0x17, 0x1c, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x25, 0x06, 0x06, 0x25, 0x06, 0x17, 0x1c, 0x06, 0x06, - 0x17, 0x1c, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x06, 0x06, 0x06, 0x06, 0x06, 0x20, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x25, 0x25, 0x06, 0x06, 0x06, 0x06, - 0x25, 0x06, 0x09, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x05, 0x06, 0x06, 0x06, 0x15, 0x1f, 0x16, 0x3a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, - 0x09, 0x0a, 0x15, 0x15, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x25, 0x09, 0x0a, 0x0a, - 0x15, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, - 0x25, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x15, 0x15, 0x3a, 0x3a, 0x3a, 0x1f, 0x16, 0x06, 0x15, 0x15, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x21, 0x21, 0x11, 0x11, 0x1f, 0x1f, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x06, 0x1f, 0x1f, 0x1f, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x22, 0x22, 0x38, 0x38, 0x38, 0x38, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x15, 0x15, 0x00, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x15, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x15, 0x15, 0x15, 0x22, - 0x22, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x15, 0x15, 0x15, 0x15, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x15, 0x15, 0x15, 0x15, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x15, 0x15, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x15, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x1f, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x1f, 0x06, 0x06, 0x06, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x16, 0x21, - 0x23, 0x23, 0x23, 0x06, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x06, 0x20, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x1f, 0x1f, 0x21, 0x21, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, - 0x21, 0x21, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x11, 0x11, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x13, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x1f, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x10, 0x13, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x20, 0x49, 0x49, 0x10, 0x13, 0x10, 0x13, 0x16, - 0x10, 0x13, 0x10, 0x13, 0x13, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, - 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, 0x10, 0x13, 0x10, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x1f, 0x1f, 0x13, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x21, 0x16, 0x16, 0x16, 0x21, 0x16, 0x16, 0x16, 0x16, 0x21, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x36, 0x36, 0x21, 0x21, 0x36, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x22, 0x22, 0x08, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, - 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x24, 0x24, 0x24, 0x16, 0x24, 0x16, 0x16, 0x21, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x16, 0x16, 0x16, 0x21, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, 0x21, 0x36, 0x36, 0x36, - 0x36, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x1f, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x00, 0x00, 0x00, 0x00, 0x24, 0x24, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x1f, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, - 0x36, 0x21, 0x21, 0x36, 0x36, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x36, 0x00, 0x00, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x00, 0x00, 0x24, 0x24, 0x24, 0x24, - 0x1f, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x22, 0x22, 0x22, 0x16, 0x36, 0x21, 0x36, 0x16, 0x16, - 0x21, 0x16, 0x21, 0x21, 0x21, 0x16, 0x16, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, - 0x16, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x1f, 0x24, 0x24, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x36, 0x21, 0x21, 0x36, 0x36, - 0x24, 0x24, 0x16, 0x1f, 0x1f, 0x36, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, - 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x49, 0x1f, 0x1f, 0x1f, 0x1f, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x36, 0x36, 0x21, 0x36, 0x36, 0x21, 0x36, 0x36, 0x24, 0x36, 0x21, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, - 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x21, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x0b, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x28, 0x00, - 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - 0x2e, 0x2e, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, 0x4c, - 0x4c, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x0a, 0x09, - 0x00, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2b, 0x15, 0x00, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x09, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x25, 0x25, 0x12, 0x12, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x09, - 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x06, 0x06, 0x09, 0x0a, 0x06, 0x06, 0x06, 0x06, 0x12, 0x12, 0x12, - 0x0c, 0x06, 0x0c, 0x00, 0x06, 0x0c, 0x06, 0x06, 0x25, 0x09, 0x0a, 0x09, 0x0a, 0x09, 0x0a, 0x07, - 0x06, 0x06, 0x0b, 0x0d, 0x0f, 0x0f, 0x0f, 0x00, 0x06, 0x08, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x00, 0x18, - 0x00, 0x06, 0x06, 0x07, 0x08, 0x07, 0x06, 0x06, 0x09, 0x0a, 0x06, 0x0b, 0x0c, 0x0d, 0x0c, 0x0c, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x09, 0x0f, 0x0a, 0x0f, 0x09, - 0x0a, 0x06, 0x09, 0x0a, 0x06, 0x06, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x1f, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x1f, 0x1f, - 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, - 0x08, 0x08, 0x0f, 0x11, 0x15, 0x08, 0x08, 0x00, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x15, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x4d, 0x4d, 0x15, 0x15, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x00, 0x16, - 0x24, 0x06, 0x24, 0x00, 0x00, 0x00, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, - 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x1d, 0x1d, 0x1d, 0x1d, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x1d, 0x1d, 0x15, 0x22, 0x22, 0x00, - 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x00, 0x00, - 0x21, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, - 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, - 0x16, 0x3a, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x24, - 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x24, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x28, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x27, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x50, 0x50, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x28, 0x28, 0x28, 0x00, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x00, 0x00, 0x00, 0x06, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x28, 0x28, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x28, 0x21, 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x21, 0x21, 0x21, - 0x28, 0x28, 0x28, 0x28, 0x00, 0x28, 0x28, 0x28, 0x00, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x21, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4f, 0x4f, 0x27, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x4f, 0x4f, 0x4f, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x50, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x27, 0x27, 0x27, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, 0x51, - 0x51, 0x51, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, - 0x52, 0x52, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x2e, 0x2e, 0x2e, 0x2e, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, - 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x00, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x54, 0x54, 0x54, 0x54, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x21, 0x36, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, - 0x00, 0x00, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, - 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, - 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, 0x21, 0x21, 0x24, 0x24, 0x3b, 0x24, 0x24, - 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x00, - 0x21, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, - 0x24, 0x24, 0x24, 0x24, 0x16, 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x21, 0x24, 0x24, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, - 0x36, 0x16, 0x16, 0x16, 0x16, 0x24, 0x24, 0x24, 0x24, 0x21, 0x21, 0x21, 0x21, 0x24, 0x00, 0x00, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x16, 0x24, 0x16, 0x24, 0x24, 0x24, - 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x36, 0x36, 0x36, 0x21, - 0x21, 0x21, 0x36, 0x36, 0x21, 0x36, 0x21, 0x21, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x21, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, - 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x21, 0x36, 0x36, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, - 0x16, 0x00, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x21, 0x21, 0x16, 0x36, 0x36, - 0x21, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, 0x36, 0x36, 0x36, 0x00, 0x00, - 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x36, 0x36, 0x00, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x36, 0x36, 0x21, 0x21, 0x21, 0x36, 0x21, 0x16, 0x16, 0x16, 0x16, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x00, 0x24, 0x00, 0x24, 0x21, 0x00, - 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x36, 0x36, 0x36, 0x36, 0x21, - 0x21, 0x36, 0x21, 0x21, 0x16, 0x16, 0x24, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x36, - 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36, 0x21, 0x21, 0x36, 0x21, - 0x21, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x00, 0x00, - 0x36, 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, 0x21, 0x36, 0x21, - 0x21, 0x24, 0x24, 0x24, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x21, 0x36, 0x21, 0x36, 0x36, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x36, 0x36, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x38, 0x38, 0x24, 0x24, 0x24, 0x22, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x21, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, - 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x39, 0x39, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x16, 0x21, 0x21, 0x21, 0x21, 0x24, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x36, 0x21, 0x21, 0x21, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x16, 0x16, 0x16, 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x21, 0x21, 0x24, 0x24, 0x24, 0x16, 0x24, 0x24, - 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x36, 0x39, - 0x16, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x24, 0x24, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x00, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x36, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x36, 0x21, 0x21, 0x36, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x16, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x16, 0x16, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, - 0x21, 0x21, 0x00, 0x36, 0x36, 0x21, 0x36, 0x21, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x21, 0x21, 0x36, 0x36, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x3a, 0x00, - 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, 0x24, 0x24, 0x24, 0x22, 0x22, 0x22, 0x22, - 0x1f, 0x1f, 0x1f, 0x1f, 0x24, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x37, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, - 0x38, 0x38, 0x00, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, - 0x21, 0x21, 0x21, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, - 0x1f, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x00, 0x00, 0x22, 0x21, 0x21, 0x24, - 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x36, 0x36, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x36, 0x36, 0x36, - 0x36, 0x36, 0x36, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x21, 0x21, 0x21, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x10, 0x10, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x00, 0x10, 0x10, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x13, 0x00, 0x13, 0x00, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x00, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x00, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x55, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x0f, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x55, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x0f, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x55, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x0f, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x55, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x0f, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x55, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x0f, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x10, 0x13, 0x00, 0x00, 0x0e, 0x0e, - 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, 0x22, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x22, 0x21, 0x22, 0x22, 0x24, 0x24, 0x24, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x00, 0x21, 0x21, 0x00, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x51, 0x51, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, - 0x52, 0x52, 0x52, 0x52, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00, 0x00, 0x00, 0x00, 0x27, 0x27, - 0x00, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, - 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, - 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x32, 0x54, 0x54, 0x54, - 0x2b, 0x54, 0x54, 0x54, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x00, 0x2e, 0x2e, 0x00, 0x2e, 0x00, 0x00, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, - 0x00, 0x2e, 0x2e, 0x00, 0x2e, 0x00, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, 0x00, 0x2e, - 0x00, 0x2e, 0x2e, 0x00, 0x2e, 0x00, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x00, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x00, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, - 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1d, 0x1d, 0x00, 0x00, 0x00, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, - 0x15, 0x00, 0x00, 0x15, 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x15, 0x15, 0x15, 0x15, - 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x26, 0x17, 0x0f, 0x26, 0x26, + 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x26, 0x26, 0x17, 0x26, 0x26, + 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x17, 0x17, 0x1b, 0x1b, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x1b, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x17, 0x26, 0x26, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, + 0x0f, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x18, 0x0f, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x17, 0x0f, 0x26, 0x26, + 0x26, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x26, 0x26, 0x18, 0x18, 0x26, 0x26, 0x17, 0x0f, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x26, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x18, 0x0f, + 0x0f, 0x0f, 0x17, 0x17, 0x18, 0x18, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x0f, 0x0f, 0x04, 0x04, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x19, 0x04, 0x0f, 0x1b, 0x17, 0x18, + 0x18, 0x17, 0x17, 0x26, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x0f, + 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x18, 0x17, 0x18, 0x26, 0x26, + 0x26, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x18, 0x18, 0x17, 0x17, 0x17, 0x18, 0x18, + 0x18, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x17, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x17, 0x17, 0x26, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, + 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x17, 0x0f, 0x26, 0x26, + 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x17, 0x17, 0x26, 0x18, 0x26, 0x26, 0x17, 0x18, 0x18, + 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x1b, 0x04, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x18, 0x17, 0x26, 0x26, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, + 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x17, 0x0f, 0x26, 0x17, + 0x26, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x26, 0x26, 0x18, 0x18, 0x26, 0x26, 0x17, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x26, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x18, 0x0f, + 0x19, 0x0f, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x17, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x0f, 0x0f, + 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x18, 0x0f, 0x0f, + 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x26, 0x26, + 0x17, 0x26, 0x26, 0x18, 0x18, 0x18, 0x26, 0x26, 0x26, 0x18, 0x26, 0x26, 0x26, 0x17, 0x18, 0x18, + 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x28, 0x28, 0x28, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x04, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x17, 0x26, 0x26, 0x26, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, + 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x0f, 0x17, 0x17, + 0x17, 0x26, 0x26, 0x26, 0x26, 0x18, 0x17, 0x17, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x18, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1b, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x19, + 0x0f, 0x17, 0x26, 0x26, 0x1b, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x17, 0x0f, 0x26, 0x29, + 0x26, 0x26, 0x26, 0x26, 0x26, 0x18, 0x29, 0x26, 0x26, 0x18, 0x26, 0x26, 0x17, 0x17, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x26, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x18, + 0x18, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x26, 0x26, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x0f, 0x26, 0x26, + 0x26, 0x17, 0x17, 0x17, 0x17, 0x18, 0x26, 0x26, 0x26, 0x18, 0x26, 0x26, 0x26, 0x17, 0x0f, 0x19, + 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x26, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x0f, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x19, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x18, 0x18, 0x26, 0x26, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x17, 0x18, 0x18, 0x18, 0x18, 0x26, + 0x26, 0x26, 0x17, 0x17, 0x17, 0x18, 0x17, 0x18, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, + 0x18, 0x18, 0x26, 0x26, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x17, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x04, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1b, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x00, 0x00 + 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x17, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x0f, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x15, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x19, 0x19, 0x19, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, + 0x1b, 0x1b, 0x1b, 0x19, 0x1b, 0x19, 0x19, 0x19, 0x17, 0x17, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x19, 0x17, 0x19, 0x17, 0x19, 0x17, 0x05, 0x06, 0x05, 0x06, 0x26, 0x26, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, + 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x1b, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x17, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x19, 0x19, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x19, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x17, 0x17, 0x17, + 0x17, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x17, 0x17, 0x26, 0x26, 0x17, 0x17, 0x0f, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, + 0x17, 0x0f, 0x26, 0x26, 0x26, 0x0f, 0x0f, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x0f, 0x0f, + 0x0f, 0x17, 0x17, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x17, 0x26, 0x26, 0x17, 0x17, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x17, 0x0f, 0x26, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x26, 0x26, 0x26, 0x17, 0x19, 0x19, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x0a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0a, 0x18, 0x18, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x1b, 0x15, 0x0d, 0x0d, 0x0d, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, + 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, + 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x17, 0x17, 0x17, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x18, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, + 0x08, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x19, 0x1b, 0x0f, + 0x02, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x05, 0x06, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1b, 0x1b, 0x1b, 0x2a, 0x2a, + 0x2a, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, + 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x18, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x17, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x1b, 0x1b, 0x1b, 0x15, 0x1b, 0x1b, 0x1b, 0x04, 0x0f, 0x17, 0x18, 0x18, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x08, 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, 0x17, 0x11, 0x18, + 0x0f, 0x0f, 0x0f, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, + 0x17, 0x17, 0x17, 0x26, 0x26, 0x26, 0x26, 0x17, 0x17, 0x26, 0x26, 0x26, 0x18, 0x18, 0x18, 0x18, + 0x26, 0x26, 0x17, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x18, 0x18, 0x18, 0x03, 0x03, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x18, 0x18, 0x18, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x26, 0x26, 0x17, 0x18, 0x18, 0x1b, 0x1b, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x17, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, + 0x17, 0x26, 0x17, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x17, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x15, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x18, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1a, 0x18, + 0x17, 0x17, 0x17, 0x17, 0x26, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x17, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x17, 0x26, 0x26, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, + 0x1b, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x26, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x26, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x17, 0x17, 0x26, 0x17, 0x17, 0x17, 0x0f, 0x0f, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x26, 0x17, 0x17, 0x26, 0x26, 0x26, 0x17, 0x26, 0x17, + 0x17, 0x17, 0x26, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1b, 0x1b, 0x1b, 0x1b, + 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x17, 0x17, 0x18, 0x18, 0x18, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x1b, 0x1b, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x18, 0x0a, 0x0a, 0x0a, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x17, 0x1b, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x0f, 0x0f, 0x26, 0x17, 0x17, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x15, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x18, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x0a, 0x18, 0x0a, 0x18, 0x0a, 0x18, 0x0a, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x14, 0x0b, 0x0d, 0x0b, + 0x0b, 0x0b, 0x0d, 0x0d, 0x0d, 0x18, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x14, 0x0b, 0x0b, 0x0b, + 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x0b, 0x0b, 0x0b, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, 0x0b, 0x0b, + 0x18, 0x18, 0x0d, 0x0d, 0x0d, 0x18, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x14, 0x0b, 0x0b, 0x18, + 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x11, 0x11, 0x11, 0x2b, 0x22, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x03, 0x03, 0x10, 0x13, 0x05, 0x10, 0x10, 0x13, 0x05, 0x10, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x2c, 0x2d, 0x11, 0x11, 0x11, 0x11, 0x11, 0x02, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x10, 0x13, 0x03, 0x03, 0x03, 0x03, 0x0c, + 0x0c, 0x03, 0x03, 0x03, 0x07, 0x05, 0x06, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x07, 0x03, 0x0c, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x2e, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x12, 0x15, 0x18, 0x18, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x07, 0x07, 0x07, 0x05, 0x06, 0x15, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x07, 0x07, 0x07, 0x05, 0x06, 0x18, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x18, 0x18, 0x18, + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1a, 0x1a, 0x1a, + 0x1a, 0x17, 0x1a, 0x1a, 0x1a, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0a, 0x0e, 0x0e, 0x0e, 0x0e, 0x0a, 0x0e, 0x0e, 0x0d, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, + 0x0a, 0x0a, 0x0a, 0x0d, 0x0e, 0x0a, 0x0e, 0x0e, 0x07, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0a, 0x0e, 0x0a, 0x0e, 0x0a, 0x0e, 0x0a, 0x0a, 0x0a, 0x0a, 0x0e, 0x0d, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0d, 0x0e, 0x0e, 0x0d, 0x0d, 0x0a, 0x0a, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0e, 0x07, 0x0e, 0x0e, 0x0d, 0x19, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x2a, 0x2a, 0x2a, 0x0a, 0x0d, 0x2a, 0x2a, 0x2a, 0x2a, 0x12, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, + 0x07, 0x0e, 0x0e, 0x07, 0x0e, 0x0e, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x07, + 0x0e, 0x0e, 0x07, 0x0e, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x05, 0x06, 0x05, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, + 0x07, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x05, 0x06, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0e, 0x07, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x19, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x07, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x07, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x19, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, + 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, + 0x07, 0x07, 0x07, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x05, 0x06, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x0e, 0x0e, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, + 0x0a, 0x0d, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x15, 0x15, 0x0a, 0x0a, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0a, 0x0d, 0x0a, 0x0d, 0x17, + 0x17, 0x17, 0x0a, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x03, 0x03, 0x03, 0x03, 0x12, 0x03, 0x03, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x15, + 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, + 0x03, 0x03, 0x10, 0x13, 0x10, 0x13, 0x03, 0x03, 0x03, 0x10, 0x13, 0x03, 0x10, 0x13, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x08, 0x03, 0x03, 0x08, 0x03, 0x10, 0x13, 0x03, 0x03, + 0x10, 0x13, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x03, 0x03, 0x03, 0x03, 0x03, 0x16, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x08, 0x08, 0x03, 0x03, 0x03, 0x03, + 0x08, 0x03, 0x05, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, + 0x02, 0x03, 0x03, 0x03, 0x0e, 0x15, 0x0f, 0x2a, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, + 0x05, 0x06, 0x0e, 0x0e, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x08, 0x05, 0x06, 0x06, + 0x0e, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, + 0x08, 0x15, 0x15, 0x15, 0x15, 0x15, 0x0e, 0x0e, 0x2a, 0x2a, 0x2a, 0x15, 0x0f, 0x03, 0x0e, 0x0e, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x17, 0x17, 0x0b, 0x0b, 0x15, 0x15, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x15, 0x15, 0x15, 0x0f, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x19, 0x19, 0x28, 0x28, 0x28, 0x28, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0e, 0x0e, 0x18, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x0e, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0e, 0x0e, 0x0e, 0x19, + 0x19, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0e, 0x0e, 0x0e, 0x0e, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0e, 0x0e, 0x0e, 0x0e, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0e, 0x0e, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0e, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x03, 0x03, 0x03, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0f, 0x17, + 0x1a, 0x1a, 0x1a, 0x03, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x03, 0x16, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x15, 0x15, 0x17, 0x17, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, + 0x17, 0x17, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, + 0x0b, 0x0b, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x0d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x15, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0d, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x16, 0x2f, 0x2f, 0x0a, 0x0d, 0x0a, 0x0d, 0x0f, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0d, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, 0x0a, 0x0d, + 0x18, 0x18, 0x0a, 0x0d, 0x0a, 0x0a, 0x0a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x15, 0x15, 0x0d, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x17, 0x0f, 0x0f, 0x0f, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x17, 0x17, 0x26, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x19, 0x19, 0x04, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x03, 0x03, 0x03, 0x03, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x26, 0x26, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x26, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1b, 0x1b, + 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1b, 0x1b, 0x1b, 0x0f, 0x1b, 0x0f, 0x0f, 0x17, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1b, 0x1b, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x26, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1b, + 0x0f, 0x0f, 0x0f, 0x17, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x17, 0x17, 0x26, 0x26, + 0x26, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x15, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x18, 0x18, 0x18, 0x1b, 0x1b, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, + 0x26, 0x17, 0x17, 0x26, 0x26, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x26, 0x18, 0x18, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x18, 0x1b, 0x1b, 0x1b, 0x1b, + 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x19, 0x19, 0x19, 0x0f, 0x26, 0x17, 0x26, 0x0f, 0x0f, + 0x17, 0x0f, 0x17, 0x17, 0x17, 0x0f, 0x0f, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, + 0x0f, 0x17, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x15, 0x1b, 0x1b, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x17, 0x17, 0x26, 0x26, + 0x1b, 0x1b, 0x0f, 0x15, 0x15, 0x26, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, + 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x2f, 0x15, 0x15, 0x15, 0x15, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x17, 0x26, 0x26, 0x17, 0x26, 0x26, 0x1b, 0x26, 0x17, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1f, 0x17, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x07, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1c, + 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x06, 0x05, + 0x1c, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x21, 0x0e, 0x1c, 0x1c, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x05, 0x06, 0x03, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x03, 0x08, 0x08, 0x0c, 0x0c, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x05, + 0x06, 0x05, 0x06, 0x05, 0x06, 0x03, 0x03, 0x05, 0x06, 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, + 0x03, 0x03, 0x03, 0x18, 0x03, 0x03, 0x03, 0x03, 0x08, 0x05, 0x06, 0x05, 0x06, 0x05, 0x06, 0x03, + 0x03, 0x03, 0x07, 0x08, 0x07, 0x07, 0x07, 0x18, 0x03, 0x04, 0x03, 0x03, 0x18, 0x18, 0x18, 0x18, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x11, + 0x18, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x03, 0x05, 0x06, 0x03, 0x07, 0x03, 0x08, 0x03, 0x03, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x05, 0x07, 0x06, 0x07, 0x05, + 0x06, 0x03, 0x05, 0x06, 0x03, 0x03, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x15, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x15, 0x15, + 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, + 0x04, 0x04, 0x07, 0x0b, 0x0e, 0x04, 0x04, 0x18, 0x0e, 0x07, 0x07, 0x07, 0x07, 0x0e, 0x0e, 0x18, + 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x11, 0x11, 0x11, 0x0e, 0x0e, 0x2e, 0x2e, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x0f, + 0x1b, 0x03, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x12, 0x12, 0x12, 0x12, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x12, 0x12, 0x0e, 0x19, 0x19, 0x18, + 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x17, 0x18, 0x18, + 0x17, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x18, 0x18, 0x18, 0x18, + 0x28, 0x28, 0x28, 0x28, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, + 0x0f, 0x2a, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x2a, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x1b, + 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x1b, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x18, 0x18, 0x18, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1b, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1f, 0x1c, 0x1c, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1e, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x24, 0x24, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x1c, 0x1c, 0x1c, 0x03, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1e, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x34, 0x34, 0x1f, 0x1f, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x17, 0x17, 0x17, 0x1c, 0x17, 0x17, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x17, 0x17, 0x17, 0x17, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x17, 0x17, 0x17, 0x1c, 0x1c, 0x1c, 0x1c, 0x17, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x34, 0x34, 0x1e, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x24, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x17, 0x17, 0x1c, 0x1c, 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1e, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x1f, 0x1f, 0x1f, 0x1f, 0x17, 0x17, 0x17, 0x17, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x1c, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x17, 0x34, 0x34, 0x34, 0x34, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x26, 0x17, 0x26, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x18, + 0x18, 0x18, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, + 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x17, 0x17, 0x1b, 0x1b, 0x2b, 0x1b, 0x1b, + 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x2b, 0x18, 0x18, + 0x17, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, + 0x1b, 0x1b, 0x1b, 0x1b, 0x0f, 0x26, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x17, 0x1b, 0x1b, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, + 0x26, 0x0f, 0x0f, 0x0f, 0x0f, 0x1b, 0x1b, 0x1b, 0x1b, 0x17, 0x17, 0x17, 0x17, 0x1b, 0x18, 0x18, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x0f, 0x1b, 0x0f, 0x1b, 0x1b, 0x1b, + 0x18, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x26, 0x17, + 0x17, 0x17, 0x26, 0x26, 0x17, 0x26, 0x17, 0x17, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x17, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, + 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x26, 0x26, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, + 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x17, 0x17, 0x0f, 0x26, 0x26, + 0x17, 0x26, 0x26, 0x26, 0x26, 0x18, 0x18, 0x26, 0x26, 0x18, 0x18, 0x26, 0x26, 0x26, 0x18, 0x18, + 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x26, 0x26, 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x26, 0x26, 0x17, 0x17, 0x17, 0x26, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x1b, 0x18, 0x1b, 0x17, 0x0f, + 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x17, 0x26, 0x26, 0x26, 0x26, 0x17, + 0x17, 0x26, 0x17, 0x17, 0x0f, 0x0f, 0x1b, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x26, + 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x26, 0x26, 0x26, 0x26, 0x17, 0x17, 0x26, 0x17, + 0x17, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x18, 0x18, + 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x17, 0x26, 0x17, + 0x17, 0x1b, 0x1b, 0x1b, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x26, 0x17, 0x26, 0x26, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x17, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x28, 0x28, 0x1b, 0x1b, 0x1b, 0x19, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x17, 0x17, 0x1b, 0x18, 0x18, 0x18, 0x18, + 0x28, 0x28, 0x28, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x26, 0x26, 0x26, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x17, 0x17, 0x26, 0x26, 0x26, 0x26, + 0x17, 0x0f, 0x1b, 0x0f, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x29, 0x29, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x1b, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x26, 0x17, 0x17, 0x17, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x17, 0x17, 0x1b, 0x1b, 0x1b, 0x0f, 0x1b, 0x1b, + 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x26, 0x29, + 0x0f, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x1b, 0x1b, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x26, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x26, 0x17, 0x17, 0x26, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x17, 0x18, 0x17, 0x17, 0x18, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x0f, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x26, 0x26, 0x26, 0x26, 0x26, 0x18, + 0x17, 0x17, 0x18, 0x26, 0x26, 0x17, 0x26, 0x17, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x26, 0x26, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x04, 0x04, 0x04, + 0x04, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1b, + 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x2a, 0x18, + 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x19, 0x19, 0x19, 0x19, + 0x15, 0x15, 0x15, 0x15, 0x1b, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x28, 0x28, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x17, + 0x0f, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, + 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x03, 0x15, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x18, 0x18, 0x19, 0x17, 0x17, 0x1b, + 0x11, 0x11, 0x11, 0x11, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x26, 0x26, 0x17, 0x17, 0x17, 0x19, 0x19, 0x19, 0x26, 0x26, 0x26, + 0x26, 0x26, 0x26, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x19, 0x19, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x17, 0x17, 0x17, 0x17, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x17, 0x17, 0x17, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x28, 0x28, 0x28, 0x28, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x18, 0x0a, 0x0a, + 0x18, 0x18, 0x0a, 0x18, 0x18, 0x0a, 0x0a, 0x18, 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x0d, 0x18, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x18, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x18, 0x0a, 0x18, 0x18, 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x18, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x18, 0x18, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x37, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x07, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x37, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x07, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x37, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x07, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x37, + 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x07, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x37, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, + 0x0d, 0x0d, 0x0d, 0x07, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x0a, 0x0d, 0x18, 0x18, 0x09, 0x09, + 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x19, 0x19, 0x19, 0x19, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x17, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x19, 0x17, 0x19, 0x19, 0x1b, 0x1b, 0x1b, 0x1b, 0x1b, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x18, 0x17, 0x17, 0x18, 0x17, 0x17, 0x17, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x18, 0x18, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x18, 0x18, 0x18, 0x0f, 0x19, + 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x17, 0x17, 0x17, 0x17, + 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x27, 0x18, 0x18, 0x18, 0x18, 0x18, 0x04, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, + 0x36, 0x36, 0x36, 0x36, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x23, 0x1c, 0x1c, 0x1c, 0x1c, + 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x25, 0x1c, 0x1c, 0x1c, 0x1c, 0x1e, 0x1e, + 0x1c, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x24, 0x34, 0x34, 0x34, + 0x21, 0x34, 0x34, 0x34, 0x34, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x24, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x1c, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1c, 0x1f, 0x1f, 0x1c, 0x1f, 0x1c, 0x1c, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1c, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, 0x1f, 0x1c, 0x1f, 0x1c, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, + 0x1c, 0x1f, 0x1f, 0x1c, 0x1f, 0x1c, 0x1c, 0x1f, 0x1c, 0x1f, 0x1c, 0x1f, 0x1c, 0x1f, 0x1c, 0x1f, + 0x1c, 0x1f, 0x1f, 0x1c, 0x1f, 0x1c, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1c, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1c, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, + 0x07, 0x07, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, + 0x18, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x18, 0x18, 0x18, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, + 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, + 0x19, 0x19, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x18, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x0e, 0x0e, 0x0e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x2e, 0x2e, + 0x0f, 0x0f, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x2e, 0x11, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, 0x2e, + 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, + 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x2e, 0x2e }; - private static ReadOnlySpan CategoriesValue => new byte[172] + // Contains Unicode category & bidi class information + private static ReadOnlySpan CategoriesValues => new byte[56] { - 0x1d, 0x00, 0x0e, 0x0e, 0x0e, 0x10, 0x0e, 0x0f, 0x0e, 0x11, 0x0b, 0x11, 0x18, 0x12, 0x18, 0x0a, - 0x1a, 0x0a, 0x14, 0x12, 0x15, 0x12, 0x19, 0x09, 0x18, 0x0c, 0x13, 0x09, 0x08, 0x08, 0x19, 0x12, - 0x00, 0x00, 0x1b, 0x12, 0x12, 0x12, 0x01, 0x00, 0x0b, 0x0c, 0x1c, 0x12, 0x04, 0x00, 0x16, 0x12, - 0x0f, 0x0e, 0x1c, 0x0a, 0x19, 0x0a, 0x0a, 0x08, 0x17, 0x12, 0x0a, 0x12, 0x02, 0x00, 0x03, 0x00, - 0x03, 0x12, 0x05, 0x0d, 0x1c, 0x00, 0x07, 0x0d, 0x18, 0x00, 0x13, 0x12, 0x13, 0x03, 0x18, 0x03, - 0x04, 0x03, 0x0f, 0x0b, 0x19, 0x04, 0x1a, 0x04, 0x18, 0x04, 0x0f, 0x04, 0x04, 0x04, 0x03, 0x04, - 0x08, 0x0b, 0x18, 0x0b, 0x1c, 0x04, 0x08, 0x03, 0x03, 0x03, 0x1a, 0x03, 0x06, 0x00, 0x08, 0x00, - 0x0a, 0x00, 0x05, 0x00, 0x09, 0x00, 0x0f, 0x00, 0x0f, 0x03, 0x0c, 0x11, 0x0d, 0x0f, 0x0f, 0x01, - 0x0f, 0x05, 0x0f, 0x07, 0x0f, 0x02, 0x0f, 0x06, 0x19, 0x0c, 0x0f, 0x13, 0x0f, 0x14, 0x0f, 0x15, - 0x0f, 0x16, 0x1b, 0x00, 0x10, 0x00, 0x11, 0x00, 0x1b, 0x04, 0x0f, 0x12, 0x09, 0x12, 0x0a, 0x03, - 0x1c, 0x03, 0x00, 0x03, 0x01, 0x03, 0x0a, 0x0b, 0x0a, 0x04, 0x19, 0x00 + 0x0e, 0x8e, 0x8b, 0x18, 0x1a, 0x14, 0x15, 0x19, 0x13, 0x08, 0x20, 0x1b, 0x12, 0x21, 0x1c, 0x24, + 0x16, 0x0f, 0x0a, 0x17, 0x22, 0x23, 0x03, 0x05, 0x3d, 0x3c, 0x07, 0x38, 0x5d, 0x53, 0x58, 0x44, + 0x59, 0x5a, 0x4f, 0x43, 0x5c, 0x48, 0x26, 0x28, 0x2a, 0x25, 0x29, 0x2f, 0x8c, 0x8d, 0x1d, 0x3b, + 0x30, 0x31, 0x5b, 0x09, 0x4a, 0x40, 0x41, 0x39 }; - // 12:4:4 index table of the Unicode numeric data. - private static ReadOnlySpan NumericLevel1Index => new byte[761] + [Conditional("DEBUG")] + private static void AssertNumericGraphemeTableLevels(int level1BitCount, int level2BitCount, int level3BitCount) { - 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x03, 0x01, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, - 0x0b, 0x01, 0x01, 0x0c, 0x01, 0x01, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x01, 0x01, 0x01, - 0x14, 0x15, 0x01, 0x01, 0x16, 0x01, 0x01, 0x17, 0x01, 0x01, 0x01, 0x01, 0x18, 0x01, 0x01, 0x01, - 0x19, 0x1a, 0x1b, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x1c, 0x01, 0x1d, 0x1e, 0x1f, 0x20, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x21, 0x01, 0x01, 0x01, 0x01, 0x01, 0x0f, - 0x01, 0x22, 0x23, 0x24, 0x25, 0x01, 0x01, 0x01, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, - 0x2e, 0x2f, 0x20, 0x01, 0x09, 0x01, 0x30, 0x31, 0x32, 0x01, 0x01, 0x01, 0x33, 0x34, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x35, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x36, 0x37, 0x01, 0x01, 0x38, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x39, 0x3a, 0x01, 0x01, 0x01, 0x3b, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x3c, 0x1f, 0x01, 0x01, 0x3d, 0x01, 0x01, 0x01, - 0x01, 0x3e, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x3f + // Ensures that the caller expects the same L1:L2:L3 count as the actual backing data. + Debug.Assert(level1BitCount == 11, "Unexpected level 1 bit count."); + Debug.Assert(level2BitCount == 5, "Unexpected level 2 bit count."); + Debug.Assert(level3BitCount == 4, "Unexpected level 3 bit count."); + } + + // 11:5:4 index table of the Unicode numeric & text segmentation data. + private static ReadOnlySpan NumericGraphemeLevel1Index => new byte[2176] + { + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0a, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x0a, 0x16, 0x17, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x1b, 0x1c, 0x1d, + 0x1e, 0x1f, 0x20, 0x21, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x23, 0x24, 0x0a, 0x25, + 0x26, 0x27, 0x28, 0x0a, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, + 0x0a, 0x0a, 0x35, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x36, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x37, 0x0a, 0x38, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x39, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x3a, 0x3b, 0x0a, 0x3c, 0x0a, 0x3d, 0x0a, 0x0a, + 0x3e, 0x3f, 0x0a, 0x0a, 0x40, 0x0a, 0x41, 0x0a, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x49, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x4a, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, + 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a, 0x0a }; - private static ReadOnlySpan NumericLevel2Index => new byte[1024] + private static ReadOnlySpan NumericGraphemeLevel2Index => new byte[4864] { - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x06, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x08, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x09, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x0c, 0x00, 0x0d, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, 0x00, 0x0f, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x10, 0x00, 0x11, 0x00, 0x03, 0x00, + 0x12, 0x00, 0x13, 0x00, 0x02, 0x00, 0x07, 0x00, 0x14, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x15, 0x00, 0x0f, 0x00, 0x03, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x16, 0x00, + 0x02, 0x00, 0x17, 0x00, 0x18, 0x00, 0x02, 0x00, 0x02, 0x00, 0x19, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x07, 0x00, + 0x1c, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x02, 0x00, + 0x21, 0x00, 0x02, 0x00, 0x02, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x20, 0x00, 0x25, 0x00, + 0x26, 0x00, 0x02, 0x00, 0x02, 0x00, 0x27, 0x00, 0x28, 0x00, 0x13, 0x00, 0x29, 0x00, 0x2a, 0x00, + 0x26, 0x00, 0x02, 0x00, 0x02, 0x00, 0x27, 0x00, 0x2b, 0x00, 0x02, 0x00, 0x20, 0x00, 0x2c, 0x00, + 0x21, 0x00, 0x02, 0x00, 0x02, 0x00, 0x2d, 0x00, 0x23, 0x00, 0x2e, 0x00, 0x20, 0x00, 0x2f, 0x00, + 0x30, 0x00, 0x02, 0x00, 0x02, 0x00, 0x31, 0x00, 0x32, 0x00, 0x24, 0x00, 0x29, 0x00, 0x33, 0x00, + 0x34, 0x00, 0x02, 0x00, 0x02, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x20, 0x00, 0x38, 0x00, + 0x21, 0x00, 0x02, 0x00, 0x02, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x37, 0x00, 0x20, 0x00, 0x02, 0x00, + 0x3b, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x20, 0x00, 0x3f, 0x00, + 0x40, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x41, 0x00, 0x42, 0x00, 0x29, 0x00, 0x40, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x43, 0x00, 0x44, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x45, 0x00, 0x46, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x4a, 0x00, + 0x4b, 0x00, 0x4c, 0x00, 0x07, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x03, 0x00, 0x51, 0x00, 0x0f, 0x00, 0x52, 0x00, + 0x53, 0x00, 0x54, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x55, 0x00, 0x56, 0x00, 0x56, 0x00, + 0x56, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, 0x58, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x4f, 0x00, 0x59, 0x00, 0x5a, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x5b, 0x00, 0x5c, 0x00, + 0x02, 0x00, 0x5d, 0x00, 0x02, 0x00, 0x5d, 0x00, 0x02, 0x00, 0x5e, 0x00, 0x02, 0x00, 0x5e, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x16, 0x00, 0x03, 0x00, 0x61, 0x00, + 0x62, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x37, 0x00, 0x02, 0x00, 0x63, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x64, 0x00, 0x65, 0x00, 0x29, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x66, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x67, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, + 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x6b, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x6c, 0x00, 0x02, 0x00, 0x02, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x6f, 0x00, + 0x70, 0x00, 0x02, 0x00, 0x71, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x72, 0x00, 0x3b, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x73, 0x00, 0x74, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x78, 0x00, + 0x79, 0x00, 0x02, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x02, 0x00, 0x01, 0x00, 0x7d, 0x00, + 0x7e, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x07, 0x00, 0x07, 0x00, 0x0f, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x7f, 0x00, 0x7c, 0x00, 0x02, 0x00, 0x80, 0x00, 0x81, 0x00, 0x81, 0x00, + 0x82, 0x00, 0x83, 0x00, 0x84, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x85, 0x00, 0x86, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x86, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x87, 0x00, 0x02, 0x00, 0x88, 0x00, 0x89, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x8a, 0x00, 0x8b, 0x00, + 0x8c, 0x00, 0x8d, 0x00, 0x02, 0x00, 0x02, 0x00, 0x7f, 0x00, 0x02, 0x00, 0x8e, 0x00, 0x8f, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x85, 0x00, 0x90, 0x00, 0x91, 0x00, 0x02, 0x00, 0x02, 0x00, 0x92, 0x00, + 0x93, 0x00, 0x94, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x96, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x97, 0x00, 0x98, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9b, 0x00, 0x9c, 0x00, 0x9d, 0x00, 0x9e, 0x00, + 0x9f, 0x00, 0xa0, 0x00, 0xa1, 0x00, 0xa2, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xa3, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0xa4, 0x00, 0xa5, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xa6, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xa7, 0x00, 0xa8, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xa7, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x07, 0x00, 0x07, 0x00, + 0xa9, 0x00, 0x02, 0x00, 0xaa, 0x00, 0xab, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0xac, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0xad, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0xae, 0x00, 0x02, 0x00, 0xaf, 0x00, 0xb0, 0x00, 0x02, 0x00, 0x02, 0x00, + 0xae, 0x00, 0xb1, 0x00, 0x02, 0x00, 0xb2, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xa7, 0x00, 0xb3, 0x00, + 0x02, 0x00, 0x35, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xb4, 0x00, 0xb5, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0xb6, 0x00, 0x02, 0x00, 0xb7, 0x00, 0xb8, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0xb9, 0x00, 0x02, 0x00, 0x02, 0x00, 0xba, 0x00, 0xbb, 0x00, 0x03, 0x00, 0x07, 0x00, 0xbc, 0x00, + 0x03, 0x00, 0x02, 0x00, 0xbd, 0x00, 0x02, 0x00, 0xbe, 0x00, 0x3b, 0x00, 0x55, 0x00, 0xbf, 0x00, + 0x1c, 0x00, 0x02, 0x00, 0x02, 0x00, 0xc0, 0x00, 0xc1, 0x00, 0x03, 0x00, 0xc2, 0x00, 0x03, 0x00, + 0x02, 0x00, 0x02, 0x00, 0xc3, 0x00, 0xc4, 0x00, 0xc5, 0x00, 0x03, 0x00, 0x02, 0x00, 0xc6, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xc7, 0x00, 0x13, 0x00, 0x02, 0x00, 0xc8, 0x00, 0xc9, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xca, 0x00, 0x03, 0x00, + 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, + 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, + 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, + 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, + 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, + 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, + 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, + 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, + 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, + 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, + 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, + 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, + 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, + 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, + 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, + 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, + 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, + 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, + 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, + 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, + 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, + 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, + 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, + 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, + 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, + 0xcc, 0x00, 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, + 0xcd, 0x00, 0xce, 0x00, 0xcd, 0x00, 0xcf, 0x00, 0xcd, 0x00, 0xcb, 0x00, 0xcc, 0x00, 0xcd, 0x00, + 0xce, 0x00, 0xcd, 0x00, 0xd0, 0x00, 0x56, 0x00, 0xd1, 0x00, 0x58, 0x00, 0x58, 0x00, 0xd2, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xd3, 0x00, 0xd4, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xd5, 0x00, 0x02, 0x00, 0xd6, 0x00, 0x02, 0x00, 0xd7, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0xd8, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x07, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x04, 0x00, + 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x35, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xd9, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0xda, 0x00, 0xdb, 0x00, 0xdc, 0x00, 0xdd, 0x00, 0xde, 0x00, 0xdf, 0x00, 0xe0, 0x00, 0xe1, 0x00, + 0xe2, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xe3, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xe4, 0x00, 0xe5, 0x00, + 0x02, 0x00, 0x02, 0x00, 0xe6, 0x00, 0x02, 0x00, 0xe7, 0x00, 0x02, 0x00, 0x02, 0x00, 0xe8, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xe9, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xea, 0x00, 0x02, 0x00, 0xeb, 0x00, + 0x02, 0x00, 0x02, 0x00, 0xec, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xed, 0x00, + 0x02, 0x00, 0xee, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xef, 0x00, 0xf0, 0x00, 0xf1, 0x00, 0xf2, 0x00, 0xf3, 0x00, + 0xf4, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf5, 0x00, 0xf6, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf7, 0x00, + 0x02, 0x00, 0xf8, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf9, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfa, 0x00, 0x02, 0x00, 0xfa, 0x00, + 0x02, 0x00, 0x02, 0x00, 0xfb, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfc, 0x00, + 0x02, 0x00, 0x02, 0x00, 0xfd, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfe, 0x00, 0xff, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x00, 0x15, 0x00, 0x02, 0x01, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x03, 0x01, 0x02, 0x00, 0x02, 0x00, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01, 0x07, 0x01, 0xa7, 0x00, + 0x70, 0x00, 0x02, 0x00, 0x02, 0x00, 0x08, 0x01, 0x09, 0x01, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, + 0x0a, 0x01, 0x02, 0x00, 0x0b, 0x01, 0x0c, 0x01, 0x0d, 0x01, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01, + 0x70, 0x00, 0x02, 0x00, 0x02, 0x00, 0x0f, 0x01, 0x10, 0x01, 0x03, 0x00, 0x11, 0x01, 0x12, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x13, 0x01, 0x14, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x15, 0x01, 0x03, 0x00, + 0x3b, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3c, 0x00, 0x16, 0x01, 0x24, 0x00, 0x17, 0x01, 0x18, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x19, 0x01, 0x1a, 0x01, 0x1b, 0x01, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x1c, 0x01, 0x1d, 0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x1e, 0x01, 0x0f, 0x00, 0x1f, 0x01, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x20, 0x01, 0x0f, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x21, 0x01, 0x22, 0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x4f, 0x00, 0x23, 0x01, 0x24, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x13, 0x01, 0x25, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x26, 0x01, 0x27, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x28, 0x01, 0x29, 0x01, 0x02, 0x00, + 0x2a, 0x01, 0x02, 0x00, 0x02, 0x00, 0x2b, 0x01, 0x24, 0x00, 0x2c, 0x01, 0x02, 0x00, 0x02, 0x00, + 0x2d, 0x01, 0x2e, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x2f, 0x01, 0x30, 0x01, 0x02, 0x00, 0x31, 0x01, 0x32, 0x01, 0x02, 0x00, + 0x02, 0x00, 0x33, 0x01, 0x34, 0x01, 0x35, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x36, 0x01, 0x37, 0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x38, 0x01, 0x39, 0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3a, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3b, 0x01, 0x3c, 0x01, 0x02, 0x00, 0x02, 0x00, + 0x3d, 0x01, 0x3e, 0x01, 0x3f, 0x01, 0x40, 0x01, 0x41, 0x01, 0x42, 0x01, 0x43, 0x01, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x44, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x18, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x05, 0x01, 0x02, 0x00, 0x45, 0x01, 0x46, 0x01, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x47, 0x01, 0x48, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xa7, 0x00, 0x49, 0x01, 0x4a, 0x01, 0x4a, 0x01, + 0x4b, 0x01, 0x0a, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x4c, 0x01, 0x4d, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x4e, 0x01, 0x4f, 0x01, + 0x50, 0x01, 0x02, 0x00, 0x51, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x5d, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x47, 0x01, 0x52, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xf0, 0x00, 0x53, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x54, 0x01, 0x55, 0x01, 0x56, 0x01, 0x57, 0x01, + 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x58, 0x01, 0x07, 0x00, 0x07, 0x00, 0x4d, 0x00, 0xc2, 0x00, + 0x59, 0x01, 0x0e, 0x00, 0x09, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x5a, 0x01, 0x5b, 0x01, 0x5c, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x05, 0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x5d, 0x01, 0x03, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0xda, 0x00, 0x05, 0x01, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x5e, 0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x11, 0x01, + 0x5f, 0x01, 0x60, 0x01, 0x61, 0x01, 0x62, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x11, 0x01, 0x5f, 0x01, 0x63, 0x01, 0x64, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x65, 0x01, 0x02, 0x00, 0x87, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x66, 0x01, 0x67, 0x01, + 0x68, 0x01, 0x69, 0x01, 0x6a, 0x01, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x6b, 0x01, 0x6c, 0x01, + 0x6d, 0x01, 0x6e, 0x01, 0x87, 0x00, 0x6f, 0x01, 0x88, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x70, 0x01, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x71, 0x01, 0x72, 0x01, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x73, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x74, 0x01, 0x95, 0x00, 0x95, 0x00, + 0x66, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x75, 0x01, 0x76, 0x01, 0x02, 0x00, 0x02, 0x00, + 0x75, 0x01, 0x02, 0x00, 0x77, 0x01, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x66, 0x01, 0x95, 0x00, 0x95, 0x00, 0x78, 0x01, 0x93, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, + 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x95, 0x00, 0x71, 0x01, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x79, 0x01, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, + 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x07, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00 + }; + + private static ReadOnlySpan NumericGraphemeLevel3Index => new byte[6048] + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x15, 0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x1c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x1e, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, - 0x21, 0x00, 0x22, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x25, 0x00, 0x26, 0x27, 0x00, 0x00, 0x25, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, - 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x2c, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x3a, - 0x00, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x41, - 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x00, 0x4b, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x50, 0x51, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x39, 0x55, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x58, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x66, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x69, 0x6a, 0x6b, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x6c, 0x6d, 0x6e, 0x6f, 0x00, 0x00, 0x00, 0x00, - 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x00, 0x0e, 0x03, + 0x03, 0x03, 0x0f, 0x10, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x03, 0x03, 0x12, 0x13, 0x14, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, + 0x03, 0x15, 0x15, 0x03, 0x15, 0x15, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x00, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x03, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x16, + 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x17, 0x15, 0x03, 0x17, 0x17, + 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x17, 0x17, 0x15, 0x17, 0x17, + 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x03, 0x15, 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x15, 0x17, + 0x17, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x17, 0x17, 0x03, 0x03, 0x17, 0x17, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x18, 0x19, 0x1a, 0x12, 0x14, 0x1b, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, + 0x03, 0x15, 0x15, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x17, 0x17, + 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x15, 0x15, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x17, 0x03, 0x17, 0x17, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x15, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1a, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x17, + 0x15, 0x17, 0x17, 0x03, 0x03, 0x03, 0x17, 0x17, 0x17, 0x03, 0x17, 0x17, 0x17, 0x15, 0x03, 0x03, + 0x1c, 0x1d, 0x1e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x17, 0x17, 0x17, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, + 0x15, 0x17, 0x17, 0x17, 0x17, 0x03, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1f, 0x20, 0x21, 0x22, 0x20, 0x21, 0x22, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x17, 0x15, + 0x17, 0x17, 0x15, 0x17, 0x17, 0x03, 0x15, 0x17, 0x17, 0x03, 0x17, 0x17, 0x15, 0x15, 0x03, 0x03, + 0x15, 0x15, 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, 0x15, 0x17, + 0x17, 0x15, 0x15, 0x15, 0x15, 0x03, 0x17, 0x17, 0x17, 0x03, 0x17, 0x17, 0x17, 0x15, 0x16, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x03, + 0x1c, 0x1d, 0x1e, 0x12, 0x13, 0x14, 0x18, 0x19, 0x1a, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x15, + 0x17, 0x17, 0x15, 0x15, 0x15, 0x03, 0x15, 0x03, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x15, + 0x03, 0x15, 0x03, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, + 0x03, 0x15, 0x03, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x13, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, + 0x2f, 0x30, 0x31, 0x32, 0x03, 0x15, 0x03, 0x15, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, + 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, + 0x15, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, + 0x03, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x15, 0x03, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, + 0x3a, 0x3b, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x1d, 0x44, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x45, 0x46, + 0x47, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x15, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x1f, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x17, 0x17, 0x17, 0x17, 0x15, 0x15, 0x17, 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, + 0x17, 0x17, 0x15, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x11, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x17, 0x17, 0x15, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, 0x15, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, + 0x15, 0x03, 0x15, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x15, 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x17, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x17, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x17, 0x15, 0x15, 0x17, 0x17, 0x17, 0x15, 0x17, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x15, 0x4e, 0x00, 0x00, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x4f, 0x03, 0x03, 0x03, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x4f, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x50, 0x51, 0x27, 0x52, 0x53, 0x29, 0x54, 0x55, 0x56, 0x57, 0x58, 0x19, 0x59, 0x5a, 0x5b, 0x20, + 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x1c, 0x5c, 0x5d, 0x3f, 0x1d, 0x5e, 0x1e, + 0x1e, 0x5f, 0x44, 0x03, 0x03, 0x4a, 0x3f, 0x60, 0x61, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x1c, 0x5c, 0x5d, 0x62, 0x63, 0x64, 0x1b, + 0x45, 0x46, 0x47, 0x3c, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x1c, 0x5c, 0x5d, + 0x62, 0x63, 0x64, 0x1b, 0x45, 0x46, 0x47, 0x3c, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, + 0x3b, 0x1c, 0x5c, 0x5d, 0x62, 0x63, 0x64, 0x1b, 0x45, 0x46, 0x47, 0x3c, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x4f, 0x5c, 0x5d, 0x62, 0x63, 0x64, + 0x1b, 0x45, 0x46, 0x47, 0x3c, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x1c, 0x4f, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x03, 0x0e, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, + 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x0e, 0x03, + 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x1c, + 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x1c, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, + 0x39, 0x3a, 0x3b, 0x1c, 0x03, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x03, 0x03, 0x03, + 0x0e, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, + 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x13, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1c, 0x3c, 0x3d, 0x03, 0x03, 0x0e, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x20, 0x21, 0x22, 0x48, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x1c, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, + 0x03, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x3d, 0x6e, 0x6f, 0x70, 0x71, 0x72, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x73, 0x74, 0x75, 0x76, 0x3e, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x3f, + 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x1f, + 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x17, 0x17, 0x15, 0x15, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x12, 0x13, 0x14, 0x18, 0x19, 0x1a, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x15, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x17, 0x17, + 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, + 0x17, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x17, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, + 0x15, 0x03, 0x15, 0x15, 0x15, 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, 0x15, 0x15, 0x17, 0x17, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x17, 0x17, 0x15, 0x17, 0x17, 0x15, 0x17, 0x17, 0x03, 0x17, 0x15, 0x03, 0x03, + 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, + 0x81, 0x81, 0x81, 0x81, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x03, 0x03, 0x03, 0x03, 0x35, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x22, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x1c, 0x03, 0x03, 0x03, 0x03, 0x21, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x1f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x4a, 0x03, 0x4a, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1c, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x1d, 0x82, 0x83, 0x84, 0x5e, 0x85, 0x86, + 0x87, 0x88, 0x1e, 0x89, 0x8a, 0x8b, 0x5f, 0x8c, 0x8d, 0x8e, 0x8f, 0x44, 0x90, 0x91, 0x92, 0x60, + 0x93, 0x94, 0x95, 0x96, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x12, 0x13, 0x20, 0x49, 0x3f, 0x5e, 0x5f, 0x60, 0x49, 0x1c, 0x3f, 0x1d, 0x5e, 0x1e, 0x5f, 0x49, + 0x1c, 0x3f, 0x1d, 0x5e, 0x1e, 0x44, 0x60, 0x1c, 0x20, 0x20, 0x20, 0x21, 0x21, 0x21, 0x21, 0x49, + 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x3d, 0x3f, 0x3f, 0x3f, 0x3f, 0x1d, 0x83, 0x5e, 0x5e, 0x5e, 0x5e, + 0x5e, 0x1e, 0x5f, 0x49, 0x3f, 0x13, 0x13, 0x53, 0x14, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x1f, 0x12, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, + 0x15, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, + 0x41, 0x42, 0x43, 0x1d, 0x82, 0x83, 0x84, 0x5e, 0x85, 0x86, 0x87, 0x88, 0x03, 0x03, 0x03, 0x03, + 0x20, 0x49, 0x1c, 0x3f, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x43, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x88, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x20, 0x21, 0x1c, 0x3c, 0x1d, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x21, 0x22, 0x1c, 0x3c, 0x1d, 0x1e, 0x44, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x21, 0x22, 0x48, 0x49, 0x1c, 0x3c, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x21, 0x22, 0x48, 0x48, 0x49, 0x1c, 0x3c, 0x1d, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x49, 0x1c, 0x3c, 0x1d, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x1c, 0x3c, 0x1d, 0x21, 0x22, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x97, 0x13, 0x03, 0x03, + 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x03, 0x03, 0x1d, 0x82, 0x83, 0x84, 0x5e, 0x85, 0x86, 0x87, 0x88, 0x1e, 0x89, 0x8a, 0x8b, 0x5f, + 0x8c, 0x8d, 0x8e, 0x8f, 0x44, 0x90, 0x91, 0x92, 0x60, 0x93, 0x94, 0x95, 0x96, 0x61, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0x57, 0x12, 0x52, 0xa1, 0x13, 0xa2, 0x53, 0x14, 0x58, + 0x03, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x15, + 0x11, 0x0f, 0x10, 0x36, 0x1c, 0x3c, 0x1d, 0x1e, 0x13, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x3f, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x1c, 0x3c, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x20, 0x49, 0x1c, 0x3c, 0x1d, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x21, 0x22, 0x48, 0x1c, 0x3c, 0x1d, 0x1e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x21, 0x22, 0x48, 0x1c, 0x3c, 0x1d, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x49, 0x1c, 0x3f, 0x1d, 0x1e, + 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, + 0x42, 0x43, 0x1d, 0x82, 0x83, 0x84, 0x5e, 0x85, 0x86, 0x87, 0x88, 0x13, 0x12, 0x52, 0x53, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x20, 0x21, 0x22, + 0x48, 0x49, 0x1c, 0x3c, 0x3d, 0x1d, 0x13, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x20, 0x1c, 0x3c, 0x1d, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x17, 0x15, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, + 0x40, 0x41, 0x42, 0x43, 0x1d, 0x1e, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x03, 0x03, 0x16, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x16, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, + 0x17, 0x03, 0x16, 0x16, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, + 0x03, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, + 0x41, 0x42, 0x43, 0x1d, 0x1e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, 0x17, 0x15, + 0x15, 0x15, 0x17, 0x17, 0x15, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, + 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x17, 0x17, 0x17, 0x17, 0x03, 0x03, 0x17, 0x17, 0x03, 0x03, 0x17, 0x17, 0x17, 0x03, 0x03, + 0x03, 0x03, 0x17, 0x17, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x17, 0x17, 0x15, 0x15, 0x15, 0x17, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, + 0x15, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x17, 0x17, 0x15, 0x17, 0x15, + 0x15, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x17, 0x17, 0x17, 0x17, 0x15, 0x15, 0x17, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, 0x03, + 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x17, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x17, 0x15, 0x17, 0x17, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x1c, 0x3c, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, + 0x41, 0x42, 0x43, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x17, 0x17, 0x17, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x15, 0x15, 0x17, 0x17, 0x17, 0x17, + 0x15, 0x03, 0x03, 0x03, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x16, 0x15, 0x15, 0x15, 0x15, 0x03, + 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x17, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x17, 0x15, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, + 0x4b, 0x4c, 0x4d, 0x1c, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x1d, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x17, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x17, 0x15, 0x15, 0x17, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x15, 0x03, 0x15, 0x15, 0x03, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x16, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x17, 0x17, 0x17, 0x17, 0x17, 0x03, + 0x15, 0x15, 0x03, 0x17, 0x17, 0x15, 0x17, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x15, 0x15, 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0xa3, 0x23, 0xa4, 0xa5, 0x24, 0xa6, 0x25, 0xa7, 0x26, 0x18, 0x18, 0x27, 0x19, 0x28, 0x1a, 0x29, + 0x12, 0x13, 0x13, 0x14, 0xa3, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x20, 0x21, + 0x22, 0x48, 0x49, 0x21, 0x22, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x20, 0x21, 0x22, 0x22, + 0x48, 0x49, 0xa8, 0xa9, 0x20, 0x21, 0x22, 0x22, 0x48, 0x49, 0x22, 0x22, 0x48, 0x48, 0x48, 0x48, + 0x4a, 0x4b, 0x4b, 0x4b, 0x4c, 0x4c, 0x4d, 0x4d, 0x4d, 0x4d, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x20, + 0x21, 0x22, 0x48, 0x48, 0x49, 0x49, 0x21, 0x22, 0x20, 0x21, 0x52, 0x53, 0x58, 0x52, 0x53, 0x19, + 0x12, 0x57, 0x12, 0x12, 0x13, 0x52, 0x53, 0x3e, 0x3f, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x03, 0x1c, 0x1d, 0x44, 0xaa, 0xab, + 0xac, 0xad, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x1f, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x1c, 0x5c, 0x5d, 0x62, 0x63, 0x64, + 0x1b, 0x45, 0x46, 0x47, 0x20, 0x21, 0x22, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, + 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x17, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x03, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x17, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x17, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, + 0x1b, 0x45, 0x46, 0x47, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x42, 0x43, 0x20, 0x21, 0x22, 0x48, 0x49, 0x20, 0x49, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x05, + 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, + 0x0c, 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x15, 0x15, 0x03, 0x15, 0x15, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, + 0x03, 0x03, 0x03, 0x03, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x41, 0x42, 0x43, 0x1d, 0x82, 0x83, 0x84, 0x5e, 0x85, 0x86, 0x87, 0x88, 0x1e, 0x89, 0x8a, 0x8b, + 0x5f, 0x8c, 0x8d, 0x8e, 0x8f, 0x44, 0x90, 0x91, 0x92, 0x60, 0x93, 0x94, 0x95, 0x96, 0x61, 0x98, + 0x61, 0xae, 0xaf, 0x20, 0x21, 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x03, 0x12, 0x13, 0x14, + 0x03, 0x20, 0x21, 0x44, 0x61, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x5f, 0x8c, 0x8d, 0x8e, 0x8f, 0x44, 0x90, 0x91, 0x92, 0x60, 0x93, 0x94, 0x95, 0x96, 0x03, 0x21, + 0x22, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x1c, 0x84, 0x85, 0x89, 0x44, 0x13, 0x57, 0x03, 0x03, + 0x4f, 0x4f, 0x11, 0x0f, 0x10, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x1f, 0x1f, 0x0e, 0x0e, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, + 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb0, + 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x03, 0x03, 0x03, 0x03, 0x03, + 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x03, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, + 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x0e, 0x0e, + 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x0e, 0x03, 0x0e, 0x0e, 0x0e, 0x0e, + 0x4d, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03 }; - private static ReadOnlySpan NumericLevel3Index => new byte[1824] + // Contains decimal digit values in high nibble; digit values in low nibble + private static ReadOnlySpan DigitValues => new byte[177] { + 0x00, 0x00, 0x00, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0x00, 0x03, + 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0b, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x0e, 0x0f, 0x10, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, - 0x00, 0x00, 0x00, 0x00, 0x11, 0x12, 0x13, 0x0e, 0x10, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x15, 0x16, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x19, 0x1a, 0x1b, 0x19, 0x1a, 0x1b, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x00, - 0x15, 0x16, 0x17, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0f, 0x23, 0x24, 0x25, 0x26, 0x27, - 0x28, 0x29, 0x2a, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, - 0x30, 0x31, 0x15, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x16, 0x3a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x3c, - 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x44, 0x00, 0x00, 0x00, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x44, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x45, 0x46, 0x20, 0x47, 0x48, 0x22, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x12, 0x4e, 0x4f, 0x50, 0x19, - 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x15, 0x51, 0x52, 0x35, 0x16, 0x53, 0x17, - 0x17, 0x54, 0x3a, 0x00, 0x00, 0x40, 0x35, 0x55, 0x56, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x15, 0x51, 0x52, 0x57, 0x58, 0x59, 0x14, - 0x3b, 0x3c, 0x3d, 0x32, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x15, 0x51, 0x52, - 0x57, 0x58, 0x59, 0x14, 0x3b, 0x3c, 0x3d, 0x32, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, - 0x31, 0x15, 0x51, 0x52, 0x57, 0x58, 0x59, 0x14, 0x3b, 0x3c, 0x3d, 0x32, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x51, 0x52, 0x57, 0x58, 0x59, - 0x14, 0x3b, 0x3c, 0x3d, 0x32, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x15, 0x44, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x15, - 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x15, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, - 0x2f, 0x30, 0x31, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, - 0x00, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x33, 0x63, 0x64, 0x65, 0x66, 0x67, - 0x00, 0x68, 0x69, 0x6a, 0x6b, 0x34, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x35, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x18, - 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, - 0x15, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x16, 0x75, 0x76, 0x77, 0x53, 0x78, 0x79, - 0x7a, 0x7b, 0x17, 0x7c, 0x7d, 0x7e, 0x54, 0x7f, 0x80, 0x81, 0x82, 0x3a, 0x83, 0x84, 0x85, 0x55, - 0x86, 0x87, 0x88, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x0e, 0x0f, 0x19, 0x3f, 0x35, 0x53, 0x54, 0x55, 0x3f, 0x15, 0x35, 0x16, 0x53, 0x17, 0x54, 0x3f, - 0x15, 0x35, 0x16, 0x53, 0x17, 0x3a, 0x55, 0x15, 0x19, 0x19, 0x19, 0x1a, 0x1a, 0x1a, 0x1a, 0x3f, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x33, 0x35, 0x35, 0x35, 0x35, 0x16, 0x76, 0x53, 0x53, 0x53, 0x53, - 0x53, 0x17, 0x54, 0x3f, 0x35, 0x0f, 0x0f, 0x48, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x15, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x16, 0x75, 0x76, 0x77, 0x53, 0x78, 0x79, 0x7a, 0x7b, 0x00, 0x00, 0x00, 0x00, - 0x19, 0x3f, 0x15, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x19, 0x1a, 0x15, 0x32, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1a, 0x1b, 0x15, 0x32, 0x16, 0x17, 0x3a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x15, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x3e, 0x3f, 0x15, 0x32, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x3f, 0x15, 0x32, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x15, 0x32, 0x16, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x0f, 0x00, 0x00, - 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x15, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x00, 0x00, 0x16, 0x75, 0x76, 0x77, 0x53, 0x78, 0x79, 0x7a, 0x7b, 0x17, 0x7c, 0x7d, 0x7e, 0x54, - 0x7f, 0x80, 0x81, 0x82, 0x3a, 0x83, 0x84, 0x85, 0x55, 0x86, 0x87, 0x88, 0x89, 0x56, 0x8b, 0x8c, - 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9c, - 0x0d, 0x0b, 0x0c, 0x2c, 0x15, 0x32, 0x16, 0x17, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x35, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x15, 0x32, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x15, 0x32, 0x16, 0x17, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1a, 0x1b, 0x3e, 0x15, 0x32, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x3f, 0x15, 0x35, 0x16, 0x17, - 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x15, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x16, 0x75, 0x76, 0x77, 0x53, 0x78, 0x79, 0x7a, 0x7b, 0x0f, 0x0e, 0x47, 0x48, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x1a, 0x1b, - 0x3e, 0x3f, 0x15, 0x32, 0x33, 0x16, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x19, 0x15, 0x32, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x15, 0x32, 0x33, 0x34, 0x35, - 0x36, 0x37, 0x38, 0x39, 0x16, 0x17, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, - 0x37, 0x38, 0x39, 0x16, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x15, 0x32, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x15, 0x32, 0x33, 0x34, 0x35, 0x36, - 0x37, 0x38, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, - 0x41, 0x42, 0x43, 0x15, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x16, 0x00, 0x00, 0x00, - 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x3e, - 0x3f, 0x40, 0x41, 0x42, 0x43, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x19, 0x1a, - 0x1b, 0x3e, 0x3f, 0x1a, 0x1b, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x19, 0x1a, 0x1b, 0x1b, - 0x3e, 0x3f, 0x9d, 0x9e, 0x19, 0x1a, 0x1b, 0x1b, 0x3e, 0x3f, 0x1b, 0x1b, 0x3e, 0x3e, 0x3e, 0x3e, - 0x40, 0x41, 0x41, 0x41, 0x42, 0x42, 0x43, 0x43, 0x43, 0x43, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x19, - 0x1a, 0x1b, 0x3e, 0x3e, 0x3f, 0x3f, 0x1a, 0x1b, 0x19, 0x1a, 0x47, 0x48, 0x4d, 0x47, 0x48, 0x12, - 0x0e, 0x4c, 0x0e, 0x0e, 0x0f, 0x47, 0x48, 0x34, 0x35, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x00, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x00, 0x15, 0x16, 0x3a, 0x9f, 0xa0, - 0xa1, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x15, 0x51, 0x52, 0x57, 0x58, 0x59, - 0x14, 0x3b, 0x3c, 0x3d, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x38, 0x39, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x19, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, - 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, - 0x09, 0x0a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x01, 0x02, 0x03, 0x04, - 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, - 0x37, 0x38, 0x39, 0x16, 0x75, 0x76, 0x77, 0x53, 0x78, 0x79, 0x7a, 0x7b, 0x17, 0x7c, 0x7d, 0x7e, - 0x54, 0x7f, 0x80, 0x81, 0x82, 0x3a, 0x83, 0x84, 0x85, 0x55, 0x86, 0x87, 0x88, 0x89, 0x56, 0x8b, - 0x56, 0xa3, 0xa4, 0x19, 0x1a, 0x1b, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x00, 0x0e, 0x0f, 0x10, - 0x00, 0x19, 0x1a, 0x3a, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x44, 0x44, 0x0d, 0x0b, 0x0c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x18, 0x18, 0x00, 0x00, 0x00, - 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00 }; - // Every item contains the value for numeric value. - private static ReadOnlySpan NumericValues => new byte[1320] + // Contains numeric values + private static ReadOnlySpan NumericValues => new byte[1416] { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x8f, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, - 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x79, 0x3f, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x3f, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xa3, 0x3f, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xa9, 0x3f, - 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xb9, 0x3f, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xc3, 0x3f, - 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xc9, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x8f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x79, 0x3f, + 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x3f, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xa3, 0x3f, + 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xa9, 0x3f, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xb9, 0x3f, + 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xc3, 0x3f, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xc9, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x40, @@ -1497,80 +2155,74 @@ public static partial class CharUnicodeInfo 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0xc2, 0x3f, - 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0xbc, 0x3f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x3f, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xe5, 0x3f, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xd9, 0x3f, - 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xe3, 0x3f, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xe9, 0x3f, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xc5, 0x3f, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7f, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xb3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xe8, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xf8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x44, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x45, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x46, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x47, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x72, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x82, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x8c, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x9f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xa7, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xaf, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb7, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xbb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbf, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xc1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xd3, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xdd, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xe3, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xed, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xf1, 0x40, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xf3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf5, 0x40, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xed, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x4f, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x18, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x80, 0x84, 0x1e, 0x41, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4f, 0x22, 0x41, - 0x00, 0x00, 0x00, 0x00, 0xc0, 0x5c, 0x25, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x28, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x40, 0x77, 0x2b, 0x41, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xb5, 0x3f, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xc5, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x3f, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x3f, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xda, 0x3f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xe2, 0x3f, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xe5, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0x3f, - 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x0a, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x1a, 0x41, 0x00, 0x00, 0x00, 0x00, 0x80, 0x84, 0x2e, 0x41, - 0x00, 0x00, 0x00, 0x00, 0x84, 0xd7, 0x97, 0x41, 0x00, 0x00, 0x00, 0x20, 0x5f, 0xa0, 0x02, 0x42, - 0x00, 0x00, 0x00, 0xa2, 0x94, 0x1a, 0x6d, 0x42, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x12, 0x63, 0x41, - 0x00, 0x00, 0x00, 0x00, 0xd0, 0x12, 0x73, 0x41 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x92, 0x24, 0x49, 0x92, 0x24, 0x49, 0xc2, 0x3f, 0x1c, 0xc7, 0x71, 0x1c, 0xc7, 0x71, 0xbc, 0x3f, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5, 0x3f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xe5, 0x3f, + 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xd9, 0x3f, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0xe3, 0x3f, + 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0xe9, 0x3f, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xc5, 0x3f, + 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xea, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd8, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x7f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xb3, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xe8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0xf8, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x42, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x43, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x44, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x45, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x46, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x47, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x48, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x72, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x82, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x85, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x89, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x8c, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x9f, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xa7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xaf, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xb7, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xbb, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xbf, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xc1, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xd3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xdd, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xe3, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0xed, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xf1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xf3, 0x40, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf5, 0x40, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xed, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x41, 0x00, 0x00, 0x00, 0x00, 0x80, 0x4f, 0x12, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x18, 0x41, 0x00, 0x00, 0x00, 0x00, 0x80, 0x84, 0x1e, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x4f, 0x22, 0x41, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x5c, 0x25, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x28, 0x41, 0x00, 0x00, 0x00, 0x00, 0x40, 0x77, 0x2b, 0x41, + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xb5, 0x3f, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xda, 0x3f, + 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xe2, 0x3f, 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x69, 0x3f, + 0x9a, 0x99, 0x99, 0x99, 0x99, 0x99, 0x89, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x3f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x0a, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, 0x1a, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x84, 0x2e, 0x41, 0x00, 0x00, 0x00, 0x00, 0x84, 0xd7, 0x97, 0x41, + 0x00, 0x00, 0x00, 0x20, 0x5f, 0xa0, 0x02, 0x42, 0x00, 0x00, 0x00, 0xa2, 0x94, 0x1a, 0x6d, 0x42, + 0x00, 0x00, 0x00, 0x00, 0xd0, 0x12, 0x63, 0x41, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x12, 0x73, 0x41, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xbf }; - private static ReadOnlySpan DigitValues => new byte[330] + // Contains grapheme cluster segmentation values + private static ReadOnlySpan GraphemeSegmentationValues => new byte[177] { - 0xff, 0xff, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x03, 0x03, 0x04, 0x04, 0x05, 0x05, 0x06, 0x06, - 0x07, 0x07, 0x08, 0x08, 0x09, 0x09, 0xff, 0x02, 0xff, 0x03, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0xff, 0x05, 0xff, 0x06, 0xff, 0x07, - 0xff, 0x08, 0xff, 0x09, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x0a, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06 }; + } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/IdnMapping.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/IdnMapping.cs index 2035932a82e63c..3ec32b27a6666e 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/IdnMapping.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/IdnMapping.cs @@ -331,8 +331,8 @@ private static string PunycodeEncode(string unicode) bool bRightToLeft = false; // Check for RTL. If right-to-left, then 1st & last chars must be RTL - BidiCategory eBidi = CharUnicodeInfo.GetBidiCategory(unicode, iAfterLastDot); - if (eBidi == BidiCategory.RightToLeft || eBidi == BidiCategory.RightToLeftArabic) + StrongBidiCategory eBidi = CharUnicodeInfo.GetBidiCategory(unicode, iAfterLastDot); + if (eBidi == StrongBidiCategory.StrongRightToLeft) { // It has to be right to left. bRightToLeft = true; @@ -345,7 +345,7 @@ private static string PunycodeEncode(string unicode) } eBidi = CharUnicodeInfo.GetBidiCategory(unicode, iTest); - if (eBidi != BidiCategory.RightToLeft && eBidi != BidiCategory.RightToLeftArabic) + if (eBidi != StrongBidiCategory.StrongRightToLeft) { // Oops, last wasn't RTL, last should be RTL if first is RTL throw new ArgumentException(SR.Argument_IdnBadBidi, nameof(unicode)); @@ -361,17 +361,17 @@ private static string PunycodeEncode(string unicode) Debug.Assert(!char.IsLowSurrogate(unicode, basicCount), "[IdnMapping.punycode_encode]Unexpected low surrogate"); // Double check our bidi rules - BidiCategory testBidi = CharUnicodeInfo.GetBidiCategory(unicode, basicCount); + StrongBidiCategory testBidi = CharUnicodeInfo.GetBidiCategory(unicode, basicCount); // If we're RTL, we can't have LTR chars - if (bRightToLeft && testBidi == BidiCategory.LeftToRight) + if (bRightToLeft && testBidi == StrongBidiCategory.StrongLeftToRight) { // Oops, throw error throw new ArgumentException(SR.Argument_IdnBadBidi, nameof(unicode)); } // If we're not RTL we can't have RTL chars - if (!bRightToLeft && (testBidi == BidiCategory.RightToLeft || testBidi == BidiCategory.RightToLeftArabic)) + if (!bRightToLeft && testBidi == StrongBidiCategory.StrongRightToLeft) { // Oops, throw error throw new ArgumentException(SR.Argument_IdnBadBidi, nameof(unicode)); @@ -749,8 +749,8 @@ private static string PunycodeDecode(string ascii) bool bRightToLeft = false; // Check for RTL. If right-to-left, then 1st & last chars must be RTL - BidiCategory eBidi = CharUnicodeInfo.GetBidiCategory(output, iOutputAfterLastDot); - if (eBidi == BidiCategory.RightToLeft || eBidi == BidiCategory.RightToLeftArabic) + StrongBidiCategory eBidi = CharUnicodeInfo.GetBidiCategory(output, iOutputAfterLastDot); + if (eBidi == StrongBidiCategory.StrongRightToLeft) { // It has to be right to left. bRightToLeft = true; @@ -765,13 +765,13 @@ private static string PunycodeDecode(string ascii) // Check to see if its LTR eBidi = CharUnicodeInfo.GetBidiCategory(output, iTest); - if ((bRightToLeft && eBidi == BidiCategory.LeftToRight) || - (!bRightToLeft && (eBidi == BidiCategory.RightToLeft || eBidi == BidiCategory.RightToLeftArabic))) + if ((bRightToLeft && eBidi == StrongBidiCategory.StrongLeftToRight) || + (!bRightToLeft && eBidi == StrongBidiCategory.StrongRightToLeft)) throw new ArgumentException(SR.Argument_IdnBadBidi, nameof(ascii)); } // Its also a requirement that the last one be RTL if 1st is RTL - if (bRightToLeft && eBidi != BidiCategory.RightToLeft && eBidi != BidiCategory.RightToLeftArabic) + if (bRightToLeft && eBidi != StrongBidiCategory.StrongRightToLeft) { // Oops, last wasn't RTL, last should be RTL if first is RTL throw new ArgumentException(SR.Argument_IdnBadBidi, nameof(ascii)); diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/StringInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/StringInfo.cs index f82d3f618c1541..2e8cf088cba05d 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/StringInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/StringInfo.cs @@ -2,7 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Collections.Generic; using System.Diagnostics; +using System.Text.Unicode; namespace System.Globalization { @@ -65,136 +67,35 @@ public string String public string SubstringByTextElements(int startingTextElement) { - // If the string is empty, no sense going further. - if (Indexes == null) - { - if (startingTextElement < 0) - { - throw new ArgumentOutOfRangeException(nameof(startingTextElement), startingTextElement, SR.ArgumentOutOfRange_NeedPosNum); - } - else - { - throw new ArgumentOutOfRangeException(nameof(startingTextElement), startingTextElement, SR.Arg_ArgumentOutOfRangeException); - } - } - - return SubstringByTextElements(startingTextElement, Indexes.Length - startingTextElement); + return SubstringByTextElements(startingTextElement, (Indexes?.Length ?? 0) - startingTextElement); } public string SubstringByTextElements(int startingTextElement, int lengthInTextElements) { - if (startingTextElement < 0) - { - throw new ArgumentOutOfRangeException(nameof(startingTextElement), startingTextElement, SR.ArgumentOutOfRange_NeedPosNum); - } - if (String.Length == 0 || startingTextElement >= Indexes!.Length) + int[] indexes = Indexes ?? Array.Empty(); + + if ((uint)startingTextElement >= (uint)indexes.Length) { throw new ArgumentOutOfRangeException(nameof(startingTextElement), startingTextElement, SR.Arg_ArgumentOutOfRangeException); } - if (lengthInTextElements < 0) - { - throw new ArgumentOutOfRangeException(nameof(lengthInTextElements), lengthInTextElements, SR.ArgumentOutOfRange_NeedPosNum); - } - if (startingTextElement > Indexes.Length - lengthInTextElements) + if ((uint)lengthInTextElements > (uint)(indexes.Length - startingTextElement)) { throw new ArgumentOutOfRangeException(nameof(lengthInTextElements), lengthInTextElements, SR.Arg_ArgumentOutOfRangeException); } - int start = Indexes[startingTextElement]; + int start = indexes[startingTextElement]; + Index end = ^0; // assume reading to end of the string unless the caller told us to stop early - if (startingTextElement + lengthInTextElements == Indexes.Length) + if ((uint)(startingTextElement + lengthInTextElements) < (uint)indexes.Length) { - // We are at the last text element in the string and because of that - // must handle the call differently. - return String.Substring(start); - } - else - { - return String[start..Indexes[lengthInTextElements + startingTextElement]]; + end = indexes[startingTextElement + lengthInTextElements]; } + + return String[start..end]; } public static string GetNextTextElement(string str) => GetNextTextElement(str, 0); - /// - /// Get the code point count of the current text element. - /// - /// A combining class is defined as: - /// A character/surrogate that has the following Unicode category: - /// * NonSpacingMark (e.g. U+0300 COMBINING GRAVE ACCENT) - /// * SpacingCombiningMark (e.g. U+ 0903 DEVANGARI SIGN VISARGA) - /// * EnclosingMark (e.g. U+20DD COMBINING ENCLOSING CIRCLE) - /// - /// In the context of GetNextTextElement() and ParseCombiningCharacters(), a text element is defined as: - /// 1. If a character/surrogate is in the following category, it is a text element. - /// It can NOT further combine with characters in the combinging class to form a text element. - /// * one of the Unicode category in the combinging class - /// * UnicodeCategory.Format - /// * UnicodeCateogry.Control - /// * UnicodeCategory.OtherNotAssigned - /// 2. Otherwise, the character/surrogate can be combined with characters in the combinging class to form a text element. - /// - /// The length of the current text element - internal static int GetCurrentTextElementLen(string str, int index, int len, ref UnicodeCategory ucCurrent, ref int currentCharCount) - { - Debug.Assert(index >= 0 && len >= 0, "StringInfo.GetCurrentTextElementLen() : index = " + index + ", len = " + len); - Debug.Assert(index < len, "StringInfo.GetCurrentTextElementLen() : index = " + index + ", len = " + len); - if (index + currentCharCount == len) - { - // This is the last character/surrogate in the string. - return currentCharCount; - } - - // Call an internal GetUnicodeCategory, which will tell us both the unicode category, and also tell us if it is a surrogate pair or not. - int nextCharCount; - UnicodeCategory ucNext = CharUnicodeInfo.InternalGetUnicodeCategory(str, index + currentCharCount, out nextCharCount); - if (CharUnicodeInfo.IsCombiningCategory(ucNext)) - { - // The next element is a combining class. - // Check if the current text element to see if it is a valid base category (i.e. it should not be a combining category, - // not a format character, and not a control character). - if (CharUnicodeInfo.IsCombiningCategory(ucCurrent) - || (ucCurrent == UnicodeCategory.Format) - || (ucCurrent == UnicodeCategory.Control) - || (ucCurrent == UnicodeCategory.OtherNotAssigned) - || (ucCurrent == UnicodeCategory.Surrogate)) // An unpair high surrogate or low surrogate - { - // Will fall thru and return the currentCharCount - } - else - { - // Remember the current index. - int startIndex = index; - - // We have a valid base characters, and we have a character (or surrogate) that is combining. - // Check if there are more combining characters to follow. - // Check if the next character is a nonspacing character. - index += currentCharCount + nextCharCount; - - while (index < len) - { - ucNext = CharUnicodeInfo.InternalGetUnicodeCategory(str, index, out nextCharCount); - if (!CharUnicodeInfo.IsCombiningCategory(ucNext)) - { - ucCurrent = ucNext; - currentCharCount = nextCharCount; - break; - } - index += nextCharCount; - } - - return index - startIndex; - } - } - - // The return value will be the currentCharCount. - int ret = currentCharCount; - ucCurrent = ucNext; - // Update currentCharCount. - currentCharCount = nextCharCount; - return ret; - } - /// /// Returns the str containing the next text element in str starting at /// index index. If index is not supplied, then it will start at the beginning @@ -204,46 +105,32 @@ internal static int GetCurrentTextElementLen(string str, int index, int len, ref /// public static string GetNextTextElement(string str, int index) { - if (str == null) + if (str is null) { - throw new ArgumentNullException(nameof(str)); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.str); } - - int len = str.Length; - if (index < 0 || index >= len) + if ((uint)index > (uint)str.Length) { - if (index == len) - { - return string.Empty; - } - - throw new ArgumentOutOfRangeException(nameof(index), index, SR.ArgumentOutOfRange_Index); + ThrowHelper.ThrowArgumentOutOfRange_IndexException(); } - int charLen; - UnicodeCategory uc = CharUnicodeInfo.InternalGetUnicodeCategory(str, index, out charLen); - return str.Substring(index, GetCurrentTextElementLen(str, index, len, ref uc, ref charLen)); + return str.Substring(index, TextSegmentationUtility.GetLengthOfFirstUtf16ExtendedGraphemeCluster(str.AsSpan(index))); } - public static TextElementEnumerator GetTextElementEnumerator(string str) - { - return GetTextElementEnumerator(str, 0); - } + public static TextElementEnumerator GetTextElementEnumerator(string str) => GetTextElementEnumerator(str, 0); public static TextElementEnumerator GetTextElementEnumerator(string str, int index) { - if (str == null) + if (str is null) { - throw new ArgumentNullException(nameof(str)); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.str); } - - int len = str.Length; - if (index < 0 || index > len) + if ((uint)index > (uint)str.Length) { - throw new ArgumentOutOfRangeException(nameof(index), index, SR.ArgumentOutOfRange_Index); + ThrowHelper.ThrowArgumentOutOfRange_IndexException(); } - return new TextElementEnumerator(str, index, len); + return new TextElementEnumerator(str, index); } /// @@ -260,37 +147,49 @@ public static TextElementEnumerator GetTextElementEnumerator(string str, int ind /// public static int[] ParseCombiningCharacters(string str) { - if (str == null) + if (str is null) { - throw new ArgumentNullException(nameof(str)); + ThrowHelper.ThrowArgumentNullException(ExceptionArgument.str); } - int len = str.Length; - int[] result = new int[len]; - if (len == 0) + // This method is optimized for small-ish strings. + // If a large string is seen we'll go down a slower code path. + + if (str.Length > 256) { - return result; + return ParseCombiningCharactersForLargeString(str); } - int resultCount = 0; + Span baseOffsets = stackalloc int[str.Length]; + int graphemeClusterCount = 0; - int i = 0; - int currentCharLen; - UnicodeCategory currentCategory = CharUnicodeInfo.InternalGetUnicodeCategory(str, 0, out currentCharLen); - - while (i < len) + ReadOnlySpan remaining = str; + while (!remaining.IsEmpty) { - result[resultCount++] = i; - i += GetCurrentTextElementLen(str, i, len, ref currentCategory, ref currentCharLen); + baseOffsets[graphemeClusterCount++] = str.Length - remaining.Length; + remaining = remaining.Slice(TextSegmentationUtility.GetLengthOfFirstUtf16ExtendedGraphemeCluster(remaining)); } - if (resultCount < len) + return baseOffsets.Slice(0, graphemeClusterCount).ToArray(); + } + + private static int[] ParseCombiningCharactersForLargeString(string str) + { + Debug.Assert(str != null); + + // If we have a large string, we may as well take the hit of using a List + // instead of trying the stackalloc optimizations we have for smaller strings. + + List baseOffsets = new List(); + + ReadOnlySpan remaining = str; + while (!remaining.IsEmpty) { - int[] returnArray = new int[resultCount]; - Array.Copy(result, returnArray, resultCount); - return returnArray; + baseOffsets.Add(str.Length - remaining.Length); + remaining = remaining.Slice(TextSegmentationUtility.GetLengthOfFirstUtf16ExtendedGraphemeCluster(remaining)); } - return result; + + return baseOffsets.ToArray(); } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/StrongBidiCategory.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/StrongBidiCategory.cs new file mode 100644 index 00000000000000..720a9df4f7ccf8 --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/StrongBidiCategory.cs @@ -0,0 +1,17 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace System.Globalization +{ + // Corresponds to the "strong" categories from https://www.unicode.org/reports/tr44/#Bidi_Class_Values. + // For our purposes, each code point is strongly left-to-right ("L"), strongly right-to-left ("R", "AL"), + // or other (all remaining code points). This is only used internally by IDN processing, and since our + // IDN processing logic only cares about "strong" values we don't carry the rest of the data. + internal enum StrongBidiCategory + { + Other = 0x00, + StrongLeftToRight = 0x10, + StrongRightToLeft = 0x20, + } +} diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/TextElementEnumerator.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/TextElementEnumerator.cs index 7ee564a9347ecd..3764d65536e8dc 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/TextElementEnumerator.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/TextElementEnumerator.cs @@ -4,49 +4,44 @@ using System.Collections; using System.Diagnostics; +using System.Text.Unicode; namespace System.Globalization { public class TextElementEnumerator : IEnumerator { private readonly string _str; - private int _index; - private readonly int _startIndex; + private readonly int _strStartIndex; // where in _str the enumeration should begin - // This is the length of the total string, counting from the beginning of string. - private readonly int _strLen; + private int _currentTextElementOffset; + private int _currentTextElementLength; + private string? _currentTextElementSubstr; - // The current text element lenght after MoveNext() is called. - private int _currTextElementLen; - - private UnicodeCategory _uc; - - // The next abstract char to look at after MoveNext() is called. - // It could be 1 or 2, depending on if it is a surrogate or not. - private int _charLen; - - internal TextElementEnumerator(string str, int startIndex, int strLen) + internal TextElementEnumerator(string str, int startIndex) { Debug.Assert(str != null, "TextElementEnumerator(): str != null"); - Debug.Assert(startIndex >= 0 && strLen >= 0, "TextElementEnumerator(): startIndex >= 0 && strLen >= 0"); - Debug.Assert(strLen >= startIndex, "TextElementEnumerator(): strLen >= startIndex"); + Debug.Assert(startIndex >= 0 && startIndex <= str.Length, "TextElementEnumerator(): startIndex >= 0 && startIndex <= str.Length"); + _str = str; - _startIndex = startIndex; - _strLen = strLen; + _strStartIndex = startIndex; + Reset(); } public bool MoveNext() { - if (_index >= _strLen) + _currentTextElementSubstr = null; // clear any cached substr + + int newOffset = _currentTextElementOffset + _currentTextElementLength; + _currentTextElementOffset = newOffset; // advance + _currentTextElementLength = 0; // prevent future calls to MoveNext() or get_Current from succeeding if we've hit end of data + + if (newOffset >= _str.Length) { - // Make the _index to be greater than _strLen so that we can throw exception if GetTextElement() is called. - _index = _strLen + 1; - return false; + return false; // reached the end of the data } - _currTextElementLen = StringInfo.GetCurrentTextElementLen(_str, _index, _strLen, ref _uc, ref _charLen); - _index += _currTextElementLen; + _currentTextElementLength = TextSegmentationUtility.GetLengthOfFirstUtf16ExtendedGraphemeCluster(_str.AsSpan(newOffset)); return true; } @@ -54,39 +49,45 @@ public bool MoveNext() public string GetTextElement() { - if (_index == _startIndex) - { - throw new InvalidOperationException(SR.InvalidOperation_EnumNotStarted); - } - if (_index > _strLen) + // Returned the cached substr if we've already generated it. + // Otherwise perform the substr operation now. + + string? currentSubstr = _currentTextElementSubstr; + if (currentSubstr is null) { - throw new InvalidOperationException(SR.InvalidOperation_EnumEnded); + if (_currentTextElementOffset >= _str.Length) + { + throw new InvalidOperationException(SR.InvalidOperation_EnumOpCantHappen); + } + + currentSubstr = _str.Substring(_currentTextElementOffset, _currentTextElementLength); + _currentTextElementSubstr = currentSubstr; } - return _str.Substring(_index - _currTextElementLen, _currTextElementLen); + return currentSubstr; } public int ElementIndex { get { - if (_index == _startIndex) + if (_currentTextElementOffset >= _str.Length) { - throw new InvalidOperationException(SR.InvalidOperation_EnumNotStarted); + throw new InvalidOperationException(SR.InvalidOperation_EnumOpCantHappen); } - return _index - _currTextElementLen; + return _currentTextElementOffset - _strStartIndex; } } public void Reset() { - _index = _startIndex; - if (_index < _strLen) - { - // If we have more than 1 character, get the category of the current char. - _uc = CharUnicodeInfo.InternalGetUnicodeCategory(_str, _index, out _charLen); - } + // These first two fields are set to intentionally out-of-range values. + // They'll be fixed up once the enumerator starts. + + _currentTextElementOffset = _str.Length; + _currentTextElementLength = _strStartIndex - _str.Length; + _currentTextElementSubstr = null; } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/Globalization/TextInfo.cs b/src/libraries/System.Private.CoreLib/src/System/Globalization/TextInfo.cs index d1f6b8d343bb62..b1908220b3c47b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Globalization/TextInfo.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Globalization/TextInfo.cs @@ -643,7 +643,7 @@ public unsafe string ToTitleCase(string str) for (int i = 0; i < str.Length; i++) { int charLen; - UnicodeCategory charType = CharUnicodeInfo.InternalGetUnicodeCategory(str, i, out charLen); + UnicodeCategory charType = CharUnicodeInfo.GetUnicodeCategoryInternal(str, i, out charLen); if (char.CheckLetter(charType)) { // Special case to check for Dutch specific titlecasing with "IJ" characters @@ -670,7 +670,7 @@ public unsafe string ToTitleCase(string str) // Use a loop to find all of the other letters following this letter. while (i < str.Length) { - charType = CharUnicodeInfo.InternalGetUnicodeCategory(str, i, out charLen); + charType = CharUnicodeInfo.GetUnicodeCategoryInternal(str, i, out charLen); if (IsLetterCategory(charType)) { if (charType == UnicodeCategory.LowercaseLetter) diff --git a/src/libraries/System.Private.CoreLib/src/System/Text/Rune.cs b/src/libraries/System.Private.CoreLib/src/System/Text/Rune.cs index ff3f4d005353e5..e303ba15c053c9 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Text/Rune.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Text/Rune.cs @@ -306,7 +306,7 @@ public static OperationStatus DecodeFromUtf16(ReadOnlySpan source, out Run /// number of s used in the input buffer to encode the . /// /// - /// If the source buffer is empty or contains only a standalone UTF-8 high surrogate character, returns , + /// If the source buffer is empty or contains only a partial UTF-8 subsequence, returns , /// and outs via and via the length of the input buffer. /// /// @@ -1070,7 +1070,7 @@ public static double GetNumericValue(Rune value) else { // not an ASCII char; fall back to globalization table - return CharUnicodeInfo.InternalGetNumericValue(value.Value); + return CharUnicodeInfo.GetNumericValue(value.Value); } } @@ -1237,16 +1237,10 @@ public static bool IsWhiteSpace(Rune value) return (AsciiCharInfo[value.Value] & IsWhiteSpaceFlag) != 0; } - // U+0085 is special since it's a whitespace character but is in the Control category - // instead of a normal separator category. No other code point outside the ASCII range - // has this mismatch. + // Only BMP code points can be white space, so only call into CharUnicodeInfo + // if the incoming value is within the BMP. - if (value._value == 0x0085u) - { - return true; - } - - return IsCategorySeparator(GetUnicodeCategoryNonAscii(value)); + return value.IsBmp && CharUnicodeInfo.GetIsWhiteSpace((char)value._value); } public static Rune ToLower(Rune value, CultureInfo culture) diff --git a/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/GraphemeClusterBreakType.cs b/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/GraphemeClusterBreakType.cs new file mode 100644 index 00000000000000..b98a3f884fe42e --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/GraphemeClusterBreakType.cs @@ -0,0 +1,27 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace System.Text.Unicode +{ + // Grapheme cluster break property values, as specified in + // https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries, Sec. 3.1. + internal enum GraphemeClusterBreakType + { + Other, + CR, + LF, + Control, + Extend, + ZWJ, + Regional_Indicator, + Prepend, + SpacingMark, + L, + V, + T, + LV, + LVT, + Extended_Pictograph, + } +} diff --git a/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/TextSegmentationUtility.cs b/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/TextSegmentationUtility.cs new file mode 100644 index 00000000000000..a8e47c9a552913 --- /dev/null +++ b/src/libraries/System.Private.CoreLib/src/System/Text/Unicode/TextSegmentationUtility.cs @@ -0,0 +1,235 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Buffers; +using System.Globalization; +using System.Runtime.InteropServices; + +namespace System.Text.Unicode +{ + /// + /// Provides helper utilities for computing text segmentation boundaries + /// as specified in UAX#29 (https://www.unicode.org/reports/tr29/). + /// + /// + /// The current implementation is compliant per Rev. 35, https://www.unicode.org/reports/tr29/tr29-35.html. + /// + internal static class TextSegmentationUtility + { + private delegate OperationStatus DecodeFirstRune(ReadOnlySpan input, out Rune rune, out int elementsConsumed); + + private static readonly DecodeFirstRune _utf16Decoder = Rune.DecodeFromUtf16; + + private static int GetLengthOfFirstExtendedGraphemeCluster(ReadOnlySpan input, DecodeFirstRune decoder) + { + // Algorithm given at https://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules. + + Processor processor = new Processor(input, decoder); + processor.MoveNext(); + + // First, consume as many Prepend scalars as we can (rule GB9b). + + while (processor.CurrentType == GraphemeClusterBreakType.Prepend) + { + processor.MoveNext(); + } + + // Next, make sure we're not about to violate control character restrictions. + // Essentially, if we saw Prepend data, we can't have Control | CR | LF data afterward (rule GB5). + + if (processor.CurrentCodeUnitOffset > 0) + { + if (processor.CurrentType == GraphemeClusterBreakType.Control + || processor.CurrentType == GraphemeClusterBreakType.CR + || processor.CurrentType == GraphemeClusterBreakType.LF) + { + goto Return; + } + } + + // Now begin the main state machine. + + GraphemeClusterBreakType previousClusterBreakType = processor.CurrentType; + processor.MoveNext(); + + switch (previousClusterBreakType) + { + case GraphemeClusterBreakType.CR: + if (processor.CurrentType != GraphemeClusterBreakType.LF) + { + goto Return; // rules GB3 & GB4 (only can follow ) + } + + processor.MoveNext(); + goto case GraphemeClusterBreakType.LF; + + case GraphemeClusterBreakType.Control: + case GraphemeClusterBreakType.LF: + goto Return; // rule GB4 (no data after Control | LF) + + case GraphemeClusterBreakType.L: + if (processor.CurrentType == GraphemeClusterBreakType.L) + { + processor.MoveNext(); // rule GB6 (L x L) + goto case GraphemeClusterBreakType.L; + } + else if (processor.CurrentType == GraphemeClusterBreakType.V) + { + processor.MoveNext(); // rule GB6 (L x V) + goto case GraphemeClusterBreakType.V; + } + else if (processor.CurrentType == GraphemeClusterBreakType.LV) + { + processor.MoveNext(); // rule GB6 (L x LV) + goto case GraphemeClusterBreakType.LV; + } + else if (processor.CurrentType == GraphemeClusterBreakType.LVT) + { + processor.MoveNext(); // rule GB6 (L x LVT) + goto case GraphemeClusterBreakType.LVT; + } + else + { + break; + } + + case GraphemeClusterBreakType.LV: + case GraphemeClusterBreakType.V: + if (processor.CurrentType == GraphemeClusterBreakType.V) + { + processor.MoveNext(); // rule GB7 (LV | V x V) + goto case GraphemeClusterBreakType.V; + } + else if (processor.CurrentType == GraphemeClusterBreakType.T) + { + processor.MoveNext(); // rule GB7 (LV | V x T) + goto case GraphemeClusterBreakType.T; + } + else + { + break; + } + + case GraphemeClusterBreakType.LVT: + case GraphemeClusterBreakType.T: + if (processor.CurrentType == GraphemeClusterBreakType.T) + { + processor.MoveNext(); // rule GB8 (LVT | T x T) + goto case GraphemeClusterBreakType.T; + } + else + { + break; + } + + case GraphemeClusterBreakType.Extended_Pictograph: + // Attempt processing extended pictographic (rules GB11, GB9). + // First, drain any Extend scalars that might exist + + while (processor.CurrentType == GraphemeClusterBreakType.Extend) + { + processor.MoveNext(); + } + + // Now see if there's a ZWJ + extended pictograph again. + + if (processor.CurrentType != GraphemeClusterBreakType.ZWJ) + { + break; + } + + processor.MoveNext(); + if (processor.CurrentType != GraphemeClusterBreakType.Extended_Pictograph) + { + break; + } + + processor.MoveNext(); + goto case GraphemeClusterBreakType.Extended_Pictograph; + + case GraphemeClusterBreakType.Regional_Indicator: + // We've consumed a single RI scalar. Try to consume another (to make it a pair). + + if (processor.CurrentType == GraphemeClusterBreakType.Regional_Indicator) + { + processor.MoveNext(); + } + + // Standlone RI scalars (or a single pair of RI scalars) can only be followed by trailers. + + break; // nothing but trailers after the final RI + + default: + break; + } + + // rules GB9, GB9a + while (processor.CurrentType == GraphemeClusterBreakType.Extend + || processor.CurrentType == GraphemeClusterBreakType.ZWJ + || processor.CurrentType == GraphemeClusterBreakType.SpacingMark) + { + processor.MoveNext(); + } + + Return: + + return processor.CurrentCodeUnitOffset; // rules GB2, GB999 + } + + /// + /// Given UTF-16 input text, returns the length (in chars) of the first extended grapheme cluster. + /// The slice [0..length] represents the first standalone extended grapheme cluster in the text. + /// If the input is empty, returns 0. + /// + public static int GetLengthOfFirstUtf16ExtendedGraphemeCluster(ReadOnlySpan input) + { + return GetLengthOfFirstExtendedGraphemeCluster(input, _utf16Decoder); + } + + [StructLayout(LayoutKind.Auto)] + private ref struct Processor + { + private readonly ReadOnlySpan _buffer; + private readonly DecodeFirstRune _decoder; + private int _codeUnitLengthOfCurrentScalar; + + internal Processor(ReadOnlySpan buffer, DecodeFirstRune decoder) + { + _buffer = buffer; + _decoder = decoder; + _codeUnitLengthOfCurrentScalar = 0; + CurrentType = GraphemeClusterBreakType.Other; + CurrentCodeUnitOffset = 0; + } + + public int CurrentCodeUnitOffset { get; private set; } + + /// + /// Will be if invalid data or EOF reached. + /// Caller shouldn't need to special-case this since the normal rules will halt on this condition. + /// + public GraphemeClusterBreakType CurrentType { get; private set; } + + public void MoveNext() + { + // For ill-formed subsequences (like unpaired UTF-16 surrogate code points), we rely on + // the decoder's default behavior of interpreting these ill-formed subsequences as + // equivalent to U+FFFD REPLACEMENT CHARACTER. This code point has a boundary property + // of Other (XX), which matches the modifications made to UAX#29, Rev. 35. + // See: https://www.unicode.org/reports/tr29/tr29-35.html#Modifications + // This change is also reflected in the UCD files. For example, Unicode 11.0's UCD file + // https://www.unicode.org/Public/11.0.0/ucd/auxiliary/GraphemeBreakProperty.txt + // has the line "D800..DFFF ; Control # Cs [2048] ..", + // but starting with Unicode 12.0 that line has been removed. + // + // If a later version of the Unicode Standard further modifies this guidance we should reflect + // that here. + + CurrentCodeUnitOffset += _codeUnitLengthOfCurrentScalar; + _decoder(_buffer.Slice(CurrentCodeUnitOffset), out Rune thisRune, out _codeUnitLengthOfCurrentScalar); + CurrentType = CharUnicodeInfo.GetGraphemeClusterBreakType(thisRune); + } + } + } +} diff --git a/src/libraries/System.Private.CoreLib/src/System/Text/UnicodeDebug.cs b/src/libraries/System.Private.CoreLib/src/System/Text/UnicodeDebug.cs index 0ea7de8c33c35d..1f82dd99ac3d74 100644 --- a/src/libraries/System.Private.CoreLib/src/System/Text/UnicodeDebug.cs +++ b/src/libraries/System.Private.CoreLib/src/System/Text/UnicodeDebug.cs @@ -11,31 +11,46 @@ internal static class UnicodeDebug [Conditional("DEBUG")] internal static void AssertIsHighSurrogateCodePoint(uint codePoint) { - Debug.Assert(UnicodeUtility.IsHighSurrogateCodePoint(codePoint), $"The value {ToHexString(codePoint)} is not a valid UTF-16 high surrogate code point."); + if (!UnicodeUtility.IsHighSurrogateCodePoint(codePoint)) + { + Debug.Fail($"The value {ToHexString(codePoint)} is not a valid UTF-16 high surrogate code point."); + } } [Conditional("DEBUG")] internal static void AssertIsLowSurrogateCodePoint(uint codePoint) { - Debug.Assert(UnicodeUtility.IsLowSurrogateCodePoint(codePoint), $"The value {ToHexString(codePoint)} is not a valid UTF-16 low surrogate code point."); + if (!UnicodeUtility.IsLowSurrogateCodePoint(codePoint)) + { + Debug.Fail($"The value {ToHexString(codePoint)} is not a valid UTF-16 low surrogate code point."); + } } [Conditional("DEBUG")] internal static void AssertIsValidCodePoint(uint codePoint) { - Debug.Assert(UnicodeUtility.IsValidCodePoint(codePoint), $"The value {ToHexString(codePoint)} is not a valid Unicode code point."); + if (!UnicodeUtility.IsValidCodePoint(codePoint)) + { + Debug.Fail($"The value {ToHexString(codePoint)} is not a valid Unicode code point."); + } } [Conditional("DEBUG")] internal static void AssertIsValidScalar(uint scalarValue) { - Debug.Assert(UnicodeUtility.IsValidUnicodeScalar(scalarValue), $"The value {ToHexString(scalarValue)} is not a valid Unicode scalar value."); + if (!UnicodeUtility.IsValidUnicodeScalar(scalarValue)) + { + Debug.Fail($"The value {ToHexString(scalarValue)} is not a valid Unicode scalar value."); + } } [Conditional("DEBUG")] internal static void AssertIsValidSupplementaryPlaneScalar(uint scalarValue) { - Debug.Assert(UnicodeUtility.IsValidUnicodeScalar(scalarValue) && !UnicodeUtility.IsBmpCodePoint(scalarValue), $"The value {ToHexString(scalarValue)} is not a valid supplementary plane Unicode scalar value."); + if (!UnicodeUtility.IsValidUnicodeScalar(scalarValue) || UnicodeUtility.IsBmpCodePoint(scalarValue)) + { + Debug.Fail($"The value {ToHexString(scalarValue)} is not a valid supplementary plane Unicode scalar value."); + } } /// diff --git a/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs b/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs index d233e40acf43e7..88c91e93006876 100644 --- a/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs +++ b/src/libraries/System.Private.CoreLib/src/System/ThrowHelper.cs @@ -684,6 +684,10 @@ private static string GetArgumentName(ExceptionArgument argument) return "arrayIndex"; case ExceptionArgument.year: return "year"; + case ExceptionArgument.codePoint: + return "codePoint"; + case ExceptionArgument.str: + return "str"; default: Debug.Fail("The enum value is not defined, please check the ExceptionArgument Enum."); return ""; @@ -933,6 +937,8 @@ internal enum ExceptionArgument elementType, arrayIndex, year, + codePoint, + str, } // diff --git a/src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj b/src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj index 7e0e48eaa9509b..ed35db5127ef18 100644 --- a/src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj +++ b/src/libraries/System.Runtime/tests/System.Runtime.Tests.csproj @@ -277,9 +277,9 @@ - - System\Text\Unicode\UnicodeData.11.0.txt - UnicodeData.11.0.txt + + System\Text\Unicode\UnicodeData.12.1.txt + UnicodeData.12.1.txt System\Text\Unicode\CaseFolding-12.1.0.txt diff --git a/src/libraries/System.Runtime/tests/System/Text/Unicode/UnicodeData.cs b/src/libraries/System.Runtime/tests/System/Text/Unicode/UnicodeData.cs index df9201c08729c4..bd121afc46a5ad 100644 --- a/src/libraries/System.Runtime/tests/System/Text/Unicode/UnicodeData.cs +++ b/src/libraries/System.Runtime/tests/System/Text/Unicode/UnicodeData.cs @@ -18,7 +18,7 @@ namespace System.Text.Unicode.Tests public static class UnicodeData { - private const string UnicodeDataFilename = "UnicodeData.11.0.txt"; + private const string UnicodeDataFilename = "UnicodeData.12.1.txt"; private const string CaseFoldingFilename = "CaseFolding-12.1.0.txt"; private const string PropListFilename = "PropList-12.1.0.txt"; diff --git a/src/libraries/System.Text.Encodings.Web/tools/updating-encodings.md b/src/libraries/System.Text.Encodings.Web/tools/updating-encodings.md index afcbb515b5ce76..cf3eed8547bb02 100644 --- a/src/libraries/System.Text.Encodings.Web/tools/updating-encodings.md +++ b/src/libraries/System.Text.Encodings.Web/tools/updating-encodings.md @@ -12,15 +12,15 @@ Updating the implementation consists of three steps: checking in a new version o As a prerequisite for updating the tools, you will need the _dotnet_ tool (version 3.0 or above) available from your local command prompt. -1. Get the latest __UnicodeData.txt__ and __Blocks.txt__ files from the Unicode Consortium web site. Drop __UnicodeData.txt__ into the __src/Common/tests/Data__ folder, rename it so that the file name contains the Unicode version it represents (e.g., _UnicodeData.11.0.txt_) and submit it to the Git repo. Place the __Blocks.txt__ in a temporary location; it will not be submitted to the Git repo. +1. Get the latest __UnicodeData.txt__ and __Blocks.txt__ files from the Unicode Consortium web site. Drop __UnicodeData.txt__ into the __src/libraries/Common/tests/Data__ folder, rename it so that the file name contains the Unicode version it represents (e.g., _UnicodeData.12.1.txt_) and submit it to the Git repo. Place the __Blocks.txt__ in a temporary location; it will not be submitted to the Git repo. -2. Open a command prompt and navigate to the __src/System.Text.Encodings.Web/tools/GenDefinedCharList__ directory, then run the following command, replacing the first parameter with the path to the _UnicodeData.txt_ file you downloaded in the previous step. This command will update the "defined characters" bitmap within the runtime folder. The test project also consumes the file from the _src_ folder, so running this command will update both the runtime and the test project. +2. Open a command prompt and navigate to the __src/libraries/System.Text.Encodings.Web/tools/GenDefinedCharList__ directory, then run the following command, replacing the first parameter with the path to the _UnicodeData.txt_ file you downloaded in the previous step. This command will update the "defined characters" bitmap within the runtime folder. The test project also consumes the file from the _src_ folder, so running this command will update both the runtime and the test project. ```txt dotnet run -- "path_to_UnicodeData.txt" ../../src/System/Text/Unicode/UnicodeHelpers.generated.cs ``` -3. Open a command prompt and navigate to the __src/System.Text.Encodings.Web/tools/GenUnicodeRanges__ directory, then run the following command, replacing the first parameter with the path to the _Blocks.txt_ file you downloaded in the first step. This command will update the `UnicodeRanges` type in the runtime folder and update the unit tests to exercise the new APIs. +3. Open a command prompt and navigate to the __src/libraries/System.Text.Encodings.Web/tools/GenUnicodeRanges__ directory, then run the following command, replacing the first parameter with the path to the _Blocks.txt_ file you downloaded in the first step. This command will update the `UnicodeRanges` type in the runtime folder and update the unit tests to exercise the new APIs. ```txt dotnet run -- "path_to_Blocks.txt" ../../src/System/Text/Unicode/UnicodeRanges.generated.cs ../../tests/UnicodeRangesTests.generated.cs @@ -28,9 +28,9 @@ dotnet run -- "path_to_Blocks.txt" ../../src/System/Text/Unicode/UnicodeRanges.g 4. Update the __ref__ APIs to reflect any new `UnicodeRanges` static properties which were added in the previous step, otherwise the unit test project will not be able to reference them. See https://github.com/dotnet/runtime/blob/master/docs/coding-guidelines/updating-ref-source.md for instructions on how to update the reference assemblies. -5. Update the __src/System.Text.Encodings.Web/tests/System.Text.Encodings.Web.Tests.csproj__ file to reference the new file that you dropped into the __src/Common/tests/data__ folder in the first step above. Open the .csproj file in a text editor, and replace both the `` and the `` elements at the end of the document to reference the new file name. +5. Update the __src/libraries/System.Text.Encodings.Web/tests/System.Text.Encodings.Web.Tests.csproj__ file to reference the new file that you dropped into the __src/libraries/Common/tests/data__ folder in the first step above. Open the .csproj file in a text editor, and replace both the `` and the `` elements at the end of the document to reference the new file name. -6. In the file __src/System.Text.Encodings.Web/tests/UnicodeHelpersTests.cs__, update the _UnicodeDataFileName_ const string at the top of the file to reflect the new file name for _UnicodeData.x.y.txt_. +6. In the file __src/libraries/System.Text.Encodings.Web/tests/UnicodeHelpersTests.cs__, update the _UnicodeDataFileName_ const string at the top of the file to reflect the new file name for _UnicodeData.x.y.txt_. 7. Finally, update the _Current implementation_ section at the beginning of this markdown file to reflect the version of the Unicode data files which were given to the tools. Remember also to update the URL within that section so that these data files can be easily accessed in the future.