From 113ad82b8c00a4ae2389dd0f04cdde18339144cc Mon Sep 17 00:00:00 2001 From: Karl Wagner <5254025+karwa@users.noreply.github.com> Date: Sat, 8 Jun 2024 03:57:36 +0200 Subject: [PATCH 1/6] [stdlib] Use broader fast-path for Unicode.Scalar.Properties.canonicalCombiningClass --- stdlib/public/core/StringGraphemeBreaking.swift | 13 +++---------- stdlib/public/core/UnicodeScalarProperties.swift | 3 +-- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/stdlib/public/core/StringGraphemeBreaking.swift b/stdlib/public/core/StringGraphemeBreaking.swift index 8c2e6c685811b..8edff7cac1621 100644 --- a/stdlib/public/core/StringGraphemeBreaking.swift +++ b/stdlib/public/core/StringGraphemeBreaking.swift @@ -790,10 +790,8 @@ extension _GraphemeBreakingState { // we continue being in one and may check if this extend is a Virama. if self.isInIndicSequence || scalar1._isLinkingConsonant { if y == .extend { - let extendNormData = Unicode._NormData(scalar2, fastUpperbound: 0x300) - // If our extend's CCC is 0, then this rule does not apply. - guard extendNormData.ccc != 0 else { + guard scalar2.properties.canonicalCombiningClass != .notReordered else { return false } } @@ -931,12 +929,9 @@ extension _StringGuts { // GB9c switch (x, scalar2._isLinkingConsonant) { case (.extend, true): - let extendNormData = Unicode._NormData(scalar1, fastUpperbound: 0x300) - - guard extendNormData.ccc != 0 else { + guard scalar1.properties.canonicalCombiningClass != .notReordered else { return true } - return !checkIfInIndicSequence(at: index, with: previousScalar) case (.zwj, true): @@ -1055,9 +1050,7 @@ extension _StringGuts { switch (gbp, scalar._isLinkingConsonant) { case (.extend, false): - let extendNormData = Unicode._NormData(scalar, fastUpperbound: 0x300) - - guard extendNormData.ccc != 0 else { + guard scalar.properties.canonicalCombiningClass != .notReordered else { return false } diff --git a/stdlib/public/core/UnicodeScalarProperties.swift b/stdlib/public/core/UnicodeScalarProperties.swift index 8bbb7f696e9e1..1afa16c685de3 100644 --- a/stdlib/public/core/UnicodeScalarProperties.swift +++ b/stdlib/public/core/UnicodeScalarProperties.swift @@ -1427,8 +1427,7 @@ extension Unicode.Scalar.Properties { /// This property corresponds to the "Canonical_Combining_Class" property in /// the [Unicode Standard](http://www.unicode.org/versions/latest/). public var canonicalCombiningClass: Unicode.CanonicalCombiningClass { - let normData = Unicode._NormData(_scalar) - return Unicode.CanonicalCombiningClass(rawValue: normData.ccc) + Unicode._NormData(_scalar, fastUpperbound: 0x300).canonicalCombiningClass } } From 86be4bba942e18c86cc5fc482fc48cf3aacf4c6a Mon Sep 17 00:00:00 2001 From: Karl Wagner <5254025+karwa@users.noreply.github.com> Date: Fri, 31 May 2024 14:58:06 +0200 Subject: [PATCH 2/6] [UnicodeData] Fix GenNormalization --- .../Sources/GenNormalization/main.swift | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/utils/gen-unicode-data/Sources/GenNormalization/main.swift b/utils/gen-unicode-data/Sources/GenNormalization/main.swift index 4e14328e14e71..15ca05afc3a70 100644 --- a/utils/gen-unicode-data/Sources/GenNormalization/main.swift +++ b/utils/gen-unicode-data/Sources/GenNormalization/main.swift @@ -13,18 +13,18 @@ import GenUtils // Main entry point into the normalization generator. -func generateNormalization(for platform: String) { +func generateNormalization(for platform: String, version: String) { var result = readFile("Input/NormalizationData.h") - let derivedNormalizationProps = readFile("Data/DerivedNormalizationProps.txt") - + let derivedNormalizationProps = readFile("Data/\(version)/DerivedNormalizationProps.txt") + let unicodeData: String switch platform { case "Apple": - unicodeData = readFile("Data/Apple/UnicodeData.txt") + unicodeData = readFile("Data/\(version)/Apple/UnicodeData.txt") default: - unicodeData = readFile("Data/UnicodeData.txt") + unicodeData = readFile("Data/\(version)/UnicodeData.txt") } // Get all NFX_QC information and put it together with CCC info. @@ -57,9 +57,9 @@ func generateNormalization(for platform: String) { """ // Finally, write it out. - write(result, to: "Output/\(platform)/NormalizationData.h") + write(result, to: "Output/\(platform)/\(version)/NormalizationData.h") } for platform in ["Common", "Apple"] { - generateNormalization(for: platform) + generateNormalization(for: platform, version: "15") } From 0ddc2b226fca19181a6c6e700b7fb432d9f2301d Mon Sep 17 00:00:00 2001 From: Karl Wagner <5254025+karwa@users.noreply.github.com> Date: Fri, 31 May 2024 14:51:52 +0200 Subject: [PATCH 3/6] [UnicodeData] Sort NormData for easier diffing (NFC) --- .../stubs/Unicode/Apple/NormalizationData.h | 352 ++++++++--------- .../stubs/Unicode/Common/NormalizationData.h | 370 ++++++++---------- .../Input/NormalizationData.h | 2 +- .../Sources/GenNormalization/NormData.swift | 4 +- 4 files changed, 351 insertions(+), 377 deletions(-) diff --git a/stdlib/public/stubs/Unicode/Apple/NormalizationData.h b/stdlib/public/stubs/Unicode/Apple/NormalizationData.h index e3720dd3b5e7b..9389595822e2c 100644 --- a/stdlib/public/stubs/Unicode/Apple/NormalizationData.h +++ b/stdlib/public/stubs/Unicode/Apple/NormalizationData.h @@ -2,7 +2,7 @@ // // This source file is part of the Swift.org open source project // -// Copyright (c) 2021 - 2023 Apple Inc. and the Swift project authors +// Copyright (c) 2021-2024 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information @@ -19,186 +19,182 @@ #include "swift/shims/SwiftStdint.h" static const __swift_uint16_t _swift_stdlib_normData_data[66] = { - 0xF8, 0x358, 0x750, 0x784, 0x3, 0xA8, 0x6E0, 0x4C, 0x88, 0x3B0, 0x78, 0xA0, 0x4, 0x110, 0x730, - 0xE0, 0x44, 0x68, 0x118, 0x748, 0x80, 0x654, 0x6C4, 0xD0, 0x48, 0x700, 0x60, 0x98, 0x6E4, 0x710, - 0xC8, 0x6C0, 0x740, 0x50, 0x8, 0x733, 0x2DC, 0xC, 0x408, 0x410, 0x30, 0x734, 0x70, 0xE8, 0x6F0, - 0x90, 0x2A0, 0xB8, 0x420, 0x58, 0x650, 0x6B0, 0x3C, 0x120, 0xF0, 0x3D0, 0x720, 0x38, 0x1, 0x100, - 0x108, 0xD8, 0xB0, 0x338, 0xC0, 0x6D0, + 0x1, 0x3, 0x4, 0x8, 0xC, 0x30, 0x38, 0x3C, 0x44, 0x48, 0x4C, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, + 0x80, 0x88, 0x90, 0x98, 0xA0, 0xA8, 0xB0, 0xB8, 0xC0, 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xF0, 0xF8, + 0x100, 0x108, 0x110, 0x118, 0x120, 0x2A0, 0x2DC, 0x338, 0x358, 0x3B0, 0x3D0, 0x408, 0x410, 0x420, + 0x650, 0x654, 0x6B0, 0x6C0, 0x6C4, 0x6D0, 0x6E0, 0x6E4, 0x6F0, 0x700, 0x710, 0x720, 0x730, 0x733, + 0x734, 0x740, 0x748, 0x750, 0x784, }; static const __swift_uint8_t _swift_stdlib_normData_data_indices[3051] = { - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x29, 0x29, 0x29, 0x29, - 0x29, 0xE, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0xE, 0xE, 0x29, 0xE, 0x29, 0xE, 0x29, 0x29, - 0x20, 0x6, 0x6, 0x6, 0x6, 0x20, 0x16, 0x6, 0x6, 0x6, 0x6, 0x6, 0x32, 0x32, 0x1C, 0x1C, 0x1C, 0x1C, - 0x15, 0x15, 0x6, 0x6, 0x6, 0x6, 0x1C, 0x1C, 0x6, 0x1C, 0x1C, 0x6, 0x6, 0x22, 0x22, 0x22, 0x22, - 0x25, 0x6, 0x6, 0x6, 0x6, 0xE, 0xE, 0xE, 0x23, 0x23, 0x29, 0x23, 0x23, 0x3, 0xE, 0x6, 0x6, 0x6, - 0xE, 0xE, 0xE, 0x6, 0x6, 0xE, 0xE, 0xE, 0x6, 0x6, 0x6, 0x6, 0xE, 0x20, 0x6, 0x6, 0xE, 0x13, 0x2, - 0x2, 0x13, 0x2, 0x2, 0x13, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x4, - 0x4, 0x3A, 0x3A, 0x4, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0xE, 0xE, 0xE, 0xE, 0xE, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x6, 0xE, 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0xE, 0x2C, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, - 0x6, 0x6, 0x6, 0x6, 0x6, 0xE, 0xE, 0x6, 0xE, 0xE, 0x2C, 0x38, 0xE, 0x21, 0x31, 0x1A, 0x11, 0x2A, - 0xA, 0x14, 0x8, 0x2D, 0x1B, 0x1B, 0xB, 0x5, 0x3E, 0x2F, 0x40, 0x1E, 0xE, 0x6, 0x2D, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0x36, 0x0, 0x3B, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3D, 0xF, 0x2B, 0x36, - 0x0, 0x3B, 0x3C, 0xD, 0x29, 0x29, 0x1C, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0x6, 0x12, - 0x3A, 0x3A, 0x3A, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0xE, 0x6, - 0xE, 0xE, 0x6, 0x35, 0xE, 0x6, 0xE, 0xE, 0x6, 0xE, 0xE, 0x6, 0x6, 0x6, 0xE, 0x6, 0x6, 0xE, 0x6, - 0xE, 0xE, 0xE, 0x6, 0xE, 0x6, 0xE, 0x6, 0xE, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0x6, 0xE, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0x6, 0x6, 0xE, 0x6, 0x6, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0x6, 0x6, 0x6, 0x6, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0x6, 0xE, 0xE, 0x6, 0xE, 0xE, 0x6, 0xE, 0xE, 0xE, 0x6, 0x6, 0x6, 0x3D, 0xF, 0x2B, 0xE, - 0xE, 0xE, 0x6, 0xE, 0xE, 0x6, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0x3A, 0x3A, 0x3A, 0x34, 0x18, 0xE, - 0x6, 0xE, 0xE, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x39, 0xC, 0x3A, 0x3A, 0x18, 0xC, 0x4, 0x4, - 0x4, 0xE, 0x4, 0x4, 0x39, 0x18, 0x4, 0x4, 0x4, 0x4, 0x39, 0x18, 0x39, 0xC, 0x3A, 0x3A, 0x3A, 0x18, - 0xC, 0xC, 0x4, 0x4, 0x3A, 0xC, 0x3A, 0x3A, 0x3A, 0x18, 0xC, 0x39, 0x3A, 0x18, 0x2E, 0x24, 0x39, - 0x3A, 0xC, 0x3A, 0x3A, 0x3A, 0x3A, 0x18, 0xC, 0xC, 0x18, 0x18, 0xC, 0x3A, 0x3A, 0x3A, 0x18, 0xC, - 0x7, 0xC, 0x3A, 0x3A, 0x3A, 0x3A, 0xC, 0x3F, 0x3F, 0x18, 0x1, 0x1, 0x1, 0x1, 0x9, 0x9, 0x18, 0x37, - 0x37, 0x37, 0x37, 0x6, 0x6, 0x6, 0x6, 0x1F, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x26, 0x27, 0x4, 0x30, - 0x4, 0x4, 0x4, 0x27, 0x27, 0x27, 0x27, 0x27, 0x4, 0xE, 0xE, 0x18, 0xE, 0xE, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x6, 0x3A, 0xC, 0x39, 0x18, 0x18, 0x6, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, - 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, - 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, 0xC, - 0xE, 0xE, 0xE, 0x18, 0x18, 0x18, 0x18, 0xE, 0x38, 0x2C, 0xE, 0x6, 0xE, 0x6, 0x18, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0xE, 0xE, - 0x6, 0x6, 0x6, 0xE, 0xE, 0x6, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0xE, 0xE, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x39, 0xC, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x18, 0xE, 0x6, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0x18, 0x18, 0x39, 0x18, 0x18, 0x39, 0xE, 0xE, 0xE, 0x22, 0x6, 0x6, 0x6, 0x6, - 0x6, 0xE, 0xE, 0x6, 0x6, 0x6, 0x6, 0xE, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x6, 0xE, 0xE, - 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0x2, 0x33, 0x6, 0x32, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x20, 0x38, - 0x38, 0x6, 0x41, 0xE, 0x13, 0x6, 0xE, 0x6, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x4, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x4, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x4, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x4, 0x3A, - 0x3A, 0x4, 0x4, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x4, 0x3A, 0x4, 0x3A, 0x4, 0x4, 0x4, 0xE, 0xE, - 0x22, 0x22, 0xE, 0xE, 0xE, 0xE, 0x22, 0x22, 0x22, 0xE, 0xE, 0xE, 0x22, 0x22, 0xE, 0x6, 0xE, 0x22, - 0x22, 0x6, 0x6, 0x6, 0x6, 0xE, 0x4, 0x4, 0x4, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x4, 0x4, 0x4, 0xE, 0xE, 0xE, 0x18, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x41, 0x38, 0x20, 0x2C, 0x19, 0x19, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x10, 0x10, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, - 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0x3A, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0x18, 0x18, 0x18, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0x6, 0x6, 0x18, 0x39, 0x18, 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0xE, - 0xE, 0xE, 0x18, 0x18, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x17, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, - 0xE, 0xE, 0x6, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0xE, 0xE, 0x22, 0x6, 0x18, 0xE, 0x6, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0x6, 0x6, 0x6, 0x6, 0x6, 0xE, 0xE, 0xE, 0x6, 0xE, 0x6, 0x6, 0x6, 0x6, 0xE, - 0x6, 0xE, 0x6, 0x18, 0x18, 0x18, 0x3A, 0x3A, 0x3A, 0x18, 0x34, 0xE, 0xE, 0xE, 0xC, 0x3A, 0x3A, - 0x18, 0x18, 0x39, 0x18, 0x39, 0x18, 0x39, 0x39, 0x18, 0x39, 0x39, 0xC, 0x3A, 0x3A, 0x18, 0xC, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x18, 0x39, 0xE, 0xC, 0xC, 0x3A, 0x3A, 0xC, - 0x3A, 0x18, 0x39, 0xC, 0x3A, 0x3A, 0x18, 0x39, 0x18, 0x18, 0x39, 0x18, 0x18, 0x39, 0xC, 0x3A, - 0x18, 0x18, 0x39, 0x18, 0x18, 0x18, 0x18, 0x18, 0x39, 0x18, 0x18, 0x18, 0x18, 0x18, 0x22, 0x22, - 0x22, 0x22, 0x22, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x28, 0x28, 0x22, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x1F, 0x1F, 0x22, 0x22, 0x22, 0x1D, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x6, 0x6, 0x6, 0x6, - 0x6, 0x6, 0x6, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0x6, 0x6, 0xE, 0xE, 0xE, 0xE, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, - 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x20, - 0x20, 0x6, 0xE, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0x39, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, - 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3B, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3B, 0x3B, 0x3D, 0x3B, 0x3D, 0x3B, 0x3D, 0x3D, 0x3E, 0x35, 0x35, 0x35, 0x35, 0x3E, 0x33, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x2F, 0x2F, 0x36, 0x36, 0x36, 0x36, 0x30, 0x30, 0x35, 0x35, 0x35, + 0x35, 0x36, 0x36, 0x35, 0x36, 0x36, 0x35, 0x35, 0x3, 0x3, 0x3, 0x3, 0x4, 0x35, 0x35, 0x35, 0x35, + 0x3B, 0x3B, 0x3B, 0x3C, 0x3C, 0x3D, 0x3C, 0x3C, 0x41, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, + 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3E, 0x35, 0x35, 0x3B, 0x3F, 0x40, + 0x40, 0x3F, 0x40, 0x40, 0x3F, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x1, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, + 0x3B, 0x37, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, + 0x3B, 0x35, 0x3B, 0x3B, 0x37, 0x3A, 0x3B, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x3B, 0x35, 0x13, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x1F, 0x20, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, + 0x23, 0x3D, 0x3D, 0x36, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x24, 0x0, + 0x0, 0x0, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, + 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x25, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, + 0x3B, 0x35, 0x35, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x35, 0x35, 0x35, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, + 0x1C, 0x1D, 0x1E, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x0, 0x0, 0x0, 0x7, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x6, 0x2, + 0x0, 0x0, 0x9, 0x2, 0x1, 0x1, 0x1, 0x3B, 0x1, 0x1, 0x6, 0x9, 0x1, 0x1, 0x1, 0x1, 0x6, 0x9, 0x6, + 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0x2, 0x1, 0x1, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0x6, 0x0, 0x9, + 0x26, 0x27, 0x6, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x9, 0x2, 0x2, 0x9, 0x9, 0x2, 0x0, 0x0, 0x0, 0x9, + 0x2, 0xA, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x28, 0x28, 0x9, 0x29, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x9, + 0x2B, 0x2B, 0x2B, 0x2B, 0x35, 0x35, 0x35, 0x35, 0x32, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2C, 0x2D, + 0x1, 0x2E, 0x1, 0x1, 0x1, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x1, 0x3B, 0x3B, 0x9, 0x3B, 0x3B, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x35, 0x0, 0x2, 0x6, 0x9, 0x9, 0x35, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x9, 0x9, 0x3B, 0x3A, 0x37, 0x3B, 0x35, 0x3B, 0x35, + 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x6, 0x9, 0x9, + 0x6, 0x3B, 0x3B, 0x3B, 0x3, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, + 0x3B, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x40, 0x31, 0x35, 0x2F, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3E, 0x3A, 0x3A, 0x35, 0x34, 0x3B, 0x3F, 0x35, 0x3B, 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3, 0x3, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3, 0x3, 0x3, 0x3B, 0x3B, 0x3B, 0x3, 0x3, 0x3B, 0x35, 0x3B, 0x3, 0x3, 0x35, + 0x35, 0x35, 0x35, 0x3B, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, + 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x34, 0x3A, 0x3E, 0x37, 0x38, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x9, + 0x6, 0x9, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3, 0x35, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x3B, + 0x35, 0x3B, 0x35, 0x9, 0x9, 0x9, 0x0, 0x0, 0x0, 0x9, 0x7, 0x3B, 0x3B, 0x3B, 0x2, 0x0, 0x0, 0x9, + 0x9, 0x6, 0x9, 0x6, 0x9, 0x6, 0x6, 0x9, 0x6, 0x6, 0x2, 0x0, 0x0, 0x9, 0x2, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x6, 0x3B, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0, 0x9, + 0x6, 0x2, 0x0, 0x0, 0x9, 0x6, 0x9, 0x9, 0x6, 0x9, 0x9, 0x6, 0x2, 0x0, 0x9, 0x9, 0x6, 0x9, 0x9, + 0x9, 0x9, 0x9, 0x6, 0x9, 0x9, 0x9, 0x9, 0x9, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x5, 0x5, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x32, 0x32, 0x3, 0x3, 0x3, + 0x39, 0x32, 0x32, 0x32, 0x32, 0x32, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3E, 0x3E, 0x35, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, }; static const __swift_uint16_t _swift_stdlib_normData_ranks[412] = { diff --git a/stdlib/public/stubs/Unicode/Common/NormalizationData.h b/stdlib/public/stubs/Unicode/Common/NormalizationData.h index 135b205a7ea80..9389595822e2c 100644 --- a/stdlib/public/stubs/Unicode/Common/NormalizationData.h +++ b/stdlib/public/stubs/Unicode/Common/NormalizationData.h @@ -2,7 +2,7 @@ // // This source file is part of the Swift.org open source project // -// Copyright (c) 2021 - 2023 Apple Inc. and the Swift project authors +// Copyright (c) 2021-2024 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information @@ -19,204 +19,182 @@ #include "swift/shims/SwiftStdint.h" static const __swift_uint16_t _swift_stdlib_normData_data[66] = { - 0xF0, 0x6F0, 0x70, 0x8, 0x60, 0xB0, 0x6D0, 0x740, 0x710, 0x654, 0xF8, 0x30, 0x2DC, 0xA8, 0x6B0, - 0x6E4, 0xD8, 0xA0, 0x90, 0x4, 0x420, 0x3C, 0x4C, 0x44, 0x110, 0x750, 0x700, 0x730, 0x6C0, 0xC0, - 0x410, 0xB8, 0x68, 0x98, 0x733, 0x6C4, 0x80, 0x108, 0x78, 0x88, 0x3, 0x48, 0x6E0, 0x2A0, 0x748, - 0x118, 0x650, 0x1, 0xC8, 0x338, 0x3D0, 0x100, 0x50, 0xC, 0x784, 0x58, 0x408, 0x720, 0x38, 0x734, - 0xE8, 0x120, 0x3B0, 0x358, 0xD0, 0xE0, + 0x1, 0x3, 0x4, 0x8, 0xC, 0x30, 0x38, 0x3C, 0x44, 0x48, 0x4C, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, + 0x80, 0x88, 0x90, 0x98, 0xA0, 0xA8, 0xB0, 0xB8, 0xC0, 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xF0, 0xF8, + 0x100, 0x108, 0x110, 0x118, 0x120, 0x2A0, 0x2DC, 0x338, 0x358, 0x3B0, 0x3D0, 0x408, 0x410, 0x420, + 0x650, 0x654, 0x6B0, 0x6C0, 0x6C4, 0x6D0, 0x6E0, 0x6E4, 0x6F0, 0x700, 0x710, 0x720, 0x730, 0x733, + 0x734, 0x740, 0x748, 0x750, 0x784, }; static const __swift_uint8_t _swift_stdlib_normData_data_indices[3051] = { - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x3B, 0x3B, 0x3B, 0x3B, - 0x3B, 0x1B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1B, 0x1B, 0x3B, 0x1B, 0x3B, 0x1B, 0x3B, - 0x3B, 0x7, 0x2A, 0x2A, 0x2A, 0x2A, 0x7, 0x23, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2E, 0x2E, 0xF, 0xF, - 0xF, 0xF, 0x9, 0x9, 0x2A, 0x2A, 0x2A, 0x2A, 0xF, 0xF, 0x2A, 0xF, 0xF, 0x2A, 0x2A, 0x3, 0x3, 0x3, - 0x3, 0x35, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x22, 0x22, 0x3B, 0x22, 0x22, 0x36, 0x1B, - 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, - 0x7, 0x2A, 0x2A, 0x1B, 0x2C, 0x19, 0x19, 0x2C, 0x19, 0x19, 0x2C, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x28, 0x28, 0x2F, 0x2F, 0x28, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, - 0x2A, 0x1B, 0x1B, 0x1B, 0x1, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, 0x2A, - 0x2A, 0x2A, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x1, 0x39, 0x1B, 0x34, 0x37, 0x4, 0x20, 0x2, 0x26, 0x24, - 0x27, 0x12, 0x21, 0x21, 0x11, 0xD, 0x5, 0x1F, 0x1D, 0x30, 0x1B, 0x2A, 0x12, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x0, 0xA, 0x33, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x10, 0x41, 0x3C, 0x0, - 0xA, 0x33, 0x25, 0x18, 0x3B, 0x3B, 0xF, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, - 0x2A, 0x2D, 0x2F, 0x2F, 0x2F, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x2A, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x2A, 0x3D, 0x1B, 0x2A, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, - 0x2A, 0x2A, 0x2A, 0x1B, 0x2A, 0x2A, 0x1B, 0x2A, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x2A, 0x1B, 0x2A, - 0x1B, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x2A, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, 0x1B, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x1B, - 0x2A, 0x2A, 0x2A, 0x10, 0x41, 0x3C, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x2A, 0x2A, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x2F, 0x2F, 0x2F, 0x15, 0x29, 0x1B, 0x2A, 0x1B, 0x1B, 0x28, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x3A, 0x13, 0x2F, 0x2F, 0x29, 0x13, 0x28, 0x28, 0x28, 0x1B, 0x28, 0x28, - 0x3A, 0x29, 0x28, 0x28, 0x28, 0x28, 0x3A, 0x29, 0x3A, 0x13, 0x2F, 0x2F, 0x2F, 0x29, 0x13, 0x13, - 0x28, 0x28, 0x2F, 0x13, 0x2F, 0x2F, 0x2F, 0x29, 0x13, 0x3A, 0x2F, 0x29, 0x2B, 0xC, 0x3A, 0x2F, - 0x13, 0x2F, 0x2F, 0x2F, 0x2F, 0x29, 0x13, 0x13, 0x29, 0x29, 0x13, 0x2F, 0x2F, 0x2F, 0x29, 0x13, - 0x16, 0x13, 0x2F, 0x2F, 0x2F, 0x2F, 0x13, 0x31, 0x31, 0x29, 0x3F, 0x3F, 0x3F, 0x3F, 0x3E, 0x3E, - 0x29, 0x32, 0x32, 0x32, 0x32, 0x2A, 0x2A, 0x2A, 0x2A, 0x1C, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, - 0x38, 0x1E, 0x28, 0x14, 0x28, 0x28, 0x28, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x28, 0x1B, 0x1B, 0x29, - 0x1B, 0x1B, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x2A, 0x2F, 0x13, 0x3A, 0x29, 0x29, 0x2A, 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, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x1B, - 0x1B, 0x1B, 0x29, 0x29, 0x29, 0x29, 0x1B, 0x39, 0x1, 0x1B, 0x2A, 0x1B, 0x2A, 0x29, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, 0x2A, - 0x2A, 0x2A, 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x3A, 0x13, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x29, 0x1B, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x29, 0x29, 0x3A, 0x29, - 0x29, 0x3A, 0x1B, 0x1B, 0x1B, 0x3, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, - 0x2A, 0x1B, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x19, 0xE, 0x2A, 0x2E, 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, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x7, 0x39, 0x39, 0x2A, 0x6, 0x1B, 0x2C, 0x2A, 0x1B, 0x2A, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x28, 0x2F, 0x28, 0x2F, 0x28, 0x2F, 0x28, 0x2F, 0x28, 0x2F, - 0x28, 0x2F, 0x28, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x28, 0x2F, 0x28, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x28, 0x2F, 0x28, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x28, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x28, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x28, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x28, 0x2F, 0x2F, 0x28, 0x28, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x28, 0x2F, 0x28, 0x2F, 0x28, 0x28, 0x28, 0x1B, 0x1B, 0x3, 0x3, 0x1B, 0x1B, 0x1B, 0x1B, 0x3, - 0x3, 0x3, 0x1B, 0x1B, 0x1B, 0x3, 0x3, 0x1B, 0x2A, 0x1B, 0x3, 0x3, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, - 0x28, 0x28, 0x28, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x28, - 0x28, 0x28, 0x1B, 0x1B, 0x1B, 0x29, 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, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x6, 0x39, 0x7, 0x1, 0x1A, 0x1A, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x17, 0x17, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, - 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x2F, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x29, 0x29, 0x29, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, 0x29, 0x3A, - 0x29, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x29, 0x29, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x40, 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, 0x28, 0x28, 0x28, 0x28, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, - 0x1B, 0x1B, 0x2A, 0x1B, 0x1B, 0x3, 0x2A, 0x29, 0x1B, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x2A, 0x1B, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, 0x2A, - 0x1B, 0x2A, 0x29, 0x29, 0x29, 0x2F, 0x2F, 0x2F, 0x29, 0x15, 0x1B, 0x1B, 0x1B, 0x13, 0x2F, 0x2F, - 0x29, 0x29, 0x3A, 0x29, 0x3A, 0x29, 0x3A, 0x3A, 0x29, 0x3A, 0x3A, 0x13, 0x2F, 0x2F, 0x29, 0x13, - 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x29, 0x3A, 0x1B, 0x13, - 0x13, 0x2F, 0x2F, 0x13, 0x2F, 0x29, 0x3A, 0x13, 0x2F, 0x2F, 0x29, 0x3A, 0x29, 0x29, 0x3A, 0x29, - 0x29, 0x3A, 0x13, 0x2F, 0x29, 0x29, 0x3A, 0x29, 0x29, 0x29, 0x29, 0x29, 0x3A, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x3, 0x3, 0x3, 0x3, 0x3, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0xB, 0xB, 0x3, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x1C, 0x1C, 0x3, 0x3, 0x3, 0x8, 0x1C, 0x1C, 0x1C, 0x1C, - 0x1C, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, 0x2A, 0x2A, - 0x1B, 0x1B, 0x1B, 0x1B, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 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, 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, - 0x7, 0x7, 0x2A, 0x1B, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x1B, 0x1B, 0x1B, 0x1B, 0x1B, - 0x1B, 0x3A, 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, 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, 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, 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, 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, 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, - 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0x28, 0x28, 0x28, 0x28, - 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, 0x28, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3B, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, + 0x3D, 0x3B, 0x3B, 0x3D, 0x3B, 0x3D, 0x3B, 0x3D, 0x3D, 0x3E, 0x35, 0x35, 0x35, 0x35, 0x3E, 0x33, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x2F, 0x2F, 0x36, 0x36, 0x36, 0x36, 0x30, 0x30, 0x35, 0x35, 0x35, + 0x35, 0x36, 0x36, 0x35, 0x36, 0x36, 0x35, 0x35, 0x3, 0x3, 0x3, 0x3, 0x4, 0x35, 0x35, 0x35, 0x35, + 0x3B, 0x3B, 0x3B, 0x3C, 0x3C, 0x3D, 0x3C, 0x3C, 0x41, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, + 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3E, 0x35, 0x35, 0x3B, 0x3F, 0x40, + 0x40, 0x3F, 0x40, 0x40, 0x3F, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x1, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, + 0x3B, 0x37, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, + 0x3B, 0x35, 0x3B, 0x3B, 0x37, 0x3A, 0x3B, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x3B, 0x35, 0x13, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x1F, 0x20, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, + 0x23, 0x3D, 0x3D, 0x36, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x24, 0x0, + 0x0, 0x0, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, + 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x25, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, + 0x3B, 0x35, 0x35, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x35, 0x35, 0x35, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, + 0x1C, 0x1D, 0x1E, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x0, 0x0, 0x0, 0x7, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x6, 0x2, + 0x0, 0x0, 0x9, 0x2, 0x1, 0x1, 0x1, 0x3B, 0x1, 0x1, 0x6, 0x9, 0x1, 0x1, 0x1, 0x1, 0x6, 0x9, 0x6, + 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0x2, 0x1, 0x1, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0x6, 0x0, 0x9, + 0x26, 0x27, 0x6, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x9, 0x2, 0x2, 0x9, 0x9, 0x2, 0x0, 0x0, 0x0, 0x9, + 0x2, 0xA, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x28, 0x28, 0x9, 0x29, 0x29, 0x29, 0x29, 0x2A, 0x2A, 0x9, + 0x2B, 0x2B, 0x2B, 0x2B, 0x35, 0x35, 0x35, 0x35, 0x32, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2C, 0x2D, + 0x1, 0x2E, 0x1, 0x1, 0x1, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x1, 0x3B, 0x3B, 0x9, 0x3B, 0x3B, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x35, 0x0, 0x2, 0x6, 0x9, 0x9, 0x35, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x9, 0x9, 0x3B, 0x3A, 0x37, 0x3B, 0x35, 0x3B, 0x35, + 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x6, 0x9, 0x9, + 0x6, 0x3B, 0x3B, 0x3B, 0x3, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, + 0x3B, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x40, 0x31, 0x35, 0x2F, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3E, 0x3A, 0x3A, 0x35, 0x34, 0x3B, 0x3F, 0x35, 0x3B, 0x35, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, + 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3, 0x3, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3, 0x3, 0x3, 0x3B, 0x3B, 0x3B, 0x3, 0x3, 0x3B, 0x35, 0x3B, 0x3, 0x3, 0x35, + 0x35, 0x35, 0x35, 0x3B, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, + 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x34, 0x3A, 0x3E, 0x37, 0x38, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x9, + 0x6, 0x9, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3, 0x35, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x3B, + 0x35, 0x3B, 0x35, 0x9, 0x9, 0x9, 0x0, 0x0, 0x0, 0x9, 0x7, 0x3B, 0x3B, 0x3B, 0x2, 0x0, 0x0, 0x9, + 0x9, 0x6, 0x9, 0x6, 0x9, 0x6, 0x6, 0x9, 0x6, 0x6, 0x2, 0x0, 0x0, 0x9, 0x2, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x6, 0x3B, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0, 0x9, + 0x6, 0x2, 0x0, 0x0, 0x9, 0x6, 0x9, 0x9, 0x6, 0x9, 0x9, 0x6, 0x2, 0x0, 0x9, 0x9, 0x6, 0x9, 0x9, + 0x9, 0x9, 0x9, 0x6, 0x9, 0x9, 0x9, 0x9, 0x9, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x5, 0x5, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x32, 0x32, 0x3, 0x3, 0x3, + 0x39, 0x32, 0x32, 0x32, 0x32, 0x32, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3E, 0x3E, 0x35, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, }; static const __swift_uint16_t _swift_stdlib_normData_ranks[412] = { diff --git a/utils/gen-unicode-data/Input/NormalizationData.h b/utils/gen-unicode-data/Input/NormalizationData.h index 162afada7fbbb..6582a9dcdeaf1 100644 --- a/utils/gen-unicode-data/Input/NormalizationData.h +++ b/utils/gen-unicode-data/Input/NormalizationData.h @@ -2,7 +2,7 @@ // // This source file is part of the Swift.org open source project // -// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Copyright (c) 2021-2024 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information diff --git a/utils/gen-unicode-data/Sources/GenNormalization/NormData.swift b/utils/gen-unicode-data/Sources/GenNormalization/NormData.swift index fd7c7059604f3..d92297a484475 100644 --- a/utils/gen-unicode-data/Sources/GenNormalization/NormData.swift +++ b/utils/gen-unicode-data/Sources/GenNormalization/NormData.swift @@ -16,8 +16,8 @@ func emitNormData( _ data: [(ClosedRange, UInt16)], into result: inout String ) { - let uniqueData = Array(Set(data.map { $0.1 })) - + let uniqueData = Set(data.map { $0.1 }).sorted() + // 64 bit arrays * 8 bytes = .512 KB var bitArrays: [BitArray] = .init(repeating: .init(size: 64), count: 64) From 9eccae96701a274e10796b36631efa15c580d9c4 Mon Sep 17 00:00:00 2001 From: Karl Wagner <5254025+karwa@users.noreply.github.com> Date: Fri, 31 May 2024 14:52:31 +0200 Subject: [PATCH 4/6] [UnicodeData] Create directory when emitting output data --- utils/gen-unicode-data/Sources/GenUtils/Files.swift | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/utils/gen-unicode-data/Sources/GenUtils/Files.swift b/utils/gen-unicode-data/Sources/GenUtils/Files.swift index fad261d089b2b..c77b2a30fb302 100644 --- a/utils/gen-unicode-data/Sources/GenUtils/Files.swift +++ b/utils/gen-unicode-data/Sources/GenUtils/Files.swift @@ -22,7 +22,16 @@ public func readFile(_ path: String) -> String { public func write(_ data: String, to path: String) { do { - try data.write(toFile: path, atomically: false, encoding: .utf8) + let directory = path.prefix(upTo: path.lastIndex(of: "/") ?? path.endIndex) + try FileManager.default.createDirectory( + atPath: String(directory), + withIntermediateDirectories: true + ) + try data.write( + toFile: path, + atomically: false, + encoding: .utf8 + ) } catch { fatalError(error.localizedDescription) } From a5975fe11bb2d0a6ba12d5aff5b5e1a8136e9d9a Mon Sep 17 00:00:00 2001 From: Karl Wagner <5254025+karwa@users.noreply.github.com> Date: Sun, 12 May 2024 01:53:27 +0200 Subject: [PATCH 5/6] Unicode Normalization API --- stdlib/public/Concurrency/CMakeLists.txt | 1 + .../Unicode+NormalizedScalarsAsync.swift | 324 ++++ .../SwiftShims/swift/shims/UnicodeData.h | 9 + stdlib/public/core/CMakeLists.txt | 4 + stdlib/public/core/Character.swift | 31 + stdlib/public/core/GroupInfo.json | 4 + stdlib/public/core/NFC.swift | 78 +- stdlib/public/core/NFD.swift | 103 +- stdlib/public/core/NFKC.swift | 219 +++ stdlib/public/core/NFKD.swift | 388 ++++ stdlib/public/core/String.swift | 102 +- stdlib/public/core/StringComparison.swift | 4 +- stdlib/public/core/StringCreate.swift | 14 +- stdlib/public/core/StringGuts.swift | 17 +- stdlib/public/core/StringNormalization.swift | 371 +++- stdlib/public/core/StringObject.swift | 22 +- stdlib/public/core/StringStorage.swift | 2 + stdlib/public/core/StringTesting.swift | 7 + .../core/Unicode+NormalizedScalars.swift | 77 + stdlib/public/core/UnicodeData.swift | 474 +++-- stdlib/public/core/UnicodeHelpers.swift | 4 +- .../core/UnicodeNormalizationCheck.swift | 637 +++++++ stdlib/public/core/UnicodeSPI.swift | 8 +- stdlib/public/core/UnicodeScalar.swift | 88 + .../public/core/UnicodeScalarProperties.swift | 64 +- .../stubs/Unicode/Apple/NormalizationData.h | 1656 ++++++++++++++++- .../stubs/Unicode/Common/NormalizationData.h | 1656 ++++++++++++++++- .../stubs/Unicode/UnicodeNormalization.cpp | 51 +- .../Sources/GenNormalization/CCC.swift | 21 +- .../Sources/GenNormalization/Decomp.swift | 285 ++- .../Sources/GenNormalization/NFX_QC.swift | 126 +- .../Sources/GenNormalization/NormData.swift | 56 +- .../Sources/GenNormalization/main.swift | 101 +- validation-test/stdlib/String.swift | 42 +- .../stdlib/StringNormalization.swift | 278 ++- 35 files changed, 6921 insertions(+), 403 deletions(-) create mode 100644 stdlib/public/Concurrency/Unicode+NormalizedScalarsAsync.swift create mode 100644 stdlib/public/core/NFKC.swift create mode 100644 stdlib/public/core/NFKD.swift create mode 100644 stdlib/public/core/Unicode+NormalizedScalars.swift create mode 100644 stdlib/public/core/UnicodeNormalizationCheck.swift diff --git a/stdlib/public/Concurrency/CMakeLists.txt b/stdlib/public/Concurrency/CMakeLists.txt index 30e2300b42f5c..7c1789db9b6d8 100644 --- a/stdlib/public/Concurrency/CMakeLists.txt +++ b/stdlib/public/Concurrency/CMakeLists.txt @@ -151,6 +151,7 @@ set(SWIFT_RUNTIME_CONCURRENCY_SWIFT_SOURCES ContinuousClock.swift SuspendingClock.swift TaskSleepDuration.swift + Unicode+NormalizedScalarsAsync.swift ) add_swift_target_library(swift_Concurrency ${SWIFT_STDLIB_LIBRARY_BUILD_TYPES} IS_STDLIB diff --git a/stdlib/public/Concurrency/Unicode+NormalizedScalarsAsync.swift b/stdlib/public/Concurrency/Unicode+NormalizedScalarsAsync.swift new file mode 100644 index 0000000000000..dfe17b8b5a061 --- /dev/null +++ b/stdlib/public/Concurrency/Unicode+NormalizedScalarsAsync.swift @@ -0,0 +1,324 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2023 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +import Swift + +@available(SwiftStdlib 9999, *) +extension AsyncSequence where Element == Unicode.Scalar { + + /// Normalized representations of this sequence's contents. + /// + @inlinable + public var normalized: Unicode.NormalizedScalars { + Unicode.NormalizedScalars(self) + } +} + +@available(SwiftStdlib 9999, *) +extension Unicode.NormalizedScalars +where Source: AsyncSequence, Source.Element == Unicode.Scalar { + + /// The contents of the source sequence, in Normalization Form D. + /// + /// Normalization to NFD preserves canonical equivalence. + /// + @inlinable + public var nfd: AsyncNFD { + AsyncNFD(source: source) + } + + /// The contents of the source sequence, in Normalization Form D. + /// + /// Normalization to NFD preserves canonical equivalence. + /// + @frozen + public struct AsyncNFD: AsyncSequence { + + public var source: Source + + @inlinable + internal init(source: Source) { + self.source = source + } + + @inlinable + public func makeAsyncIterator() -> AsyncIterator { + AsyncIterator(source: source.makeAsyncIterator()) + } + + @frozen + public struct AsyncIterator: AsyncIteratorProtocol { + + public typealias Element = Unicode.Scalar + public typealias Failure = Source.Failure + + public var source: Source.AsyncIterator + + @usableFromInline + internal var normalizer = Unicode.NFDNormalizer() + @usableFromInline + internal var pending = Optional.none + + @inlinable + internal init(source: Source.AsyncIterator) { + self.source = source + } + + @inlinable + public mutating func next( + isolation actor: isolated (any Actor)? + ) async throws(Source.Failure) -> Unicode.Scalar? { + + // Equivalent to: "pending.take() ?? try await source.next()" + func _pendingOrNextFromSource() + async throws(Source.Failure) -> Unicode.Scalar? { + if pending != nil { return pending.take() } + return try await source.next(isolation: actor) + } + + while let scalar = try await _pendingOrNextFromSource() { + var iter = CollectionOfOne(scalar).makeIterator() + if let output = normalizer.resume(consuming: &iter) { + pending = iter.next() + return output + } + } + return normalizer.flush() + } + } + } +} + +@available(SwiftStdlib 9999, *) +extension Unicode.NormalizedScalars +where Source: AsyncSequence, Source.Element == Unicode.Scalar { + + /// The contents of the source sequence, in Normalization Form C. + /// + /// Normalization to NFC preserves canonical equivalence. + /// + @inlinable + public var nfc: AsyncNFC { + AsyncNFC(source: source) + } + + /// The contents of the source sequence, in Normalization Form C. + /// + /// Normalization to NFC preserves canonical equivalence. + /// + @frozen + public struct AsyncNFC: AsyncSequence { + + public var source: Source + + @inlinable + internal init(source: Source) { + self.source = source + } + + @inlinable + public func makeAsyncIterator() -> AsyncIterator { + AsyncIterator(source: source.makeAsyncIterator()) + } + + @frozen + public struct AsyncIterator: AsyncIteratorProtocol { + + public typealias Element = Unicode.Scalar + public typealias Failure = Source.Failure + + public var source: Source.AsyncIterator + + @usableFromInline + internal var normalizer = Unicode.NFCNormalizer() + @usableFromInline + internal var pending = Optional.none + + @inlinable + internal init(source: Source.AsyncIterator) { + self.source = source + } + + @inlinable + public mutating func next( + isolation actor: isolated (any Actor)? + ) async throws(Source.Failure) -> Unicode.Scalar? { + + // Equivalent to: "pending.take() ?? try await source.next()" + func _pendingOrNextFromSource() + async throws(Source.Failure) -> Unicode.Scalar? { + if pending != nil { return pending.take() } + return try await source.next(isolation: actor) + } + + while let scalar = try await _pendingOrNextFromSource() { + var iter = CollectionOfOne(scalar).makeIterator() + if let output = normalizer.resume(consuming: &iter) { + pending = iter.next() + return output + } + } + return normalizer.flush() + } + } + } +} + +@available(SwiftStdlib 9999, *) +extension Unicode.NormalizedScalars +where Source: AsyncSequence, Source.Element == Unicode.Scalar { + + /// The contents of the source sequence, in Normalization Form KD. + /// + /// Normalization to NFKD does _not_ preserve canonical equivalence. + /// + @inlinable + public var nfkd: AsyncNFKD { + AsyncNFKD(source: source) + } + + /// The contents of the source sequence, in Normalization Form KD. + /// + /// Normalization to NFKD does _not_ preserve canonical equivalence. + /// + @frozen + public struct AsyncNFKD: AsyncSequence { + + public var source: Source + + @inlinable + internal init(source: Source) { + self.source = source + } + + @inlinable + public func makeAsyncIterator() -> AsyncIterator { + AsyncIterator(source: source.makeAsyncIterator()) + } + + @frozen + public struct AsyncIterator: AsyncIteratorProtocol { + + public typealias Element = Unicode.Scalar + public typealias Failure = Source.Failure + + public var source: Source.AsyncIterator + + @usableFromInline + internal var normalizer = Unicode.NFKDNormalizer() + @usableFromInline + internal var pending = Optional.none + + @inlinable + internal init(source: Source.AsyncIterator) { + self.source = source + } + + @inlinable + public mutating func next( + isolation actor: isolated (any Actor)? + ) async throws(Source.Failure) -> Unicode.Scalar? { + + // Equivalent to: "pending.take() ?? try await source.next()" + func _pendingOrNextFromSource() + async throws(Source.Failure) -> Unicode.Scalar? { + if pending != nil { return pending.take() } + return try await source.next(isolation: actor) + } + + while let scalar = try await _pendingOrNextFromSource() { + var iter = CollectionOfOne(scalar).makeIterator() + if let output = normalizer.resume(consuming: &iter) { + pending = iter.next() + return output + } + } + return normalizer.flush() + } + } + } +} + +@available(SwiftStdlib 9999, *) +extension Unicode.NormalizedScalars +where Source: AsyncSequence, Source.Element == Unicode.Scalar { + + /// The contents of the source sequence, in Normalization Form KC. + /// + /// Normalization to NFKC does _not_ preserve canonical equivalence. + /// + @inlinable + public var nfkc: AsyncNFKC { + AsyncNFKC(source: source) + } + + /// The contents of the source sequence, in Normalization Form KC. + /// + /// Normalization to NFKC does _not_ preserve canonical equivalence. + /// + @frozen + public struct AsyncNFKC: AsyncSequence { + + public var source: Source + + @inlinable + internal init(source: Source) { + self.source = source + } + + @inlinable + public func makeAsyncIterator() -> AsyncIterator { + AsyncIterator(source: source.makeAsyncIterator()) + } + + @frozen + public struct AsyncIterator: AsyncIteratorProtocol { + + public typealias Element = Unicode.Scalar + public typealias Failure = Source.Failure + + public var source: Source.AsyncIterator + + @usableFromInline + internal var normalizer = Unicode.NFKCNormalizer() + @usableFromInline + internal var pending = Optional.none + + @inlinable + internal init(source: Source.AsyncIterator) { + self.source = source + } + + @inlinable + public mutating func next( + isolation actor: isolated (any Actor)? + ) async throws(Source.Failure) -> Unicode.Scalar? { + + // Equivalent to: "pending.take() ?? try await source.next()" + func _pendingOrNextFromSource() + async throws(Source.Failure) -> Unicode.Scalar? { + if pending != nil { return pending.take() } + return try await source.next(isolation: actor) + } + + while let scalar = try await _pendingOrNextFromSource() { + var iter = CollectionOfOne(scalar).makeIterator() + if let output = normalizer.resume(consuming: &iter) { + pending = iter.next() + return output + } + } + return normalizer.flush() + } + } + } +} diff --git a/stdlib/public/SwiftShims/swift/shims/UnicodeData.h b/stdlib/public/SwiftShims/swift/shims/UnicodeData.h index 143aa72516047..e6fd363797376 100644 --- a/stdlib/public/SwiftShims/swift/shims/UnicodeData.h +++ b/stdlib/public/SwiftShims/swift/shims/UnicodeData.h @@ -44,12 +44,21 @@ __swift_intptr_t _swift_stdlib_getScalarBitArrayIdx(__swift_uint32_t scalar, SWIFT_RUNTIME_STDLIB_INTERNAL __swift_uint16_t _swift_stdlib_getNormData(__swift_uint32_t scalar); +SWIFT_RUNTIME_STDLIB_INTERNAL +__swift_uint16_t _swift_stdlib_getCompatibilityNormData(__swift_uint32_t scalar); + SWIFT_RUNTIME_STDLIB_INTERNAL const __swift_uint8_t * const _swift_stdlib_nfd_decompositions; SWIFT_RUNTIME_STDLIB_INTERNAL __swift_uint32_t _swift_stdlib_getDecompositionEntry(__swift_uint32_t scalar); +SWIFT_RUNTIME_STDLIB_INTERNAL +const __swift_uint8_t * const _swift_stdlib_nfkd_decompositions; + +SWIFT_RUNTIME_STDLIB_INTERNAL +__swift_uint32_t _swift_stdlib_getCompatibilityDecompositionEntry(__swift_uint32_t scalar); + SWIFT_RUNTIME_STDLIB_INTERNAL __swift_uint32_t _swift_stdlib_getComposition(__swift_uint32_t x, __swift_uint32_t y); diff --git a/stdlib/public/core/CMakeLists.txt b/stdlib/public/core/CMakeLists.txt index 7616a3636cac4..b37b87776a3b5 100644 --- a/stdlib/public/core/CMakeLists.txt +++ b/stdlib/public/core/CMakeLists.txt @@ -116,6 +116,8 @@ split_embedded_sources( NORMAL NewtypeWrapper.swift EMBEDDED NFC.swift EMBEDDED NFD.swift + EMBEDDED NFKC.swift + EMBEDDED NFKD.swift EMBEDDED ObjectIdentifier.swift EMBEDDED Optional.swift EMBEDDED OptionSet.swift @@ -193,6 +195,8 @@ split_embedded_sources( NORMAL ThreadLocalStorage.swift EMBEDDED UIntBuffer.swift EMBEDDED UnavailableStringAPIs.swift + EMBEDDED Unicode+NormalizedScalars.swift + EMBEDDED UnicodeNormalizationCheck.swift EMBEDDED UnicodeData.swift EMBEDDED UnicodeEncoding.swift EMBEDDED UnicodeBreakProperty.swift diff --git a/stdlib/public/core/Character.swift b/stdlib/public/core/Character.swift index fc5b0642bdde8..7c647ab60243f 100644 --- a/stdlib/public/core/Character.swift +++ b/stdlib/public/core/Character.swift @@ -246,3 +246,34 @@ extension Character { return _str._guts.isSmall } } + +extension Character { + + /// The contents of this character, normalized to the given form. + /// + /// The result is canonically equivalent to this character. + /// + /// ```swift + /// let original: Character = "é" + /// + /// let nfc = original.normalized(.nfc) + /// for scalar in nfc.unicodeScalars { + /// print(scalar.escaped(asASCII: true)) // "\u{00E9}" + /// } + /// + /// let nfd = original.normalized(.nfd) + /// for scalar in nfd.unicodeScalars { + /// print(scalar.escaped(asASCII: true)) // "e", "\u{0301}" + /// } + /// + /// assert(original == nfd) + /// assert(nfc == nfd) + /// ``` + /// + @available(SwiftStdlib 9999, *) + public func normalized( + _ form: Unicode.CanonicalNormalizationForm + ) -> Character { + Character(unchecked: _str.normalized(form)) + } +} diff --git a/stdlib/public/core/GroupInfo.json b/stdlib/public/core/GroupInfo.json index 8601fb3f3c90c..cb6690ff6ea0a 100644 --- a/stdlib/public/core/GroupInfo.json +++ b/stdlib/public/core/GroupInfo.json @@ -10,6 +10,8 @@ "CharacterProperties.swift", "NFC.swift", "NFD.swift", + "NFKC.swift", + "NFKD.swift", "SmallString.swift", "StaticString.swift", "String.swift", @@ -44,6 +46,8 @@ "StringWordBreaking.swift", "Substring.swift", "Unicode.swift", + "Unicode+NormalizedScalars.swift", + "UnicodeNormalizationCheck.swift", "UnicodeData.swift", "UnicodeEncoding.swift", "UnicodeBreakProperty.swift", diff --git a/stdlib/public/core/NFC.swift b/stdlib/public/core/NFC.swift index 9e5cf8f8e17e0..6d3e89c2203d9 100644 --- a/stdlib/public/core/NFC.swift +++ b/stdlib/public/core/NFC.swift @@ -12,58 +12,75 @@ import SwiftShims -extension Sequence where Element == Unicode.Scalar { - internal var _internalNFC: Unicode._InternalNFC { - Unicode._InternalNFC(self) +extension Unicode.NormalizedScalars where Source: Sequence { + + /// The contents of the source sequence, in Normalization Form C. + /// + /// Normalization to NFC preserves canonical equivalence. + /// + @inlinable + public var nfc: NFC { + Unicode.NormalizedScalars.NFC(source) } -} -extension Unicode { + // TODO: Should this be frozen? + // If we want to let it conform to Collection, it wouldn't be able to store its 'startIndex'. + // But computing startIndex has costs that we don't want to impose on sequences... + // Maybe we just make the iterator frozen and give it a public init? /// The contents of the source sequence, in Normalization Form C. /// /// Normalization to NFC preserves canonical equivalence. /// - internal struct _InternalNFC where Source: Sequence { + @frozen + public struct NFC { + @usableFromInline internal let source: Source + @inlinable internal init(_ source: Source) { self.source = source } } } -extension Unicode._InternalNFC: Sequence { +extension Unicode.NormalizedScalars.NFC: Sequence { - internal consuming func makeIterator() -> Iterator { + @inlinable + public consuming func makeIterator() -> Iterator { Iterator(source: source.makeIterator()) } - internal struct Iterator: IteratorProtocol { + @frozen + public struct Iterator: IteratorProtocol { + + public var source: Source.Iterator - internal var source: Source.Iterator - internal var normalizer: Unicode._NFCNormalizer + @usableFromInline + internal var normalizer: Unicode.NFCNormalizer + @inlinable internal init(source: Source.Iterator) { self.source = source if let strIter = source as? String.UnicodeScalarView.Iterator { - self.normalizer = Unicode._NFCNormalizer(sourceString: strIter._guts) + self.normalizer = Unicode.NFCNormalizer(sourceString: strIter._guts) } else if let substrIter = source as? Substring.UnicodeScalarView.Iterator { - self.normalizer = Unicode._NFCNormalizer(sourceString: substrIter._elements._wholeGuts) + self.normalizer = Unicode.NFCNormalizer(sourceString: substrIter._elements._wholeGuts) } else { - self.normalizer = Unicode._NFCNormalizer() + self.normalizer = Unicode.NFCNormalizer() } } - internal mutating func next() -> Unicode.Scalar? { + @inlinable + public mutating func next() -> Unicode.Scalar? { normalizer.resume { source.next() } ?? normalizer.flush() } } } -extension Unicode._InternalNFC: Sendable where Source: Sendable {} -extension Unicode._InternalNFC.Iterator: Sendable where Source.Iterator: Sendable {} +extension Unicode.NormalizedScalars.NFC: Sendable where Source: Sendable {} +extension Unicode.NormalizedScalars.NFC.Iterator: Sendable where Source.Iterator: Sendable {} extension Unicode { @@ -102,7 +119,7 @@ extension Unicode { /// boundary. The normalizer state has value semantics, so it is possible /// to copy and store and is inherently thread-safe. /// - internal struct _NFCNormalizer: Sendable { + public struct NFCNormalizer: Sendable { internal enum State { case emittingSegment @@ -113,8 +130,8 @@ extension Unicode { internal var isTerminated = false internal var sourceIsAlreadyNFC = false - internal var nfd = Unicode._NFDNormalizer() - internal var buffer = Unicode._NormDataBuffer() + internal var nfd = Unicode.NFDNormalizer() + internal var buffer = Unicode._CanonicalNormalizationBuffer() // This is our starter that is currently being composed with other scalars // into new scalars. For example, "e\u{301}", here our first scalar is 'e', // which is a starter, thus we assign composee to this 'e' and move to the @@ -123,13 +140,24 @@ extension Unicode { // we continue to try and compose following scalars with this composee. internal var composee = Optional.none + @usableFromInline internal init(sourceString: borrowing _StringGuts) { sourceIsAlreadyNFC = sourceString.isNFC } /// Creates a new normalizer. /// - internal init() { } + public init() { } + + @usableFromInline + internal mutating func reset(maximumCapacity: Int = 64) { + state = .consuming + isTerminated = false + sourceIsAlreadyNFC = false + nfd.reset(maximumCapcity: maximumCapacity) + buffer.reset(maximumCapacity: maximumCapacity) + composee = .none + } /// Resume normalizing the text stream. /// @@ -171,7 +199,8 @@ extension Unicode { /// Be careful to ensure each input source has been fully consumed /// before moving on to the next source (marked by `resume` returning `nil`). /// - internal mutating func resume( + @inlinable + public mutating func resume( consuming source: inout some IteratorProtocol ) -> Unicode.Scalar? { resume(consuming: { source.next() }) @@ -179,6 +208,7 @@ extension Unicode { // Intended ABI barrier for resume(consuming: inout some IteratorProtocol). // when it becomes public. + @usableFromInline internal mutating func resume( consuming nextFromSource: () -> Unicode.Scalar? ) -> Unicode.Scalar? { @@ -221,7 +251,7 @@ extension Unicode { /// } /// ``` /// - internal mutating func flush() -> Unicode.Scalar? { + public mutating func flush() -> Unicode.Scalar? { isTerminated = true @@ -241,7 +271,7 @@ extension Unicode { } } -extension Unicode._NFCNormalizer { +extension Unicode.NFCNormalizer { @inline(never) internal mutating func _resume( diff --git a/stdlib/public/core/NFD.swift b/stdlib/public/core/NFD.swift index 1ccba3282b925..5242760b571bd 100644 --- a/stdlib/public/core/NFD.swift +++ b/stdlib/public/core/NFD.swift @@ -10,52 +10,64 @@ // //===----------------------------------------------------------------------===// -extension Sequence where Element == Unicode.Scalar { - internal var _internalNFD: Unicode._InternalNFD { - Unicode._InternalNFD(self) - } -} +extension Unicode.NormalizedScalars where Source: Sequence { -extension Unicode { + /// The contents of the source sequence, in Normalization Form D. + /// + /// Normalization to NFD preserves canonical equivalence. + /// + @inlinable + public var nfd: NFD { + Unicode.NormalizedScalars.NFD(source) + } /// The contents of the source sequence, in Normalization Form D. /// /// Normalization to NFD preserves canonical equivalence. /// - internal struct _InternalNFD where Source: Sequence { + @frozen + public struct NFD { + @usableFromInline internal let source: Source + @inlinable internal init(_ source: Source) { self.source = source } } } -extension Unicode._InternalNFD: Sequence { +extension Unicode.NormalizedScalars.NFD: Sequence { - internal consuming func makeIterator() -> Iterator { + @inlinable + public consuming func makeIterator() -> Iterator { Iterator(source: source.makeIterator()) } - internal struct Iterator: IteratorProtocol { + @frozen + public struct Iterator: IteratorProtocol { - internal var source: Source.Iterator - internal var normalizer: Unicode._NFDNormalizer + public var source: Source.Iterator + @usableFromInline + internal var normalizer: Unicode.NFDNormalizer + + @inlinable internal init(source: Source.Iterator) { self.source = source - self.normalizer = Unicode._NFDNormalizer() + self.normalizer = Unicode.NFDNormalizer() } - internal mutating func next() -> Unicode.Scalar? { + @inlinable + public mutating func next() -> Unicode.Scalar? { normalizer.resume(consuming: &source) ?? normalizer.flush() } } } -extension Unicode._InternalNFD: Sendable where Source: Sendable {} -extension Unicode._InternalNFD.Iterator: Sendable where Source.Iterator: Sendable {} +extension Unicode.NormalizedScalars.NFD: Sendable where Source: Sendable {} +extension Unicode.NormalizedScalars.NFD.Iterator: Sendable where Source.Iterator: Sendable {} extension Unicode { @@ -94,7 +106,7 @@ extension Unicode { /// boundary. The normalizer state has value semantics, so it is possible /// to copy and store and is inherently thread-safe. /// - internal struct _NFDNormalizer: Sendable { + public struct NFDNormalizer: Sendable { internal enum State { case emittingSegment @@ -104,13 +116,20 @@ extension Unicode { internal var state = State.consuming - internal var buffer = Unicode._NormDataBuffer() + internal var buffer = Unicode._CanonicalNormalizationBuffer() internal var pendingStarter = Optional.none internal var bufferIsSorted = false /// Creates a new normalizer. /// - internal init() { } + public init() { } + + internal mutating func reset(maximumCapcity: Int = 64) { + state = .consuming + buffer.reset(maximumCapacity: maximumCapcity) + pendingStarter = .none + bufferIsSorted = false + } /// Resume normalizing the text stream. /// @@ -152,14 +171,15 @@ extension Unicode { /// Be careful to ensure each input source has been fully consumed /// before moving on to the next source (marked by `resume` returning `nil`). /// - internal mutating func resume( + @inlinable + public mutating func resume( consuming source: inout some IteratorProtocol ) -> Unicode.Scalar? { resume(consuming: { source.next() }) } - // Intended ABI barrier for resume(consuming: inout some IteratorProtocol). - // when it becomes public. + // ABI barrier for resume(consuming: inout some IteratorProtocol). + @usableFromInline internal mutating func resume( consuming nextFromSource: () -> Unicode.Scalar? ) -> Unicode.Scalar? { @@ -194,13 +214,14 @@ extension Unicode { /// print(scalar) /// } /// ``` - internal mutating func flush() -> Unicode.Scalar? { + /// + public mutating func flush() -> Unicode.Scalar? { _flush()?.scalar } } } -extension Unicode._NFDNormalizer { +extension Unicode.NFDNormalizer { @inline(never) internal mutating func _resume( @@ -290,7 +311,7 @@ extension Unicode._NFDNormalizer { if let pendingStarter = pendingStarter.take() { return pendingStarter } else if let nextScalar = nextFromSource() { - return (nextScalar, Unicode._NormData(nextScalar)) + return (nextScalar, Unicode._CanonicalNormData(nextScalar)) } else { return nil } @@ -330,22 +351,16 @@ extension Unicode._NFDNormalizer { let lIdx = sIdx / N.count let l = Unicode.Scalar(_value: L.base &+ lIdx) - // Hangul leading consonants, L, always have normData of 0. - // CCC = 0, NFC_QC = Yes, NFD_QC = Yes - buffer.append((scalar: l, normData: .init(rawValue: 0))) + buffer.append((scalar: l, normData: .hangulLeadingConsonants)) let vIdx = (sIdx % N.count) / T.count let v = Unicode.Scalar(_value: V.base &+ vIdx) - // Hangul vowels, V, always have normData of 4. - // CCC = 0, NFC_QC = Maybe, NFD_QC = Yes - buffer.append((scalar: v, normData: .init(rawValue: 4))) + buffer.append((scalar: v, normData: .hangulVowels)) let tIdx = sIdx % T.count if tIdx != 0 { let t = Unicode.Scalar(_value: T.base &+ tIdx) - // Hangul tail consonants, T, always have normData of 4. - // CCC = 0, NFC_QC = Maybe, NFD_QC = Yes - buffer.append((scalar: t, normData: .init(rawValue: 4))) + buffer.append((scalar: t, normData: .hangulTailConsonants)) } } @@ -353,30 +368,20 @@ extension Unicode._NFDNormalizer { private mutating func decomposeSlow( _ original: ScalarAndNormData ) { - // Look into the decomposition perfect hash table. - let decompEntry = Unicode._DecompositionEntry(original.scalar) - - // If this is not our original scalar, then we have no decomposition for this - // scalar, so just emit itself. This is required because perfect hashing - // does not know the original set of keys that it used to create itself, so - // we store the original scalar in our decomposition entry to ensure that - // scalars that hash to the same index don't succeed. - guard original.scalar == decompEntry.hashedScalar else { + + guard let decomp = Unicode._CanonicalDecomposition(original.scalar) else { buffer.append(original) return } - var utf8 = decompEntry.utf8 - + var utf8 = decomp.utf8 while utf8.count > 0 { let (scalar, len) = _decodeScalar(utf8, startingAt: 0) utf8 = UnsafeBufferPointer(rebasing: utf8[len...]) // Fast path: Because this will be emitted into the completed NFD buffer, - // we don't need to look at NFD_QC anymore which lets us do a larger - // latiny check for NFC_QC and CCC (0xC0 vs. 0x300). - let normData = Unicode._NormData(scalar, fastUpperbound: 0x300) - + // we don't need to look at NFD_QC anymore. + let normData = Unicode._CanonicalNormData(onlyCCCAndNFCQC: scalar) buffer.append((scalar, normData)) } } diff --git a/stdlib/public/core/NFKC.swift b/stdlib/public/core/NFKC.swift new file mode 100644 index 0000000000000..1e88edac9fae1 --- /dev/null +++ b/stdlib/public/core/NFKC.swift @@ -0,0 +1,219 @@ + +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +extension Unicode.NormalizedScalars where Source: Sequence { + + /// The contents of the source sequence, in Normalization Form KC. + /// + /// Normalization to NFKC does _not_ preserve canonical equivalence. + /// + @inlinable + public var nfkc: NFKC { + Unicode.NormalizedScalars.NFKC(source) + } + + /// The contents of the source sequence, in Normalization Form KC. + /// + /// Normalization to NFKC does _not_ preserve canonical equivalence. + /// + @frozen + public struct NFKC { + + @usableFromInline + internal let source: Source + + @inlinable + internal init(_ source: Source) { + self.source = source + } + } +} + +extension Unicode.NormalizedScalars.NFKC: Sequence { + + @inlinable + public consuming func makeIterator() -> Iterator { + Iterator(source: source.makeIterator()) + } + + @frozen + public struct Iterator: IteratorProtocol { + + public var source: Source.Iterator + + @usableFromInline + internal var normalizer: Unicode.NFKCNormalizer + + @inlinable + internal init(source: Source.Iterator) { + self.source = source + self.normalizer = Unicode.NFKCNormalizer() + } + + @inlinable + public mutating func next() -> Unicode.Scalar? { + normalizer.resume(consuming: &source) ?? normalizer.flush() + } + } +} + +extension Unicode.NormalizedScalars.NFKC: Sendable where Source: Sendable {} +extension Unicode.NormalizedScalars.NFKC.Iterator: Sendable where Source.Iterator: Sendable {} + +extension Unicode { + + /// A stateful normalizer, producing a single logical stream + /// of normalized text from chunked inputs. + /// + /// To use the normalizer, first create an instance. + /// Next, feed it a chunk of a text stream using the `resume(consuming:)` + /// function. The normalizer will consume from the stream and buffer + /// it as needed, so continue feeding the same source until + /// it returns `nil`, indicating that the source was exhausted. + /// + /// ```swift + /// var normalizer = Unicode.NFKCNormalizer() + /// + /// var input: some IteratorProtocol = ... + /// while let scalar = normalizer.resume(consuming: &input) { + /// print(scalar) + /// } + /// + /// // assert(input.next() == nil) + /// ``` + /// + /// You may continue consuming sources until you reach the end + /// of the logical text stream. Once you reach the end, + /// call `flush()` to drain any remaining content + /// from the normalizer's buffers. + /// + /// ```swift + /// while let scalar = normalizer.flush() { + /// print(scalar) + /// } + /// ``` + /// + /// The chunks of input text do not need to be aligned on any normalization + /// boundary. The normalizer state has value semantics, so it is possible + /// to copy and store and is inherently thread-safe. + /// + public struct NFKCNormalizer: Sendable { + + // FIXME: Factor out canonical composition and apply it directly to the output of the NFKD normalizer. + // `toNFC(toNFKD(source))` gives the correct result but is suboptimal because it decomposes the NFKD result again. + + internal var _nfkd = NFKDNormalizer() + internal var _nfc = NFCNormalizer() + internal var _isFlushing = false + + /// Creates a new normalizer. + /// + public init() { } + + public mutating func reset(maximumCapacity: Int = 64) { + _nfkd.reset(maximumCapacity: maximumCapacity) + _nfc.reset(maximumCapacity: maximumCapacity) + _isFlushing = false + } + + /// Resume normalizing the text stream. + /// + /// Each call to `resume` returns the next scalar in the normalized output, + /// consuming elements from the given source as necessary. + /// + /// If the normalizer returns `nil`, the source was exhausted. + /// One a source is exhausted, you may: + /// + /// - Call `resume` again some time later with a different source + /// to continue processing the same logical text stream, or + /// + /// - Call `flush` in order to mark the end of the stream + /// and consume data remaining in the normalizer's internal buffers. + /// + /// Typical usage looks like the following: + /// + /// ```swift + /// var normalizer = Unicode.NFKCNormalizer() + /// + /// var input: some IteratorProtocol = ... + /// while let scalar = normalizer.resume(consuming: &input) { + /// print(scalar) + /// } + /// + /// // We could resume again, consuming from another input here. + /// // Finally, when we are done consuming inputs: + /// + /// while let scalar = normalizer.flush() { + /// print(scalar) + /// } + /// ``` + /// + /// The normalizer consumes data from the source as needed, + /// meaning even if a call to `resume` returns a value, + /// that value may have come from the normalizer's internal buffers + /// without consuming the input source at all. + /// + /// Be careful to ensure each input source has been fully consumed + /// before moving on to the next source (marked by `resume` returning `nil`). + /// + @inlinable + public mutating func resume( + consuming source: inout some IteratorProtocol + ) -> Unicode.Scalar? { + resume(consuming: { source.next() }) + } + + // ABI barrier for resume(consuming: inout some IteratorProtocol). + @usableFromInline + internal mutating func resume( + consuming nextFromSource: () -> Unicode.Scalar? + ) -> Unicode.Scalar? { + guard !_isFlushing else { return nil } + return _nfc.resume { _nfkd.resume { nextFromSource() } } + } + + /// Marks the end of the text stream and + /// returns the next scalar from the normalizer's internal buffer. + /// + /// Once you have finished feeding input data to the normalizer, + /// call `flush` until it returns `nil`. + /// + /// ```swift + /// while let scalar = normalizer.flush() { + /// print(scalar) + /// } + /// ``` + /// + /// After calling `flush`, all future calls to `resume` + /// will immediately return `nil` without consuming from its source. + /// This allows optional chaining to be used to + /// fully normalize a stream: + /// + /// ```swift + /// // Normalize the concatenation of inputA and inputB + /// + /// while let scalar = + /// normalizer.resume(consuming: &inputA) ?? + /// normalizer.resume(consuming: &inputB) ?? + /// normalizer.flush() + /// { + /// print(scalar) + /// } + /// ``` + /// + public mutating func flush() -> Unicode.Scalar? { + _isFlushing = true + return _nfc.resume { _nfkd.flush() } ?? _nfc.flush() + } + } +} diff --git a/stdlib/public/core/NFKD.swift b/stdlib/public/core/NFKD.swift new file mode 100644 index 0000000000000..047e1c11c405b --- /dev/null +++ b/stdlib/public/core/NFKD.swift @@ -0,0 +1,388 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2021 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +extension Unicode.NormalizedScalars where Source: Sequence { + + /// The contents of the source sequence, in Normalization Form KD. + /// + /// Normalization to NFKD does _not_ preserve canonical equivalence. + /// + @inlinable + public var nfkd: NFKD { + Unicode.NormalizedScalars.NFKD(source) + } + + /// The contents of the source sequence, in Normalization Form KD. + /// + /// Normalization to NFKD does _not_ preserve canonical equivalence. + /// + @frozen + public struct NFKD { + + @usableFromInline + internal let source: Source + + @inlinable + internal init(_ source: Source) { + self.source = source + } + } +} + +extension Unicode.NormalizedScalars.NFKD: Sequence { + + @inlinable + public consuming func makeIterator() -> Iterator { + Iterator(source: source.makeIterator()) + } + + @frozen + public struct Iterator: IteratorProtocol { + + public var source: Source.Iterator + + @usableFromInline + internal var normalizer: Unicode.NFKDNormalizer + + @inlinable + internal init(source: Source.Iterator) { + self.source = source + self.normalizer = Unicode.NFKDNormalizer() + } + + @inlinable + public mutating func next() -> Unicode.Scalar? { + normalizer.resume(consuming: &source) ?? normalizer.flush() + } + } +} + +extension Unicode.NormalizedScalars.NFKD: Sendable where Source: Sendable {} +extension Unicode.NormalizedScalars.NFKD.Iterator: Sendable where Source.Iterator: Sendable {} + +extension Unicode { + + /// A stateful normalizer, producing a single logical stream + /// of normalized text from chunked inputs. + /// + /// To use the normalizer, first create an instance. + /// Next, feed it a chunk of a text stream using the `resume(consuming:)` + /// function. The normalizer will consume from the stream and buffer + /// it as needed, so continue feeding the same source until + /// it returns `nil`, indicating that the source was exhausted. + /// + /// ```swift + /// var normalizer = Unicode.NFKDNormalizer() + /// + /// var input: some IteratorProtocol = ... + /// while let scalar = normalizer.resume(consuming: &input) { + /// print(scalar) + /// } + /// + /// // assert(input.next() == nil) + /// ``` + /// + /// You may continue consuming sources until you reach the end + /// of the logical text stream. Once you reach the end, + /// call `flush()` to drain any remaining content + /// from the normalizer's buffers. + /// + /// ```swift + /// while let scalar = normalizer.flush() { + /// print(scalar) + /// } + /// ``` + /// + /// The chunks of input text do not need to be aligned on any normalization + /// boundary. The normalizer state has value semantics, so it is possible + /// to copy and store and is inherently thread-safe. + /// + public struct NFKDNormalizer: Sendable { + + internal enum State { + case emittingSegment + case consuming + case terminated + } + + internal var state = State.consuming + + internal var buffer = Unicode._CompatibilityNormalizationBuffer() + internal var pendingStarter = Optional.none + internal var bufferIsSorted = false + + /// Creates a new normalizer. + /// + public init() { } + + public mutating func reset(maximumCapacity: Int = 64) { + state = .consuming + buffer.reset(maximumCapacity: maximumCapacity) + pendingStarter = .none + bufferIsSorted = false + } + + /// Resume normalizing the text stream. + /// + /// Each call to `resume` returns the next scalar in the normalized output, + /// consuming elements from the given source as necessary. + /// + /// If the normalizer returns `nil`, the source was exhausted. + /// One a source is exhausted, you may: + /// + /// - Call `resume` again some time later with a different source + /// to continue processing the same logical text stream, or + /// + /// - Call `flush` in order to mark the end of the stream + /// and consume data remaining in the normalizer's internal buffers. + /// + /// Typical usage looks like the following: + /// + /// ```swift + /// var normalizer = Unicode.NFKDNormalizer() + /// + /// var input: some IteratorProtocol = ... + /// while let scalar = normalizer.resume(consuming: &input) { + /// print(scalar) + /// } + /// + /// // We could resume again, consuming from another input here. + /// // Finally, when we are done consuming inputs: + /// + /// while let scalar = normalizer.flush() { + /// print(scalar) + /// } + /// ``` + /// + /// The normalizer consumes data from the source as needed, + /// meaning even if a call to `resume` returns a value, + /// that value may have come from the normalizer's internal buffers + /// without consuming the input source at all. + /// + /// Be careful to ensure each input source has been fully consumed + /// before moving on to the next source (marked by `resume` returning `nil`). + /// + @inlinable + public mutating func resume( + consuming source: inout some IteratorProtocol + ) -> Unicode.Scalar? { + resume(consuming: { source.next() }) + } + + // ABI barrier for resume(consuming: inout some IteratorProtocol). + @usableFromInline + internal mutating func resume( + consuming nextFromSource: () -> Unicode.Scalar? + ) -> Unicode.Scalar? { + _resume(consuming: nextFromSource)?.scalar + } + + /// Marks the end of the text stream and + /// returns the next scalar from the normalizer's internal buffer. + /// + /// Once you have finished feeding input data to the normalizer, + /// call `flush` until it returns `nil`. + /// + /// ```swift + /// while let scalar = normalizer.flush() { + /// print(scalar) + /// } + /// ``` + /// + /// After calling `flush`, all future calls to `resume` + /// will immediately return `nil` without consuming from its source. + /// This allows optional chaining to be used to + /// fully normalize a stream: + /// + /// ```swift + /// // Normalize the concatenation of inputA and inputB + /// + /// while let scalar = + /// normalizer.resume(consuming: &inputA) ?? + /// normalizer.resume(consuming: &inputB) ?? + /// normalizer.flush() + /// { + /// print(scalar) + /// } + /// ``` + /// + public mutating func flush() -> Unicode.Scalar? { + _flush()?.scalar + } + } +} + +extension Unicode.NFKDNormalizer { + + @inline(never) + internal mutating func _resume( + consuming nextFromSource: () -> Unicode.Scalar? + ) -> ScalarAndCompatNormData? { + + switch state { + case .emittingSegment: + _internalInvariant( + pendingStarter != nil, + "Must find next segment starter before emitting buffered segment" + ) + _internalInvariant( + bufferIsSorted, + "Buffered segment must be sorted before being emitted" + ) + + if let buffered = buffer.next() { + return buffered + } + bufferIsSorted = false + state = .consuming + fallthrough + + case .consuming: + + while let (scalar, normData) = takePendingOrConsume(nextFromSource) { + + // If this scalar is a starter, stash it and emit the decomposed segment + // we have in the buffer. The buffer must be sorted first. + + if normData.canonicalCombiningClass == .notReordered, !buffer.isEmpty { + pendingStarter = (scalar, normData) + buffer.sort() + bufferIsSorted = true + state = .emittingSegment + return buffer.next() + } + + // If this scalar is NFKD_QC, it does not need to be decomposed. + + if normData.isNFKDQC { + + // If the scalar is a starter its CCC is 0, + // so it does not need to be sorted and can be emitted directly. + + if normData.canonicalCombiningClass == .notReordered { + return (scalar, normData) + } + buffer.append((scalar, normData)) + continue + } + + // Otherwise, append the scalar's decomposition to the buffer. + + decomposeNonNFKDQC((scalar, normData)) + } + + // Source is exhausted. + return nil + + case .terminated: + return nil + } + } + + internal mutating func _flush() -> ScalarAndCompatNormData? { + + state = .terminated + + if !bufferIsSorted { + buffer.sort() + bufferIsSorted = true + } + + // The buffer contains the decomposed segment *prior to* + // any pending starter we might have. + + return buffer.next() ?? pendingStarter.take() + } + + @inline(__always) + private mutating func takePendingOrConsume( + _ nextFromSource: () -> Unicode.Scalar? + ) -> ScalarAndCompatNormData? { + + if let pendingStarter = pendingStarter.take() { + return pendingStarter + } else if let nextScalar = nextFromSource() { + return (nextScalar, Unicode._CompatibilityNormData(nextScalar)) + } else { + return nil + } + } + + private mutating func decomposeNonNFKDQC( + _ scalarInfo: ScalarAndCompatNormData + ) { + // Handle Hangul decomposition algorithmically. + // S.base = 0xAC00 + // S.count = 11172 + // S.base + S.count - 1 = 0xD7A3 + if (0xAC00 ... 0xD7A3).contains(scalarInfo.scalar.value) { + decomposeHangul(scalarInfo.scalar) + return + } + + // Otherwise, we need to lookup the decomposition (if there is one). + decomposeSlow(scalarInfo) + } + + @inline(never) + private mutating func decomposeHangul(_ scalar: Unicode.Scalar) { + // L = Hangul leading consonants + let L: (base: UInt32, count: UInt32) = (base: 0x1100, count: 19) + // V = Hangul vowels + let V: (base: UInt32, count: UInt32) = (base: 0x1161, count: 21) + // T = Hangul tail consonants + let T: (base: UInt32, count: UInt32) = (base: 0x11A7, count: 28) + // N = Number of precomposed Hangul syllables that start with the same + // leading consonant. (There is no base for N). + let N: (base: UInt32, count: UInt32) = (base: 0x0, count: 588) + // S = Hangul precomposed syllables + let S: (base: UInt32, count: UInt32) = (base: 0xAC00, count: 11172) + + let sIdx = scalar.value &- S.base + + let lIdx = sIdx / N.count + let l = Unicode.Scalar(_value: L.base &+ lIdx) + buffer.append((scalar: l, normData: .hangulLeadingConsonants)) + + let vIdx = (sIdx % N.count) / T.count + let v = Unicode.Scalar(_value: V.base &+ vIdx) + buffer.append((scalar: v, normData: .hangulVowels)) + + let tIdx = sIdx % T.count + if tIdx != 0 { + let t = Unicode.Scalar(_value: T.base &+ tIdx) + buffer.append((scalar: t, normData: .hangulTailConsonants)) + } + } + + @inline(never) + private mutating func decomposeSlow( + _ original: ScalarAndCompatNormData + ) { + + guard let decomp = Unicode._CompatibilityDecomposition(original.scalar) else { + buffer.append(original) + return + } + + var utf8 = decomp.utf8 + while utf8.count > 0 { + let (scalar, len) = _decodeScalar(utf8, startingAt: 0) + utf8 = UnsafeBufferPointer(rebasing: utf8[len...]) + + // FIXME: This could be a _CanonicalNormData lookup. + // We'd only need CCC for sorting, and NFC_QC is useful for composition. + let normData = Unicode._CompatibilityNormData(scalar) + buffer.append((scalar, normData)) + } + } +} diff --git a/stdlib/public/core/String.swift b/stdlib/public/core/String.swift index 06fa7c0fb77f3..661c25f675254 100644 --- a/stdlib/public/core/String.swift +++ b/stdlib/public/core/String.swift @@ -745,6 +745,104 @@ extension String { } } +extension String { + + /// Creates a string with the given Unicode scalars. + /// + /// - parameters: + /// - scalars: A sequence of Unicode scalar values. + /// + @inlinable + @_alwaysEmitIntoClient + public init(_ scalars: consuming some Sequence) { + + if let contig = scalars.withContiguousStorageIfAvailable({ String($0) }) { + self = contig + return + } + + // Unicode Scalars encode to a maximum of 4 bytes of UTF-8. + var utf8 = [UInt8]() + utf8.reserveCapacity(scalars.underestimatedCount * 4) + for scalar in (consume scalars) { + scalar.withUTF8CodeUnits { utf8.append(contentsOf: $0) } + } + self = utf8.withUnsafeBufferPointer { String._uncheckedFromUTF8($0) } + } + + /// Creates a string with the given Unicode scalars. + /// + /// - parameters: + /// - scalars: A collection of Unicode scalar values. + /// + @inlinable + @_alwaysEmitIntoClient + public init( + _ scalars: borrowing some RandomAccessCollection + ) { + // Unicode Scalars encode to a maximum of 4 bytes of UTF-8. + self = _withUnprotectedUnsafeTemporaryAllocation( + of: UInt8.self, capacity: scalars.count * 4 + ) { + // FIXME: It is currently not possible to capture 'scalars' as a borrow. + // https://forums.swift.org/t/is-it-possible-to-capture-a-borrowing-parameter-in-a-non-escaping-closure/72967 + [scalars = copy scalars] buffer in + var bufferIdx = 0 + var scalarIdx = scalars.startIndex + while scalarIdx < scalars.endIndex { + scalars[scalarIdx].withUTF8CodeUnits { + bufferIdx = buffer[Range(uncheckedBounds: (bufferIdx, buffer.endIndex))] + .initialize(fromContentsOf: $0) + } + scalars.formIndex(after: &scalarIdx) + } + return String._uncheckedFromUTF8( + UnsafeBufferPointer( + rebasing: buffer[Range(uncheckedBounds: (buffer.startIndex, bufferIdx))] + ) + ) + } + } + + /// Creates a string with the given Unicode scalars. + /// + /// - parameters: + /// - scalars: A sequence of Unicode scalar values. + /// + @inlinable + @available(SwiftStdlib 9999, *) + public init( + _ scalars: consuming Unicode.NormalizedScalars.NFC + ) { + // Unicode.NormalizedScalars cannot provide a good underestimatedCount. + var utf8 = [UInt8]() + for scalar in (consume scalars) { + scalar.withUTF8CodeUnits { utf8.append(contentsOf: $0) } + } + self = utf8.withUnsafeBufferPointer { String._uncheckedFromUTF8($0) } + self._guts.markIsNFC() + } + + /// Creates a string with the given Unicode scalars. + /// + /// - parameters: + /// - scalars: A sequence of Unicode scalar values. + /// + @inlinable + @available(SwiftStdlib 9999, *) + public init( + _ scalars: consuming Unicode.NormalizedScalars.NFKC + ) { + // Unicode.NormalizedScalars cannot provide a good underestimatedCount. + var utf8 = [UInt8]() + for scalar in (consume scalars) { + scalar.withUTF8CodeUnits { utf8.append(contentsOf: $0) } + } + self = utf8.withUnsafeBufferPointer { String._uncheckedFromUTF8($0) } + self._guts.markIsNFC() + } +} + extension String: _ExpressibleByBuiltinUnicodeScalarLiteral { @_effects(readonly) @inlinable @inline(__always) @@ -1104,7 +1202,7 @@ extension _StringGutsSlice { _ scalar: Unicode.Scalar, _ prevCCC: inout UInt8 ) -> Bool { - let normData = Unicode._NormData(scalar, fastUpperbound: 0x300) + let normData = Unicode._CanonicalNormData(onlyCCCAndNFCQC: scalar) if prevCCC > normData.ccc, normData.ccc != 0 { return false @@ -1161,7 +1259,7 @@ extension _StringGutsSlice { } } - for scalar in substring.unicodeScalars._internalNFC { + for scalar in substring.unicodeScalars.normalized.nfc { try scalar.withUTF8CodeUnits { for byte in $0 { try f(byte) diff --git a/stdlib/public/core/StringComparison.swift b/stdlib/public/core/StringComparison.swift index d46383f94f1e6..bb08a7f643cdd 100644 --- a/stdlib/public/core/StringComparison.swift +++ b/stdlib/public/core/StringComparison.swift @@ -333,8 +333,8 @@ extension _StringGutsSlice { with other: _StringGutsSlice, expecting: _StringComparisonResult ) -> Bool { - var iter1 = Substring(self).unicodeScalars._internalNFC.makeIterator() - var iter2 = Substring(other).unicodeScalars._internalNFC.makeIterator() + var iter1 = Substring(self).unicodeScalars.normalized.nfc.makeIterator() + var iter2 = Substring(other).unicodeScalars.normalized.nfc.makeIterator() var scalar1: Unicode.Scalar? = nil var scalar2: Unicode.Scalar? = nil diff --git a/stdlib/public/core/StringCreate.swift b/stdlib/public/core/StringCreate.swift index 2aaf097629ebc..497d15a46485a 100644 --- a/stdlib/public/core/StringCreate.swift +++ b/stdlib/public/core/StringCreate.swift @@ -308,17 +308,25 @@ extension String { internal static func _copying(_ str: String) -> String { return String._copying(str[...]) } + @_alwaysEmitIntoClient @inline(never) // slow-path internal static func _copying(_ str: Substring) -> String { + var result: String if _fastPath(str._wholeGuts.isFastUTF8) { - return str._wholeGuts.withFastUTF8(range: str._offsetRange) { + result = str._wholeGuts.withFastUTF8(range: str._offsetRange) { + String._uncheckedFromUTF8($0) + } + } else { + result = Array(str.utf8).withUnsafeBufferPointer { String._uncheckedFromUTF8($0) } } - return Array(str.utf8).withUnsafeBufferPointer { - String._uncheckedFromUTF8($0) + + if str._wholeGuts.isNFC { + result._guts.markIsNFC() } + return result } @usableFromInline diff --git a/stdlib/public/core/StringGuts.swift b/stdlib/public/core/StringGuts.swift index b07d7cb982f23..f712b2bba9475 100644 --- a/stdlib/public/core/StringGuts.swift +++ b/stdlib/public/core/StringGuts.swift @@ -124,7 +124,7 @@ extension _StringGuts { return isFastUTF8 && _object.isASCII } - @inline(__always) + @inlinable @inline(__always) internal var isNFC: Bool { return _object.isNFC } @inline(__always) @@ -144,6 +144,21 @@ extension _StringGuts { } } +// Setting flags +extension _StringGuts { + + /// Flags that the contents of this string + /// are known to be in Normalization Form C. + /// + /// Not all strings are able to store this information. + /// + @_alwaysEmitIntoClient + @inline(__always) + internal mutating func markIsNFC() { + _object.markIsNFC() + } +} + // extension _StringGuts { // Whether we can provide fast access to contiguous UTF-8 code units diff --git a/stdlib/public/core/StringNormalization.swift b/stdlib/public/core/StringNormalization.swift index 1426695722c23..1be42bad4fc34 100644 --- a/stdlib/public/core/StringNormalization.swift +++ b/stdlib/public/core/StringNormalization.swift @@ -10,6 +10,373 @@ // //===----------------------------------------------------------------------===// +extension Unicode { + + /// A representation of a Unicode string + /// which preserves canonical equivalence. + /// + /// Unicode Normalization Forms are formally defined normalizations + /// of Unicode strings which make it possible to determine + /// whether any two Unicode strings are equivalent to each other. + /// If two strings are equivalent, they will contain exactly the same + /// sequence of Unicode scalars when normalized to the same form. + /// + /// Canonical normalization preserves abstract meaning, + /// and applications can normalize to one of these forms + /// or convert between them without fear of altering + /// the interpretation of the source text. + /// + /// Some characters are equivalent to sequences of characters + /// and combining marks. The two forms of canonical normalization + /// allow one to choose whether the result contains the composed (NFC) + /// or decomposed (NFD) representations of these characters. + /// + @available(SwiftStdlib 9999, *) + @frozen + public enum CanonicalNormalizationForm { + + /// Normalization Form D. + /// + case nfd + + /// Normalization Form C. + /// + case nfc + + /// The normalization form preferred by the Swift Standard Library. + /// + /// The standard library's `String` type sorts values according to + /// the lexicographical order of their Unicode scalars + /// after normalizing to this form. + /// + @inlinable + public static var preferredForm: Self { + .nfc + } + } + + /// A representation of a Unicode string + /// which does _not_ preserve canonical equivalence. + /// + /// Unicode Normalization Forms are formally defined normalizations + /// of Unicode strings which make it possible to determine + /// whether any two Unicode strings are equivalent to each other. + /// If two strings are equivalent, they will contain exactly the same + /// sequence of Unicode scalars when normalized to the same form. + /// + /// Compatibility normalization is described as being similar + /// to an uppercase or lowercase mapping: useful in certain contexts + /// for identifying core meanings, but also performing modifications + /// to the text that may not always be appropriate. + /// + /// Some characters are equivalent to sequences of characters + /// and combining marks. The two forms of compatibility normalization + /// allow one to choose whether the result contains the composed (NFKC) + /// or decomposed (NFKD) representations of these characters. + /// + @available(SwiftStdlib 9999, *) + @frozen + public enum CompatibilityNormalizationForm { + + /// Normalization Form KD. + /// + case nfkd + + /// Normalization Form KC. + /// + case nfkc + } +} + +extension StringProtocol { + + /// Returns a copy of this string in the given normal form. + /// The result is canonically equivalent to this string. + /// + /// If two strings are normalized to the same form, + /// and they are equivalent, they will contain + /// the same Unicode scalars. + /// + /// ```swift + /// let a = "cafe\u{0301}" + /// let b = "caf\u{00E9}" + /// + /// a.unicodeScalars + /// b.unicodeScalars + /// // ["c", "a", "f", "e", "\u{0301}"] + /// // ["c", "a", "f", "\u{00E9}"] + /// + /// a.normalized(.nfc).unicodeScalars + /// b.normalized(.nfc).unicodeScalars + /// // ["c", "a", "f", "\u{00E9}"] + /// // ["c", "a", "f", "\u{00E9}"] + /// + /// a.normalized(.nfd).unicodeScalars + /// b.normalized(.nfd).unicodeScalars + /// // ["c", "a", "f", "e", "\u{0301}"] + /// // ["c", "a", "f", "e", "\u{0301}"] + /// ``` + /// + /// Note that String's built-in equality and comparison operators + /// already test canonical equivalence and do not require strings + /// to be manually normalized. + /// + /// If persisting normalized strings, be aware that a string + /// containing characters unassigned in the standard library's + /// version of Unicode has an unstable normalization. + /// The ``stableNormalization`` function should be used + /// if a stable normalization is required. + /// + /// - parameters: + /// - form: The canonical normalization form. + /// + @_specialize(where Self == String) + @_specialize(where Self == Substring) + @available(SwiftStdlib 9999, *) + public func normalized( + _ form: Unicode.CanonicalNormalizationForm + ) -> String { + + switch form { + case .nfd: + if _wholeGuts.isASCII { + return String(self) + } + return String(unicodeScalars.normalized.nfd) + + case .nfc: + // FIXME: There should be a test that String.init keeps the isNFC bit. + if _wholeGuts.isNFC { + return String(self) + } + + // UAX#15 (Unicode 15.1.0), Section 9: + // + // > There is also a Unicode Consortium stability policy + // > that canonical mappings are always limited + // > in all versions of Unicode, so that no string + // > when decomposed with NFC expands to more than 3x in length + // > (measured in code units). + // > This is true whether the text is in UTF-8, UTF-16, or UTF-32 + // + // This is not true of NFD. + + return _withUnprotectedUnsafeTemporaryAllocation( + of: UInt8.self, capacity: _gutsSlice.utf8Count * 3 + ) { buffer in + var i = 0 + for scalar in self.unicodeScalars.normalized.nfc { + scalar.withUTF8CodeUnits { utf8 in + _precondition( + i < buffer.endIndex, "We should not run out of capacity" + ) + i = buffer[Range(uncheckedBounds: (i, buffer.endIndex))] + .initialize(fromContentsOf: utf8) + } + } + + let encodedContents = UnsafeBufferPointer( + rebasing: buffer[Range(uncheckedBounds: (buffer.startIndex, i))] + ) + var string = String._uncheckedFromUTF8(encodedContents) + string._guts.markIsNFC() + return string + } + } + } + + /// Returns a copy of this string in the given normal form, + /// if the normalization is stable. + /// + /// The result, if not `nil`, is a stabilized string + /// that is canonically equivalent to this string. + /// + /// If two strings are normalized to the same form, + /// and they are equivalent, they will contain + /// the same Unicode scalars. + /// + /// ```swift + /// let a = "cafe\u{0301}" + /// let b = "caf\u{00E9}" + /// + /// a.unicodeScalars + /// b.unicodeScalars + /// // ["c", "a", "f", "e", "\u{0301}"] + /// // ["c", "a", "f", "\u{00E9}"] + /// + /// a.normalized(.nfc).unicodeScalars + /// b.normalized(.nfc).unicodeScalars + /// // ["c", "a", "f", "\u{00E9}"] + /// // ["c", "a", "f", "\u{00E9}"] + /// + /// a.normalized(.nfd).unicodeScalars + /// b.normalized(.nfd).unicodeScalars + /// // ["c", "a", "f", "e", "\u{0301}"] + /// // ["c", "a", "f", "e", "\u{0301}"] + /// ``` + /// + /// If a string does not contain any unassigned characters + /// and is normalized, it is said to be a 'Stabilized String' + /// and will never change if renormalized for that same form + /// in any past or future version of Unicode. + /// + /// This can be important if a normalized string is to be persisted. + /// For instance, if keys in a database are normalized strings, + /// the additional guarantee of stability ensures all versions + /// of Unicode will agree that each key is distinct. + /// + /// - parameters: + /// - form: The canonical normalization form. + /// + @_specialize(where Self == String) + @_specialize(where Self == Substring) + @available(SwiftStdlib 9999, *) + public func stableNormalization( + _ form: Unicode.CanonicalNormalizationForm + ) -> String? { + + if _wholeGuts.isASCII { + return String(self) + } + guard !unicodeScalars.contains(where: \.isUnassigned) else { + return nil + } + return normalized(form) + } +} + +extension StringProtocol { + + /// Returns a copy of this string in the given compatibility normal form. + /// The result may not be canonically equivalent to this string. + /// + /// If two strings are normalized to the same form, + /// and they are equivalent, they will contain + /// the same Unicode scalars. + /// + /// Compatibility equivalence is a more permissive kind + /// of equivalence than canonical equivalence, + /// useful for identifying core meanings but also modifying the text + /// in ways that may not always be appropriate. + /// + /// ```swift + /// let a = "Henry Ⅷ" + /// let b = "Henry VIII" + /// + /// a.unicodeScalars + /// b.unicodeScalars + /// // ["H", "e", "n", "r", "y", " ", "\u{2167}"] + /// // ["H", "e", "n", "r", "y", " ", "V", "I", "I", "I"] + /// + /// a.normalized(.nfkc).unicodeScalars + /// b.normalized(.nfkc).unicodeScalars + /// // ["H", "e", "n", "r", "y", " ", "V", "I", "I", "I"] + /// // ["H", "e", "n", "r", "y", " ", "V", "I", "I", "I"] + /// + /// // => 'a' is compatibility equivalent to 'b' + /// + /// let c = "2² = 4" + /// print(c.normalized(.nfkd)) + /// // "22 = 4" (!) + /// ``` + /// + /// If persisting normalized strings, be aware that a string + /// containing characters unassigned in the standard library's + /// version of Unicode has an unstable normalization. + /// The `stabilized()` function should be used + /// if a stable normalization is required. + /// + /// - parameters: + /// - form: The canonical normalization form. + /// + @_specialize(where Self == String) + @_specialize(where Self == Substring) + @available(SwiftStdlib 9999, *) + public func normalized( + _ form: Unicode.CompatibilityNormalizationForm + ) -> String { + + if _wholeGuts.isASCII { + return String(self) + } + + switch form { + case .nfkd: + return String(unicodeScalars.normalized.nfkd) + + case .nfkc: + var result = String(unicodeScalars.normalized.nfkc) + result._guts.markIsNFC() + return result + } + } + + /// Returns a copy of this string in the given compatibility normal form, + /// if the normalization is stable. + /// + /// The result, if not `nil`, is a stabilized string + /// that may not be canonically equivalent to this string. + /// + /// If two strings are normalized to the same form, + /// and they are equivalent, they will contain + /// the same Unicode scalars. + /// + /// Compatibility equivalence is a more permissive kind + /// of equivalence than canonical equivalence, + /// useful for identifying core meanings but also modifying the text + /// in ways that may not always be appropriate. + /// + /// ```swift + /// let a = "Henry Ⅷ" + /// let b = "Henry VIII" + /// + /// a.unicodeScalars + /// b.unicodeScalars + /// // ["H", "e", "n", "r", "y", " ", "\u{2167}"] + /// // ["H", "e", "n", "r", "y", " ", "V", "I", "I", "I"] + /// + /// a.normalized(.nfkc).unicodeScalars + /// b.normalized(.nfkc).unicodeScalars + /// // ["H", "e", "n", "r", "y", " ", "V", "I", "I", "I"] + /// // ["H", "e", "n", "r", "y", " ", "V", "I", "I", "I"] + /// + /// // => 'a' is compatibility equivalent to 'b' + /// + /// let c = "2² = 4" + /// print(c.normalized(.nfkd)) + /// // "22 = 4" (!) + /// ``` + /// + /// If a string does not contain any unassigned characters + /// and is normalized, it is said to be a 'Stabilized String' + /// and will never change if renormalized for that same form + /// in any past or future version of Unicode. + /// + /// This can be important if a normalized string is to be persisted. + /// For instance, if keys in a database are normalized strings, + /// the additional guarantee of stability ensures all versions + /// of Unicode will agree that each key is distinct. + /// + /// - parameters: + /// - form: The compatibility normalization form. + /// + @_specialize(where Self == String) + @_specialize(where Self == Substring) + @available(SwiftStdlib 9999, *) + public func stableNormalization( + _ form: Unicode.CompatibilityNormalizationForm + ) -> String? { + + if _wholeGuts.isASCII { + return String(self) + } + guard !unicodeScalars.contains(where: \.isUnassigned) else { + return nil + } + return normalized(form) + } +} + extension Unicode.Scalar { // Normalization boundary - a place in a string where everything left of the // boundary can be normalized independently from everything right of the @@ -23,9 +390,7 @@ extension Unicode.Scalar { // Quick check if a scalar is an NFC segment starter. internal var _isNFCStarter: Bool { - // Fast path: All scalars up to U+300 are NFC_QC and have boundaries - // before them. - let normData = Unicode._NormData(self, fastUpperbound: 0x300) + let normData = Unicode._CanonicalNormData(onlyCCCAndNFCQC: self) return normData.ccc == 0 && normData.isNFCQC } } diff --git a/stdlib/public/core/StringObject.swift b/stdlib/public/core/StringObject.swift index 192bc11474578..87ad207760fef 100644 --- a/stdlib/public/core/StringObject.swift +++ b/stdlib/public/core/StringObject.swift @@ -906,6 +906,14 @@ extension _StringObject.CountAndFlags { (_storage & Self.isForeignUTF8Mask) != 0 } + /// Sets the `isNFC` bit. + /// + @_alwaysEmitIntoClient + @inline(__always) + internal mutating func markIsNFC() { + _storage |= _StringObject.CountAndFlags.isNFCMask + } + #if !INTERNAL_CHECKS_ENABLED @inlinable @inline(__always) internal func _invariantCheck() {} #else @@ -1140,7 +1148,7 @@ extension _StringObject { return _countAndFlags.isASCII } - @inline(__always) + @inlinable @inline(__always) internal var isNFC: Bool { if isSmall { // TODO(String performance): Worth implementing more sophisticated @@ -1151,6 +1159,18 @@ extension _StringObject { return _countAndFlags.isNFC } + /// Sets the `isNFC` bit, + /// if the representation has a bit to store that information. + /// + @_alwaysEmitIntoClient + @inline(__always) + internal mutating func markIsNFC() { + if isSmall { return } + var newFlags = _countAndFlags + newFlags.markIsNFC() + _setCountAndFlags(to: newFlags) + } + /// Returns whether this string has a UTF-8 storage representation. /// If this returns false, then the string is encoded in UTF-16. /// diff --git a/stdlib/public/core/StringStorage.swift b/stdlib/public/core/StringStorage.swift index 11652b4a2a9a9..16c07a879fba7 100644 --- a/stdlib/public/core/StringStorage.swift +++ b/stdlib/public/core/StringStorage.swift @@ -540,6 +540,8 @@ extension __StringStorage { self._breadcrumbsAddress.pointee = nil } _invariantCheck() + // TODO(String performance): Consider updating isNFC when feasible. + _internalInvariant(countAndFlags.isASCII || !countAndFlags.isNFC) } // Perform common post-append adjustments and invariant enforcement. diff --git a/stdlib/public/core/StringTesting.swift b/stdlib/public/core/StringTesting.swift index 552f50a7c0ed0..fe2e6f3b794de 100644 --- a/stdlib/public/core/StringTesting.swift +++ b/stdlib/public/core/StringTesting.swift @@ -15,6 +15,7 @@ public // @testable struct _StringRepresentation { public var _isASCII: Bool + public var _isNFC: Bool public var _count: Int public var _capacity: Int @@ -77,10 +78,16 @@ extension String { #endif } +extension Character { + public // @testable + func _classify() -> _StringRepresentation { return _str._classify() } +} + extension _StringGuts { internal func _classify() -> _StringRepresentation { var result = _StringRepresentation( _isASCII: self.isASCII, + _isNFC: self.isNFC, _count: self.count, _capacity: nativeCapacity ?? 0, _form: ._small diff --git a/stdlib/public/core/Unicode+NormalizedScalars.swift b/stdlib/public/core/Unicode+NormalizedScalars.swift new file mode 100644 index 0000000000000..3fb30f7f010e9 --- /dev/null +++ b/stdlib/public/core/Unicode+NormalizedScalars.swift @@ -0,0 +1,77 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the Swift.org open source project +// +// Copyright (c) 2023 Apple Inc. and the Swift project authors +// Licensed under Apache License v2.0 with Runtime Library Exception +// +// See https://swift.org/LICENSE.txt for license information +// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +// +//===----------------------------------------------------------------------===// + +extension Unicode { + + /// Normalized representations of Unicode text. + /// + /// This type exposes `Sequence`s and `AsyncSequence`s which + /// wrap a source of Unicode scalars and lazily normalize it. + /// + /// The `.normalized` property is available on all + /// `Sequence`s and `AsyncSequence`s where the element type + /// is `Unicode.Scalar`. + /// + /// ```swift + /// let text = "ṩ" // Latin Small Letter S with Dot Below and Dot Above + /// + /// for scalar in text.unicodeScalars.normalized.nfd { + /// print(scalar) + /// } + /// + /// // Prints: + /// // "s" + /// // "\u{0323}" (Combining Dot Below) + /// // "\u{0307}" (Combining Dot Above) + /// ``` + /// + /// ## Topics + /// + /// ### Normal Forms + /// + /// - ``NormalizedScalars/nfd`` + /// - ``NormalizedScalars/nfc`` + /// + @frozen + public struct NormalizedScalars { + + public var source: Source + + @inlinable + public init(_ source: Source) { + self.source = source + } + } +} + +extension Sequence where Element == Unicode.Scalar { + + /// Normalized representations of this sequence's contents. + /// + /// ```swift + /// let text = "ṩ" // Latin Small Letter S with Dot Below and Dot Above + /// + /// for scalar in text.unicodeScalars.normalized.nfd { + /// print(scalar) + /// } + /// + /// // Prints: + /// // "s" + /// // "\u{0323}" (Combining Dot Below) + /// // "\u{0307}" (Combining Dot Above) + /// ``` + /// + @inlinable + public var normalized: Unicode.NormalizedScalars { + Unicode.NormalizedScalars(self) + } +} diff --git a/stdlib/public/core/UnicodeData.swift b/stdlib/public/core/UnicodeData.swift index 7973a1c828471..1a824f0f07061 100644 --- a/stdlib/public/core/UnicodeData.swift +++ b/stdlib/public/core/UnicodeData.swift @@ -14,180 +14,398 @@ import SwiftShims internal typealias ScalarAndNormData = ( scalar: Unicode.Scalar, - normData: Unicode._NormData + normData: Unicode._CanonicalNormData +) + +internal typealias ScalarAndCompatNormData = ( + scalar: Unicode.Scalar, + normData: Unicode._CompatibilityNormData ) extension Unicode { - // A wrapper type over the normalization data value we receive when we - // lookup a scalar's normalization information. The layout of the underlying - // 16 bit value we receive is as follows: - // - // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 - // └───┬───┘ └──── CCC ────┘ └─┘ │ - // │ │ └── NFD_QC - // │ └── NFC_QC - // └── Unused - // - // NFD_QC: This is a simple Yes/No on whether the scalar has canonical - // decomposition. Note: Yes is indicated via 0 instead of 1. - // - // NFC_QC: This is either Yes/No/Maybe on whether the scalar is NFC quick - // check. Yes, represented as 0, means the scalar can NEVER compose - // with another scalar previous to it. No, represented as 1, means the - // scalar can NEVER appear within a well formed NFC string. Maybe, - // represented as 2, means the scalar could appear with an NFC string, - // but further information is required to determine if that is the - // case. At the moment, we really only care about Yes/No. - // - // CCC: This is the canonical combining class property of a scalar that is - // used when sorting scalars of a normalization segment after NFD - // computation. A scalar with a CCC value of 128 can NEVER appear before - // a scalar with a CCC value of 100, unless there are normalization - // boundaries between them. - // - internal struct _NormData { - var rawValue: UInt16 - - var ccc: UInt8 { - UInt8(truncatingIfNeeded: rawValue >> 3) - } - - var canonicalCombiningClass: Unicode.CanonicalCombiningClass { + + internal struct _CanonicalNormData { + + // A wrapper type over the normalization data value we receive when we + // lookup a scalar's normalization information. The layout of the underlying + // 16 bit value we receive is as follows: + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // └──── CCC ────┘ └───────┘ └─┘ │ + // │ │ └── decomposed_QC + // Unused ┘ └── precomposed_QC + // + // NF(K)D_QC: This is a simple Yes/No on whether the scalar has canonical + // decomposition. Note: Yes is indicated via 0 instead of 1. + // + // NF(K)C_QC: This is either Yes/No/Maybe on whether the scalar is NFC quick + // check. + // - Yes, represented as 0, means the scalar can NEVER compose + // with another scalar previous to it. + // - No, represented as 1, means the scalar can NEVER appear + // within a well formed NFC string. + // - Maybe, represented as 2, means the scalar COULD appear + // with an NFC string, but further information is required + // to determine if that is the case. + // + // CCC: This is the canonical combining class property of a scalar that is + // used when sorting scalars of a normalization segment after NFD + // computation. A scalar with a CCC value of 128 can NEVER appear before + // a scalar with a CCC value of 100, unless there are normalization + // boundaries between them. + // + + private let rawValue: UInt16 + + private init(rawValue: UInt16) { + self.rawValue = rawValue + } + + private init(_ scalar: Unicode.Scalar, fastUpperbound: UInt32) { + + if _fastPath(scalar.value < fastUpperbound) { + // CCC = 0, NFD_QC = Yes, NFC_QC = Yes. + self.rawValue = 0 + return + } + + var rawValue = _swift_stdlib_getNormData(scalar.value) + if (0xAC00 ... 0xD7A3).contains(scalar.value) { + // Because we don't store precomposed hangul in our NFD_QC data, + // these will return true for NFD_QC when in fact they are not. + // So set the bit to false. + rawValue |= 0x1 + } + self.rawValue = rawValue + } + + /// Lookup the NormData for the given scalar. + /// All fields are accurate. + /// + internal init(_ scalar: Unicode.Scalar) { + self.init(scalar, fastUpperbound: 0xC0) + } + + /// Lookup the NormData for the given scalar. + /// Only the Canonical Combining Class and NFC\_QC fields are accurate. + /// + internal init(onlyCCCAndNFCQC scalar: Unicode.Scalar) { + self.init(scalar, fastUpperbound: 0x300) + } + + internal static var hangulLeadingConsonants: Self { + // CCC = 0, NFD_QC = Yes, NFC_QC = Yes. + Self(rawValue: 0) + } + + internal static var hangulVowels: Self { + // CCC = 0, NFD_QC = Yes, NFC_QC = Maybe. + Self(rawValue: 0b0000_0000_0000_0100) + } + + internal static var hangulTailConsonants: Self { + // CCC = 0, NFD_QC = Yes, NFC_QC = Maybe. + Self(rawValue: 0b0000_0000_0000_0100) + } + + internal var ccc: UInt8 { + UInt8(truncatingIfNeeded: rawValue >> 8) + } + + internal var canonicalCombiningClass: Unicode.CanonicalCombiningClass { Unicode.CanonicalCombiningClass(rawValue: ccc) } - var isNFCQC: Bool { - rawValue & 0x6 == 0 + internal var isNFDQC: Bool { + rawValue & 0b0000_0001 == 0 } - var isNFDQC: Bool { - rawValue & 0x1 == 0 + // TODO: Replace with Tristate + internal var isNFCQC: Bool { + rawValue & 0b0000_0110 == 0 } + } - init(_ scalar: Unicode.Scalar, fastUpperbound: UInt32 = 0xC0) { - if _fastPath(scalar.value < fastUpperbound) { - // CCC = 0, NFC_QC = Yes, NFD_QC = Yes - rawValue = 0 - } else { - rawValue = _swift_stdlib_getNormData(scalar.value) - - // Because we don't store precomposed hangul in our NFD_QC data, these - // will return true for NFD_QC when in fact they are not. - if (0xAC00 ... 0xD7A3).contains(scalar.value) { - // NFD_QC = false - rawValue |= 0x1 - } - } + + internal struct _CompatibilityNormData { + + // Same layout as Unicode._CanonicalNormData. + + private let rawValue: UInt16 + + private init(rawValue: UInt16) { + self.rawValue = rawValue } - init(rawValue: UInt16) { + /// Lookup the NormData for the given scalar. + /// All fields are accurate. + /// + internal init(_ scalar: Unicode.Scalar) { + + if _fastPath(scalar.value < 0xA0) { + // CCC = 0, NFKD_QC = Yes, NFKC_QC = Yes. + self.rawValue = 0 + return + } + + var rawValue = _swift_stdlib_getCompatibilityNormData(scalar.value) + if (0xAC00 ... 0xD7A3).contains(scalar.value) { + // Because we don't store precomposed hangul in our NFKD_QC data, + // these will return true for NFKD_QC when in fact they are not. + // So set the bit to false. + rawValue |= 0x1 + } self.rawValue = rawValue } + + internal static var hangulLeadingConsonants: Self { + // CCC = 0, NFD_QC = Yes, NFC_QC = Yes. + Self(rawValue: 0) + } + + internal static var hangulVowels: Self { + // CCC = 0, NFD_QC = Yes, NFC_QC = Maybe. + Self(rawValue: 0b0000_0000_0000_0100) + } + + internal static var hangulTailConsonants: Self { + // CCC = 0, NFD_QC = Yes, NFC_QC = Maybe. + Self(rawValue: 0b0000_0000_0000_0100) + } + + internal var ccc: UInt8 { + UInt8(truncatingIfNeeded: rawValue >> 8) + } + + internal var canonicalCombiningClass: Unicode.CanonicalCombiningClass { + Unicode.CanonicalCombiningClass(rawValue: ccc) + } + + internal var isNFKDQC: Bool { + rawValue & 0b0000_0001 == 0 + } + + internal var isNFKCQC: Unicode.NFCQCResult { + let v = UInt8(truncatingIfNeeded: (rawValue & 0b0000_0110) &>> 1) + return Unicode.NFCQCResult(rawValue: v) + } } } extension Unicode { - // A wrapper type for normalization buffers in the NFC and NFD iterators. - // This helps remove some of the buffer logic like removal and sorting out of - // the iterators and into this type. - internal struct _NormDataBuffer { - var storage: [ScalarAndNormData] = [] - - // This is simply a marker denoting that we've built up our storage, and - // now everything within it needs to be emitted. We reverse the buffer and - // pop elements from the back as a way to remove them. - var isReversed = false - - var isEmpty: Bool { - storage.isEmpty + + @usableFromInline + internal struct NFCQCResult: Equatable { + internal var rawValue: UInt8 + + @usableFromInline + internal static var yes: Self { Self(rawValue: 0) } + @usableFromInline + internal static var no: Self { Self(rawValue: 1) } + @usableFromInline + internal static var maybe: Self { Self(rawValue: 2) } + + @usableFromInline + internal static func == (lhs: Self, rhs: Self) -> Bool { + lhs.rawValue == rhs.rawValue } + } +} +extension Unicode._CanonicalNormData { + internal var isNFCQC_Tristate: Unicode.NFCQCResult { + let v = UInt8(truncatingIfNeeded: (rawValue & 0b0000_0110) &>> 1) + return Unicode.NFCQCResult(rawValue: v) + } +} - var last: ScalarAndNormData? { - storage.last +extension Unicode { + + internal typealias _CanonicalNormalizationBuffer = Unicode._NormDataBuffer + internal typealias _CompatibilityNormalizationBuffer = Unicode._NormDataBuffer + + /// A buffer for Normalization data. + /// + /// The buffer operates in two modes: + /// + /// 1. Elements are inserted using the `append` method + /// until the normalizer detects some kind of boundary. + /// If required, the contents may then be sorted. + /// + /// 2. Elements are consumed by using the `next` method. + /// Once it has started consuming elements, the normalizer + /// must not append anything until it has consumed the entire buffer + /// and `next` has returned `nil`. + /// + internal struct _NormDataBuffer { + + private var storage: [T] = [] + private var isReversed = false + + /// Resets the buffer to its initial state. + /// + /// Existing capacity is kept unless it exceeds the given maximum. + /// + internal mutating func reset(maximumCapacity: Int) { + storage.removeAll(keepingCapacity: storage.capacity <= maximumCapacity) + isReversed = false } - mutating func append(_ scalarAndNormData: ScalarAndNormData) { + /// Appends an element to the buffer. + /// + internal mutating func append(_ element: T) { _internalInvariant(!isReversed) - storage.append(scalarAndNormData) + storage.append(element) } - // Removes the first element from the buffer. Note: it is not safe to append - // to the buffer after this function has been called. We reverse the storage - // internally for everything to be emitted out, so appending would insert - // into the storage at the wrong location. One must continue to call this - // function until a 'nil' return value has been received before appending. - mutating func next() -> ScalarAndNormData? { + /// Removes the first element from the buffer. + /// + /// After calling this method, `append` becomes unavailable + /// until the entire buffer has been consumed. + /// + internal mutating func next() -> T? { guard !storage.isEmpty else { isReversed = false return nil } - - // If our storage hasn't been reversed yet, do so now. if !isReversed { storage.reverse() isReversed = true } - return storage.removeLast() } - // Sort the entire buffer based on the canonical combining class. - mutating func sort() { - storage._insertionSort(within: storage.indices) { - $0.normData.ccc < $1.normData.ccc + internal var isEmpty: Bool { + storage.isEmpty + } + + internal var last: T? { + _internalInvariant(!isReversed) + return storage.last + } + } +} + +extension Unicode._CanonicalNormalizationBuffer { + + /// Sorts the buffer in canonical order. + /// + /// > Important: The buffer must only contain a single normalization segment. + /// + internal mutating func sort() { + storage._insertionSort(within: storage.indices) { + $0.normData.ccc < $1.normData.ccc + } + } +} + +extension Unicode._CompatibilityNormalizationBuffer { + + /// Sorts the buffer in canonical order. + /// + /// The buffer may contain multiple normalization segments. + /// Each segment (between starters) is sorted independently. + /// + internal mutating func sort() { + var segmentStart = storage.startIndex + var i = segmentStart + while i < storage.endIndex { + if storage[i].normData.canonicalCombiningClass == .notReordered { + storage._insertionSort(within: segmentStart..> 14) - } - - // The index into the decomposition array is stored in the top 14 bits. - var index: Int { - Int(truncatingIfNeeded: rawValue >> 18) - } - - // A buffer pointer to the UTF8 decomposition string. - var utf8: UnsafeBufferPointer { - let decompPtr = _swift_stdlib_nfd_decompositions._unsafelyUnwrappedUnchecked - - // This size is the utf8 length of the decomposition. - let size = Int(truncatingIfNeeded: decompPtr[index]) - - return UnsafeBufferPointer( - // We add 1 here to skip the size byte. - start: decompPtr + index + 1, + + internal struct _CanonicalDecomposition { + + internal let utf8: UnsafeBufferPointer + + internal init?(_ scalar: Unicode.Scalar) { + + // The layout of the underlying 32 bit value we receive is as follows: + // + // Top 14 bits Bottom 18 bits + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // └───────── Index ─────────┘ └───────── Hashed Scalar ─────────┘ + // + // Index: This is the direct index into '_swift_stdlib_nfd_decompositions' + // that points to a size byte indicating the overall size of the + // UTF-8 decomposition string. Following the size byte is said string. + // + // Hashed Scalar: Because perfect hashing doesn't know the original set of + // keys it was hashed with, we store the original scalar in the + // decomposition entry so that we can guard against scalars + // who happen to hash to the same index. + + let rawValue = _swift_stdlib_getDecompositionEntry(scalar.value) + let index = Int(truncatingIfNeeded: rawValue >> 18) + let hashedScalar = (rawValue << 14) >> 14 + + guard hashedScalar == scalar.value else { + return nil + } + + let decompositionsTable = _swift_stdlib_nfd_decompositions._unsafelyUnwrappedUnchecked + + // First byte of the decomposition entry is its size. + let size = Int(truncatingIfNeeded: decompositionsTable[index]) + self.utf8 = UnsafeBufferPointer( + start: decompositionsTable + index + 1 /* size byte */, count: size ) } + } - init(_ scalar: Unicode.Scalar) { - rawValue = _swift_stdlib_getDecompositionEntry(scalar.value) + internal struct _CompatibilityDecomposition { + + internal let utf8: UnsafeBufferPointer + + internal init?(_ scalar: Unicode.Scalar) { + + // Same layout as Unicode._CanonicalDecomposition. + + let rawValue = _swift_stdlib_getCompatibilityDecompositionEntry(scalar.value) + let index = Int(truncatingIfNeeded: rawValue >> 18) + let hashedScalar = (rawValue << 14) >> 14 + + guard hashedScalar == scalar.value else { + + // The compatibility decomposition table is recursively expanded, + // which includes considering canonical decompositions, + // but it doesn't store its own copy of purely-canonical decompositions. + + guard let canonicalResult = _CanonicalDecomposition(scalar) else { + return nil + } + + self.utf8 = canonicalResult.utf8 + return + } + + let decompositionsTable = _swift_stdlib_nfkd_decompositions._unsafelyUnwrappedUnchecked + + // First byte of the decomposition entry is its size. + let size = Int(truncatingIfNeeded: decompositionsTable[index]) + self.utf8 = UnsafeBufferPointer( + start: decompositionsTable + index + 1 /* size byte */, + count: size + ) } } } diff --git a/stdlib/public/core/UnicodeHelpers.swift b/stdlib/public/core/UnicodeHelpers.swift index 39ce3667f6c67..de5b054c67345 100644 --- a/stdlib/public/core/UnicodeHelpers.swift +++ b/stdlib/public/core/UnicodeHelpers.swift @@ -421,7 +421,9 @@ extension _StringGuts { ) -> Character { if _fastPath(isFastUTF8) { return withFastUTF8(range: start.. { + + /// Whether this sequence of scalars is in the given normalization form. + /// + /// Computing this result is often more efficient + /// than normalizing and comparing. + /// + /// ```swift + /// let aString = "café" + /// + /// aString.unicodeScalars.isNormalized(.nfd) // false + /// aString.unicodeScalars.isNormalized(.nfc) // true + /// ``` + /// + @available(SwiftStdlib 9999, *) + @inlinable + public consuming func isNormalized( + _ form: Unicode.CanonicalNormalizationForm + ) -> Bool { + switch form { + case .nfd: return _isNFD() + case .nfc: return _isNFC() + } + } + + /// Whether this sequence of scalars is in the given normalization form. + /// + /// Computing this result is often more efficient + /// than normalizing and comparing. + /// + /// ```swift + /// let aString = "Henry Ⅷ" + /// + /// aString.unicodeScalars.isNormalized(.nfkd) // false + /// aString.unicodeScalars.isNormalized(.nfc) // true + /// ``` + /// + @available(SwiftStdlib 9999, *) + @inlinable + public consuming func isNormalized( + _ form: Unicode.CompatibilityNormalizationForm + ) -> Bool { + switch form { + case .nfkd: return _isNFKD() + case .nfkc: return _isNFKC() + } + } +} + +extension Collection { + + /// Whether this sequence of scalars is in the given normalization form. + /// + /// Computing this result is often more efficient + /// than normalizing and comparing. + /// + /// ```swift + /// let aString = "café" + /// + /// aString.unicodeScalars.isNormalized(.nfd) // false + /// aString.unicodeScalars.isNormalized(.nfc) // true + /// ``` + /// + @available(SwiftStdlib 9999, *) + @inlinable + public func isNormalized( + _ form: Unicode.CanonicalNormalizationForm + ) -> Bool { + switch form { + case .nfd: return _isNFD() + case .nfc: return _isNFC() + } + } + + /// Whether this sequence of scalars is in the given normalization form. + /// + /// Computing this result is often more efficient + /// than normalizing and comparing. + /// + /// ```swift + /// let aString = "Henry Ⅷ" + /// + /// aString.unicodeScalars.isNormalized(.nfkd) // false + /// aString.unicodeScalars.isNormalized(.nfc) // true + /// ``` + /// + @available(SwiftStdlib 9999, *) + @inlinable + public func isNormalized( + _ form: Unicode.CompatibilityNormalizationForm + ) -> Bool { + switch form { + case .nfkd: return _isNFKD() + case .nfkc: return _isNFKC() + } + } +} + +extension StringProtocol { + + /// Whether this string is in the given normalization form. + /// + /// Computing this result is often more efficient + /// than normalizing and comparing. + /// + /// ```swift + /// let aString = "café" + /// + /// aString.isNormalized(.nfd) // false + /// aString.isNormalized(.nfc) // true + /// ``` + /// + @available(SwiftStdlib 9999, *) + @_specialize(where Self == String) + @_specialize(where Self == Substring) + public func isNormalized( + _ form: Unicode.CanonicalNormalizationForm + ) -> Bool { + self.unicodeScalars.isNormalized(form) + } + + /// Whether this string is in the given normalization form. + /// + /// Computing this result is often more efficient + /// than normalizing and comparing. + /// + /// ```swift + /// let aString = "Henry Ⅷ" + /// + /// aString.isNormalized(.nfkd) // false + /// aString.isNormalized(.nfc) // true + /// ``` + /// + @available(SwiftStdlib 9999, *) + @_specialize(where Self == String) + @_specialize(where Self == Substring) + public func isNormalized( + _ form: Unicode.CompatibilityNormalizationForm + ) -> Bool { + self.unicodeScalars.isNormalized(form) + } +} + +extension Character { + + /// Whether this character is in the given normalization form. + /// + /// Computing this result is often more efficient + /// than normalizing and comparing. + /// + /// ```swift + /// let char: Character = "é" + /// + /// char.isNormalized(.nfd) // false + /// char.isNormalized(.nfc) // true + /// ``` + /// + @available(SwiftStdlib 9999, *) + public func isNormalized( + _ form: Unicode.CanonicalNormalizationForm + ) -> Bool { + self._str.isNormalized(form) + } + + /// Whether this character is in the given normalization form. + /// + /// Computing this result is often more efficient + /// than normalizing and comparing. + /// + /// ```swift + /// let char: Character = "Ⅷ" + /// + /// char.isNormalized(.nfkd) // false + /// char.isNormalized(.nfc) // true + /// ``` + /// + @available(SwiftStdlib 9999, *) + public func isNormalized( + _ form: Unicode.CompatibilityNormalizationForm + ) -> Bool { + self._str.isNormalized(form) + } +} + + +// ---------------------------------------------------------------------------// +// NFD (Sequence only) +// ---------------------------------------------------------------------------// + + +extension Unicode.Scalar { + + // ABI barrier for data required by the NFD Quick Check algorithm. + + @available(SwiftStdlib 9999, *) + @usableFromInline + internal typealias _NFDQuickCheckData = ( + CCC: Unicode.CanonicalCombiningClass, + isNFDQC: Bool + ) + + @available(SwiftStdlib 9999, *) + @usableFromInline + internal func _getNFDQuickCheckData() -> _NFDQuickCheckData { + let normdata = Unicode._CanonicalNormData(self) + return (normdata.canonicalCombiningClass, normdata.isNFDQC) + } +} + +extension Sequence { + + @available(SwiftStdlib 9999, *) + @inlinable + internal consuming func _isNFD() -> Bool { + + var lastCanonicalClass = Unicode.CanonicalCombiningClass.notReordered + var iter = (consume self).makeIterator() + + while let scalar = iter.next() { + let scalarInfo = scalar._getNFDQuickCheckData() + + if scalarInfo.CCC != .notReordered, + lastCanonicalClass > scalarInfo.CCC { + return false + } + + guard scalarInfo.isNFDQC else { + return false + } + + lastCanonicalClass = scalarInfo.CCC + } + return true + } +} + + +// ---------------------------------------------------------------------------// +// NFKD (Sequence only) +// ---------------------------------------------------------------------------// + + +extension Unicode.Scalar { + + // ABI barrier for data required by the NFKD Quick Check algorithm. + + @available(SwiftStdlib 9999, *) + @usableFromInline + internal typealias _NFKDQuickCheckData = ( + CCC: Unicode.CanonicalCombiningClass, + isNFKDQC: Bool + ) + + @available(SwiftStdlib 9999, *) + @usableFromInline + internal func _getNFKDQuickCheckData() -> _NFKDQuickCheckData { + let normdata = Unicode._CompatibilityNormData(self) + return (normdata.canonicalCombiningClass, normdata.isNFKDQC) + } +} + +extension Sequence { + + @available(SwiftStdlib 9999, *) + @inlinable + internal consuming func _isNFKD() -> Bool { + + var lastCanonicalClass = Unicode.CanonicalCombiningClass.notReordered + var iter = (consume self).makeIterator() + + while let scalar = iter.next() { + let scalarInfo = scalar._getNFKDQuickCheckData() + + if scalarInfo.CCC != .notReordered, + lastCanonicalClass > scalarInfo.CCC { + return false + } + + guard scalarInfo.isNFKDQC else { + return false + } + + lastCanonicalClass = scalarInfo.CCC + } + return true + } +} + + +// ---------------------------------------------------------------------------// +// NFC (Collection and Sequence) +// ---------------------------------------------------------------------------// + + +extension Unicode.Scalar { + + // ABI barrier for data required by the NFC Quick Check algorithm. + + @available(SwiftStdlib 9999, *) + @usableFromInline + internal typealias _NFCQuickCheckData = ( + CCC: Unicode.CanonicalCombiningClass, + isNFCQC: Unicode.NFCQCResult + ) + + @available(SwiftStdlib 9999, *) + @usableFromInline + internal func _getNFCQuickCheckData() -> _NFCQuickCheckData { + let normdata = Unicode._CanonicalNormData(onlyCCCAndNFCQC: self) + return (normdata.canonicalCombiningClass, normdata.isNFCQC_Tristate) + } +} + +extension Collection { + + @available(SwiftStdlib 9999, *) + @inlinable @inline(never) + internal func _isNFC() -> Bool { + + var segmentStart = startIndex + var needsSlowCheck = false + var lastCanonicalClass = Unicode.CanonicalCombiningClass.notReordered + var normalizer = Unicode.NFCNormalizer() + + var i = segmentStart + while i < endIndex { + let scalar = self[i] + let scalarInfo = scalar._getNFCQuickCheckData() + + if scalarInfo.CCC != .notReordered, + lastCanonicalClass > scalarInfo.CCC { + return false + } + + switch scalarInfo.isNFCQC { + case .no: + return false + case .yes: + if scalarInfo.CCC == .notReordered { + if _slowPath(needsSlowCheck) { + guard _isNFC_sequence_slow( + segment: self[segmentStart.. { + + @available(SwiftStdlib 9999, *) + @inlinable @inline(never) + internal consuming func _isNFC() -> Bool { + + // Because Sequence is potentially single-pass, + // we need to keep the current normalization segment in a buffer + // in case we later hit a "maybe" scalar. + var segment = [Unicode.Scalar]() + var needsSlowCheck = false + var lastCanonicalClass = Unicode.CanonicalCombiningClass.notReordered + var normalizer = Unicode.NFCNormalizer() + + // Array needs 16 bytes for count + capacity on 64-bit, + // so in total this should be a 128 byte allocation. + segment.reserveCapacity(28) + + var iter = (consume self).makeIterator() + while let scalar = iter.next() { + let scalarInfo = scalar._getNFCQuickCheckData() + + if scalarInfo.CCC != .notReordered, + lastCanonicalClass > scalarInfo.CCC { + return false + } + + switch scalarInfo.isNFCQC { + case .no: + return false + case .yes: + if scalarInfo.CCC == .notReordered { + if _slowPath(needsSlowCheck) { + guard _isNFC_sequence_slow( + segment: segment, + normalizer: &normalizer + ) else { + return false + } + } + needsSlowCheck = false + segment.removeAll(keepingCapacity: true) + } + lastCanonicalClass = scalarInfo.CCC + segment.append(scalar) + default: + _internalInvariant(scalarInfo.isNFCQC == .maybe) + lastCanonicalClass = scalarInfo.CCC + segment.append(scalar) + needsSlowCheck = true + } + } + + if _slowPath(needsSlowCheck) { + return _isNFC_sequence_slow( + segment: segment, + normalizer: &normalizer + ) + } + + return true + } +} + +@available(SwiftStdlib 9999, *) +@inlinable +internal func _isNFC_sequence_slow( + segment: some Collection, + normalizer: inout Unicode.NFCNormalizer +) -> Bool { + + normalizer.reset() + + var original = segment.makeIterator() + var input = segment.makeIterator() + while let s = normalizer.resume(consuming: &input) ?? normalizer.flush() { + guard original.next() == s else { + return false + } + } + return (original.next() == nil) +} + + +// ---------------------------------------------------------------------------// +// NFKC (Collection and Sequence) +// ---------------------------------------------------------------------------// + + +extension Unicode.Scalar { + + // ABI barrier for data required by the NFKC Quick Check algorithm. + + @available(SwiftStdlib 9999, *) + @usableFromInline + internal typealias _NFKCQuickCheckData = ( + CCC: Unicode.CanonicalCombiningClass, + isNFKCQC: Unicode.NFCQCResult + ) + + @available(SwiftStdlib 9999, *) + @usableFromInline + internal func _getNFKCQuickCheckData() -> _NFKCQuickCheckData { + let normdata = Unicode._CompatibilityNormData(self) + return (normdata.canonicalCombiningClass, normdata.isNFKCQC) + } +} + +extension Collection { + + @available(SwiftStdlib 9999, *) + @inlinable @inline(never) + internal func _isNFKC() -> Bool { + + var segmentStart = startIndex + var needsSlowCheck = false + var lastCanonicalClass = Unicode.CanonicalCombiningClass.notReordered + var normalizer = Unicode.NFKCNormalizer() + + var i = segmentStart + while i < endIndex { + let scalar = self[i] + let scalarInfo = scalar._getNFKCQuickCheckData() + + if scalarInfo.CCC != .notReordered, + lastCanonicalClass > scalarInfo.CCC { + return false + } + + switch scalarInfo.isNFKCQC { + case .no: + return false + case .yes: + if scalarInfo.CCC == .notReordered { + if _slowPath(needsSlowCheck) { + guard _isNFKC_sequence_slow( + segment: self[segmentStart.. { + + @available(SwiftStdlib 9999, *) + @inlinable @inline(never) + internal consuming func _isNFKC() -> Bool { + + // Because Sequence is potentially single-pass, + // we need to keep the current normalization segment in a buffer + // in case we later hit a "maybe" scalar. + var segment = [Unicode.Scalar]() + var needsSlowCheck = false + var lastCanonicalClass = Unicode.CanonicalCombiningClass.notReordered + var normalizer = Unicode.NFKCNormalizer() + + // Array needs 16 bytes for count + capacity on 64-bit, + // so in total this should be a 128 byte allocation. + segment.reserveCapacity(28) + + var iter = (consume self).makeIterator() + while let scalar = iter.next() { + let scalarInfo = scalar._getNFKCQuickCheckData() + + if scalarInfo.CCC != .notReordered, + lastCanonicalClass > scalarInfo.CCC { + return false + } + + switch scalarInfo.isNFKCQC { + case .no: + return false + case .yes: + if scalarInfo.CCC == .notReordered { + if _slowPath(needsSlowCheck) { + guard _isNFKC_sequence_slow( + segment: segment, + normalizer: &normalizer + ) else { + return false + } + } + needsSlowCheck = false + segment.removeAll(keepingCapacity: true) + } + lastCanonicalClass = scalarInfo.CCC + segment.append(scalar) + default: + _internalInvariant(scalarInfo.isNFKCQC == .maybe) + lastCanonicalClass = scalarInfo.CCC + segment.append(scalar) + needsSlowCheck = true + } + } + + if _slowPath(needsSlowCheck) { + return _isNFKC_sequence_slow( + segment: segment, + normalizer: &normalizer + ) + } + + return true + } +} + +@available(SwiftStdlib 9999, *) +@inlinable +internal func _isNFKC_sequence_slow( + segment: some Collection, + normalizer: inout Unicode.NFKCNormalizer +) -> Bool { + + normalizer.reset() + + var original = segment.makeIterator() + var input = segment.makeIterator() + while let s = normalizer.resume(consuming: &input) ?? normalizer.flush() { + guard original.next() == s else { + return false + } + } + return (original.next() == nil) +} diff --git a/stdlib/public/core/UnicodeSPI.swift b/stdlib/public/core/UnicodeSPI.swift index 0838d07f6cce0..8d892213f7dd7 100644 --- a/stdlib/public/core/UnicodeSPI.swift +++ b/stdlib/public/core/UnicodeSPI.swift @@ -32,7 +32,7 @@ extension Unicode._NFD { @_spi(_Unicode) @available(SwiftStdlib 5.7, *) public struct Iterator { - var base: Unicode._InternalNFD.Iterator + var base: Unicode.NormalizedScalars.NFD.Iterator } } @@ -53,7 +53,7 @@ extension Unicode._NFD: Sequence { @_spi(_Unicode) @available(SwiftStdlib 5.7, *) public func makeIterator() -> Iterator { - Iterator(base: base._internalNFD.makeIterator()) + Iterator(base: base.normalized.nfd.makeIterator()) } } @@ -93,7 +93,7 @@ extension Unicode._NFC { @_spi(_Unicode) @available(SwiftStdlib 5.7, *) public struct Iterator { - var base: Unicode._InternalNFC.Iterator + var base: Unicode.NormalizedScalars.NFC.Iterator } } @@ -114,7 +114,7 @@ extension Unicode._NFC: Sequence { @_spi(_Unicode) @available(SwiftStdlib 5.7, *) public func makeIterator() -> Iterator { - Iterator(base: base._internalNFC.makeIterator()) + Iterator(base: base.normalized.nfc.makeIterator()) } } diff --git a/stdlib/public/core/UnicodeScalar.swift b/stdlib/public/core/UnicodeScalar.swift index e423ceae385cb..8c6799c343310 100644 --- a/stdlib/public/core/UnicodeScalar.swift +++ b/stdlib/public/core/UnicodeScalar.swift @@ -535,3 +535,91 @@ extension Unicode.Scalar { } } } + +extension Unicode.Scalar { + + /// Whether this scalar lacks an assigned interpretation + /// in the version of Unicode used by the Swift standard library. + /// + /// Unicode is a versioned standard and regularly adds characters. + /// Scalars which are unassigned in this version of Unicode + /// may be meaningful to applications using a later version of the standard. + /// + @available(SwiftStdlib 9999, *) + public var isUnassigned: Bool { + + // Accurate for Unicode 14.0 and later. + + if _fastPath(_value < 0x1_0000) { + + // BMP. + + // Hoist these checks so the compiler is more likely + // to SIMD the simpler range checks in the 'switch'. + // + // - Testing U+03A2 allows almost all the Greek block to be fast-pathed. + // - U+2065 is in the General Punctuation block. + // - U+3097, U+3098 are in the Hiragana block. + + guard + _value != 0x03A2, + _value != 0x2065, + _value != 0x3097, _value != 0x3098 + else { + return self.properties.age == nil + } + + switch _value { + // Basic Latin, Latin-1 Supplement, Latin Extended-A, Latin Extended-B, + // IPA Extensions, Spacing Modifier Letters, Combining Diacritical Marks, + // some Greek and Coptic. + case 0x0000...0x0377: + return false + // some Greek and Coptic, Cyrillic, Cyrillic Supplement. + case 0x038E...0x052F /* except U+03A2 */: + return false + // Arabic. + case 0x0600...0x06FF: + return false + // some Arabic Extended-B, Arabic Extended-A, Devanagari, some Bengali. + case 0x0898...0x0983: + return false + // some Georgian, Hangul Jamo, some Ethiopic. + case 0x10D0...0x1248: + return false + // General Punctuation. + case 0x2000...0x206F /* except U+2065 */: + return false + // Hiragana, Katakana. + case 0x3041...0x30FF /* except U+3097, U+3098 */: + return false + // some Enclosed CJK Letters and Months, CJK Compatibility, + // CJK Unified Ideographs Extension A, Yijing Hexagram Symbols, + // CJK Unified Ideographs, some Yi Syllables. + case 0x3220...0xA48C: + return false + // Hangul Syllables. + case 0xAC00...0xD7A3: + return false + // TODO: Variation selectors? Other common marks? + default: + return self.properties.age == nil + } + } + + switch _value { + // Miscellaneous Symbols and Pictographs, Emoticons, + // Ornamental Dingbats, some Transport and Map Symbols. + case 0x1F300...0x1F6D7: + return false + // Supplemental Symbols and Pictographs. + case 0x1F900...0x1F9FF: + return false + // Symbols and Pictographs Extended-A is filling up. + // Will probably be entirely assigned soon. + // https://en.wikipedia.org/wiki/Symbols_and_Pictographs_Extended-A + default: + return self.properties.age == nil + } + } +} diff --git a/stdlib/public/core/UnicodeScalarProperties.swift b/stdlib/public/core/UnicodeScalarProperties.swift index 1afa16c685de3..fe0e575cee525 100644 --- a/stdlib/public/core/UnicodeScalarProperties.swift +++ b/stdlib/public/core/UnicodeScalarProperties.swift @@ -1281,6 +1281,8 @@ extension Unicode.Scalar.Properties { } } +// Normalization Properties. + extension Unicode { /// The classification of a scalar used in the Canonical Ordering Algorithm @@ -1427,10 +1429,69 @@ extension Unicode.Scalar.Properties { /// This property corresponds to the "Canonical_Combining_Class" property in /// the [Unicode Standard](http://www.unicode.org/versions/latest/). public var canonicalCombiningClass: Unicode.CanonicalCombiningClass { - Unicode._NormData(_scalar, fastUpperbound: 0x300).canonicalCombiningClass + Unicode._CanonicalNormData(onlyCCCAndNFCQC: _scalar).canonicalCombiningClass + } +} + +extension Unicode { + + @frozen + public enum QuickCheckResult: Equatable, Hashable, Sendable { + case yes + case no + case maybe + } +} + +extension Unicode.Scalar.Properties { + + /// The value of the scalar's NFD\_QuickCheck property. + /// + /// This property reflects whether the scalar may appear + /// in NFD-normalized content. + /// + public var isNFD_QC: Bool { + Unicode._CanonicalNormData(_scalar).isNFDQC + } + + /// The value of the scalar's NFC\_QuickCheck property. + /// + /// This property reflects whether the scalar may appear + /// in NFC-normalized content. + /// + public var isNFC_QC: Unicode.QuickCheckResult { + switch Unicode._CanonicalNormData(onlyCCCAndNFCQC: _scalar).isNFCQC_Tristate { + case .yes: return .yes + case .no: return .no + default: return .maybe + } + } + + /// The value of the scalar's NFKD\_QuickCheck property. + /// + /// This property reflects whether the scalar may appear + /// in NFKD-normalized content. + /// + public var isNFKD_QC: Bool { + Unicode._CompatibilityNormData(_scalar).isNFKDQC + } + + /// The value of the scalar's NFKC\_QuickCheck property. + /// + /// This property reflects whether the scalar may appear + /// in NFKC-normalized content. + /// + public var isNFKC_QC: Unicode.QuickCheckResult { + switch Unicode._CompatibilityNormData(_scalar).isNFKCQC { + case .yes: return .yes + case .no: return .no + default: return .maybe + } } } +// Numeric properties of scalars. + extension Unicode { /// The numeric type of a scalar. @@ -1490,7 +1551,6 @@ extension Unicode { } } -/// Numeric properties of scalars. extension Unicode.Scalar.Properties { /// The numeric type of the scalar. diff --git a/stdlib/public/stubs/Unicode/Apple/NormalizationData.h b/stdlib/public/stubs/Unicode/Apple/NormalizationData.h index 9389595822e2c..0d5cfee6efec1 100644 --- a/stdlib/public/stubs/Unicode/Apple/NormalizationData.h +++ b/stdlib/public/stubs/Unicode/Apple/NormalizationData.h @@ -19,11 +19,12 @@ #include "swift/shims/SwiftStdint.h" static const __swift_uint16_t _swift_stdlib_normData_data[66] = { - 0x1, 0x3, 0x4, 0x8, 0xC, 0x30, 0x38, 0x3C, 0x44, 0x48, 0x4C, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, - 0x80, 0x88, 0x90, 0x98, 0xA0, 0xA8, 0xB0, 0xB8, 0xC0, 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xF0, 0xF8, - 0x100, 0x108, 0x110, 0x118, 0x120, 0x2A0, 0x2DC, 0x338, 0x358, 0x3B0, 0x3D0, 0x408, 0x410, 0x420, - 0x650, 0x654, 0x6B0, 0x6C0, 0x6C4, 0x6D0, 0x6E0, 0x6E4, 0x6F0, 0x700, 0x710, 0x720, 0x730, 0x733, - 0x734, 0x740, 0x748, 0x750, 0x784, + 0x1, 0x3, 0x4, 0x100, 0x104, 0x600, 0x700, 0x704, 0x804, 0x900, 0x904, 0xA00, 0xB00, 0xC00, 0xD00, + 0xE00, 0xF00, 0x1000, 0x1100, 0x1200, 0x1300, 0x1400, 0x1500, 0x1600, 0x1700, 0x1800, 0x1900, + 0x1A00, 0x1B00, 0x1C00, 0x1D00, 0x1E00, 0x1F00, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x5400, + 0x5B04, 0x6700, 0x6B00, 0x7600, 0x7A00, 0x8100, 0x8200, 0x8400, 0xCA00, 0xCA04, 0xD600, 0xD800, + 0xD804, 0xDA00, 0xDC00, 0xDC04, 0xDE00, 0xE000, 0xE200, 0xE400, 0xE600, 0xE603, 0xE604, 0xE800, + 0xE900, 0xEA00, 0xF004, }; static const __swift_uint8_t _swift_stdlib_normData_data_indices[3051] = { @@ -1617,4 +1618,1649 @@ static const __swift_uint32_t * const _swift_stdlib_nfc_comp_indices[63] = { _swift_stdlib_nfc_comp60, _swift_stdlib_nfc_comp61, _swift_stdlib_nfc_comp62, }; +static const __swift_uint16_t _swift_stdlib_normData_compat_data[66] = { + 0x1, 0x3, 0x4, 0x100, 0x104, 0x600, 0x700, 0x704, 0x804, 0x900, 0x904, 0xA00, 0xB00, 0xC00, 0xD00, + 0xE00, 0xF00, 0x1000, 0x1100, 0x1200, 0x1300, 0x1400, 0x1500, 0x1600, 0x1700, 0x1800, 0x1900, + 0x1A00, 0x1B00, 0x1C00, 0x1D00, 0x1E00, 0x1F00, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x5400, + 0x5B04, 0x6700, 0x6B00, 0x7600, 0x7A00, 0x8100, 0x8200, 0x8400, 0xCA00, 0xCA04, 0xD600, 0xD800, + 0xD804, 0xDA00, 0xDC00, 0xDC04, 0xDE00, 0xE000, 0xE200, 0xE400, 0xE600, 0xE603, 0xE604, 0xE800, + 0xE900, 0xEA00, 0xF004, +}; + +static const __swift_uint8_t _swift_stdlib_normData_compat_data_indices[6847] = { + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3B, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3B, 0x3B, 0x3D, + 0x3B, 0x3D, 0x3B, 0x3D, 0x3D, 0x3E, 0x35, 0x35, 0x35, 0x35, 0x3E, 0x33, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x2F, 0x2F, 0x36, 0x36, 0x36, 0x36, 0x30, 0x30, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x35, + 0x36, 0x36, 0x35, 0x35, 0x3, 0x3, 0x3, 0x3, 0x4, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3C, + 0x3C, 0x3D, 0x3C, 0x3C, 0x41, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3E, 0x35, 0x35, 0x3B, 0x3F, 0x40, 0x40, 0x3F, 0x40, 0x40, + 0x3F, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x35, + 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x37, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x37, 0x3A, 0x3B, 0xB, 0xC, 0xD, + 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x3B, 0x35, + 0x13, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1F, 0x20, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x3D, 0x3D, 0x36, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x24, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x25, + 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x35, 0x35, 0x3B, 0x35, 0x3B, + 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x35, 0x35, + 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, + 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x1C, 0x1D, 0x1E, 0x3B, 0x3B, 0x3B, + 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x7, 0x9, 0x3B, 0x35, + 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x6, 0x2, 0x0, 0x0, 0x9, 0x2, 0x1, 0x1, 0x1, + 0x3B, 0x1, 0x1, 0x6, 0x9, 0x1, 0x1, 0x1, 0x1, 0x6, 0x9, 0x6, 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0x2, + 0x1, 0x1, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0x6, 0x0, 0x9, 0x26, 0x27, 0x6, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x2, 0x2, 0x9, 0x9, 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0xA, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x1, 0x28, 0x28, 0x9, 0x29, 0x29, 0x29, 0x29, 0x1, 0x2A, 0x2A, 0x9, 0x2B, 0x2B, 0x2B, 0x2B, + 0x1, 0x1, 0x1, 0x35, 0x35, 0x35, 0x35, 0x32, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2C, 0x2D, 0x1, 0x2E, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x1, 0x3B, 0x3B, 0x9, 0x3B, 0x3B, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x35, 0x0, 0x2, 0x6, 0x9, 0x9, 0x35, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x9, 0x9, 0x3B, 0x3A, 0x37, 0x3B, 0x35, 0x3B, 0x35, + 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x6, 0x9, 0x9, + 0x6, 0x3B, 0x3B, 0x3B, 0x3, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, + 0x3B, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x35, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x35, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x40, 0x31, 0x35, 0x2F, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3E, 0x3A, 0x3A, 0x35, 0x34, 0x3B, 0x3F, 0x35, 0x3B, 0x35, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3, 0x3, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3, 0x3, 0x3, 0x3B, 0x3B, 0x3B, 0x3, 0x3, 0x3B, 0x35, 0x3B, 0x3, 0x3, 0x35, + 0x35, 0x35, 0x35, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x3B, 0x3B, 0x3B, 0x1, 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x34, 0x3A, 0x3E, 0x37, + 0x38, 0x38, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x8, 0x1, 0x1, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x9, 0x9, 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x9, 0x6, 0x9, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x35, + 0x3B, 0x3B, 0x3, 0x35, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x9, + 0x9, 0x9, 0x0, 0x0, 0x0, 0x9, 0x7, 0x3B, 0x3B, 0x3B, 0x2, 0x0, 0x0, 0x9, 0x9, 0x6, 0x9, 0x6, 0x9, + 0x6, 0x6, 0x9, 0x6, 0x6, 0x2, 0x0, 0x0, 0x9, 0x2, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x6, 0x3B, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0, 0x9, 0x6, 0x2, 0x0, 0x0, + 0x9, 0x6, 0x9, 0x9, 0x6, 0x9, 0x9, 0x6, 0x2, 0x0, 0x9, 0x9, 0x6, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6, + 0x9, 0x9, 0x9, 0x9, 0x9, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x5, + 0x5, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x32, 0x32, 0x3, 0x3, 0x3, 0x39, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, + 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3E, 0x3E, 0x35, 0x3B, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +}; + +static const __swift_uint16_t _swift_stdlib_normData_compat_ranks[517] = { + 0x0, 0x2A, 0x2A, 0x30, 0x40, 0x4D, 0x4F, 0x57, 0x62, 0x62, 0x62, 0x62, 0x0, 0x0, 0x0, 0xE, 0x43, + 0x0, 0x36, 0x62, 0x72, 0xAD, 0x0, 0xE, 0xE, 0x1D, 0x42, 0x0, 0x3F, 0x53, 0x60, 0x6E, 0x0, 0x9, + 0xE, 0x30, 0x30, 0x0, 0x1, 0x34, 0x34, 0x49, 0x0, 0x5, 0x10, 0x1C, 0x37, 0x0, 0x0, 0x5, 0x1F, + 0x22, 0x0, 0x8, 0x3D, 0x41, 0x4E, 0x0, 0x5, 0xA, 0xE, 0x12, 0x0, 0x2, 0x2, 0xC, 0xD, 0x0, 0x6, + 0x6, 0xB, 0xB, 0x0, 0x9, 0xC, 0x11, 0x11, 0x0, 0x5, 0xD, 0xD, 0x15, 0x0, 0x3, 0xB, 0x22, 0x27, + 0x0, 0x2, 0x5, 0x6, 0x6, 0x0, 0x0, 0x15, 0x2D, 0x30, 0x0, 0x3, 0x3, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x2, 0x2, 0x2, 0x0, 0x1, 0x1, 0x1, 0x4, 0x0, 0x0, 0x0, 0x2, 0xC, 0x0, 0x1E, 0x23, + 0x2C, 0x35, 0x0, 0x2, 0x5, 0x6, 0x6, 0x0, 0x18, 0x1E, 0x57, 0x6D, 0x0, 0x40, 0x80, 0xC0, 0xFC, + 0x0, 0x3A, 0x72, 0xAC, 0xEA, 0x0, 0x29, 0x38, 0x62, 0x70, 0x0, 0x25, 0x59, 0x6D, 0x70, 0x0, 0x9, + 0x18, 0x22, 0x2A, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0x0, 0x40, 0x80, 0x8B, 0x0, 0x0, 0x0, 0x1, 0x1, + 0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, 0x3, 0x5, 0x0, 0x10, 0x20, 0x20, + 0x21, 0x0, 0x1, 0x41, 0x81, 0xC1, 0x0, 0x7, 0x13, 0x2A, 0x40, 0x0, 0x7, 0x36, 0x73, 0x73, 0x0, + 0x2F, 0x67, 0xA6, 0xE6, 0x0, 0x40, 0x80, 0xC0, 0x100, 0x0, 0x0, 0x0, 0xB, 0xF, 0x0, 0x2, 0x2, 0x3, + 0x3, 0x0, 0x6, 0x7, 0x7, 0x8, 0x0, 0x5, 0x6, 0x6, 0x8, 0x0, 0x0, 0x0, 0x8, 0xA, 0x0, 0x0, 0x5, + 0x5, 0x6, 0x0, 0x0, 0x20, 0x60, 0xA0, 0x0, 0x40, 0x74, 0xB2, 0xF2, 0x0, 0x1A, 0x46, 0x84, 0xB6, + 0x0, 0x3D, 0x7D, 0xBD, 0xFD, 0x0, 0x40, 0x6E, 0xAC, 0xD4, 0x0, 0x27, 0x5F, 0x9D, 0xDD, 0x0, 0x3F, + 0x7F, 0xBE, 0xE1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x5, 0x5, 0x5, 0x5, 0x0, + 0x38, 0x38, 0x38, 0x38, 0x0, 0x0, 0x2, 0x6, 0x6, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0x0, 0x4, 0x4, 0x4, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x3, 0xE, 0x12, 0x12, 0x0, 0x0, 0x3, 0x8, 0x8, 0x0, 0x5, 0x6, 0x8, + 0x8, 0x0, 0x2, 0x2, 0x2, 0x4, 0x0, 0xE, 0x13, 0x13, 0x13, 0x0, 0x3, 0x9, 0xB, 0xB, 0x0, 0x0, 0x5, + 0x5, 0x6, 0x0, 0x0, 0x2, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x4, 0x5, 0x0, 0x0, + 0x1, 0x3, 0x3, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x3, 0x4, 0x0, 0x0, 0x2, 0x2, 0x2, 0x0, + 0x0, 0x0, 0x5, 0xC, 0x0, 0x0, 0x2, 0x2, 0x2, 0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1F, 0x29, 0x29, 0x2C, 0x0, 0x0, 0x0, 0x40, 0x7F, 0x0, 0x35, 0x72, 0xAA, 0xE9, 0x0, 0x40, + 0x80, 0xC0, 0x100, 0x0, 0x40, 0x80, 0xC0, 0x100, 0x0, 0x3E, 0x3E, 0x3E, 0x3E, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x0, 0x2E, 0x2F, 0x2F, 0x36, 0x0, 0x0, 0x1, 0x5, 0x5, 0x0, 0x0, 0x4, 0x4, 0x4, 0x0, 0x7, + 0x7, 0xE, 0xE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2B, 0x59, 0x7E, 0x7E, 0x0, 0x0, 0x0, 0x0, 0x2A, + 0x0, 0x13, 0x14, 0x14, 0x43, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0xA, 0xA, 0xA, 0xA, 0x0, 0x0, 0x30, + 0x70, 0xB0, 0x0, 0x40, 0x80, 0xC0, 0x100, 0x0, 0x40, 0x4E, 0x4E, 0x4E, +}; + +static const __swift_uint64_t _swift_stdlib_normData_compat[518] = { + 0xC, 0x1FF87FFE5FFFF, 0x0, 0x3F0000000, 0xED1DFC0000000000, 0x5BFF, 0x4200000, 0x1F60000400000000, + 0x403B1158, 0x0, 0x0, 0x0, 0x3800, 0x0, 0x0, 0x773C850100000000, 0xBE7EFFBF3E7EFFBF, 0xFFFF, + 0xF3F9FEFDFF3FFFFC, 0xFFFFFF3FFFF3, 0xFFF0000180030000, 0xFFFFFF3FFFCFDFFF, 0x53CFFF, 0xFFFC0, + 0x0, 0x3F00000001FF0000, 0xFFFFFFFF0000001F, 0x10EFFFF, 0xFFFFFFFF7FFFFFFF, 0xFC000001D7F04410, + 0x7F7C000001, 0x200708B0237, 0x1600200, 0xC00000708B0000, 0xF8, 0x33FFCFCFCCF0006, 0x0, 0x1CF0000, + 0x80000000000000, 0xB6BFFFFFFFFFFE, 0x0, 0xF8000000007C07FF, 0x1FFFFFF, 0x1E10000, + 0x9FC8000500000000, 0x2000000003D9F, 0x7FFFFFF0000, 0x2580000, 0x0, 0xF800000000000000, + 0x3EEFFBC00000200F, 0xE0000000000, 0x28F0000, 0xFF000000, 0xFFFFFFFBFFFFFC00, 0x1012020000000000, + 0xFF1E2000, 0x2B10000, 0x3800500000000000, 0x40000000B080, 0x2000104800000000, 0x4E00, 0x2FF0000, + 0x200010000000, 0x0, 0x30C0390050000000, 0x10000000000000, 0x3110000, 0x803C004000, 0x0, + 0x6021001000, 0x0, 0x31E1000, 0x602D85, 0x5800000000000000, 0x803C00, 0x0, 0x32A8400, 0xF400, + 0xF00070800000000, 0x0, 0xF00070800000000, 0x33D3000, 0x300100000000000, 0x1084200802A00000, + 0x200800DF3FFE0200, 0x4002001084, 0x3540000, 0x4040000000000000, 0x680, 0x20000000, 0x0, + 0x37B1000, 0x0, 0x3FFFFE00000000, 0xFFFFFF0000000000, 0x7, 0x3820000, 0xE000000000000000, 0x0, + 0x0, 0x0, 0x3B20000, 0x0, 0x0, 0x0, 0x1000000030, 0x3B50000, 0x0, 0x2004000000000000, 0x0, 0x0, + 0x3B80000, 0x200000000000000, 0x0, 0x0, 0xE00, 0x3BA0000, 0x0, 0x0, 0x1800000, 0x9FE0000100000000, + 0x3BE0000, 0x7FFFBFFF00000000, 0x5540000000000000, 0x1B283000000004, 0xFF8000000, 0x3CA0000, + 0xC00, 0xC0040, 0x800000, 0x0, 0x3FF0000, 0x21FDFFF700000000, 0x7000000000000310, + 0x7FFFFFFBFFFF7FF, 0xFFFFF80000000100, 0x405FFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF0FFFFFFF, 0x482FFFF, 0xFFFF03FFFFFFFFFF, 0x3F3FFFFFFFFF3F3F, + 0xFFFF3FFFFFFFAAFF, 0xFFDFFFDFFFFFFFFF, 0x58EEFCF, 0x8207FF7FDCFFFF, 0x8080038050D88070, + 0x1FFF7FFFFFF30000, 0x1FFF000000000100, 0x685FFE2, 0xBD573E6FFEEF0001, 0xFFFFFFFF03E1FBFB, + 0x40000C000200FFFF, 0xE0000000, 0x7010000, 0x1B05000001210, 0x333E00500000292, 0xF00000000333, + 0x3C0F00000000, 0x7710000, 0x6000000, 0x0, 0x0, 0x0, 0x79B0000, 0x0, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0x7FF, 0x79D0000, 0x0, 0x0, 0x10000000, 0x0, 0x8280070, 0x0, 0x10000000, 0x0, + 0x0, 0x82C0000, 0x0, 0x0, 0x0, 0x300000000000, 0x82D0000, 0x0, 0x38000, 0x0, 0x80008000, + 0x82F0000, 0xFFFF000000000000, 0xFFFF, 0x0, 0x800000000000, 0x8340000, 0x8000000000000, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x855FFFF, 0x100000000003F, + 0x50000740FC000000, 0x36DB02A55555, 0x2A555555000DE10, 0x92636DB, 0xC7900000, 0xFFFFFFFFFFFE0000, + 0xFFFC7FFFFFFFFFFF, 0x0, 0x9700000, 0xFFFF7FFFFFFF0000, 0xFFFFFFFF00FFFFFF, 0xFFFFFFFFFFFF7FFF, + 0xFFFFFFFFFFFFFFFF, 0x9E3FFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xAD90000, 0x0, 0x0, 0x3FF0800000000000, 0xF0000000, 0xBD90000, 0x300000000, + 0x0, 0x100000000, 0x0, 0xBE80000, 0x40031C0000, 0x1000, 0x0, 0x1000000000, 0xBEBFFFF, + 0x3800000000000003, 0x800000000, 0x0, 0x10008, 0xC030000, 0x0, 0x0, 0xC19D000000000000, + 0x40000000000002, 0xC0B0000, 0x0, 0x200F000, 0x0, 0x20000000, 0xC150000, 0x0, 0xFFFFFFFF00000000, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xC1BFFFF, 0xFFFFFFFFFFFFFFFF, 0xFC657FE53FFFFFFF, + 0x3FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xCCBFFFF, 0x3FFFFFF, 0x5F7FFFFFE0F8007F, + 0xFFFFFFFFFFFFFFDB, 0x3FFFFFFFFFFFF, 0xDCD0000, 0xFFFFFFFFFFFFFFF8, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xE83FFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFF00003FFFFFFF, + 0xFFFCFFFFFFFFFFFF, 0xFFFFFFFFFF, 0xF900000, 0xFFFF03FF00001FFF, 0xF7FFFF7FF9FFFFF, + 0xFFFFFFFFFFFFFFD7, 0xFFFFFFFFFFFFFFFF, 0x10641FFF, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFFF, 0x7F7F1CFCFCFC, 0x114E0000, 0x0, 0x0, 0x0, 0x20000000, 0x122F0000, 0x0, 0x0, + 0x1000000000000, 0x0, 0x12300000, 0x7C0000000000000, 0x0, 0x0, 0x0, 0x12310000, 0x7FDFFFFFFFFFFBE, + 0x0, 0x0, 0x0, 0x12360000, 0x0, 0xA00000000000, 0x87000000, 0x0, 0x126E0000, 0x60000000000000, + 0x0, 0x0, 0x0, 0x12740000, 0x0, 0xF00000, 0x0, 0x0, 0x12760000, 0x0, 0x0, 0x0, 0x1800, 0x127A0000, + 0xE000, 0x1FFC00000, 0x3C0000, 0x0, 0x127C0000, 0x0, 0x8001000000000040, 0x600080014000000, 0x0, + 0x128E0007, 0x18C0800000, 0x800000000, 0x401000000000000, 0x0, 0x12990000, 0x600000, 0x0, 0x0, + 0x600, 0x12A10000, 0x1FC0008038005800, 0x1F, 0x0, 0x0, 0x12A50000, 0x40000044, 0x7C01000000000000, + 0xC, 0x0, 0x12B80000, 0x0, 0x18C0080000000, 0x0, 0x800000000000, 0x12C30000, 0x0, 0xC00000, 0x0, + 0x800, 0x12C90000, 0x0, 0x0, 0x0, 0x600, 0x12CC0000, 0x0, 0x0, 0x6101000000000000, 0x8, + 0x12CE0000, 0x0, 0x10000, 0x80001000000000, 0x0, 0x12D30200, 0x0, 0x0, 0x8000, 0x0, 0x12D70000, + 0x0, 0x0, 0x34, 0x800000, 0x12D80000, 0x0, 0x600000000, 0x0, 0x0, 0x12DC0000, 0x0, 0x0, + 0x1F00000000, 0x7F00000000, 0x12DE0000, 0x0, 0x30000, 0x0, 0x0, 0x12EA0000, 0x0, + 0x4000000000000000, 0x0, 0x0, 0x12EC0000, 0x0, 0x0, 0x0, 0x0, 0x12EDC000, 0xFE7F807E3FF, + 0x1F8003C00, 0x0, 0x1C00000000, 0x12EF0000, 0x0, 0x0, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFDFFFFF, + 0x131BFFFF, 0xFFEFEBFFDE64DFFF, 0xE7BFFFFFFFFFFFFF, 0xFC5F7BFFFFFFDFDF, 0xFFFFFFFFFFFFFFFD, + 0x13AAFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0x14A3FF3F, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0x15B1FFFF, 0xFFFFFFFFFFFFCFFF, 0x0, 0x0, 0x0, 0x16C10000, 0x0, 0x0, 0x0, 0x7DBF9FFFF7F0000, + 0x16FFFFFF, 0x3FFFFFFFFFFF, 0x8000, 0x0, 0x7F000000000000, 0x17350000, 0x0, 0x4000, 0xF000, 0x0, + 0x176B0000, 0x0, 0xF00000000000, 0x0, 0x0, 0x17700000, 0x7F0000, 0x0, 0x7F0, 0x0, 0x17740000, 0x0, + 0x0, 0x0, 0x0, 0x1782FFEF, 0xEA840AF7FE96FFFF, 0xFBFF5EF7F796AA96, 0xFFFFBEE0FFF, 0x0, 0x17910000, + 0x0, 0x0, 0x0, 0x7FFFFFFF07FF0000, 0x180FFFFF, 0x1C000000FFFF, 0x10000, 0x0, 0xFFFFFFFFFFF0007, + 0x184901FF, 0x3, 0x0, 0x0, 0x0, 0x18950000, 0x3FF0000, 0x0, 0x0, 0x0, 0x18970000, 0x0, + 0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x18A1FFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x1961FFFF, 0xFFFFFFFFFFFFFFFF, + 0x3FFF, 0x0, 0x0, 0x1A710000, +}; + +#define NFKD_DECOMP_LEVEL_COUNT 13 + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_sizes[13] = { + 0xEE4, 0x95B, 0x5EF, 0x3CA, 0x245, 0x17E, 0x100, 0xA3, 0x5B, 0x40, 0x40, 0x40, 0x40, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys0[60] = { + 0x901220BD0BE04418, 0xB0188E290D880A4, 0xC12942408692380B, 0xA0C04914D8B447F2, 0x5C4F65A40420A830, + 0x481B468CAB702398, 0x1044931C7A228942, 0x6030013512085230, 0xA4889404B17C0100, + 0x2E46B91B72D5AAF4, 0xC629102B50E6FC29, 0x3C442A6402D314FA, 0x2CC45214DC3802BC, + 0x89468520D3C0A459, 0x8DEC8B081E2E2328, 0x468833B846919852, 0x24B9016212840488, + 0x8C232454529C2803, 0x8954927514A01615, 0x727A34B6E404042, 0x8620132CACD1A1A, 0x319022448681C181, + 0xF8272CD02FA08D82, 0xC84E7041A19951E6, 0x483A0B040A69D3A1, 0xD0C6B588648BAB48, 0x8537D43A0CC720, + 0x7E8BA4A602875947, 0x76C944E480231AD6, 0x12913630D2022644, 0x8EA6716400724406, + 0xA082A08AE14D90E2, 0x126A25000188D0E, 0xE687C5E2845AC804, 0xC4DA014108A8F8ED, 0x444BC80348BB275B, + 0x440101934F804880, 0x4009A400749CD8A0, 0x41E014830850D17E, 0x30E1CE408D618208, + 0x46B7BF58CCB71770, 0x80D0347E04909A81, 0x6650418E82860490, 0x884106045B0C0ED2, + 0x544CCF2882041408, 0xA0F70940A182E9B9, 0x604750318718294, 0x28A26C89003A2D39, 0x16424038D84C5181, + 0x3D9156E45D447326, 0xE1404463B1BAFA11, 0x42BC4183886A2220, 0x22718B00D4781423, + 0xB034AB7364E04413, 0x80E66916A0426041, 0x43641912874810BA, 0x888B017A26B19A58, 0xF60285833AC8A20, + 0x85180405A8A8100C, 0x151D3AA48, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys1[38] = { + 0x8133611C14003EC, 0x2A192E2298BC42E9, 0x3C241A1220995042, 0x20816B04B5A00465, 0x402C006864834BB2, + 0x60640E19CB589582, 0xE09C8BD876286C51, 0x5C3D820449614201, 0x1580B94452964420, + 0x73CC22481C205B98, 0xA003A10010063B84, 0x100A9424002970E2, 0x491E412E263361CC, + 0x81C91A3A701923D0, 0x832422CB89AF1A2A, 0x14B608101A00A1CD, 0xC3EC51EA0B0602DF, + 0x774241180DD40360, 0x18664CA655A13A28, 0xA00CA2EF6C00D70B, 0x221295235011731, 0xCDC65B22501A229D, + 0x1C208A5113235114, 0xA9C28F06629C62B1, 0x2698831608403040, 0xA09E1841289908E2, + 0x1F8E5E927881C1D0, 0x70004CC0560017, 0xE086081006018, 0x98A541626466085D, 0xA920040486B8CC64, + 0x6110640150471105, 0xCFE2F640B100E20A, 0xC2A520E78DB4728, 0xE460E987E1509A19, 0xC30F0903095D97C9, + 0xC10CCDC41AE4981, 0x28BBD88, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys2[24] = { + 0xB7018FA119031900, 0xD990488412E2BE22, 0xB8010BA8ACC27849, 0xDC56825527698C10, + 0x16964A841E8901D0, 0xA28CB01F0B2E0345, 0x562042CCD18C1C0D, 0x49401B9835469A58, + 0x4884A8804041A428, 0x4929C8665819A078, 0x26446C1C126A3848, 0x4056014890010395, + 0x2D007902A6804C88, 0xE170140A1005B2AA, 0xB5C6E19064161488, 0x434E434C24282046, 0x425454063C81034, + 0xC14004CA842CB23A, 0x88B3A0F07664A111, 0x2446597514193A81, 0xE98432840C924A38, 0x8AC0B169C47BA24, + 0x16738449411A538C, 0x1C7CA09A050, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys3[16] = { + 0x323323721BC053E, 0x18044D502E8B30A6, 0xA1D5F0A8100B03B5, 0x94DB307E38F20B09, 0x1D8248575DC67C56, + 0x33801BE54E04AA40, 0x953632597406272, 0x20A320ABEBB8141, 0xDF4604C05A285AD6, 0x3F84008A27E25784, + 0xA285119C0B14B910, 0x9018B98602F18875, 0x8258625A41D81A09, 0x741B63046151C6A8, + 0x62444B3B0CAC0890, 0xA6, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys4[10] = { + 0xB00AE67C9864A942, 0x360224413421201C, 0x1C8230022120154D, 0x58085298A8C12400, 0xE210C444E65D02, + 0xA01689110BD88, 0x510DCCC8AA33D62A, 0x82B6D4A39456C62B, 0xA13CA4A00A410086, 0x8, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys5[6] = { + 0x1528D382843E0B02, 0x1010833A256AB220, 0x410A9646060C320, 0xBD34198953086B83, 0xF0006402081002E, + 0x17AF381052018441, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys6[4] = { + 0x515014B089111486, 0x8430A006144488B1, 0x485280130C09EDCF, 0x17A9E5104A9A762B, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys7[3] = { + 0x18481DCB9311795, 0x5B305427C2716DB7, 0x24B180F19, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys8[2] = { + 0x78080C3711A1497D, 0xB4E44A, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys9[1] = { + 0x259F921E430F320D, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys10[1] = { + 0x891100C0029C3400, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys11[1] = { + 0x108441000100084, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys12[1] = { + 0x40080000000, +}; + +static const __swift_uint64_t * const _swift_stdlib_nfkd_decomp_keys[13] = { + _swift_stdlib_nfkd_decomp_keys0, _swift_stdlib_nfkd_decomp_keys1, _swift_stdlib_nfkd_decomp_keys2, + _swift_stdlib_nfkd_decomp_keys3, _swift_stdlib_nfkd_decomp_keys4, _swift_stdlib_nfkd_decomp_keys5, + _swift_stdlib_nfkd_decomp_keys6, _swift_stdlib_nfkd_decomp_keys7, _swift_stdlib_nfkd_decomp_keys8, + _swift_stdlib_nfkd_decomp_keys9, _swift_stdlib_nfkd_decomp_keys10, + _swift_stdlib_nfkd_decomp_keys11, _swift_stdlib_nfkd_decomp_keys12, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks0[8] = { + 0x0, 0xB0, 0x180, 0x239, 0x301, 0x3B6, 0x475, 0x538, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks1[5] = { + 0x589, 0x642, 0x6F6, 0x7C2, 0x862, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks2[3] = { + 0x8F5, 0x9BB, 0xA64, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks3[2] = { + 0xB1A, 0xBED, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks4[2] = { + 0xC9F, 0xD52, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks5[1] = { + 0xD66, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks6[1] = { + 0xDE4, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks7[1] = { + 0xE41, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks8[1] = { + 0xE89, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks9[1] = { + 0xEAE, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks10[1] = { + 0xECB, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks11[1] = { + 0xEDA, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks12[1] = { + 0xEE2, +}; + +static const __swift_uint16_t * const _swift_stdlib_nfkd_decomp_ranks[13] = { + _swift_stdlib_nfkd_decomp_ranks0, _swift_stdlib_nfkd_decomp_ranks1, + _swift_stdlib_nfkd_decomp_ranks2, _swift_stdlib_nfkd_decomp_ranks3, + _swift_stdlib_nfkd_decomp_ranks4, _swift_stdlib_nfkd_decomp_ranks5, + _swift_stdlib_nfkd_decomp_ranks6, _swift_stdlib_nfkd_decomp_ranks7, + _swift_stdlib_nfkd_decomp_ranks8, _swift_stdlib_nfkd_decomp_ranks9, + _swift_stdlib_nfkd_decomp_ranks10, _swift_stdlib_nfkd_decomp_ranks11, + _swift_stdlib_nfkd_decomp_ranks12, +}; + +static const __swift_uint8_t _swift_stdlib_nfkd_decomp[8837] = { + 0x2, 0xC9, 0x91, 0x2, 0xD8, 0xAE, 0x2, 0xDB, 0x89, 0x3, 0xE8, 0xA7, 0xA3, 0x2, 0x33, 0x39, 0x2, + 0xDA, 0xB3, 0x1, 0x6C, 0x1, 0x4B, 0x3, 0xE5, 0xBC, 0x8B, 0x3, 0x6D, 0x6F, 0x6C, 0x6, 0xD9, 0x8A, + 0xD9, 0x94, 0xD9, 0x87, 0x6, 0xD9, 0x82, 0xD9, 0x85, 0xD8, 0xAD, 0x3, 0xE1, 0x85, 0xAF, 0x2, 0xD9, + 0x86, 0x2, 0xCE, 0x9A, 0x3, 0x73, 0xCC, 0x87, 0x3, 0xE3, 0x83, 0x9E, 0x2, 0xCE, 0xB3, 0x1, 0x4F, + 0x3, 0xE8, 0xB2, 0xA1, 0x2, 0xCE, 0xB2, 0x9, 0xE3, 0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, + 0x3, 0xE7, 0xA6, 0xBE, 0x3, 0xE9, 0xBE, 0x9F, 0x1, 0x4E, 0x1, 0x73, 0x4, 0xD9, 0x82, 0xD9, 0x89, + 0x3, 0xE6, 0x9C, 0xA8, 0x2, 0xDA, 0xA9, 0x3, 0xE7, 0xA4, 0xBA, 0x3, 0xE1, 0x84, 0x85, 0x2, 0x66, + 0x69, 0x1, 0x61, 0x1, 0x6B, 0x9, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80, 0x95, 0x1, 0x76, + 0x5, 0x32, 0x31, 0xE6, 0x97, 0xA5, 0x1, 0x4D, 0x1, 0x55, 0x2, 0xCA, 0xA5, 0x1, 0x64, 0x2, 0xD0, + 0xBD, 0x2, 0x50, 0x61, 0x1, 0x70, 0x3, 0x28, 0x45, 0x29, 0x2, 0xD8, 0xAC, 0x2, 0xCE, 0xB8, 0x1, + 0x2D, 0x2, 0xD8, 0xAD, 0x2, 0xC9, 0xA5, 0x3, 0xE6, 0xAD, 0xB9, 0x1, 0x51, 0x1, 0x6A, 0x4, 0xD9, + 0x85, 0xD9, 0x85, 0x3, 0xE7, 0x94, 0x9F, 0x1, 0x77, 0x12, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0x3, 0xE1, 0x85, 0xA7, + 0xC, 0xE3, 0x83, 0x9F, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x3, 0xE1, 0x85, + 0xB3, 0x3, 0xE3, 0x82, 0xB5, 0x1, 0x37, 0x3, 0xE5, 0x8F, 0xB3, 0x3, 0xE1, 0x84, 0x82, 0x6, 0xD8, + 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, 0x6, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0x20, 0xCC, 0x85, 0x1, + 0x67, 0x4, 0xD8, 0xAA, 0xD9, 0x8A, 0x3, 0x28, 0x79, 0x29, 0x3, 0xE7, 0x99, 0xBD, 0x1, 0x5A, 0x1, + 0x31, 0x2, 0xDA, 0xA4, 0x4, 0xD8, 0xB5, 0xD8, 0xAE, 0x4, 0xD8, 0xB9, 0xD9, 0x85, 0x1, 0x6D, 0x3, + 0xE6, 0xB0, 0xB4, 0x1, 0x79, 0x5, 0x31, 0x38, 0xE7, 0x82, 0xB9, 0x3, 0x28, 0x58, 0x29, 0x1, 0x62, + 0x3, 0xE1, 0x85, 0xA4, 0x4, 0xD9, 0x83, 0xD9, 0x85, 0x1, 0x47, 0x3, 0xCE, 0xBC, 0x6C, 0x2, 0xCF, + 0x84, 0x2, 0xCF, 0x80, 0x3, 0xE2, 0x82, 0xA9, 0x3, 0x58, 0x49, 0x49, 0x1, 0x44, 0x4, 0xD8, 0xAD, + 0xD8, 0xAC, 0x3, 0xE4, 0xB8, 0x80, 0x2, 0xDA, 0x88, 0x1, 0x3A, 0x2, 0xCF, 0x82, 0x3, 0xE9, 0xA6, + 0xAC, 0x3, 0x47, 0x48, 0x7A, 0x2, 0xD0, 0xB5, 0x3, 0xE5, 0x89, 0x8D, 0x3, 0xE1, 0x87, 0xB2, 0x3, + 0xE1, 0x84, 0x90, 0x4, 0x38, 0xE6, 0x97, 0xA5, 0x2, 0x4E, 0x6A, 0x5, 0x28, 0xE1, 0x84, 0x8B, 0x29, + 0x2, 0xCE, 0x98, 0x3, 0xE5, 0xA5, 0xB3, 0xC, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAD, + 0xE3, 0x83, 0xB3, 0x3, 0x28, 0x31, 0x29, 0x2, 0xCE, 0x9C, 0x2, 0x6C, 0x6E, 0x2, 0xCF, 0x87, 0x2, + 0xCA, 0x8B, 0x4, 0xD8, 0xAC, 0xD9, 0x89, 0x3, 0xE3, 0x82, 0xA6, 0xF, 0xE3, 0x82, 0xB5, 0xE3, 0x83, + 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x2, 0x57, 0x43, 0x1, 0x33, 0x1, 0x56, + 0x3, 0xE5, 0x8C, 0xB8, 0x1, 0x6F, 0x2, 0xD8, 0xB1, 0x1, 0x41, 0x6, 0xD8, 0xAA, 0xD8, 0xAD, 0xD8, + 0xAC, 0x1, 0x57, 0x3, 0xE5, 0x8A, 0xB4, 0x2, 0xCE, 0x99, 0x1, 0x66, 0x4, 0xD8, 0xB9, 0xD9, 0x89, + 0x1, 0x72, 0x2, 0xD9, 0x87, 0x6, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, 0xAC, 0x2, 0xC9, 0xA3, 0x6, 0xD9, + 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x2, 0xD8, 0xB5, 0x3, 0xE9, 0xBE, 0xA0, 0x2, 0xCE, 0xA3, 0x1, 0x59, + 0x3, 0xE3, 0x80, 0x82, 0x4, 0xD9, 0x84, 0xD8, 0xAD, 0x6, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x4, + 0xD9, 0x81, 0xD8, 0xAC, 0x2, 0xD8, 0xBA, 0x3, 0xE6, 0x9C, 0x88, 0x3, 0x28, 0x61, 0x29, 0x3, 0xE3, + 0x83, 0xAD, 0x1, 0x45, 0x4, 0xD8, 0xA8, 0xD8, 0xAE, 0x2, 0xCE, 0xA8, 0x1, 0x71, 0x2, 0xCE, 0x93, + 0x2, 0xCE, 0xBE, 0x4, 0xD8, 0xB7, 0xD9, 0x89, 0x2, 0xCF, 0x86, 0x9, 0xE3, 0x80, 0x94, 0xE6, 0x9C, + 0xAC, 0xE3, 0x80, 0x95, 0x3, 0xE8, 0x80, 0x92, 0x1, 0x74, 0x2, 0xC7, 0x81, 0x3, 0x20, 0xCC, 0x84, + 0x1, 0x52, 0xC, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4, 0x1, 0x46, + 0x2, 0xCA, 0x8A, 0x2, 0x31, 0x33, 0x1, 0x53, 0x3, 0xE3, 0x83, 0xB2, 0x6, 0xD8, 0xB9, 0xD9, 0x85, + 0xD9, 0x8A, 0x3, 0xE1, 0x84, 0x8F, 0x8, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29, 0x2, 0xC9, + 0x95, 0xC, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x6, 0xE3, + 0x83, 0xAC, 0xE3, 0x83, 0xA0, 0x5, 0x28, 0xE5, 0xAD, 0xA6, 0x29, 0x4, 0x37, 0xE7, 0x82, 0xB9, 0x2, + 0x6E, 0x6A, 0x3, 0xE1, 0x85, 0xB0, 0x4, 0xD8, 0xAB, 0xD9, 0x8A, 0x3, 0xE1, 0x85, 0x97, 0x4, 0xD8, + 0xB8, 0xD9, 0x85, 0x2, 0xCE, 0xB5, 0x2, 0xD8, 0xAB, 0x1, 0x4A, 0x1, 0x20, 0x1, 0x49, 0x3, 0xE7, + 0xA9, 0xBA, 0x1, 0x68, 0x2, 0xD3, 0x8F, 0x2, 0xCA, 0xA9, 0x4, 0x28, 0x31, 0x37, 0x29, 0x1, 0x75, + 0x5, 0x20, 0xCC, 0x94, 0xCD, 0x82, 0x3, 0xE2, 0xB1, 0xB1, 0x2, 0xD1, 0x87, 0x6, 0xD8, 0xB3, 0xD8, + 0xAE, 0xD9, 0x8A, 0x6, 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x3, 0xE3, 0x80, 0x95, 0x6, 0xE0, 0xBA, + 0xAB, 0xE0, 0xBA, 0xA1, 0x3, 0x63, 0x6D, 0x32, 0x3, 0xE7, 0x9B, 0xA3, 0x2, 0xCA, 0xA4, 0xC, 0xE3, + 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0x2, 0xCF, 0x88, 0x2, 0xCE, + 0xA0, 0x2, 0xDA, 0xBB, 0x3, 0xE1, 0x84, 0x9D, 0x2, 0xD9, 0xAF, 0x1, 0x50, 0x3, 0xE1, 0x84, 0x8D, + 0x6, 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x2, 0xD7, 0x93, 0x1, 0x30, 0x3, 0x20, 0xCC, 0x94, 0x5, + 0x28, 0xE4, 0xB9, 0x9D, 0x29, 0x1, 0x38, 0x3, 0xE8, 0xB5, 0xB0, 0x4, 0xD8, 0xB3, 0xD8, 0xAE, 0x3, + 0xE1, 0x87, 0x9D, 0x5, 0x28, 0xE1, 0x84, 0x8C, 0x29, 0xF, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x1, 0x7A, 0x2, 0xC9, 0xBE, 0x3, 0xE1, 0x84, + 0x87, 0x3, 0xE9, 0x9A, 0xB9, 0x3, 0xE3, 0x82, 0xA7, 0x2, 0xCF, 0x81, 0x6, 0xD9, 0x86, 0xD8, 0xAC, + 0xD9, 0x85, 0x4, 0xD8, 0xAA, 0xD9, 0x86, 0x3, 0xE2, 0x80, 0x93, 0x3, 0xE1, 0x86, 0xB1, 0x2, 0xCE, + 0xA6, 0x6, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x85, 0x2, 0xD9, 0x8A, 0x3, 0x31, 0x35, 0x2E, 0x3, 0xE8, + 0xA1, 0x80, 0x5, 0x31, 0x31, 0xE6, 0x9C, 0x88, 0x3, 0xE5, 0xB7, 0xA6, 0x4, 0xD8, 0xAA, 0xD8, 0xB2, + 0x1, 0x63, 0x5, 0x31, 0x35, 0xE7, 0x82, 0xB9, 0x3, 0xE1, 0x85, 0xB4, 0x2, 0xCE, 0x9F, 0x3, 0x4D, + 0x50, 0x61, 0x3, 0xE6, 0xAC, 0xA0, 0x1, 0x42, 0x4, 0xD8, 0xB5, 0xD9, 0x8A, 0x3, 0xE7, 0xBD, 0x91, + 0x2, 0xD0, 0xBB, 0x5, 0x28, 0xE1, 0x84, 0x90, 0x29, 0x2, 0xCE, 0x9D, 0x1, 0x54, 0x9, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x2, 0xCE, 0xA7, 0x3, 0xE5, 0x86, 0x99, 0x1, 0x5F, 0x6, + 0xD9, 0x82, 0xD9, 0x84, 0xDB, 0x92, 0x3, 0xE1, 0x85, 0xA2, 0x3, 0x20, 0xCC, 0x86, 0x6, 0xD9, 0x84, + 0xD8, 0xAC, 0xD8, 0xAC, 0x3, 0xE7, 0xAE, 0x8F, 0x3, 0xE7, 0x93, 0xA6, 0x2, 0x44, 0x5A, 0x3, 0xE5, + 0xB9, 0xB2, 0x3, 0xE2, 0x88, 0x82, 0x2, 0xD9, 0xBE, 0x2, 0xD8, 0xB8, 0x3, 0xE3, 0x83, 0x84, 0xC, + 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x2, 0xDA, 0x83, 0x1, + 0x58, 0x4, 0xD8, 0xB9, 0xD9, 0x8A, 0x1, 0x69, 0x2, 0x21, 0x21, 0x8, 0xD8, 0xA7, 0xD9, 0x83, 0xD8, + 0xA8, 0xD8, 0xB1, 0x1, 0x28, 0x2, 0xD9, 0xBB, 0x5, 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x3, 0xE4, 0xBA, + 0xBA, 0x6, 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAE, 0x2, 0xD8, 0xB4, 0x4, 0xD5, 0xB4, 0xD5, 0xB6, 0x2, + 0xCE, 0xBC, 0x3, 0xE5, 0x86, 0x82, 0x3, 0xE3, 0x83, 0xA2, 0xF, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x8B, + 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x5, 0x33, 0xE2, 0x81, 0x84, 0x34, 0x2, + 0xD8, 0xAA, 0x3, 0xE1, 0x86, 0x88, 0x3, 0xE3, 0x82, 0xAF, 0x4, 0xD9, 0x87, 0xD8, 0xAC, 0x1, 0x43, + 0x1, 0x78, 0x3, 0xE3, 0x83, 0xA9, 0x3, 0x6D, 0x69, 0x6C, 0x2, 0xCE, 0x9B, 0x3, 0xE6, 0x97, 0xA5, + 0x4, 0xD8, 0xBA, 0xD9, 0x85, 0x1, 0x3C, 0x6, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x5, 0x28, 0xE4, + 0xB8, 0x80, 0x29, 0x2, 0xDB, 0x81, 0x6, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x85, 0x4, 0xD9, 0x87, 0xD9, + 0x89, 0x6, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE1, 0x84, 0x83, 0x4, 0xD8, 0xB3, 0xD8, 0xB1, + 0x4, 0xD8, 0xB6, 0xD8, 0xAD, 0x2, 0x31, 0x30, 0x4, 0xD9, 0x8A, 0xD9, 0x94, 0x9, 0xE3, 0x80, 0x94, + 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x3, 0xE1, 0x85, 0xA0, 0x3, 0xE3, 0x83, 0xAB, 0x2, 0x6D, 0x6D, + 0x1, 0x35, 0x2, 0xCE, 0xA9, 0xC, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, + 0xB2, 0x2, 0xC8, 0xB7, 0x2, 0xC9, 0xAE, 0x5, 0x20, 0xCC, 0x94, 0xCC, 0x80, 0x3, 0xE2, 0xA6, 0x85, + 0x3, 0xE9, 0x85, 0x8D, 0x2, 0xC2, 0xA5, 0x2, 0x32, 0x31, 0x9, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAB, 0x2, 0xDB, 0x87, 0x2, 0xD9, 0x82, 0x2, 0xCE, 0x9E, 0x5, 0x33, 0x31, 0xE6, 0x97, + 0xA5, 0x4, 0xD9, 0x8A, 0xD9, 0x87, 0x1, 0x3B, 0x3, 0xE1, 0x84, 0x8E, 0x2, 0x53, 0x44, 0x2, 0x34, + 0x35, 0x3, 0xE1, 0x85, 0xAE, 0x4, 0xD9, 0x85, 0xD8, 0xAC, 0x3, 0xE9, 0x85, 0x89, 0x5, 0x28, 0xE5, + 0x91, 0xBC, 0x29, 0x2, 0xCE, 0x96, 0x6, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE6, 0x89, 0x8B, + 0x3, 0xE1, 0x85, 0x80, 0x2, 0xD9, 0x85, 0x2, 0x6D, 0x41, 0x2, 0xD8, 0xA1, 0x3, 0xE8, 0x88, 0x9B, + 0x1, 0x4C, 0x4, 0xD8, 0xA7, 0xD9, 0x94, 0x1, 0x5C, 0x4, 0x31, 0xE2, 0x81, 0x84, 0x4, 0xDB, 0x95, + 0xD9, 0x94, 0x4, 0xD8, 0xB4, 0xD8, 0xB1, 0x2, 0x32, 0x33, 0x2, 0xDA, 0xAD, 0x2, 0xD8, 0xB9, 0x3, + 0xE5, 0x8D, 0x81, 0x9, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x3, 0xEA, 0xAD, + 0xA6, 0x3, 0xE1, 0x86, 0xB0, 0x8, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x29, 0x2, 0xD0, 0xB1, + 0x2, 0xCE, 0x92, 0x6, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x2, 0xD8, 0xAF, 0x3, 0xE2, 0x88, 0x92, + 0x9, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x4, 0x28, 0x32, 0x30, 0x29, 0x2, 0xCE, + 0xBA, 0x2, 0xDB, 0x90, 0x3, 0xE3, 0x83, 0x8E, 0x4, 0xD9, 0x84, 0xD8, 0xA7, 0x5, 0x28, 0xE6, 0x9C, + 0x88, 0x29, 0x4, 0xD9, 0x82, 0xD8, 0xAD, 0x3, 0xE9, 0xBC, 0x93, 0x4, 0x34, 0xE7, 0x82, 0xB9, 0x3, + 0xEA, 0xAC, 0xB7, 0x2, 0xD8, 0xB3, 0x2, 0x43, 0x44, 0x3, 0xE1, 0x85, 0xA8, 0x4, 0xD8, 0xAB, 0xD9, + 0x85, 0x2, 0xCA, 0x81, 0x4, 0xD9, 0x83, 0xD9, 0x8A, 0x3, 0xE4, 0xBA, 0xA0, 0x3, 0xE7, 0x89, 0xB9, + 0x3, 0xE1, 0x84, 0x81, 0x1, 0x2B, 0x6, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, 0x2, 0xDA, 0x84, 0x4, + 0xD8, 0xB9, 0xD8, 0xAC, 0x2, 0xC9, 0xAD, 0x3, 0xE1, 0x84, 0x91, 0x3, 0xE7, 0xA4, 0xBE, 0x4, 0xD9, + 0x84, 0xD9, 0x8A, 0x9, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xB3, 0x3, 0xE4, 0xB8, + 0xA8, 0x4, 0xD8, 0xAE, 0xD9, 0x89, 0x3, 0xE8, 0x89, 0xAE, 0x6, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, + 0x3, 0xE9, 0x9F, 0xB3, 0x3, 0xE6, 0x97, 0xA0, 0x5, 0x20, 0xCC, 0x94, 0xCC, 0x81, 0x3, 0xE3, 0x82, + 0xAD, 0x3, 0x6D, 0x6D, 0x32, 0x2, 0xDA, 0xB1, 0x2, 0xC9, 0xA1, 0x3, 0xE8, 0xB1, 0xB8, 0x3, 0xE3, + 0x80, 0x91, 0x3, 0xE1, 0x84, 0x9A, 0x5, 0x28, 0xE5, 0x85, 0xAD, 0x29, 0x4, 0x31, 0xE7, 0x82, 0xB9, + 0x3, 0xE9, 0xBC, 0x8E, 0x4, 0xD9, 0x82, 0xD9, 0x8A, 0x6, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x85, 0x6, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x2, 0xD9, 0x88, 0x3, 0xE6, 0xB3, 0xA8, 0x2, 0x31, 0x34, 0x2, + 0xD8, 0xA8, 0x1, 0x7B, 0x6, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0xB3, 0x4, 0xD8, 0xA8, 0xD9, 0x87, 0x5, + 0x31, 0x32, 0xE6, 0x97, 0xA5, 0x3, 0xE5, 0xBD, 0xA1, 0x2, 0xCE, 0xB6, 0x3, 0x54, 0x45, 0x4C, 0x2, + 0xCE, 0xBF, 0x3, 0xE7, 0xA6, 0xB8, 0x1, 0x34, 0x2, 0xDA, 0x87, 0x3, 0xE9, 0xBC, 0xBB, 0x1, 0x36, + 0x2, 0xD8, 0xB0, 0x3, 0xE5, 0xB7, 0xBE, 0x3, 0xE3, 0x83, 0xAC, 0x3, 0xE9, 0x9D, 0xA2, 0x2, 0xCA, + 0x80, 0x4, 0xD8, 0xA7, 0xD9, 0x95, 0x2, 0xCE, 0x91, 0x2, 0x49, 0x49, 0x4, 0xD9, 0x80, 0xD9, 0x8F, + 0x1, 0x6E, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, 0x5, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x5, 0x28, + 0xE1, 0x84, 0x86, 0x29, 0x5, 0x32, 0xE2, 0x81, 0x84, 0x33, 0x9, 0xE2, 0x80, 0xB5, 0xE2, 0x80, + 0xB5, 0xE2, 0x80, 0xB5, 0x3, 0xE3, 0x83, 0xAA, 0x2, 0xCE, 0x94, 0x3, 0xE8, 0xB2, 0x9D, 0x3, 0x28, + 0x66, 0x29, 0x3, 0xE7, 0x99, 0xB6, 0x3, 0xE5, 0xB1, 0xAE, 0x3, 0xE5, 0x8D, 0x94, 0x2, 0xCE, 0xA1, + 0x3, 0x4D, 0xCE, 0xA9, 0x4, 0xD8, 0xAC, 0xD8, 0xAD, 0x2, 0xC9, 0x90, 0x3, 0x50, 0x50, 0x4D, 0x4, + 0xD8, 0xB6, 0xD8, 0xAC, 0x3, 0xE3, 0x83, 0x88, 0x4, 0xD8, 0xAA, 0xD8, 0xAD, 0x2, 0xCF, 0x83, 0x1, + 0x40, 0x3, 0x28, 0x4F, 0x29, 0x2, 0xD1, 0x83, 0x4, 0xD8, 0xBA, 0xD8, 0xAC, 0x3, 0xE6, 0x98, 0xA0, + 0x2, 0x6C, 0x6A, 0x3, 0xE4, 0xB8, 0xAD, 0x3, 0x28, 0x41, 0x29, 0x3, 0xE1, 0x86, 0xB2, 0x2, 0xD0, + 0xB7, 0xC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x3, 0xE3, + 0x83, 0x81, 0x5, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x3, 0x20, 0xCC, 0x93, 0x4, 0xF0, 0x9D, 0xBC, 0x84, + 0x7, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x2, 0xD9, 0x83, 0x2, 0x6B, 0x67, 0x3, 0xE7, 0x94, + 0xB7, 0x3, 0xE5, 0x9B, 0x9B, 0x3, 0xE7, 0x9A, 0xBF, 0x3, 0xE7, 0x84, 0xA1, 0x3, 0xE9, 0x95, 0xB7, + 0x3, 0x28, 0x6D, 0x29, 0x2, 0xCE, 0xA5, 0x5, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x3, 0xE1, 0x85, 0xA6, + 0x8, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x2, 0x44, 0x4A, 0x3, 0xE5, 0xBF, 0x83, 0x2, + 0xCE, 0xB4, 0x2, 0xDA, 0x8C, 0x3, 0x28, 0x4B, 0x29, 0x2, 0x73, 0x74, 0x2, 0x32, 0x2E, 0x2, 0xCA, + 0x9D, 0x3, 0x50, 0x54, 0x45, 0x4, 0xD9, 0x86, 0xD9, 0x85, 0x4, 0x39, 0xE7, 0x82, 0xB9, 0x3, 0xE7, + 0xA7, 0x98, 0x2, 0xDB, 0x86, 0x3, 0xE8, 0x80, 0x8C, 0x2, 0x6E, 0x73, 0x2, 0xD1, 0x85, 0x5, 0x31, + 0x38, 0xE6, 0x97, 0xA5, 0x6, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x3, 0xE3, 0x82, 0xB1, 0x4, 0xD8, + 0xB3, 0xD9, 0x8A, 0x4, 0xD5, 0xB4, 0xD5, 0xAB, 0x4, 0x33, 0xE7, 0x82, 0xB9, 0x6, 0xD8, 0xB5, 0xD9, + 0x84, 0xD9, 0x89, 0x1, 0x32, 0x2, 0xC9, 0xB7, 0xF, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0x4, 0xD8, 0xB4, 0xD8, 0xAC, 0x3, 0x67, 0x61, 0x6C, 0x3, + 0xE6, 0xAF, 0x8D, 0x2, 0xCE, 0xB7, 0x2, 0xD9, 0x81, 0x3, 0xE8, 0xBE, 0xB5, 0x3, 0xE5, 0xB0, 0x8F, + 0x3, 0xE7, 0x8E, 0x89, 0x2, 0xCA, 0x9C, 0x1, 0x21, 0x3, 0xE3, 0x83, 0xA6, 0x3, 0xE1, 0x85, 0xA9, + 0xF, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0x4, 0x28, 0x31, 0x31, 0x29, 0x4, 0x33, 0xE6, 0x97, 0xA5, 0x4, 0xD8, 0xAE, 0xD8, 0xAC, 0x4, 0x35, + 0xE7, 0x82, 0xB9, 0x6, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, 0x2, 0xCE, 0xBB, 0x12, 0xE3, 0x83, + 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, + 0x1, 0x65, 0x2, 0xD7, 0x9C, 0x2, 0x54, 0x4D, 0x3, 0xE3, 0x83, 0xA7, 0x5, 0x28, 0xE7, 0xA5, 0xAD, + 0x29, 0x3, 0xE9, 0xBD, 0x92, 0x6, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0x2, 0x53, 0x76, 0x3, 0xE4, + 0xB8, 0x81, 0x2, 0xD9, 0xBA, 0x9, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x3, 0xE4, + 0xBA, 0x85, 0x3, 0xE3, 0x82, 0xA4, 0x4, 0x31, 0xE6, 0x97, 0xA5, 0x4, 0xD8, 0xB6, 0xD8, 0xAE, 0x2, + 0xCA, 0x92, 0x6, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x2, 0xD8, 0xB7, 0x3, 0xE3, 0x82, 0xB9, 0x2, + 0xD0, 0xBC, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0xC, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x3, 0xE5, 0xAD, 0x90, 0x2, 0xD9, 0xBF, 0x2, 0xCF, 0x89, 0x2, + 0x66, 0x6C, 0x3, 0xE9, 0x82, 0x91, 0x4, 0xD8, 0xAA, 0xD9, 0x85, 0x3, 0xE4, 0xB8, 0x89, 0x2, 0xD7, + 0x90, 0x2, 0xC9, 0xB4, 0x2, 0x70, 0x63, 0x3, 0xE2, 0x80, 0x94, 0x4, 0xD9, 0x80, 0xD9, 0x8B, 0x5, + 0x28, 0xE6, 0x9C, 0xA8, 0x29, 0x6, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x1, 0x3D, 0x6, 0xD9, 0x84, + 0xD8, 0xA7, 0xD9, 0x93, 0x3, 0xE3, 0x83, 0xB1, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x6, 0xE1, + 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x95, 0x4, 0xD9, 0x86, 0xD9, + 0x8A, 0x3, 0xE7, 0xAB, 0x8B, 0x3, 0xE9, 0xAA, 0xA8, 0x3, 0x6C, 0xC2, 0xB7, 0x2, 0xD3, 0x99, 0x3, + 0xE5, 0x8C, 0x95, 0x5, 0x56, 0xE2, 0x88, 0x95, 0x6D, 0x4, 0x44, 0x5A, 0xCC, 0x8C, 0x4, 0xD9, 0x83, + 0xD8, 0xAE, 0x5, 0x37, 0xE2, 0x81, 0x84, 0x38, 0x4, 0xD8, 0xB4, 0xD9, 0x85, 0x2, 0xCA, 0xA3, 0x2, + 0xC8, 0xA2, 0x4, 0xD8, 0xAA, 0xD8, 0xAE, 0x8, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84, 0x2, + 0xCA, 0x88, 0x3, 0xE1, 0x86, 0xB3, 0x3, 0x3D, 0x3D, 0x3D, 0x1, 0x48, 0x3, 0xE4, 0xBA, 0xA4, 0x2, + 0x49, 0x58, 0x2, 0xC9, 0xAA, 0x6, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x3, 0xE3, 0x80, 0x96, 0x4, + 0xD8, 0xB3, 0xD8, 0xAC, 0x9, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x5, 0x31, + 0x33, 0xE6, 0x97, 0xA5, 0x3, 0xE8, 0xBA, 0xAB, 0x3, 0xE6, 0x8D, 0x95, 0x2, 0x69, 0x6A, 0x3, 0xE7, + 0x88, 0xB6, 0x8, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x29, 0x4, 0xD9, 0x88, 0xD9, 0x94, 0x4, + 0x28, 0x31, 0x32, 0x29, 0x3, 0xE1, 0x86, 0x91, 0x4, 0xD8, 0xAD, 0xD9, 0x89, 0x3, 0xE2, 0xA6, 0x86, + 0x2, 0xCF, 0x85, 0x3, 0x28, 0x4C, 0x29, 0x2, 0x33, 0x33, 0x2, 0xC5, 0x93, 0x5, 0x28, 0xE5, 0x90, + 0x8D, 0x29, 0x4, 0xD9, 0x84, 0xD8, 0xAC, 0x3, 0xE1, 0x84, 0x95, 0x3, 0xE3, 0x80, 0x8A, 0x2, 0x32, + 0x35, 0x3, 0xE1, 0xB4, 0x82, 0x3, 0xE1, 0x85, 0x98, 0x3, 0xE4, 0xB8, 0x99, 0x3, 0xE3, 0x80, 0x97, + 0x4, 0xD9, 0x86, 0xD8, 0xAC, 0x4, 0xD8, 0xAD, 0xD9, 0x8A, 0x2, 0x34, 0x39, 0x3, 0xEA, 0x9C, 0xA7, + 0x3, 0xE1, 0x87, 0x8E, 0x3, 0xE5, 0xBD, 0x90, 0x2, 0xC9, 0x9F, 0x4, 0x36, 0xE6, 0x97, 0xA5, 0x3, + 0xE7, 0x94, 0xB3, 0x3, 0xE1, 0x84, 0x8B, 0x4, 0xD8, 0xA8, 0xD8, 0xAD, 0xC, 0xE3, 0x82, 0xAD, 0xE3, + 0x82, 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x4, 0xD9, 0x87, 0xD9, 0x8A, 0x3, 0xE1, 0x84, + 0x88, 0x3, 0xE9, 0xAC, 0xA5, 0x3, 0x6B, 0x48, 0x7A, 0x2, 0xCE, 0xB9, 0x3, 0x28, 0x56, 0x29, 0x3, + 0xE1, 0x86, 0xB5, 0x3, 0x20, 0xD9, 0x8F, 0x3, 0xE3, 0x80, 0x92, 0x3, 0x28, 0x34, 0x29, 0x3, 0xE4, + 0xB8, 0x8B, 0x2, 0x4B, 0x4D, 0x3, 0xE9, 0x9D, 0x91, 0x3, 0xE6, 0xB0, 0x94, 0xC, 0xE3, 0x82, 0xAB, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x9E, 0x3, 0x28, 0x38, 0x29, 0x2, 0xD0, 0xB6, 0x3, + 0xE5, 0xB9, 0xBC, 0x4, 0x44, 0x7A, 0xCC, 0x8C, 0x3, 0xE5, 0x8F, 0xA3, 0x2, 0x32, 0x30, 0x2, 0xD9, + 0xB9, 0x5, 0x31, 0x34, 0xE7, 0x82, 0xB9, 0x3, 0xE6, 0xAD, 0xA3, 0x4, 0xD8, 0xAE, 0xD9, 0x8A, 0x3, + 0x6B, 0x6D, 0x32, 0x4, 0x33, 0xE6, 0x9C, 0x88, 0x2, 0x53, 0x4D, 0x4, 0xD8, 0xA7, 0xD9, 0x8B, 0xC, + 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x3, 0xE8, 0xA6, 0x8B, + 0x3, 0xE1, 0x87, 0x87, 0x3, 0xE6, 0x94, 0xAF, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x3, 0xE1, + 0x85, 0xAD, 0x6, 0xD8, 0xA8, 0xD8, 0xAD, 0xD9, 0x8A, 0x2, 0x33, 0x31, 0x6, 0xD8, 0xAA, 0xD8, 0xAD, + 0xD9, 0x85, 0x2, 0xD1, 0x84, 0xC, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xBC, 0x6, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x85, 0x3, 0xE1, 0x86, 0x9E, 0x6, 0xD8, 0xB4, 0xD9, + 0x85, 0xD9, 0x85, 0x3, 0xE5, 0xA3, 0xB0, 0x6, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x2, 0x68, 0x61, + 0x2, 0xCA, 0x95, 0x6, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x2, 0x69, 0x76, 0x5, 0x28, 0xE8, 0xB3, + 0x87, 0x29, 0x2, 0x6D, 0x73, 0x6, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x2, 0xD8, 0xB6, 0x6, 0xD9, + 0x84, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0x4C, 0x54, 0x44, 0x3, 0xE3, 0x80, 0x8F, 0x2, 0x6E, 0x56, 0x4, + 0xDB, 0x87, 0xD9, 0xB4, 0x8, 0x28, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x29, 0x3, 0xE6, 0xAF, + 0x8B, 0x5, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x2, 0xD7, 0x94, 0x2, 0xD8, 0xA7, 0x4, 0xD9, 0x82, 0xD9, + 0x85, 0x4, 0xD9, 0x83, 0xD8, 0xAD, 0x4, 0xD9, 0x86, 0xD8, 0xAE, 0xF, 0xE3, 0x83, 0xA1, 0xE3, 0x82, + 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x3, 0x20, 0xCC, 0x8B, 0x3, 0xE5, + 0x8B, 0xB9, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x87, 0x1, 0x3F, 0x3, 0xE6, 0x96, 0x99, 0x6, 0xE1, + 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x6, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x3, 0xE2, 0x80, 0x90, + 0x21, 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, + 0x20, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, + 0xD9, 0x85, 0x5, 0x31, 0xE2, 0x81, 0x84, 0x38, 0x3, 0xE8, 0xB1, 0x95, 0xC, 0xE3, 0x82, 0xB3, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x6, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x3, + 0x31, 0x32, 0x2E, 0x4, 0xD9, 0x8A, 0xD9, 0x8A, 0x4, 0xD8, 0xAB, 0xD9, 0x89, 0x3, 0xE8, 0x88, 0x9F, + 0x9, 0xE3, 0x82, 0xB1, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0xF, 0xD8, 0xAC, 0xD9, 0x84, 0x20, + 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x87, 0x3, 0x28, 0x53, 0x29, 0x3, 0x20, + 0xD9, 0x91, 0x6, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0x2, 0xCE, 0xBD, 0x3, 0xE5, 0xAD, 0xA6, 0x2, + 0xDB, 0x8B, 0x4, 0xDB, 0x92, 0xD9, 0x94, 0x4, 0xD8, 0xB7, 0xD9, 0x85, 0xC, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x9A, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x3, 0xE1, 0x85, 0xB1, 0x6, 0xD8, 0xB4, 0xD8, + 0xAC, 0xD9, 0x8A, 0x12, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x3, 0xE9, 0x81, 0x8A, 0x5, 0x31, 0xE2, 0x81, 0x84, 0x35, 0x1, + 0x39, 0x4, 0xD9, 0x8A, 0xD9, 0x85, 0x2, 0x32, 0x34, 0x2, 0xD9, 0x89, 0x3, 0x31, 0x34, 0x2E, 0x3, + 0xE5, 0x8C, 0x9A, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x85, 0x2, 0x39, 0x2C, 0x3, 0xE1, 0x85, 0xB5, + 0x12, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xB3, 0x3, 0x28, 0x32, 0x29, 0xC, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0x8B, 0xE3, 0x83, 0xBC, 0x2, 0x31, 0x2E, 0x2, 0x56, 0x49, 0x3, 0xE5, 0xA4, 0xA9, 0x3, 0x28, 0x4E, + 0x29, 0x3, 0xE2, 0x86, 0x90, 0x3, 0xE6, 0x96, 0xA4, 0x3, 0xE1, 0x84, 0x89, 0x12, 0xE3, 0x82, 0xAF, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x3, + 0xE1, 0x86, 0xAA, 0x3, 0xE6, 0xAF, 0x9B, 0x3, 0xE4, 0xBC, 0x91, 0x2, 0xC6, 0xAB, 0x3, 0x28, 0x42, + 0x29, 0x4, 0xD8, 0xAE, 0xD8, 0xAD, 0x6, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x2, 0xCE, 0xB1, 0x2, + 0xD0, 0xBE, 0x3, 0x20, 0xD9, 0x8D, 0x2, 0x4D, 0x43, 0x3, 0xE1, 0xB6, 0x85, 0x2, 0x33, 0x37, 0x3, + 0x2E, 0x2E, 0x2E, 0x3, 0xE1, 0x84, 0xAD, 0x3, 0x63, 0x2F, 0x75, 0x3, 0xCE, 0xBC, 0x41, 0x9, 0xE3, + 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x2, 0xCA, 0xA7, 0x2, 0x49, 0x55, 0x5, 0x20, 0xCC, + 0x93, 0xCD, 0x82, 0x3, 0xE2, 0x88, 0x87, 0xC, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4, 0xE3, 0x82, + 0xAF, 0xE3, 0x83, 0xAB, 0x3, 0xE3, 0x82, 0xBD, 0x1, 0x7D, 0x9, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, + 0xE3, 0x83, 0x88, 0x3, 0xE3, 0x80, 0x89, 0x3, 0xE1, 0x84, 0x80, 0x2, 0xC4, 0xA7, 0x6, 0xD8, 0xB3, + 0xD8, 0xAC, 0xD9, 0x89, 0x3, 0xC2, 0xB0, 0x46, 0x6, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, 0x5, 0x28, + 0xE8, 0xB2, 0xA1, 0x29, 0x3, 0xE1, 0xB4, 0x9C, 0x5, 0x33, 0xE2, 0x81, 0x84, 0x38, 0x3, 0xE1, 0x87, + 0x8C, 0x2, 0x38, 0x2C, 0x4, 0xD9, 0x86, 0xD8, 0xAD, 0x3, 0x31, 0x38, 0x2E, 0x2, 0xDA, 0x91, 0x3, + 0xE3, 0x83, 0x9F, 0x2, 0xD1, 0x81, 0xF, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xAB, 0x1, 0x2A, 0x3, 0xE3, 0x82, 0xBF, 0x4, 0xD9, 0x84, 0xD9, 0x85, + 0x5, 0x28, 0xE1, 0x84, 0x80, 0x29, 0x6, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, 0xA3, 0x4, 0x70, 0x2E, 0x6D, + 0x2E, 0x5, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0x3, 0xE3, 0x83, 0x8D, 0x1, 0x5D, 0x6, 0xE0, 0xBA, 0xAB, + 0xE0, 0xBA, 0x99, 0x3, 0xE1, 0x86, 0xAD, 0x6, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, 0x2, 0xC9, 0x9C, + 0x2, 0xD7, 0x9B, 0x2, 0x33, 0x34, 0x5, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x2, 0x48, 0x50, 0x5, 0x28, + 0xE5, 0x9C, 0x9F, 0x29, 0x2, 0x44, 0x7A, 0x3, 0x20, 0xCC, 0x87, 0x3, 0xE4, 0xB8, 0xB6, 0x9, 0xE3, + 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80, 0x95, 0x9, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, + 0x83, 0xAB, 0x3, 0xE1, 0x84, 0xAB, 0x3, 0xE1, 0x84, 0xAE, 0x3, 0x28, 0x74, 0x29, 0x3, 0xE3, 0x83, + 0x8B, 0x6, 0xD9, 0x84, 0xD8, 0xAC, 0xD9, 0x85, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xA7, 0x2, 0x34, + 0x31, 0x3, 0x46, 0x41, 0x58, 0x3, 0x28, 0x68, 0x29, 0x5, 0x32, 0x35, 0xE6, 0x97, 0xA5, 0x2, 0xD1, + 0x8B, 0x3, 0xE1, 0x84, 0xA1, 0x3, 0xE3, 0x83, 0xA0, 0x3, 0xE9, 0xAB, 0x98, 0x4, 0xD7, 0x90, 0xD7, + 0x9C, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, 0x6, 0xE3, 0x81, 0xBB, 0xE3, 0x81, 0x8B, 0x2, 0xC9, + 0xA0, 0x6, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x6, 0xD8, 0xB9, 0xD8, 0xAC, 0xD9, 0x85, 0x4, 0xD8, + 0xB5, 0xD8, 0xAD, 0x3, 0xE2, 0x94, 0x82, 0x2, 0xC6, 0x8E, 0x2, 0xCF, 0x9C, 0x4, 0xD8, 0xB5, 0xD9, + 0x85, 0x2, 0xC3, 0xB8, 0x5, 0x28, 0xE7, 0x9B, 0xA3, 0x29, 0x4, 0xCE, 0xA5, 0xCC, 0x81, 0x4, 0xD9, + 0x8A, 0xD8, 0xAC, 0x4, 0xD9, 0x85, 0xD8, 0xAE, 0x4, 0xD8, 0xB4, 0xD8, 0xAD, 0x2, 0x66, 0x6D, 0x3, + 0xE3, 0x83, 0x8C, 0x4, 0xD8, 0xA8, 0xD8, 0xAC, 0x3, 0x28, 0x48, 0x29, 0x6, 0xD8, 0xA8, 0xD8, 0xAE, + 0xD9, 0x8A, 0x3, 0xE3, 0x83, 0x8A, 0x2, 0xC9, 0x92, 0x2, 0xDA, 0xAF, 0x3, 0xE3, 0x82, 0xB7, 0x1, + 0x26, 0x2, 0xCA, 0x8F, 0x4, 0xD9, 0x89, 0xD9, 0xB0, 0x2, 0x63, 0x64, 0x5, 0x31, 0xE2, 0x81, 0x84, + 0x32, 0x3, 0x28, 0x46, 0x29, 0x3, 0x28, 0x76, 0x29, 0x5, 0x28, 0xE9, 0x87, 0x91, 0x29, 0xE, 0x28, + 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xAE, 0x29, 0x3, 0x20, 0xCC, + 0x81, 0x12, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0x3, 0xE7, 0x88, 0xAA, 0x3, 0xE5, 0xB7, 0x9B, 0x6, 0xD9, 0x80, 0xD9, 0x90, + 0xD9, 0x91, 0x2, 0x73, 0x72, 0x3, 0xE5, 0x96, 0xB6, 0x2, 0xDA, 0x86, 0x3, 0xE9, 0xA6, 0x99, 0x6, + 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x4, 0xF0, 0x9D, 0xBC, 0x8A, 0x4, 0xD8, 0xB7, 0xD9, 0x8A, 0x2, + 0xD0, 0xBA, 0x3, 0xE3, 0x80, 0x94, 0x2, 0xC9, 0xA9, 0x3, 0xE3, 0x82, 0xA8, 0x5, 0x31, 0x37, 0xE7, + 0x82, 0xB9, 0x2, 0x4E, 0x4A, 0x3, 0xE3, 0x83, 0x9B, 0x11, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x4, 0x28, 0x31, 0x38, 0x29, + 0x5, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x6, 0xE3, 0x82, 0x88, 0xE3, 0x82, 0x8A, 0x3, 0xEA, 0x9E, 0x8E, + 0x5, 0x31, 0x37, 0xE6, 0x97, 0xA5, 0x2, 0xC2, 0xA2, 0x6, 0xD9, 0x85, 0xD9, 0x85, 0xD9, 0x8A, 0x2, + 0x34, 0x38, 0x2, 0x64, 0x7A, 0x3, 0xE1, 0xB4, 0xA5, 0x3, 0xE7, 0xA6, 0x81, 0x6, 0xD9, 0x86, 0xD8, + 0xAD, 0xD9, 0x8A, 0x2, 0xDA, 0xBA, 0x3, 0x28, 0x4D, 0x29, 0x6, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, + 0x3, 0xE5, 0x9C, 0x9F, 0x4, 0xD8, 0xB4, 0xD8, 0xAE, 0x4, 0xD9, 0x8A, 0xD8, 0xAD, 0x9, 0xE3, 0x83, + 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xBD, 0x2, 0x6E, 0x46, 0x3, 0xE5, 0xB1, 0xB1, 0x3, 0xE5, 0x85, + 0xAD, 0xC, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0x3, 0xE1, + 0xB4, 0x96, 0x2, 0xC5, 0x8B, 0x3, 0xE1, 0x84, 0xA9, 0x5, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x4, 0xD8, + 0xAA, 0xD9, 0x89, 0x2, 0xD8, 0xB2, 0x2, 0x64, 0x6D, 0x3, 0xE1, 0x85, 0xA3, 0x5, 0x31, 0x35, 0xE6, + 0x97, 0xA5, 0x3, 0xE8, 0x89, 0xB2, 0x3, 0xE4, 0xB9, 0x9D, 0x6, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, + 0x3, 0xE7, 0x88, 0xBB, 0x3, 0xE5, 0x87, 0xB5, 0x2, 0x4C, 0x6A, 0x9, 0xE3, 0x83, 0x92, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xAB, 0xC, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82, + 0xB9, 0x5, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x2, 0x32, 0x38, 0x3, 0xE9, 0xBB, 0x8D, 0x4, 0xD8, 0xB4, + 0xD9, 0x89, 0x3, 0xE9, 0xB3, 0xA5, 0x5, 0x20, 0xCC, 0x88, 0xCD, 0x82, 0x3, 0xE5, 0x8F, 0xAF, 0x2, + 0xD2, 0xAB, 0x4, 0xD5, 0xA5, 0xD6, 0x82, 0x3, 0xE5, 0xAD, 0x97, 0x1, 0x23, 0x3, 0xE1, 0x85, 0xAC, + 0x2, 0x4E, 0x6F, 0x8, 0x28, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x29, 0x4, 0xD9, 0x81, 0xD9, 0x8A, + 0x3, 0xE5, 0xA4, 0xA7, 0x3, 0xE8, 0xB0, 0xB7, 0x3, 0x28, 0x51, 0x29, 0x4, 0xD9, 0x81, 0xD8, 0xAD, + 0x7, 0xE3, 0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x3, 0xE5, 0x87, 0xA0, 0x2, 0xDB, 0x8C, 0x6, 0xD9, + 0x86, 0xD9, 0x85, 0xD9, 0x8A, 0x4, 0x39, 0xE6, 0x9C, 0x88, 0x2, 0xC7, 0x82, 0x4, 0xD8, 0xA8, 0xD9, + 0x85, 0x9, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x6, 0xE2, 0x80, 0xB2, 0xE2, + 0x80, 0xB2, 0x2, 0x3D, 0x3D, 0x4, 0xD9, 0x86, 0xD9, 0x86, 0x3, 0x20, 0xCC, 0xA7, 0x3, 0xE8, 0xA5, + 0xBE, 0x4, 0x64, 0x7A, 0xCC, 0x8C, 0x4, 0xD9, 0x84, 0xD8, 0xAE, 0x3, 0xE6, 0x89, 0x93, 0x3, 0xE5, + 0xBE, 0x97, 0x4, 0xD9, 0x83, 0xD8, 0xA7, 0x9, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xAB, 0x2, 0xD1, 0x96, 0x4, 0x35, 0xE6, 0x97, 0xA5, 0x3, 0xE8, 0x88, 0x8C, 0x3, 0xE1, 0x84, 0x86, + 0x3, 0xE9, 0xBE, 0x9C, 0x2, 0xC3, 0x86, 0x9, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAA, + 0x2, 0x6B, 0x6C, 0x3, 0x28, 0x47, 0x29, 0x3, 0xE1, 0x87, 0x99, 0x2, 0xDA, 0xA1, 0x2, 0xCA, 0x8D, + 0x4, 0xD8, 0xAE, 0xD9, 0x85, 0x5, 0x32, 0x34, 0xE7, 0x82, 0xB9, 0x4, 0x32, 0xE6, 0x97, 0xA5, 0x4, + 0xD9, 0x86, 0xD9, 0x87, 0x3, 0xE3, 0x83, 0x8F, 0x3, 0xE3, 0x83, 0xA4, 0x3, 0xE3, 0x83, 0xBB, 0x2, + 0xC2, 0xA3, 0x4, 0xD8, 0xA7, 0xD9, 0x93, 0x3, 0xE6, 0xAD, 0xA2, 0x5, 0x20, 0xD9, 0x90, 0xD9, 0x91, + 0x3, 0xE3, 0x83, 0xA3, 0x6, 0xD9, 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x5, 0x28, 0xE7, 0xA5, 0x9D, 0x29, + 0x6, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x2, 0x49, 0x56, 0x4, 0xD8, 0xB3, 0xD8, 0xAD, 0x3, 0xE6, + 0xA0, 0xAA, 0x2, 0x36, 0x2C, 0x5, 0x33, 0x30, 0xE6, 0x97, 0xA5, 0x2, 0x6B, 0x74, 0x3, 0x28, 0x62, + 0x29, 0x6, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x2, 0xD1, 0x98, 0x6, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xA1, 0x2, 0x31, 0x38, 0xC, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAA, 0xE3, 0x83, + 0xBC, 0x3, 0xE1, 0x84, 0xA0, 0x4, 0xD5, 0xB4, 0xD5, 0xAD, 0x2, 0x34, 0x30, 0x6, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0xF, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80, + 0xE1, 0x85, 0xA9, 0x3, 0xE6, 0xBA, 0x80, 0x3, 0xE2, 0x88, 0x91, 0x4, 0xD9, 0x83, 0xD9, 0x84, 0x3, + 0xE7, 0x9A, 0xAE, 0x3, 0xE1, 0x84, 0xA2, 0x3, 0x69, 0x69, 0x69, 0x3, 0xE8, 0x87, 0xBC, 0x6, 0xD8, + 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x3, 0xE9, 0x81, 0xA9, 0x4, 0xD9, 0x83, 0xD8, 0xAC, 0x3, 0xE1, 0x84, + 0x9C, 0x3, 0xE5, 0xBC, 0x93, 0xC, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, + 0x82, 0x99, 0x4, 0xD8, 0xB6, 0xD9, 0x8A, 0x9, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x88, 0x5, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x2, 0xD2, 0xB1, + 0x2, 0xCA, 0x89, 0x3, 0xE3, 0x80, 0x81, 0x3, 0xEA, 0x9A, 0x89, 0xC, 0xE3, 0x82, 0xAF, 0xE3, 0x83, + 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x8D, 0x3, 0xE1, 0x85, 0xA5, 0x3, 0xE5, 0x8D, 0xA9, 0x3, 0xE6, + 0xBC, 0x94, 0x4, 0x6B, 0x63, 0x61, 0x6C, 0x3, 0xE7, 0x93, 0x9C, 0x2, 0xCE, 0x97, 0x2, 0x6D, 0x57, + 0x6, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x5, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x6, 0xD9, 0x85, 0xD8, + 0xAC, 0xD9, 0x8A, 0x3, 0x31, 0x31, 0x2E, 0x2, 0x6D, 0x6C, 0x4, 0xD9, 0x8A, 0xD8, 0xAE, 0x2, 0xCE, + 0xA4, 0x4, 0xD8, 0xA7, 0xD9, 0xB4, 0x3, 0x3A, 0x3A, 0x3D, 0x3, 0xE1, 0x84, 0x84, 0x6, 0xD8, 0xB6, + 0xD8, 0xAE, 0xD9, 0x85, 0x2, 0x4D, 0x44, 0x2, 0xDA, 0xA6, 0x1, 0x29, 0x5, 0x31, 0x36, 0xE7, 0x82, + 0xB9, 0x9, 0xE3, 0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, 0x3, 0x28, 0x36, 0x29, 0x5, 0x20, + 0xD9, 0x8E, 0xD9, 0x91, 0x3, 0x43, 0x6F, 0x2E, 0xC, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4, 0x39, 0xE6, 0x97, 0xA5, 0x3, 0xE5, 0x8D, 0xB0, 0x3, 0x28, 0x44, + 0x29, 0x3, 0xE1, 0x84, 0xA3, 0x2, 0x33, 0x35, 0x1, 0x2E, 0x4, 0x61, 0x2E, 0x6D, 0x2E, 0x8, 0x28, + 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x29, 0x4, 0x34, 0xE6, 0x97, 0xA5, 0x3, 0xE3, 0x82, 0x99, 0x6, + 0xD9, 0x85, 0xD8, 0xAE, 0xD8, 0xAC, 0x3, 0xE7, 0xBE, 0x8A, 0x3, 0xE8, 0x82, 0x89, 0x4, 0xD9, 0x8A, + 0xD8, 0xB1, 0x5, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x4, 0xD8, 0xB5, 0xD8, 0xB1, 0x9, 0xE3, 0x83, 0x92, + 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x3, 0x20, 0xD9, 0x90, 0x2, 0xC9, 0x94, 0x5, 0x31, 0xE2, 0x81, + 0x84, 0x37, 0x3, 0x68, 0x50, 0x61, 0x3, 0xE3, 0x83, 0xA1, 0x3, 0xE3, 0x83, 0x92, 0x2, 0x53, 0x53, + 0x3, 0xE3, 0x82, 0xAA, 0x2, 0xDA, 0x80, 0x6, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x3, 0x54, 0x48, + 0x7A, 0x3, 0x63, 0x61, 0x6C, 0x3, 0xE4, 0xBC, 0x81, 0x3, 0xE9, 0x96, 0x80, 0x2, 0x6B, 0x6D, 0x3, + 0xE5, 0x9C, 0xB0, 0x2, 0xD1, 0x86, 0x8, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, 0x84, 0x3, 0x28, + 0x33, 0x29, 0x3, 0xE9, 0xAC, 0xB2, 0x2, 0xD9, 0x84, 0x3, 0xE6, 0x94, 0xB4, 0x2, 0x4B, 0x42, 0x6, + 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB2, 0x3, 0xEA, 0xAD, 0xA7, 0x6, 0xE6, 0x98, 0xAD, 0xE5, 0x92, + 0x8C, 0x3, 0xE7, 0xB3, 0xB8, 0x5, 0x28, 0xE4, 0xBC, 0x81, 0x29, 0x1, 0x25, 0x3, 0xE1, 0x84, 0xAF, + 0x3, 0xE1, 0x85, 0xA1, 0x5, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x2, 0xD1, 0x8E, 0x3, 0xEA, 0x9D, 0xAF, + 0x2, 0x50, 0x52, 0x3, 0xE5, 0x8C, 0xBB, 0x5, 0x35, 0xE2, 0x81, 0x84, 0x36, 0x5, 0x20, 0xCC, 0x88, + 0xCC, 0x81, 0x4, 0xD8, 0xAA, 0xD8, 0xAC, 0x3, 0x28, 0x55, 0x29, 0x6, 0xE1, 0x84, 0x90, 0xE1, 0x85, + 0xA1, 0x3, 0xE3, 0x83, 0xBC, 0x4, 0xD8, 0xAD, 0xD9, 0x85, 0x3, 0xE9, 0x9D, 0xA9, 0x4, 0xD8, 0xAC, + 0xD9, 0x8A, 0x3, 0xE1, 0x87, 0x97, 0x3, 0xE8, 0x80, 0xB3, 0x6, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x8A, + 0x3, 0xE8, 0xB1, 0x86, 0x5, 0x32, 0x33, 0xE6, 0x97, 0xA5, 0x4, 0xD8, 0xAA, 0xD8, 0xB1, 0x3, 0xE5, + 0xB9, 0xBF, 0x6, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0x3, 0xE3, 0x82, 0xA2, 0x4, 0xD8, 0xB7, 0xD8, + 0xAD, 0x9, 0xE3, 0x83, 0x98, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0xC, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84, 0x3, 0xE1, 0x84, 0x8C, 0x2, 0xCA, 0x9B, 0x2, 0x64, + 0x6C, 0x5, 0x31, 0x30, 0xE6, 0x9C, 0x88, 0x2, 0x76, 0x69, 0x3, 0x28, 0x39, 0x29, 0x5, 0x34, 0xE2, + 0x81, 0x84, 0x35, 0x3, 0xE5, 0x8E, 0x82, 0x2, 0xDA, 0x98, 0x4, 0x36, 0xE7, 0x82, 0xB9, 0x3, 0xE7, + 0xA5, 0x9D, 0x6, 0x43, 0xE2, 0x88, 0x95, 0x6B, 0x67, 0x6, 0xD9, 0x81, 0xD9, 0x85, 0xD9, 0x8A, 0x3, + 0xE1, 0x85, 0x99, 0x3, 0xEA, 0xAD, 0x92, 0x4, 0xD8, 0xB3, 0xD9, 0x85, 0x3, 0xE4, 0xBA, 0x8C, 0x6, + 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, 0x3, 0xE7, 0x96, 0x92, 0x2, 0x66, 0x66, 0x3, 0xE1, 0x84, 0x8A, + 0x3, 0xE8, 0xB5, 0xA4, 0x3, 0xE1, 0xB4, 0x9D, 0x4, 0xD8, 0xB6, 0xD9, 0x85, 0x6, 0xD9, 0x8A, 0xD9, + 0x94, 0xDB, 0x86, 0x2, 0x65, 0x56, 0x3, 0xE6, 0x9C, 0x89, 0x3, 0xE8, 0x99, 0x8D, 0x2, 0x33, 0x30, + 0x5, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0x3, 0xE5, 0x85, 0xAB, 0x6, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, + 0x2, 0x21, 0x3F, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x90, 0x3, 0xE1, 0x86, 0xA1, 0x3, 0xE5, 0xAE, + 0x80, 0x2, 0x31, 0x39, 0xF, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xAB, 0x3, 0x28, 0x4A, 0x29, 0x3, 0xE5, 0xA4, 0x82, 0x3, 0xE5, 0x8D, 0x9C, 0x2, + 0x69, 0x6E, 0x8, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, 0x3, 0xE3, 0x82, 0xAB, 0x3, 0xE4, + 0xB8, 0x83, 0x3, 0xE9, 0xBD, 0x8A, 0x6, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x89, 0x3, 0x28, 0x6F, 0x29, + 0x3, 0xE3, 0x80, 0x8C, 0x6, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, 0xAD, 0x5, 0x32, 0x39, 0xE6, 0x97, 0xA5, + 0x5, 0x32, 0x38, 0xE6, 0x97, 0xA5, 0x2, 0xC9, 0xBB, 0x3, 0xE2, 0x96, 0xA0, 0x3, 0xE5, 0x89, 0xB2, + 0x1, 0x27, 0x2, 0xD1, 0x82, 0x8, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x2, 0xD2, 0x91, + 0x2, 0xC9, 0xB0, 0x4, 0xF0, 0x9D, 0xBC, 0x9E, 0x2, 0xC9, 0x93, 0x2, 0x6D, 0x33, 0x4, 0xD5, 0xB4, + 0xD5, 0xA5, 0x3, 0xE8, 0x87, 0xAA, 0x2, 0xD7, 0x92, 0x3, 0xE9, 0xA6, 0x96, 0x3, 0xE2, 0xB5, 0xA1, + 0x3, 0x56, 0x49, 0x49, 0x4, 0xD8, 0xAB, 0xD8, 0xB1, 0x2, 0x31, 0x35, 0x6, 0xD9, 0x8A, 0xD9, 0x94, + 0xD8, 0xB1, 0x6, 0xD8, 0xB5, 0xD9, 0x84, 0xDB, 0x92, 0x5, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x4, 0xD5, + 0xBE, 0xD5, 0xB6, 0x4, 0xD9, 0x86, 0xD8, 0xB2, 0x2, 0xCA, 0x84, 0x2, 0xC9, 0xBA, 0x3, 0x49, 0x49, + 0x49, 0x2, 0xC3, 0xB0, 0x4, 0xD9, 0x81, 0xD9, 0x89, 0x3, 0xE4, 0xB8, 0xBF, 0x2, 0x34, 0x32, 0x2, + 0xC9, 0x9E, 0x2, 0xC9, 0xB5, 0x2, 0xC9, 0xA4, 0x6, 0xD9, 0x81, 0xD8, 0xAE, 0xD9, 0x85, 0x6, 0xD8, + 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x3, 0x20, 0xD9, 0x8C, 0x2, 0xDA, 0xBE, 0x9, 0xE3, 0x83, 0x95, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0xB3, 0x3, 0x20, 0xCC, 0x83, 0x2, 0x31, 0x2C, 0x3, 0xE1, 0x84, 0x92, 0x5, + 0x31, 0x33, 0xE7, 0x82, 0xB9, 0x3, 0x63, 0x2F, 0x6F, 0x3, 0x20, 0xCD, 0x85, 0x4, 0x28, 0x31, 0x33, + 0x29, 0x9, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x84, 0x3, 0xE5, 0xB7, 0xB1, 0x3, 0x28, + 0x5A, 0x29, 0x3, 0xE2, 0x86, 0x93, 0x2, 0xD9, 0xB1, 0x6, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x8A, 0x3, + 0x20, 0xCD, 0x82, 0x3, 0xE7, 0x81, 0xAB, 0x3, 0xE9, 0xA3, 0x9B, 0x2, 0x63, 0x63, 0x3, 0xE9, 0xBB, + 0xB9, 0x2, 0x33, 0x2E, 0x3, 0xCE, 0xBC, 0x67, 0x3, 0x31, 0x30, 0x2E, 0x5, 0x28, 0xE7, 0x89, 0xB9, + 0x29, 0x3, 0xE5, 0x90, 0x88, 0x6, 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x3, 0xE4, 0xB9, 0x99, 0x3, + 0xE5, 0x95, 0x8F, 0x9, 0xE3, 0x83, 0xA6, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0x3, 0xE9, 0x9B, + 0xA8, 0x2, 0xD7, 0xA2, 0x3, 0xE9, 0xBB, 0x91, 0x6, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0x3, 0x50, + 0x50, 0x56, 0x2, 0xD1, 0x9F, 0x2, 0x4B, 0x4B, 0x1, 0x60, 0x2, 0xC4, 0xB1, 0x5, 0x28, 0xE1, 0x84, + 0x92, 0x29, 0x6, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x8A, 0x3, 0xE6, 0x96, 0xB0, 0x9, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x3, 0xE5, 0xB9, 0xBA, 0x3, 0x20, 0xD9, 0x92, 0x6, 0x6D, 0xE2, + 0x88, 0x95, 0x73, 0x32, 0x3, 0xE3, 0x83, 0xA8, 0x2, 0xC2, 0xA6, 0x6, 0xD9, 0x84, 0xD8, 0xAC, 0xD9, + 0x8A, 0x3, 0xE3, 0x83, 0x86, 0x3, 0xE7, 0x89, 0x99, 0x9, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, + 0x88, 0xAB, 0x3, 0xE7, 0x94, 0xB0, 0x4, 0x20, 0xE3, 0x82, 0x9A, 0x4, 0xD8, 0xB3, 0xD9, 0x87, 0x9, + 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x4, 0xF0, 0x9D, 0xBC, 0x88, 0x2, 0x33, + 0x38, 0x6, 0xD9, 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x2, 0x30, 0x2C, 0x3, 0xE5, 0x90, 0x8D, 0x2, 0x57, + 0x62, 0x2, 0xDA, 0x8D, 0x2, 0xDA, 0x8E, 0x5, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x2, 0xD0, 0xB3, 0x3, + 0xE9, 0xBB, 0x83, 0x2, 0x48, 0x7A, 0x3, 0xE3, 0x83, 0xA5, 0x6, 0xD8, 0xB5, 0xD9, 0x85, 0xD9, 0x85, + 0x2, 0x2E, 0x2E, 0x3, 0x4D, 0x48, 0x7A, 0x2, 0x41, 0x55, 0x2, 0xC9, 0xA6, 0x4, 0xD9, 0x86, 0xD8, + 0xB1, 0x4, 0xD9, 0x81, 0xD9, 0x85, 0x2, 0xCA, 0xA8, 0x3, 0xE5, 0x88, 0x80, 0x2, 0x34, 0x2C, 0x3, + 0xE6, 0x96, 0x87, 0x2, 0xCE, 0x95, 0x2, 0xD7, 0xAA, 0x3, 0x31, 0x33, 0x2E, 0xC, 0xE3, 0x83, 0x9B, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x5, 0x28, 0xE6, 0xA0, 0xAA, 0x29, 0x3, + 0x61, 0x2F, 0x73, 0x3, 0xE9, 0x98, 0x9C, 0x5, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x3, 0xE7, 0x89, 0x87, + 0x4, 0x35, 0xE6, 0x9C, 0x88, 0x2, 0xD7, 0x91, 0x2, 0xD1, 0x8A, 0x3, 0xE7, 0xB5, 0x82, 0x3, 0xE3, + 0x83, 0x98, 0x3, 0xE1, 0x87, 0x9F, 0x6, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0x31, 0x37, 0x2E, + 0x3, 0xE3, 0x83, 0xB3, 0x3, 0xE9, 0xA3, 0x9F, 0x9, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0x2, 0x6D, 0x32, 0x5, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x2, 0xD0, 0xB2, 0x1, 0x22, 0x5, 0x32, + 0x36, 0xE6, 0x97, 0xA5, 0x3, 0xE5, 0x86, 0xAB, 0x4, 0x28, 0x31, 0x30, 0x29, 0x3, 0xE9, 0xA2, 0xA8, + 0x3, 0xE9, 0xBA, 0xBB, 0x3, 0xE3, 0x82, 0xBB, 0x5, 0x28, 0xE4, 0xB8, 0x83, 0x29, 0x6, 0xD8, 0xB3, + 0xD8, 0xAC, 0xD8, 0xAD, 0x3, 0x28, 0x78, 0x29, 0xF, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x3, 0xE7, 0x96, 0x8B, 0x3, 0xE7, 0xAB, 0xB9, 0x8, + 0x28, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x29, 0x6, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x2, + 0xD7, 0xA8, 0x3, 0xE9, 0x9F, 0xAD, 0x3, 0x6B, 0x50, 0x61, 0x3, 0x47, 0x50, 0x61, 0x6, 0xD8, 0xAD, + 0xD8, 0xAC, 0xD9, 0x8A, 0x3, 0x28, 0x57, 0x29, 0x6, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0xE9, + 0xAD, 0x9A, 0x3, 0xE7, 0x9F, 0x9B, 0x2, 0xC9, 0xB9, 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x5, + 0x31, 0x39, 0xE6, 0x97, 0xA5, 0x2, 0x49, 0x4A, 0x3, 0xE1, 0x84, 0xB2, 0x5, 0x32, 0xE2, 0x81, 0x84, + 0x35, 0x4, 0xF0, 0x9D, 0xBC, 0x86, 0x3, 0x28, 0x63, 0x29, 0x8, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9, + 0xD9, 0x85, 0x3, 0xE7, 0x94, 0xB2, 0x2, 0x35, 0x30, 0x5, 0x28, 0xE6, 0x9C, 0x89, 0x29, 0x2, 0x70, + 0x56, 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x2, 0xD1, 0x8C, 0x3, 0xE1, 0xB5, 0xBB, 0x2, 0xCA, + 0x9F, 0x6, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x3, 0xE4, 0xBA, 0x94, 0xC, 0xE3, 0x82, 0xAB, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xF, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x3, 0xE7, 0xBE, 0xBD, 0x2, 0x70, 0x73, 0x4, 0x20, + 0xE3, 0x82, 0x99, 0x3, 0xE5, 0xBB, 0xBE, 0x3, 0xE1, 0x85, 0xAA, 0x3, 0xE5, 0x8A, 0x9B, 0x3, 0xCE, + 0xBC, 0x56, 0x2, 0xD1, 0x88, 0x3, 0xE5, 0x86, 0x96, 0x3, 0x28, 0x6E, 0x29, 0x9, 0xE3, 0x83, 0x86, + 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x2, 0x32, 0x32, 0x3, 0xE2, 0x86, 0x91, 0xC, 0xE3, 0x82, 0xAD, + 0xE3, 0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x5, 0x28, 0xE1, 0x84, 0x82, 0x29, 0x2, + 0xD0, 0xB4, 0x3, 0xE5, 0x8E, 0xB6, 0x6, 0xE4, 0xBB, 0xA4, 0xE5, 0x92, 0x8C, 0x2, 0xCA, 0xA2, 0x2, + 0xD3, 0xA9, 0x2, 0x70, 0x41, 0x3, 0x78, 0x69, 0x69, 0x2, 0xC7, 0x80, 0x5, 0x20, 0xD9, 0x8C, 0xD9, + 0x91, 0x6, 0xD9, 0x80, 0xD9, 0x8F, 0xD9, 0x91, 0x6, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0xE3, + 0x83, 0xB0, 0x2, 0xD1, 0x8D, 0x3, 0xE1, 0x87, 0x93, 0x3, 0xE6, 0x8A, 0x95, 0x3, 0x66, 0x66, 0x6C, + 0x2, 0xDB, 0x85, 0x4, 0xD9, 0x80, 0xD9, 0x8E, 0x2, 0x30, 0x2E, 0x3, 0x28, 0x72, 0x29, 0x2, 0xC9, + 0x96, 0x2, 0xCA, 0xAA, 0x3, 0xE3, 0x83, 0xAF, 0x5, 0x41, 0xE2, 0x88, 0x95, 0x6D, 0x2, 0xC9, 0xBD, + 0x3, 0xE1, 0x86, 0xAC, 0x8, 0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x2, 0x6D, 0x67, 0x2, + 0x69, 0x69, 0x3, 0xE1, 0xB6, 0x91, 0x4, 0xD9, 0x8A, 0xD9, 0x86, 0x2, 0x31, 0x37, 0x3, 0x62, 0x61, + 0x72, 0x3, 0x31, 0x39, 0x2E, 0x2, 0x32, 0x39, 0x4, 0x38, 0xE7, 0x82, 0xB9, 0x3, 0xE8, 0xBE, 0xB0, + 0x3, 0xE1, 0x84, 0xAC, 0x2, 0x4D, 0x42, 0x3, 0xE9, 0x87, 0x86, 0x4, 0x34, 0xE6, 0x9C, 0x88, 0x3, + 0xE8, 0x87, 0xB3, 0x3, 0xE8, 0xB6, 0xB3, 0x4, 0xD9, 0x84, 0xD9, 0x87, 0x3, 0xC2, 0xB0, 0x43, 0x9, + 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x4, 0xD8, 0xA8, 0xD8, 0xB2, 0x3, 0xE8, + 0x81, 0xBF, 0x4, 0x31, 0xE6, 0x9C, 0x88, 0x3, 0xE6, 0x8C, 0x87, 0x9, 0xE3, 0x80, 0x94, 0xE5, 0xAE, + 0x89, 0xE3, 0x80, 0x95, 0x3, 0xE9, 0x9D, 0x9E, 0x5, 0x32, 0x30, 0xE7, 0x82, 0xB9, 0x3, 0xE9, 0xAB, + 0x9F, 0x2, 0xC9, 0x97, 0x3, 0xE6, 0x9B, 0xB0, 0xF, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, + 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x2, 0x3F, 0x3F, 0x2, 0xCA, 0x98, 0x3, 0xE9, 0xA0, 0x81, + 0x2, 0x6E, 0x41, 0x4, 0xD8, 0xB5, 0xD9, 0x89, 0x3, 0x28, 0x37, 0x29, 0x3, 0xE9, 0x9F, 0x8B, 0x3, + 0xE5, 0xB0, 0xB8, 0x2, 0xC9, 0xB3, 0x4, 0xD8, 0xBA, 0xD9, 0x89, 0x3, 0xE5, 0x84, 0xBF, 0x3, 0x61, + 0xCA, 0xBE, 0x4, 0xD8, 0xB3, 0xD9, 0x89, 0x3, 0xE1, 0x84, 0x9E, 0x3, 0x4C, 0xC2, 0xB7, 0x8, 0xD8, + 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x2, 0x34, 0x36, 0x4, 0xD9, 0x84, 0xD9, 0x89, 0x6, 0xD8, + 0xAA, 0xD8, 0xAE, 0xD9, 0x85, 0x2, 0xCA, 0x99, 0x6, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE5, + 0xBB, 0xB4, 0x2, 0xC9, 0xA7, 0x2, 0x34, 0x34, 0x3, 0xE9, 0xA0, 0x85, 0x4, 0xD9, 0x85, 0xD9, 0x89, + 0x2, 0xDB, 0x92, 0x3, 0xE3, 0x82, 0xB3, 0x6, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x2, 0xD1, 0x95, + 0x1, 0x24, 0x6, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x85, 0x4, 0xD8, 0xAB, 0xD8, 0xB2, 0x2, 0xC9, 0xB1, + 0x3, 0x28, 0x65, 0x29, 0x4, 0xD8, 0xAB, 0xD8, 0xAC, 0x2, 0x50, 0x48, 0x3, 0xE5, 0xA3, 0xAB, 0x5, + 0x28, 0xE5, 0x8A, 0xB4, 0x29, 0x2, 0x34, 0x2E, 0x4, 0xD9, 0x87, 0xD9, 0xB0, 0x6, 0xD9, 0x80, 0xD9, + 0x8E, 0xD9, 0x91, 0x2, 0x6B, 0x41, 0x4, 0xD9, 0x86, 0xD9, 0x89, 0x2, 0x70, 0x57, 0x3, 0xE0, 0xBC, + 0x8B, 0x3, 0x28, 0x6A, 0x29, 0x5, 0x31, 0x39, 0xE7, 0x82, 0xB9, 0x5, 0x31, 0xE2, 0x81, 0x84, 0x34, + 0x2, 0xD7, 0x9D, 0x4, 0xD8, 0xB1, 0xD9, 0xB0, 0x2, 0x33, 0x2C, 0x6, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, + 0x8A, 0x5, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x2, 0xCA, 0xAB, 0x3, 0xCE, 0xBC, 0x73, 0x2, 0x36, 0x2E, + 0x2, 0x64, 0x42, 0x12, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x3, 0xE9, 0x87, 0x91, 0x3, 0xE6, 0x96, 0x97, 0x3, 0xE3, 0x83, + 0x95, 0x3, 0xCE, 0xBC, 0x46, 0x2, 0xD8, 0xA9, 0x4, 0xD8, 0xAC, 0xD9, 0x85, 0x3, 0x32, 0x30, 0x2E, + 0x5, 0x28, 0xE5, 0x85, 0xAB, 0x29, 0x6, 0xD9, 0x8A, 0xD8, 0xAD, 0xD9, 0x8A, 0x2, 0x6C, 0x78, 0x1, + 0x2C, 0x3, 0x28, 0x35, 0x29, 0x3, 0xE7, 0x9F, 0xB3, 0x3, 0x28, 0x64, 0x29, 0x3, 0xE6, 0x88, 0x88, + 0x2, 0x6E, 0x57, 0x4, 0xD8, 0xB4, 0xD9, 0x8A, 0x4, 0xD8, 0xAB, 0xD9, 0x87, 0x2, 0x70, 0x46, 0x6, + 0xD8, 0xB3, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE5, 0xA4, 0x9A, 0x4, 0xD9, 0x85, 0xD8, 0xA7, 0x5, 0x31, + 0xE2, 0x81, 0x84, 0x33, 0x6, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, 0x2, 0x6F, 0x56, 0x2, 0x31, 0x31, + 0x6, 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAD, 0x5, 0x31, 0x30, 0xE7, 0x82, 0xB9, 0x2, 0x34, 0x37, 0x3, + 0xE8, 0xB2, 0xA9, 0x5, 0x20, 0xD9, 0x8D, 0xD9, 0x91, 0x2, 0x4D, 0x56, 0x8, 0x28, 0xE1, 0x84, 0x89, + 0xE1, 0x85, 0xA1, 0x29, 0x3, 0xE1, 0x86, 0xB4, 0x2, 0x32, 0x2C, 0x3, 0x28, 0x6C, 0x29, 0x4, 0xD9, + 0x85, 0xD9, 0x8A, 0x2, 0x37, 0x2E, 0x6, 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x4, 0xD8, 0xAB, 0xD9, + 0x86, 0x1, 0x5E, 0x3, 0xE8, 0xA7, 0x92, 0x6, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x8A, 0x3, 0xE9, 0xBA, + 0xA5, 0x1, 0x5B, 0x3, 0xEA, 0x99, 0x91, 0x3, 0xE1, 0x87, 0x88, 0x2, 0x6E, 0x6D, 0x5, 0x28, 0xE7, + 0x81, 0xAB, 0x29, 0x2, 0xCA, 0xA1, 0x4, 0xD9, 0x80, 0xD9, 0x90, 0x3, 0xE9, 0xBC, 0xA0, 0x3, 0xE3, + 0x80, 0x8D, 0x5, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x12, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, + 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x3, 0x61, 0x2F, 0x63, 0x3, + 0x28, 0x50, 0x29, 0x4, 0xD8, 0xA8, 0xD9, 0x89, 0x2, 0x37, 0x2C, 0x2, 0xD9, 0xAE, 0x4, 0xD8, 0xA8, + 0xD8, 0xB1, 0x4, 0x28, 0x31, 0x34, 0x29, 0x4, 0xD9, 0x85, 0xD8, 0xAD, 0x3, 0x28, 0x67, 0x29, 0x5, + 0x28, 0xE1, 0x84, 0x91, 0x29, 0x3, 0xE8, 0xA8, 0x80, 0x3, 0x28, 0x49, 0x29, 0x3, 0xCA, 0xBC, 0x6E, + 0x6, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x89, 0x5, 0x32, 0x31, 0xE7, 0x82, 0xB9, 0x3, 0xE9, 0xAC, 0xBC, + 0x3, 0xE1, 0xB4, 0x97, 0x2, 0x58, 0x49, 0x3, 0xE7, 0x94, 0xA8, 0x4, 0x28, 0x31, 0x39, 0x29, 0x6, + 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x89, 0x5, 0x28, 0xE1, 0x84, 0x83, 0x29, 0xC, 0xE6, 0xA0, 0xAA, + 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x5, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x5, + 0x28, 0xE5, 0x8D, 0x94, 0x29, 0xF, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, + 0x83, 0xA7, 0xE3, 0x83, 0xB3, 0x3, 0xE6, 0x88, 0xB6, 0x2, 0xD0, 0xB0, 0x4, 0xD8, 0xB6, 0xD8, 0xB1, + 0x4, 0xD9, 0x83, 0xD9, 0x89, 0x3, 0xE5, 0xB7, 0xA5, 0x3, 0xE5, 0x8D, 0x84, 0x2, 0x33, 0x36, 0x4, + 0x36, 0xE6, 0x9C, 0x88, 0x2, 0x38, 0x2E, 0x6, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x89, 0x4, 0xD8, 0xB0, + 0xD9, 0xB0, 0x3, 0xE5, 0xB0, 0xA2, 0x3, 0xE5, 0xA4, 0x8A, 0x4, 0xD8, 0xB4, 0xD9, 0x87, 0x4, 0x28, + 0x31, 0x36, 0x29, 0x2, 0xC9, 0xB8, 0x2, 0xD0, 0xB8, 0x2, 0x32, 0x37, 0x3, 0xE8, 0xBB, 0x8A, 0x1, + 0x2F, 0x5, 0x28, 0xE6, 0x97, 0xA5, 0x29, 0x5, 0x31, 0x30, 0xE6, 0x97, 0xA5, 0x4, 0x30, 0xE7, 0x82, + 0xB9, 0x2, 0xCA, 0x8C, 0x6, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xA9, 0x3, 0xE9, 0x87, 0x8C, 0x5, 0x32, + 0x33, 0xE7, 0x82, 0xB9, 0x6, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE9, 0xAC, 0xAF, 0x3, 0xE3, + 0x82, 0xA9, 0x3, 0xE7, 0x88, 0xBF, 0x5, 0x28, 0xE1, 0x84, 0x87, 0x29, 0x6, 0xE0, 0xBB, 0x8D, 0xE0, + 0xBA, 0xB2, 0x4, 0xD9, 0x8A, 0xD9, 0x89, 0x12, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, + 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x2, 0xCB, 0x90, 0x3, 0xE4, 0xB8, + 0x8A, 0x4, 0xD9, 0x8A, 0xD8, 0xB2, 0x4, 0xF0, 0x9D, 0xBC, 0x85, 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, + 0x8A, 0x3, 0xE3, 0x83, 0x83, 0x1, 0x3E, 0x4, 0xD8, 0xA8, 0xD9, 0x8A, 0x9, 0xE3, 0x80, 0x94, 0xE5, + 0x8B, 0x9D, 0xE3, 0x80, 0x95, 0xC, 0xE3, 0x82, 0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, + 0x83, 0xBC, 0x3, 0xE5, 0x86, 0x8D, 0x3, 0xE1, 0x85, 0x87, 0x6, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, + 0x2, 0xCF, 0x9D, 0x3, 0xE1, 0x85, 0x8C, 0x4, 0xD8, 0xA8, 0xD9, 0x86, 0x5, 0x31, 0x32, 0xE6, 0x9C, + 0x88, 0x3, 0x20, 0xD9, 0x8B, 0x8, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x3, 0x20, 0xCC, + 0x8A, 0x8, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x29, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, + 0x86, 0x2, 0xC6, 0x90, 0x2, 0xD2, 0xAF, 0x3, 0xE7, 0x9F, 0xA2, 0x2, 0x31, 0x36, 0x3, 0xE3, 0x82, + 0xA5, 0x5, 0x28, 0xE1, 0x84, 0x8E, 0x29, 0x4, 0xD9, 0x81, 0xD8, 0xAE, 0x3, 0xE1, 0x83, 0x9C, 0x3, + 0xE3, 0x82, 0xA1, 0x2, 0x6D, 0x62, 0x5, 0x28, 0xE1, 0x84, 0x85, 0x29, 0x8, 0xD9, 0x85, 0xD8, 0xAD, + 0xD9, 0x85, 0xD8, 0xAF, 0x6, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, 0x3, 0xE5, 0x85, 0xA5, 0x3, 0x76, + 0x69, 0x69, 0x4, 0x76, 0x69, 0x69, 0x69, 0x2, 0x47, 0x42, 0x3, 0xE5, 0x88, 0x9D, 0x3, 0xE5, 0x90, + 0xB9, 0x3, 0xE5, 0xA4, 0x95, 0x4, 0xD8, 0xB6, 0xD9, 0x89, 0x3, 0x6C, 0x6F, 0x67, 0x2, 0xC3, 0xA6, + 0x1, 0x7C, 0x2, 0xDB, 0x88, 0x9, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x2, 0xC9, + 0xB6, 0x3, 0x28, 0x54, 0x29, 0x9, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x3, 0xE3, + 0x82, 0x9A, 0x2, 0xC9, 0xAC, 0x2, 0x42, 0x71, 0x3, 0xE5, 0xBE, 0x8C, 0x4, 0x38, 0xE6, 0x9C, 0x88, + 0x4, 0x28, 0x31, 0x35, 0x29, 0x3, 0xE3, 0x80, 0x8E, 0x2, 0x4D, 0x52, 0x5, 0x32, 0x32, 0xE7, 0x82, + 0xB9, 0x3, 0xE8, 0xA1, 0x8C, 0x2, 0xC4, 0xA6, 0x2, 0x63, 0x6D, 0x2, 0x48, 0x56, 0x2, 0x64, 0x61, + 0x3, 0xE7, 0x8E, 0x84, 0x3, 0x28, 0x69, 0x29, 0x3, 0x28, 0x59, 0x29, 0x5, 0x31, 0x32, 0xE7, 0x82, + 0xB9, 0x3, 0xE3, 0x82, 0xA3, 0x4, 0x32, 0xE6, 0x9C, 0x88, 0x9, 0xE3, 0x80, 0x94, 0xE7, 0x82, 0xB9, + 0xE3, 0x80, 0x95, 0x2, 0x35, 0x2C, 0x8, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x5, 0x35, + 0xE2, 0x81, 0x84, 0x38, 0x3, 0xE5, 0x8F, 0x8C, 0x2, 0xCA, 0x83, 0x3, 0xE7, 0xB1, 0xB3, 0x2, 0xD0, + 0xBF, 0x3, 0x20, 0xCC, 0xA8, 0x3, 0xE5, 0xAF, 0xB8, 0x6, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x89, 0x3, + 0xE7, 0xBC, 0xB6, 0x3, 0x20, 0xCC, 0x88, 0x2, 0x6B, 0x56, 0x2, 0xC9, 0xAB, 0x3, 0xE5, 0x84, 0xAA, + 0x3, 0xE7, 0x8A, 0xAC, 0x2, 0x78, 0x69, 0xC, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0x9, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x9, 0xE0, 0xBE, + 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x2, 0x57, 0x5A, 0x2, 0x39, 0x2E, 0x3, 0x28, 0x75, 0x29, + 0x3, 0x28, 0x43, 0x29, 0x3, 0xE9, 0xBE, 0x8D, 0x3, 0xE1, 0x85, 0xB2, 0x3, 0xE8, 0x87, 0xA3, 0x2, + 0x3F, 0x21, 0x3, 0x65, 0x72, 0x67, 0x4, 0xD9, 0x87, 0xD9, 0x85, 0x2, 0xD1, 0x80, 0x3, 0xE1, 0x84, + 0xA7, 0x4, 0x56, 0x49, 0x49, 0x49, 0x3, 0xE9, 0xB9, 0xBF, 0x3, 0xE1, 0x84, 0x94, 0x3, 0x28, 0x52, + 0x29, 0x2, 0xC9, 0x99, 0x4, 0x32, 0xE7, 0x82, 0xB9, 0x2, 0x6B, 0x57, 0x3, 0xE8, 0x89, 0xB8, 0x3, + 0xE5, 0x8D, 0x85, 0x6, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, + 0xAC, 0x2, 0x33, 0x32, 0x3, 0xE1, 0x86, 0x94, 0x3, 0x28, 0x77, 0x29, 0x5, 0x31, 0xE2, 0x81, 0x84, + 0x39, 0x5, 0x28, 0xE4, 0xBA, 0x94, 0x29, 0x2, 0xC9, 0x98, 0xC, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x4, 0x37, 0xE6, 0x9C, 0x88, 0x2, 0x48, 0x67, 0x2, 0xC9, 0xA8, + 0x6, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x3, 0xE1, 0x86, 0x85, 0x3, 0xE5, 0xBD, 0xB3, 0x5, 0x28, + 0xE4, 0xBB, 0xA3, 0x29, 0x3, 0x28, 0x73, 0x29, 0x3, 0xE6, 0xB0, 0x8F, 0x8, 0x28, 0xE1, 0x84, 0x90, + 0xE1, 0x85, 0xA1, 0x29, 0x8, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x3, 0x28, 0x7A, + 0x29, 0x3, 0xE8, 0x80, 0x81, 0x5, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x3, 0xE5, 0xAE, 0x97, 0x6, 0xD9, + 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE1, 0x86, 0x92, 0x2, 0x47, 0x79, 0x2, 0x31, 0x32, 0x6, 0xE1, + 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x2, 0xCA, 0x8E, 0x2, 0x35, 0x2E, 0x3, 0x6B, 0xCE, 0xA9, 0x2, 0xCA, + 0xA6, 0x4, 0xD8, 0xAA, 0xD9, 0x87, 0x3, 0x20, 0xCC, 0xB3, 0x12, 0xE3, 0x83, 0x9F, 0xE3, 0x83, + 0xAA, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x2, 0x4D, 0x57, + 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x3, 0xE3, 0x80, 0x8B, 0x3, 0x28, 0x71, 0x29, 0x3, 0xE1, + 0x86, 0x84, 0x4, 0xCE, 0xA5, 0xCC, 0x88, 0x6, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x3, 0xE7, 0x94, + 0x98, 0x3, 0xE1, 0x85, 0xAB, 0x5, 0x20, 0xCC, 0x88, 0xCC, 0x80, 0xF, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x2, 0x6C, 0x6D, 0x3, 0x6D, 0x6D, + 0x33, 0x3, 0xE5, 0x8F, 0x88, 0x2, 0xC9, 0xAF, 0x1, 0x7E, 0x4, 0xD9, 0x8A, 0xD9, 0xB4, 0x12, 0xE3, + 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0xA0, 0x2, 0x34, 0x33, 0x3, 0xE8, 0x99, 0xAB, 0x6, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x89, 0x2, 0x52, + 0x73, 0x2, 0x32, 0x36, 0x3, 0x64, 0x6D, 0x32, 0x3, 0xE9, 0xB9, 0xB5, 0x3, 0xE8, 0xB3, 0x87, 0x2, + 0xCA, 0x90, 0x3, 0xE6, 0x96, 0xB9, 0x3, 0x20, 0xD9, 0x8E, 0x3, 0xE2, 0x97, 0x8B, 0x3, 0xE8, 0xBE, + 0x9B, 0x3, 0x6B, 0x6D, 0x33, 0x2, 0x6D, 0x56, 0x3, 0xE7, 0x9B, 0xAE, 0x8, 0x28, 0xE1, 0x84, 0x80, + 0xE1, 0x85, 0xA1, 0x29, 0x3, 0x72, 0x61, 0x64, 0x2, 0xC2, 0xAC, 0x6, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, + 0x89, 0x3, 0xE5, 0xA4, 0x9C, 0x5, 0x28, 0xE8, 0x87, 0xAA, 0x29, 0x3, 0x66, 0x66, 0x69, 0x6, 0x31, + 0xE2, 0x81, 0x84, 0x31, 0x30, 0x3, 0xE3, 0x80, 0x88, 0x3, 0xE9, 0xBB, 0xBD, 0xF, 0xE3, 0x83, 0x98, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x3, 0x31, 0x36, 0x2E, + 0x3, 0x63, 0x6D, 0x33, 0x9, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x3, 0xE3, 0x80, + 0x90, 0x2, 0xCA, 0x91, 0x5, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x2, 0xC9, 0x9B, 0x5, 0x28, 0xE4, 0xB8, + 0x89, 0x29, 0x4, 0xD8, 0xBA, 0xD9, 0x8A, 0x2, 0xCA, 0x82, 0x3, 0xCE, 0xBC, 0x6D, 0x3, 0xE6, 0xAE, + 0xB3, 0x12, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xAD, 0x3, 0x64, 0x6D, 0x33, 0x3, 0xE2, 0x86, 0x92, 0x6, 0xD9, 0x86, 0xD8, 0xAC, + 0xD9, 0x89, 0x6, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x2, 0x69, 0x78, 0x3, 0xE1, 0x84, 0xB6, 0x2, + 0xCB, 0x91, 0x3, 0xE1, 0x87, 0xB1, 0x4, 0xD9, 0x88, 0xD9, 0xB4, 0x4, 0xD9, 0x80, 0xD9, 0x91, 0x3, + 0xCE, 0xBC, 0x57, 0x3, 0x28, 0x6B, 0x29, 0x3, 0xE5, 0x9B, 0x97, 0x2, 0xC9, 0xA2, 0x3, 0x28, 0x70, + 0x29, 0x4, 0x37, 0xE6, 0x97, 0xA5, 0x4, 0xD9, 0x80, 0xD9, 0x92, 0x3, 0xE8, 0xA1, 0xA3, 0x3, 0xE7, + 0x89, 0x9B, 0x5, 0x31, 0x31, 0xE7, 0x82, 0xB9, 0x2, 0xC9, 0xB2, 0x3, 0xE9, 0x9A, 0xB6, 0x3, 0xE6, + 0xAF, 0x94, 0x3, 0xE7, 0xA9, 0xB4, 0x2, 0x4C, 0x4A, +}; + +static const __swift_uint32_t _swift_stdlib_nfkd_decomp_indices[3812] = { + 0x1D45, 0xDEEB7, 0x18FBE3, 0x25F216, 0x3432B4, 0x40FB98, 0x4C2113, 0x55D4DA, 0x5C2F37, 0x6C33D6, + 0x7CFC9B, 0x98FD7E, 0xB4315D, 0xC5EE6D, 0xD1D6B1, 0xDC1E9B, 0xEC32EE, 0xFC1D5E, 0x109D5AE, + 0x1103296, 0x121D737, 0x12DF245, 0x1542F72, 0x1642EF3, 0x175D615, 0x17DD634, 0x184FC7E, 0x1982F4A, + 0x1A8FB91, 0x1B42F70, 0x1C4FFA9, 0x1D4FB01, 0x1E02090, 0x1E9D4F4, 0x1F1F242, 0x219D637, 0x175D40D, + 0x22033F4, 0x239D40C, 0x240FF35, 0x2490789, 0x254217E, 0x25C1D78, 0x26833A9, 0x275D595, 0x27DF114, + 0x198328D, 0x21824E5, 0x28CFE9E, 0x299D7B1, 0x17C017F, 0x2A4FE63, 0x2ACFEA3, 0x255D521, 0x2B81DA3, + 0x2C42F4D, 0x2D5D5B0, 0x2DDD4F3, 0x239D5E0, 0x2E4FC48, 0x2F82F63, 0x309D464, 0x3103313, 0x35CFFCA, + 0x36C3348, 0x3A0FFDA, 0xC5EE0D, 0x3B0FF7B, 0x3C1D7E9, 0x3C832A8, 0x3D8FFA4, 0x3E8FDAB, 0x404FD7A, + 0x420FE49, 0x431D690, 0x438FC75, 0x255D5F1, 0x44C24B4, 0x1E9D458, 0x45C2F69, 0x46DD419, 0x4742081, + 0x47CFB6D, 0x488FCB2, 0x49CFC2A, 0x4B0217F, 0x4B8328C, 0x4C9D502, 0x4D0336A, 0x4E9F127, 0x184FC35, + 0x4F9D553, 0x500FFC5, 0x510FCC8, 0x525D642, 0x52C3395, 0x53DD70F, 0x1741D3A, 0x549D7C9, 0x554FFE6, + 0x564216B, 0x4DD529, 0x575D507, 0x57CFCA9, 0x5903192, 0x5A0FB89, 0x5ACFF1A, 0x5B5D747, 0x5C02FBA, + 0x5D03393, 0x5E1E035, 0x5EDF21C, 0x5FC3183, 0x60CFFBC, 0x61C33E7, 0x63001CB, 0x63C3207, 0x655D75D, + 0x660329B, 0x670330E, 0x6A42474, 0x6B5D6ED, 0x6C033D1, 0x6CDD7C0, 0x6D81DB9, 0x6E4FD1D, 0x6F832D2, + 0xC4FEE7, 0x7083320, 0x749F14F, 0x755D7F9, 0x75DD415, 0x7642F16, 0x77400BA, 0x28CFE9F, 0x77DEEB3, + 0x788FF21, 0x790FD52, 0x7AC24CC, 0x7B43298, 0x7C5D6EA, 0x7D1D453, 0x7D8FCF7, 0x7ECFF52, 0x7F5EE84, + 0x77CFEAE, 0x800FD5C, 0x1C43263, 0x81C02E0, 0x828FD93, 0x845EE71, 0x8502FD5, 0x861D72E, 0x86DD584, + 0x241D61C, 0x874FF61, 0x884FCCA, 0x898FDB2, 0x844FEBC, 0x8B4FC2D, 0x8C8FECF, 0x8D5F237, 0x8E4249C, + 0x8F432FA, 0x905D5A4, 0x90CFC9E, 0x921D6F9, 0x92DD69A, 0x2D5D478, 0x935D6AA, 0x941D6CF, 0x94CFD11, + 0x961D78D, 0x96DF240, 0x9942F7E, 0x46C24CF, 0x9A5D4FD, 0x9AD07B7, 0x9B8FFE3, 0x47400B9, 0x549D745, + 0x9C9D64D, 0x55D5DE, 0x9D0327D, 0xA05D405, 0xA0C1DB7, 0xA18246C, 0x55F13A, 0xA24FF33, 0xA2CFF66, + 0xA3CFDB6, 0xC5EE2D, 0xA58326A, 0x7D1D5F3, 0xA683217, 0x6B5D6B3, 0xA8C1D9D, 0xA98333C, 0xACC3355, + 0xAE8323B, 0x86DD4E8, 0x4C9D49A, 0x1E81D4F, 0xB00335F, 0xB1401CC, 0xB20FFD5, 0xB30FC14, 0xB443184, + 0xB54FD3B, 0xB69D73A, 0xB75EEB6, 0xB81D575, 0xA25D54A, 0xB88202F, 0xB91D540, 0xB99F233, 0xBA9D691, + 0x309D59C, 0xBB1E050, 0xBBD0790, 0xBC82484, 0xBDDD66A, 0xB74FE99, 0xBE41FDF, 0xBFD07B0, 0xC0DE045, + 0xC18FDC6, 0xC34FD85, 0xC50FE5E, 0xC600EDD, 0xC7C33A0, 0xC8C32AC, 0xC9D078A, 0xCA83343, 0xB75EE76, + 0xCDDD6D9, 0x9C9D445, 0xCE9D765, 0xCF4FBA0, 0xD003171, 0xD11EE1F, 0xD1DD67F, 0xD243149, 0xD34FD72, + 0xD50FB22, 0xD5DD7CE, 0xD641FFE, 0xD743228, 0xD8DD7EA, 0xD95F230, 0x4B1D4F6, 0x4F9D44F, 0xBA8210E, + 0x861D7A2, 0x54FF2B, 0x274FF50, 0x8C9EE7B, 0xB882001, 0xDA4FCAF, 0xDB8316F, 0x6602F25, 0xDC83208, + 0xB882004, 0x525D5A6, 0xDE03300, 0xE21D6A3, 0xE2907A9, 0xE343265, 0xE442FAB, 0x9C9D619, 0xE54FF6A, + 0xE641D68, 0xE70FD97, 0x789D608, 0xE8CFC73, 0xEA0FE32, 0xEB0313B, 0xEC1D6F7, 0xECCFD67, 0xEE9EE09, + 0xEF42496, 0xA05D641, 0x109D4AA, 0xF042F8E, 0xF1432CA, 0xF2C32A7, 0xF3CFC71, 0xF51D41C, 0xF583367, + 0xF703162, 0x46DD689, 0x8C8FECE, 0xF81D6B6, 0x4C9D63A, 0x92DD492, 0xF8C33AB, 0xF9C2F4B, 0xFACFF22, + 0x2981DBF, 0xFB4FD22, 0xFC82F79, 0xFD9E03A, 0xFE4320B, 0xFFDD728, 0x40FB99, 0x1009D413, + 0x10100F77, 0xD8DD7E0, 0x1039D76C, 0xA05D60D, 0x104432A2, 0x1054FE4D, 0xDEE17, 0xA25D5B2, + 0x105CFDF1, 0x10783150, 0xA25D682, 0x108802D8, 0x1098FD83, 0x10B43247, 0x10C42F61, 0x10D401F1, + 0x10E02F32, 0x574216E, 0x10F1D789, 0x1100FB56, 0x110DEE9A, 0x1118FF82, 0x1128334D, 0x241D54C, + 0xF51D5BC, 0x775D630, 0x4DD5F9, 0x75DD5E9, 0x115CFB78, 0x11682169, 0x4DD591, 0x75DD4E5, 0xBDDD602, + 0x1170FD14, 0x755D7E5, 0x1185D526, 0x118C203C, 0x1198FDF3, 0x11BCFF08, 0x11C4FB53, 0x11D0FC63, + 0x11E8319F, 0xB81D4A5, 0x75DD685, 0x17CFF53, 0x11F8FD92, 0xB91D408, 0x1214FEB6, 0x1220FB13, + 0x1235D77B, 0x12402F0C, 0x109D64A, 0x125032F2, 0xFADD609, 0x934213E, 0x575D60B, 0x12603304, + 0x12A000BE, 0x12B8FE97, 0x7ACFF37, 0x75DD519, 0x12C43189, 0x844FEBA, 0x12D4FF78, 0x12E4FC51, + 0x12F82102, 0x1301D569, 0xFDD7AC, 0x1308FF97, 0x131833D5, 0x1329D760, 0x510FCEC, 0x13343290, + 0x1344FCBD, 0x1358FE64, 0x845EE91, 0x1360FD9F, 0x137C3220, 0x1394FBA6, 0x13A0FDB5, 0x13BCFC53, + 0x13D0FD76, 0x13EC3137, 0x13FCFD2A, 0x1410FC23, 0x14242469, 0x1430FE8C, 0x655D6B9, 0x1445F241, + 0x146CFFA0, 0x147CFF99, 0x148C339C, 0x14982075, 0x14A1D734, 0x14AC2057, 0x14E1D6A5, 0x14ED079E, + 0x941D77D, 0x14F81FDD, 0x1185D4F2, 0x1510FF5F, 0x1521F23B, 0x1530FFE5, 0x153C3251, 0x15483344, + 0x1570FBD8, 0x775D52C, 0x157CFED6, 0xEE9EE29, 0x1589D6B5, 0x159433FE, 0x15ACFCF1, 0x15C0FE14, + 0x15C83269, 0x15D9F14C, 0x15E432BA, 0x15F0FFD3, 0x1600FCCE, 0x16142FA3, 0x4B1D696, 0xD942F9B, + 0x53DD7BD, 0x1214FEB5, 0x7C5D798, 0x1624323A, 0x1300FF58, 0x905F134, 0x163DD721, 0x1648FDC3, + 0x1665F210, 0x1674317F, 0x1685EE8C, 0x16903383, 0x169CFE80, 0x16A82F87, 0x16B82112, 0x16C0FE84, + 0x16D4FF3C, 0x4F9D4EB, 0x16DC215F, 0x1170FCF8, 0x16F0FBA4, 0x9A5D669, 0x1704FD0D, 0x17183253, + 0xB81D541, 0x1724FBD4, 0x1731EE0F, 0xE201DBB, 0x173C2F17, 0x174C2034, 0x75C2C7D, 0x3C1D7DF, + 0x17750788, 0x7D1D68F, 0x1784FFAA, 0x109D512, 0x17943218, 0x46DD4E9, 0x17B9E052, 0x17DD42C, + 0x17C5D6E3, 0x17D0337B, 0x17EDEE03, 0x17F8208B, 0x1808331D, 0x18302487, 0x1845D73F, 0x1850FBE4, + 0x185CFF89, 0x186CFEFC, 0x2ACFEA2, 0x9042130, 0x1880322A, 0x1185D692, 0x1898FC33, 0x18AC2FCE, + 0x18BC335C, 0x1235D6CD, 0x18D0AB5D, 0x18E1EE4E, 0x18EDF12D, 0x18F83156, 0x1908FCA6, 0x961D7C7, + 0x191C02B6, 0x1928FC3E, 0x193C2F07, 0x194C3295, 0x195CFFA2, 0x196C207A, 0x1974FDA7, 0x7D8FD13, + 0x1990FB74, 0x199CFCBA, 0x19B01DA9, 0x9C9D681, 0x4F9D587, 0x1169F147, 0x19BC314D, 0x19CC3293, + 0x19DCFC87, 0x19F03342, 0x4DD4F5, 0x1A182F01, 0x12F9D49E, 0x7D1D58B, 0x1A28FD1F, 0xDA4FC1E, + 0x1A3C2F89, 0x4DD425, 0x1A4CFD6A, 0x1A682FB3, 0x1A782F46, 0x1A881FDE, 0x1AA032D6, 0x1AB0339F, + 0x1AC0FB9C, 0x9B800AF, 0x9A4FF54, 0x1ACC1DA2, 0xB80FF2A, 0x1AD82F98, 0x1AE8FE3C, 0x1AF8FFB0, + 0x1B083225, 0x1B203359, 0x309D5D0, 0x1B342FCD, 0x961D753, 0x110CFEC6, 0x2D5D57C, 0x2D5F140, + 0x1B44FC36, 0x9C8211B, 0x1B58FD8F, 0x2401D41, 0x1B74FC69, 0x1B91EE05, 0x1B9C329F, 0x1BAC246D, + 0x1BB9EE81, 0x1BC4FE5B, 0x275D665, 0x1BCDF201, 0x1BE8FCA0, 0x1BFC33EB, 0x1C142F3A, 0x1C25D7AF, + 0x1C302121, 0x874FE12, 0x274209A, 0x905D60C, 0x1C41D6D0, 0x1C4C2F71, 0x255D451, 0x1C5C2074, + 0x1C64FB7E, 0x1C702FD0, 0x1C81FBF6, 0x1C89EEB8, 0x1C942F31, 0x4F9D4B7, 0x905D5D8, 0x1CA432F9, + 0x1CB42FAF, 0xD1DD443, 0x4C02E1, 0x46DD4B5, 0xB81D645, 0x1CC507AA, 0x1CD0FE88, 0x16B9D40B, + 0x1E9D62C, 0x525D4A2, 0x1CE5D6A8, 0x1CF02161, 0x9A5D599, 0x1CFCFE79, 0x3C1D7D5, 0x1D11D4F7, + 0x1D18FC97, 0x1C25D73B, 0x2F9F222, 0xE65D6E0, 0x1D3433FA, 0x7542083, 0x299D6C9, 0x195C3132, + 0x1D4C3204, 0xB91D610, 0x1D642154, 0x1D7C2037, 0x1DA432F7, 0x1DB5D71F, 0x4C9D536, 0x1DC02F99, + 0x1DD024A1, 0x175D579, 0x1DE02F68, 0x1DF02F2C, 0x1E0032AF, 0x1E11D766, 0x1E1C33C1, 0x157DEE12, + 0x14982464, 0x431D488, 0x18E1EE0E, 0x1E2CFC15, 0x219D59B, 0xF51D450, 0x1E401D44, 0x1E4C33D9, + 0x1E5CFC22, 0x1E70FF84, 0x1E80FCA2, 0x7EC02B3, 0x1E95D7BC, 0x1EA0FF20, 0x1EA9F11E, 0x1201D5D, + 0x1EB9E041, 0x1EC4FC2B, 0x541D37, 0x1ED9F219, 0x1EE801C9, 0xB69D6C6, 0x2D5D5E4, 0x1EF432A5, + 0x1F05F110, 0x1F14313C, 0x1E1D622, 0x1F25E058, 0x1F303333, 0x1F64FF81, 0xB74FE9B, 0x17B9E031, + 0x1078FFC3, 0x309D568, 0x549D6E1, 0xC4FEE6, 0x8C9EEBB, 0xD1C2119, 0x1F7433F5, 0x47CFB6A, + 0x431D4F0, 0x1F8C1FBF, 0xA05D675, 0xC4FEE5, 0x1F9D079C, 0x1FB033AE, 0x17C02E2, 0x941D709, + 0x1FD1EE6A, 0x1FDC338F, 0x961D711, 0x46DD44D, 0x30824E6, 0x309D4CC, 0x1FE8329A, 0x1FF83283, + 0x20082F6B, 0x2019F21A, 0x20282FA7, 0x7ADD4E6, 0x219D4FF, 0x203824A8, 0x574FF24, 0x2049D7A4, + 0x2054FC61, 0x206C3154, 0x241D414, 0x86CFF39, 0x207CFDF8, 0xB69D716, 0x20A1F190, 0x20AC2F3C, + 0x20BDD739, 0x20C8FB85, 0x7EC24E1, 0xFDD772, 0x275D699, 0x7EDD563, 0x20D5F11A, 0x20E4FB06, + 0x1E9D528, 0x1D11D52B, 0x20F02489, 0x20FC1DA8, 0xDA4FD36, 0x21083250, 0xD1DD513, 0x2118FC8C, + 0x18E0FEB2, 0x212C3361, 0x21403299, 0x7ADD4B2, 0x2150FBDA, 0x215C2F7D, 0x216C33B1, 0xCE9D6F1, + 0x2179E043, 0x218433F1, 0x219C3327, 0x21B8FF79, 0x4CFF4C, 0x21C8FCFC, 0x16B824C1, 0x21DCFB15, + 0x21F0335B, 0x2D4211A, 0x2204FDF9, 0x2221D7EE, 0x222907A4, 0xCDDD713, 0x22343302, 0x2274FD25, + 0x4F9D5BB, 0x186CFEFB, 0x239D5AC, 0x228833FF, 0xB902111, 0x22982E9F, 0x22A9D702, 0x22B5EE30, + 0x1215EE34, 0x22C02FA1, 0x22D02F29, 0x22E02F5F, 0xB8024BF, 0x905D674, 0x7742134, 0xF70FFDB, + 0x1184FF49, 0x22F10796, 0x22FCFF01, 0xA0424BB, 0x230432F4, 0x2314FFCC, 0x1B90FEEE, 0x23243317, + 0x2364247E, 0x237833E2, 0x55D646, 0x7D1D41F, 0x22A9D73C, 0x92DD666, 0x7F4FEEA, 0x238CFC19, + 0x23A0335D, 0x309D66C, 0x23B4FDBD, 0x15C0FE54, 0x7C5D6B0, 0x55D472, 0x23D1D706, 0x23DC332B, + 0x2428212F, 0x549D78F, 0x2430FB25, 0x789D504, 0x243C2122, 0xCFEA6, 0x175D67D, 0x2448FF6E, + 0x24583240, 0x24702FD2, 0x655D6AF, 0x961D785, 0x24803349, 0x249C33DC, 0x24A8319C, 0x24B8FB5E, + 0xBA9D559, 0x24C43346, 0x24EC2F05, 0x24FCFF72, 0x250C33E0, 0x6B5D79B, 0x57CFC17, 0x2520FC24, + 0x575D5D7, 0x25341DBE, 0x2540FD5F, 0x255CFEC2, 0x256832DC, 0x255D625, 0x1C5CFF14, 0xB69D78A, + 0x3D83261, 0x1845D7C6, 0x22A9D776, 0x789D434, 0x789D5A0, 0x175D649, 0x2579E03B, 0x2584FC99, + 0x25A03318, 0x25D42F26, 0xB81D5DD, 0x775D594, 0xD1DF13F, 0x25E4FB62, 0x25F1D788, 0x25FCFB02, + 0x309D534, 0x2D5D4AC, 0x4C217C, 0x11842170, 0x9C9D5E5, 0xD1DD477, 0x26082FA2, 0x12F9D46A, + 0x2618FCA4, 0x262C3194, 0x263CFB21, 0x5241D33, 0x26481DB0, 0x26543376, 0xB69D7C4, 0x2660FE31, + 0x2670FE71, 0x2684322D, 0x269C3278, 0x28DEEA2, 0x1214FEB7, 0xD1DD57B, 0x4B1D5FA, 0xD1DD64B, + 0x26B8FF1D, 0x1B91EE85, 0x222000B2, 0xB88205F, 0x26C0FEF6, 0x26DC32FD, 0x26ECFC01, 0x27083272, + 0x2724FBEC, 0x46DD481, 0xD1D75F, 0xB91D470, 0x12F9D436, 0x9C9D411, 0x4B1D62E, 0x2740FC50, + 0x27542F74, 0x27642FBB, 0x4B1D4C2, 0x27740140, 0x2785E04B, 0x255DEEA8, 0x17DD4FC, 0x27902F14, + 0x27A033DE, 0x157DEEB2, 0x163DD6E7, 0x9C8211D, 0x7D01DA0, 0x24024CA, 0x27B801C4, 0xE21D49B, + 0x27CCFCC6, 0x1C88FEAC, 0x4B0FF4D, 0x27E0215E, 0x27F8FD0C, 0x280D0787, 0x28181D3D, 0x241D4E4, + 0x309D498, 0x2824FC0D, 0x1D10FF4E, 0x2838FDF6, 0x1E1D552, 0xB91D574, 0x1E1D44E, 0x285D07AF, + 0x2868FFAD, 0x28782A76, 0x2889D407, 0x2891F218, 0x28A02168, 0x28AC1DA6, 0xBA9D4BD, 0x28B8FD8A, + 0x28D4FE17, 0x75C2164, 0x12B9EE15, 0x28E4FCAD, 0x935D6E4, 0x28F8330A, 0x7EDD667, 0x292033EC, + 0x275D561, 0x29382F9D, 0x1100FB59, 0x2949F228, 0x9C8211C, 0x29580133, 0x23143157, 0x29642F57, + 0x29743210, 0x2998FE85, 0x29AC247F, 0x1009D4E3, 0x29C0318A, 0xE21D4CF, 0x77424DE, 0x655D6F3, + 0xCF4FBA2, 0x29D0FD1B, 0x29E4FF60, 0x1784313A, 0x29F5D74A, 0x2A01F11B, 0x2A10325D, 0x2540FD60, + 0xBDC24E4, 0x2A1CA7F9, 0x2A283234, 0x2A40FC3F, 0x2A543166, 0x115CFB76, 0x1BB8FE90, 0x2A64FE3D, + 0x2A743255, 0x2A801D46, 0xD5C2070, 0x525F136, 0x1E11D6B8, 0x2A903185, 0x2889D573, 0x2AA0319B, + 0x2181D5B, 0x2AB0FE18, 0xBDCFF55, 0x2AC0FCD2, 0x549D71B, 0x175D5AD, 0x2AD4FD1C, 0x1100FB57, + 0x12B8FE98, 0x2AE832BE, 0x299D7C5, 0x2AF4AB5C, 0x775D664, 0x2B04316A, 0x2B142F39, 0x844FEBB, + 0x2B241DA1, 0x16B9D543, 0x2B3033E5, 0x255D4B9, 0x2B45F238, 0x2B543267, 0x1731EE6F, 0x2B64FC9D, + 0x2B783310, 0x2BACFC54, 0x2BC03143, 0x2BD02FBE, 0x16B9D50F, 0x2BE03391, 0x94CFCF5, 0x2BF1D778, + 0x2BFDF125, 0x2C0CFFAF, 0x6B5D761, 0x2C1CFE78, 0x524FF27, 0x1C5DFBF4, 0x2C2C3036, 0x53DD749, + 0x2C3C2477, 0x2C4C3198, 0x2C5C33CE, 0x175D4A9, 0x2C682FAD, 0x2C782F53, 0x2C88330F, 0x2150FBD9, + 0x2CBC247B, 0x2CCDE057, 0x1E1D656, 0x55D4A6, 0x2CD83245, 0x22A9D7B0, 0x17DD564, 0x22B5EE70, + 0x2CE801C5, 0x2CFC2F1D, 0x1E024D0, 0x2D0C2473, 0x2D18FB69, 0x4F9D623, 0x2D243366, 0x2D3C32A3, + 0x1E9D4C0, 0xDEE97, 0x2D4CFD20, 0x2D6033A2, 0x2D7032C2, 0x905D4D4, 0x2D842120, 0x2D90FD3D, + 0x2DA43351, 0xB882000, 0x2DD82F92, 0x7ADD47E, 0x475D7F7, 0x2DE83167, 0x2DF82F40, 0x2E08FBFB, + 0x275D45D, 0x255D68D, 0x2E24FFD2, 0x2E34FDC2, 0x2E50325B, 0x2E5CFD53, 0x2E79E042, 0x2ACFEA4, + 0x2E843353, 0x2EB8FD95, 0x905D640, 0xCDDD787, 0xB81D409, 0x275D4C5, 0x2ED4318D, 0x2EE4FD6D, + 0x2F01F224, 0x1C25D701, 0x1845D718, 0x2F10FD81, 0x175D475, 0x525D406, 0x28E4FD34, 0x2F2C33CA, + 0x109D67E, 0xC0DE063, 0x2F3802E4, 0x7881D2C, 0x2F44FD61, 0x1D11D62F, 0x11C4FB54, 0x2F602173, + 0x2F6C323E, 0x2F8433B3, 0x2F90FD5B, 0x2FACFEBE, 0x2FB8FDAD, 0x16C0FE83, 0x55D576, 0x2429D556, + 0x905D438, 0x2FD432CF, 0x109D4DE, 0x1235D741, 0x2FE4FE44, 0x9A5D495, 0x2FF433B5, 0x30000677, + 0x3014321B, 0x591F229, 0x30382F4F, 0x90424BA, 0x30482159, 0x3060FB23, 0x306CFE8E, 0x3078FC34, + 0x1BB9EEA1, 0x7ADD686, 0x308CFCC5, 0x1169D4B3, 0x4F9D41B, 0x1E1D5EE, 0x30A0FCD4, 0x30B4334C, + 0xA05D4D5, 0x75400B3, 0x5B5D781, 0xEE9EEA9, 0xBDDD532, 0x30F402DD, 0x31042F13, 0x7D1D4BB, + 0x2ACFEA1, 0xB91D678, 0x2889D677, 0x3114FBF1, 0xA25D446, 0x2221D7E4, 0x3130FE56, 0x1BB8FE8F, + 0x3139F21B, 0x92DD52E, 0x1BB9EE01, 0x31483273, 0x3164327B, 0x31802011, 0x12F8FF23, 0x16642F3F, + 0x3190FDFA, 0xB69D6DC, 0x1C25D6C7, 0x3218215B, 0x32302F97, 0x655D767, 0x10F1D715, 0x3240331E, + 0x28CFE9D, 0x196CFF0B, 0xB88200A, 0x3274326F, 0x196C208A, 0x32902493, 0x1009D57F, 0x548213C, + 0x7EDD52F, 0xEC1D731, 0x1C5DD7D2, 0x32A0FC5A, 0x7ADD5EA, 0x121D6C3, 0x32B4FC7A, 0x32C82F88, + 0x32D8331C, 0x3300FDFB, 0x3341F122, 0x3350FE7C, 0x3360FEF8, 0x238CFCAB, 0x92DD4C6, 0x337DD77C, + 0x338832AB, 0x3398FBDF, 0x33A4FBB1, 0x27F8FD28, 0x33B8FC27, 0x1E2CFCA7, 0x961D719, 0x1009D5E7, + 0x2724FBED, 0x2B54FFB7, 0x33CC332F, 0x1850FBE5, 0x430FF47, 0x3400FFD6, 0x3410FD69, 0x342C3307, + 0x1009D447, 0x3479F22B, 0x275D5C9, 0x34882155, 0x34A1D7F5, 0x1BB8FE92, 0x34A8FCF0, 0x34BC3254, + 0x34C8FEEF, 0x34D42495, 0xF81D6F0, 0x34E42F15, 0x32B4FC13, 0x34F4FC9A, 0x1169D5B7, 0x3511F10A, + 0x351C3163, 0x7EDD493, 0x352C3356, 0x35782475, 0x13FCFD0E, 0x86DD688, 0xBDDD636, 0xF51D68C, + 0x35883311, 0xBA9D5C1, 0xBA824D7, 0x35BC2488, 0x35C82165, 0x2998FE86, 0x35D4319D, 0x2E79E060, + 0x575F133, 0xECFF8F, 0x60C326B, 0x35E5F11D, 0x35F4FFE9, 0x36042F44, 0x1E01D43, 0x1301D605, + 0x36143266, 0x86DD5EC, 0x2DDD62B, 0x1898FCC2, 0x36243319, 0x36703133, 0x1009D517, 0x3360FEF7, + 0xF51D4EC, 0x36802F51, 0x369032A1, 0x36A01DB5, 0x1B74FC04, 0x1724FBD5, 0xFADF131, 0x36ADF111, + 0x36BCFC1A, 0x36D0FDC7, 0x24282147, 0x36EDD6C2, 0x17C24E2, 0x36F9E03C, 0x2429D41E, 0x3704FE74, + 0x3C1D7FD, 0x3715F16A, 0x2BF1D7B2, 0x37201DAA, 0x373032B2, 0x373C2026, 0x1928FC84, 0xDEE77, + 0x1DB5D6E5, 0x1C81D7FC, 0x1169D54F, 0x374C317A, 0x22FCFE57, 0x375C2106, 0x376C3382, 0xC5EE4D, + 0x377C334B, 0x37A507AE, 0x26B8208C, 0x37B0337A, 0x255D41D, 0x37BC1FCF, 0x37D5D735, 0x7ADD54E, + 0x37E4331F, 0x2B543147, 0x431D524, 0x3818FF7F, 0x3828FF5D, 0x38303357, 0x3858FE40, 0x3868FFA1, + 0x2429D522, 0x38790795, 0x3884FD5E, 0x38A02109, 0x12F8216D, 0x2542146, 0x38B0FD82, 0xF51D588, + 0x38CC3236, 0x1D11D48F, 0x4742460, 0x430210A, 0x7EDD45F, 0x431D558, 0x38E41DB8, 0x38F4215C, + 0x5E1E056, 0x390C3169, 0x11842071, 0x391DF109, 0x3928FCD3, 0x393C2499, 0x1169D44B, 0x394CFB8C, + 0x3958FF90, 0x2889D4D7, 0x3969E03F, 0x3974332D, 0x1168FF38, 0x1C89EE98, 0x219D533, 0x2DCFF4A, + 0x12F9D4D2, 0x39B4FF0A, 0x39BC32DF, 0x381832DE, 0x39CCFC42, 0x115CFB79, 0x39E03200, 0xBA9D65D, + 0x39F8337D, 0xF5024D2, 0x3A1433D8, 0x1C64FB81, 0x3A281FCD, 0x3A40FF88, 0x4B1D52A, 0x1DA4FF98, + 0x3A50FF3D, 0x3A580EDC, 0x3A743136, 0x17ECFEAA, 0x2D18FB68, 0x3A840E33, 0x3AA01D9F, 0x3AACFB24, + 0x3AB8325E, 0xE21D503, 0xFADD435, 0x157DEE32, 0x3AC43206, 0x3ADC33CB, 0x3AE8322F, 0xB882007, + 0x2E08FBFA, 0x3B0001F2, 0x263C2135, 0x1009D5B3, 0x30802B7, 0x1B44FC7F, 0x3B0C02D9, 0x17DD460, + 0x3B1C2F02, 0x34C8FBE9, 0x9C9D479, 0xE21D66F, 0x1BC4FE37, 0x1BB9EE61, 0x2D4CFD04, 0x1FD0FEDB, + 0x3B2DF248, 0x845EE31, 0xD1DD5AF, 0x3B543326, 0x3B7C3178, 0x3B8C317B, 0x3B9C24AF, 0xD11EE5F, + 0x3BAC32E5, 0x3BBCFDBA, 0x3BD8FBEA, 0x7EDD4FB, 0x1301D5D1, 0x3BF432B6, 0x5B5D7BB, 0x4C24DB, + 0x3C00213B, 0x34A1D7E1, 0x9A4209C, 0x309D430, 0x2429D486, 0x9A5D42D, 0x39B4FE61, 0x3C0FF17, + 0xD1CFF30, 0x3C1024A3, 0xB81D5A9, 0x255D485, 0x1AF83140, 0x3C2033F8, 0x299D751, 0x3C39E066, + 0x3C44FFB4, 0x3C54FF91, 0x3C642FBC, 0x3C74FB4F, 0x3C88FBEE, 0x275D4F9, 0x3CA5F200, 0x4F8FF42, + 0x3CC10793, 0x157DEE92, 0xB4FFD4, 0x9041D31, 0x3CCC333F, 0x3CE8FD75, 0x3D04FC20, 0x34A8FC58, + 0x3969E05E, 0xD502138, 0x28DEE22, 0x18E1EEAE, 0x3D18FFE8, 0x130024E7, 0x2274FD09, 0x525D4D6, + 0x309D638, 0x3D281D32, 0x3D35D7CA, 0x3D40FCB3, 0x789D56C, 0x3D5507A2, 0x2AD4FD00, 0xFADD401, + 0x3D60323C, 0x3D7803D3, 0x86DF148, 0x2428FF45, 0x3D8CFCDA, 0x3DA0FCD0, 0x2CCDE036, 0x3DB4FD26, + 0x3DC83399, 0x3DD432E6, 0x3DE4FC9C, 0x20BDD6C5, 0x163DD75B, 0x3DF9F117, 0x3E08FD9E, 0x525D46E, + 0x3E2432E4, 0x3E341D9B, 0x3E40FB94, 0x3E4CFF7C, 0x4C9D466, 0x11E82F08, 0x3E5CFF06, 0x3E6507B2, + 0x241D518, 0xD5CFF10, 0x3E70FC90, 0x39CCFCED, 0x549D70B, 0x77CFEAD, 0x92C24E0, 0x3E8433C5, + 0x1F6432E0, 0x3E9000BD, 0x3EA9F115, 0xBDDD5CE, 0x3EB824B1, 0xCFEA8, 0x18FBE2, 0x3EC8322E, + 0x15C0FF1B, 0x3EE0321E, 0x3F1C1FFD, 0x3F2C3332, 0x3F782F56, 0x2221D7DA, 0x754FF13, 0x7F5EE24, + 0xD1DD4AB, 0xE70FD98, 0x7EDD4C7, 0x43024D6, 0x3F882F2E, 0x3F98FCF4, 0x1685EE6C, 0x241D684, + 0x4F81D47, 0x3FB433DB, 0x1E8FF4B, 0x3FC1F23A, 0x12B9EE95, 0x2BF1D6CA, 0x5003152, 0x3FD0FB7A, + 0x10824C4, 0x3FDC2FB9, 0x3FECFD8B, 0x400907B9, 0x34A8FC93, 0x401CFCF6, 0x655D7A1, 0x4031E05A, + 0x403CFE39, 0x28881D34, 0xE65D71A, 0x404C1DA5, 0x4058FF74, 0x40683369, 0x408001CA, 0x241D580, + 0x7741D52, 0x7ADD44A, 0x255DEE08, 0x408C32ED, 0x409C321D, 0x1009D683, 0x40E42485, 0x40F83233, + 0x4110309F, 0x2FACFEC0, 0x2DDD58F, 0x17C5D791, 0xF50FF43, 0xBDC1D64, 0x412D079D, 0x413C33F0, + 0x4154FFE0, 0x1C41D77E, 0x1AC0FB9A, 0xB91D5A8, 0x4160FDB1, 0x417C32BD, 0x418801F3, 0x41941D5C, + 0xE2024E9, 0x41A5F232, 0x41B4FDB3, 0x41D0FB9F, 0x1499FBF5, 0xFB4FD06, 0x41DDF11C, 0x2118FCD5, + 0x92DD45E, 0xA25D412, 0x2049D6BC, 0x41EC222F, 0x1E95D6D4, 0x4208328F, 0x26B8207C, 0x7542462, + 0xBA8FF48, 0x2FADEE59, 0x4218FD39, 0x422CFCDB, 0x42403337, 0x4268338B, 0x1E80FC0C, 0x42742F2D, + 0x42843285, 0xA05D46D, 0x42943301, 0x42C81D54, 0x13002179, 0x42D81D51, 0x306DEE80, 0x1301D535, + 0x42E43177, 0x2889D46F, 0x4C9D59E, 0x42F43229, 0x430CFC74, 0x4321EEA6, 0x3614FFB5, 0xD8DD7FE, + 0x2FADEE99, 0x42082F1F, 0xD1DD5E3, 0x36143145, 0x432C3377, 0x43383151, 0x434833EE, 0xCFEA7, + 0x43602F8A, 0x43703288, 0x3E40FB92, 0x4380FD7F, 0x92DD562, 0x439C2F58, 0x43AC2F10, 0x43BC01C8, + 0x43C83331, 0x43F0333A, 0x12E4FCD7, 0x7742092, 0x27F8FD30, 0x7ADD652, 0x442433EA, 0x443C3258, + 0x1AC0FB9B, 0xBA9D421, 0x44482FC9, 0x4458FD19, 0x446C2FC3, 0x17DD4C8, 0x755D7DB, 0x1169D4E7, + 0xBA9D5F5, 0x110DEEBA, 0x2181D65, 0x447C1FC1, 0x774FF4F, 0x575D673, 0x4495F251, 0x20BC1D5F, + 0x288824BD, 0x44A5E06B, 0xA04FF26, 0x44B00587, 0x44C5F211, 0x44D4FF03, 0x44DCFFCF, 0x1329D79A, + 0x44EC2116, 0x22FCFE15, 0x1054FE4E, 0x44F8321A, 0xCFEA5, 0x451CFC7D, 0x45302F24, 0xA25D47A, + 0x45402F95, 0x34A02079, 0x4551F120, 0x4560FCBF, 0x4575F12A, 0x45942F0F, 0x2FACFEBD, 0x45A4FBFD, + 0x2DDD4BF, 0x7ADD5B6, 0x13002093, 0x10F1D6DB, 0x45B0FD9A, 0x2824FCA3, 0x12B9EEB5, 0x3E70FC5D, + 0xF81D79E, 0x1098FD84, 0x45CC32C8, 0x1E1D4EA, 0x45E107B8, 0xA25D4E2, 0x1EF5F22D, 0x45ECFCE1, + 0x46002230, 0x9C9D57D, 0x905D46C, 0x2429D452, 0x255D5BD, 0x46282033, 0x46442A75, 0x4650FC8D, + 0x466400B8, 0x46742F91, 0x468401C6, 0x24FC32D1, 0x935D71E, 0x4698FCCB, 0x46ADF231, 0x17DD600, + 0x46BDF250, 0x46CCFC37, 0x46E0334F, 0x238216F, 0x575D46B, 0x4709E04C, 0x471433E4, 0x47282F86, + 0x1A8FB8E, 0x47383141, 0x2049D6F6, 0x2660FE58, 0x2D424C6, 0x47482FD4, 0x47581D2D, 0x351CFFDC, + 0x4764330B, 0x1DB5D793, 0x478C3398, 0x430CFC0F, 0x239D474, 0x4799F116, 0x241D47C, 0x47A8316D, + 0xFDD6C4, 0x47B9EE1E, 0x37D5D6FB, 0x1C81D7DE, 0x92D07A5, 0x255DEE68, 0x25F1D714, 0x1CD0FE87, + 0x47C4AB69, 0x174FF2E, 0x47D0FC1B, 0x575D56F, 0xB91D4D8, 0x1F25E037, 0x47E43370, 0xA25D5E6, + 0x1008FF34, 0x5742145, 0xB882005, 0x47FC33E1, 0x11BC208D, 0x4810FCD6, 0x219D5CF, 0x20E4FB05, + 0x482432E9, 0xA25F142, 0x34C8FEF0, 0x4834FF94, 0x4844FF65, 0xEE8FEF2, 0x4854FFE1, 0x4860FE82, + 0x48742F4C, 0x4738FFB1, 0x4884FC62, 0x86DD51C, 0x11841D62, 0xD8DD7F4, 0x489CFF6C, 0x2ADEE07, + 0x4C9D4CE, 0x48ACFD88, 0x2889D643, 0x2BC0FFB3, 0x4860FE81, 0x9A5D531, 0x147C32F8, 0x48C83237, + 0x48E03270, 0x4218FD0B, 0x48FC2163, 0x4908FCAE, 0xE21D607, 0x491C3291, 0x254FF44, 0x12F9D63E, + 0x492DF107, 0x19BCFFBD, 0x493833FD, 0x47CFB6C, 0x241D650, 0x495033CF, 0x495C249D, 0x496C3277, + 0x4908FD35, 0x157CFED7, 0x1C41D7B8, 0x4989E04D, 0x49943275, 0x49B02471, 0x17C5D757, 0x11C4FB55, + 0x7C5D724, 0x49BC330D, 0x49F03173, 0xF81D764, 0x109D57A, 0x2568FF7D, 0x4A00FB17, 0x4A1432B5, + 0x4A20222C, 0x4A3C327C, 0x775D698, 0x4A7DF235, 0x408CFF8E, 0x27CCFC3A, 0xB882009, 0x4A8C2140, + 0x4A9CFCC7, 0x4AB02F6A, 0x1D11D55F, 0x4AC03174, 0x28DEE82, 0x14982085, 0x4AD02172, 0x2221FBF2, + 0x4AE02F85, 0x4AF0FDA9, 0x206CFFC7, 0xE21D63B, 0x4B0C329C, 0x337DD708, 0x4B1CFC38, 0xD24FFB9, + 0xB74FE9C, 0x1DB5D759, 0x12F9D5D6, 0x4B30316E, 0x17C5D71D, 0xA042131, 0x4B402F38, 0x4B50334E, + 0x2D90FD3C, 0x4B84FD08, 0x9C9D4E1, 0x4B983322, 0x4BC0FBF4, 0x4BDC3241, 0x4BF5E06D, 0x2DDD55B, + 0x34F4FC66, 0x4C001DB6, 0x4C0CFE51, 0x4C1DE04A, 0x3878210F, 0x4C2C331B, 0x1D18FC00, 0x1FD0FEDC, + 0x4C60FFC6, 0x4C702F19, 0x1731EE2F, 0x2D4FF31, 0x789F130, 0x24281D49, 0x4C81F226, 0x4C903389, + 0x4CA42F60, 0x4CB5D75C, 0x2888FF28, 0x4CC033BD, 0x255D4ED, 0x4B1D55E, 0x395832EF, 0x4CCCFD79, + 0x4CE833F3, 0x2BF1D704, 0x4D00FDC0, 0xF51D658, 0x12F9F12B, 0x4D1C2492, 0x55D5AA, 0x48ACFD87, + 0x49CFCBB, 0x4D2C3396, 0x1E9D424, 0x4D38FC57, 0x4D4DD72F, 0x2DC2149, 0x4D580675, 0x4D6C2A74, + 0x3A03161, 0x4D7CFFA8, 0x4D8CFD70, 0x262C3282, 0x3E24FF85, 0x16B9D4DB, 0x4DA9F16B, 0x25424D3, + 0x163DD795, 0x4DB4FB70, 0x2AC0FC4B, 0x1185D422, 0x4DC0207E, 0x4DC83368, 0xCE9D6B7, 0x4DE1F246, + 0x6F8FF73, 0x4E082479, 0x1E11D6F2, 0x4E18FC60, 0x4E3033C7, 0x118424D8, 0x4E403338, 0x6B5D727, + 0x4E7433E8, 0x299D703, 0x884FC40, 0x4E88329E, 0x4E99F113, 0x4EA83175, 0x4EB8325F, 0x4EC4FE52, + 0x4ECC33C2, 0x3DD4FF87, 0x4EE03211, 0x1E9D55C, 0x4F0433E3, 0x4F18FF9E, 0x8C8FECD, 0x1730FECC, + 0x4F28FD8E, 0x4F442F7A, 0x9A5D565, 0x46CFF3A, 0x4F542F81, 0x4F64FC91, 0x4F78320A, 0x12B9EE35, + 0x4F90FD2B, 0x4FA43330, 0x4FCCFE7A, 0x4FDC1D53, 0xB91F138, 0x575D49F, 0x4FE82150, 0x50003371, + 0xFADD56D, 0x501032F1, 0xB902110, 0x502032EA, 0x1845D6CB, 0x5031F14D, 0x55D43E, 0x503CFF75, + 0xFFDD762, 0x504CFB5C, 0x11C4FB52, 0x50583276, 0x50743394, 0x50843388, 0x509432AD, 0x50A42FA8, + 0x50B4339E, 0x50C0319E, 0x50D1E044, 0x255D555, 0x33B8FD33, 0x41D0FB9E, 0x1CE5D790, 0x861D6BA, + 0x50DCFDFC, 0x549D6D1, 0x34A1FBF9, 0x51002476, 0x51102FC0, 0x2118FCEE, 0x1185D55A, 0x2EE4FD6C, + 0x5121EE4B, 0x29F5D710, 0x1FD0FED9, 0xE65D7C8, 0x242824D4, 0x504CFB5B, 0x175D441, 0x512C2F41, + 0x513C3385, 0x5148FC65, 0x4F9D657, 0x1185D62A, 0x23D1D740, 0x516507AD, 0x116824CD, 0x5174337C, + 0x51902F77, 0x51A0323D, 0x51B8FF05, 0x5120FEDE, 0x1185D58E, 0xEC1D7A5, 0x51C0317C, 0x3000FBDD, + 0x109F13E, 0x51D0FFC2, 0xBDDD69E, 0x2868313D, 0x655D6E9, 0x51E033ED, 0x75DD61D, 0x51F9E049, + 0x5204A770, 0x2E4FCD1, 0x521433DA, 0x522032A9, 0x1845D6DE, 0x5230215A, 0x5B5D70D, 0x7EDD597, + 0x3E5CFE60, 0x14A1D6C0, 0x219D42F, 0x52480385, 0x1301D6A1, 0x5260FCA1, 0x5275F124, 0x1724FBD6, + 0x52843279, 0x1C802086, 0x52A0FF70, 0x52B0FCAA, 0x52C42FB0, 0x52D4FD02, 0x75DD581, 0x52E8316C, + 0x52F82F7F, 0x1E824DA, 0xB69D774, 0x4B02098, 0x5308FDAA, 0x53242F96, 0x533433F6, 0x29D0FCFF, + 0x2889F137, 0x6CDD786, 0xB901D35, 0x534CFC70, 0x8D4328A, 0x4D38FCDC, 0x53602F34, 0xD5C2080, + 0x53703314, 0x538C32D0, 0x539CFC26, 0x53B03339, 0xE21D433, 0x25F1D6DA, 0x60C314C, 0x4320FEB0, + 0x92DD42A, 0x1039D732, 0x53D8332C, 0x47D0FCAC, 0x540CFFB8, 0x34A1D7D7, 0x541D0794, 0x54283397, + 0x20C8FB84, 0x2ADEE67, 0x1E1D4B6, 0x306DEE00, 0x543432C9, 0x34A8FCDD, 0x544C2175, 0x12F9D402, + 0x1329D6B2, 0x5458247C, 0x54682158, 0x54802F1A, 0x5490FB8A, 0x1D11D697, 0x549C335E, 0x54B03297, + 0x575D63F, 0x54C033C6, 0x1235D707, 0x2DC2C7C, 0x54DCFDC1, 0x54F83186, 0x5508AB5F, 0x5518FCB0, + 0x552DF214, 0x1169D61F, 0x553CFDA8, 0x55582F67, 0x5568FB00, 0x196CFE62, 0x5574FFB6, 0x55842F9A, + 0x2FADEEB9, 0x55941D59, 0x255DEE88, 0x55D50E, 0x309D6A0, 0x1845D705, 0x115CFB77, 0x1C25D775, + 0xD5DD7F6, 0x55A4FCB7, 0x55B8FBF3, 0x55D432CE, 0x905D570, 0x1215EE14, 0x55E1F236, 0x55F02F8C, + 0x55D542, 0x299D777, 0x3CE8FDC4, 0x39BCFF80, 0x5600325A, 0x5010FF92, 0x239F13C, 0x560C1FCE, + 0x56242F0B, 0x5424C0, 0x5634FD89, 0x56502049, 0x565CFBF7, 0x1301D499, 0x92DD4FA, 0x3B1F202, + 0x2429D5BE, 0x775D560, 0x5678318E, 0x56882F27, 0x56982472, 0x92CFF51, 0x56A43354, 0x219D66B, + 0x86C24CE, 0x775D5FC, 0x75C24CB, 0xE65D780, 0x56E5F119, 0x6CDD712, 0x5B403F2, 0x56F42F21, + 0x1301D59D, 0x57042F18, 0x571433CC, 0x5720321C, 0x7EDD5FF, 0x3D83134, 0x574432D5, 0x57543286, + 0x17DD668, 0xB69D750, 0x29F5D6D6, 0x109D546, 0x57642FD1, 0x431D65C, 0xE34FFB2, 0x86DD480, + 0x549D77F, 0x5518FC1F, 0x2304FF95, 0x4218FD27, 0x8C9EE1B, 0xF51D4B8, 0x2BF1D73E, 0x1D11D593, + 0x5774FDA6, 0x579024AA, 0x57A0FF62, 0x86DD5B8, 0x239D614, 0x57B0FD58, 0x57CC33FC, 0x1D11D427, + 0x57E433FB, 0x57FC02B5, 0x5808FFED, 0x109D5E2, 0x1845D752, 0x475FBF1, 0x109D40E, 0x27F8FCE9, + 0x5819F239, 0x5828FF07, 0x5831E040, 0x1394FBA7, 0x9C9D5B1, 0x2DDD423, 0x583C3216, 0xEB0FFAB, + 0x1730FECB, 0x5861E067, 0xBDDD4CA, 0x586C1DAD, 0x2049D730, 0x587907BA, 0x16B8FF2C, 0x588D0785, + 0x1845D7B3, 0x789D4D0, 0x589833A5, 0x1C43139, 0x58A4FB14, 0x1D11D5C7, 0x1A8FB8F, 0x4031E039, + 0x58B82F83, 0x58C82137, 0xC5EEAD, 0x58D42FB8, 0x110CFEC7, 0xC5EE8D, 0x45A4FBFF, 0x58E42D6F, + 0x58F42166, 0x3AA01D4C, 0x1430FE8A, 0x5904FC76, 0x1684FEE4, 0x5918246E, 0x5924FC64, 0x5940FDF0, + 0x6CDD6D8, 0x595C3221, 0x5974FB16, 0x5988FC8B, 0x599D0798, 0x59A907A6, 0x45ECFC9F, 0x59B42162, + 0x3DA0FC47, 0x2D18FB66, 0xB8800A0, 0x1731EEAF, 0x59C41D9E, 0x59D0FC7C, 0x59E42F03, 0x255D659, + 0x59F432B7, 0x5A01078F, 0x5A0C1DB1, 0x1185D48A, 0x5A190791, 0x5A24FD7D, 0x337DD742, 0x5121EE0B, + 0x5A40FDA0, 0x5A5CFE72, 0x2FADEE19, 0x5A6CFBAC, 0x5A783335, 0x5AA002DC, 0xA58FFBB, 0x1C41D744, + 0x1E1D51E, 0x5AB1F102, 0x5ABC326D, 0x5ACC3365, 0x5AE42105, 0xD1DD617, 0xB74FE9A, 0x46CCFC80, + 0x420203E, 0x77DEE93, 0x5AF4037A, 0x565CFBF8, 0xEE9EE49, 0xF51D554, 0x5B042480, 0x5B18332A, + 0xA25D61A, 0xB81D679, 0xB883000, 0x5B402F30, 0x239D440, 0x5B51F129, 0x2740FC8F, 0x1E0FF41, + 0x5B60FFEC, 0x47383264, 0x5B70FB50, 0x5B7CFDBE, 0x5B981FC0, 0x5BA8328B, 0x27424DF, 0x25E4FB65, + 0x5BB82FB6, 0x5BC833C4, 0x36EDD7AA, 0x1BB9EE21, 0x5BD42FCB, 0x7F4FEEB, 0x1990FB75, 0xD5DD7E2, + 0x4DD5C5, 0x2D5D444, 0x5BE4248A, 0x5BF0338D, 0xB54FC28, 0x45ECFC08, 0x5C002491, 0x2618FC72, + 0xFADD469, 0x5C103235, 0xFADD5A1, 0x5C29F234, 0x5C38FD64, 0x3670FFA3, 0x4F9D68B, 0x5C54319A, + 0x2429D626, 0xE65D6D2, 0x5C643244, 0x5C743350, 0x5C9C2FAC, 0x3114FBF0, 0x5CACFB20, 0x34F4FC02, + 0x1E9D5C4, 0xFADD539, 0x5CB82FCA, 0x5CC8FEFA, 0xBDDD566, 0x5CE5F14E, 0x22B5EEB0, 0x5CF5E06A, + 0x5D0033CD, 0xA05D439, 0x5D0CFF40, 0x5D15D6A4, 0x239D67C, 0x2221D7D0, 0x16B9D5AB, 0x5D20320D, + 0x25E4FB64, 0x5D38FDB9, 0x5D55F21F, 0x5D643303, 0x5120FEDF, 0x3F1C0384, 0x5D8C2F33, 0x2C4C32A6, + 0x1358FF1C, 0x5D9CFE7E, 0x13D0FD77, 0x5DAC33A8, 0x5DC8FF96, 0x5DD8FFE4, 0x7D1D4EF, 0x3C02466, + 0x5DE4FDAC, 0x5E0032E2, 0x5E102F5B, 0x5E20222D, 0x5E482F65, 0x5E58309C, 0x5E6CFCE8, 0x109D616, + 0x5E803345, 0x2382133, 0x130002E3, 0x16B9D613, 0x5EA907A7, 0x5EBC32B3, 0x5EC8FDAF, 0x1A28FD03, + 0x7EC1D63, 0x5EE5F101, 0x2182174, 0x47CFB6B, 0x5EF03294, 0x7D1D523, 0x4C2097, 0x5F0033DD, + 0x12B8FE96, 0x5F0CFB82, 0x5F18FB87, 0x5F24322C, 0x789D5D4, 0x7AC1D42, 0x5F3DE033, 0x4CB5D6E8, + 0x37D5D76F, 0xE6403F1, 0x7EDD633, 0x3FD0FB7B, 0x7D1D5BF, 0x1009D64F, 0x5F482FC8, 0x77DEE13, + 0x12F8A7F2, 0x5F583390, 0xF50217D, 0x5F64FF6D, 0xE21D56B, 0x5F74FD66, 0x5F902025, 0x185C32E8, + 0x5F9C3392, 0x123400B5, 0x8F4FF9B, 0x5FAC3373, 0x5FB802B1, 0x5FC4FC8A, 0x5FD8FC30, 0x17C209B, + 0x55743146, 0x5FED07AB, 0x17EDEEA3, 0x5FF82F11, 0x219D497, 0x6009F105, 0x60142F42, 0x6025D6AC, + 0x1169D51B, 0x6030FB28, 0x17DD530, 0x3130FE16, 0x1C5C2084, 0x199CFC29, 0x25F1D7C2, 0x603C2494, + 0x41D1EE1D, 0x604C333E, 0x60803231, 0x299D73D, 0x45ECFC6C, 0x60982101, 0x904FF25, 0x60A82FA9, + 0x1C5C2463, 0x1235D7B5, 0xA05D571, 0x22B4FED2, 0x60B833A7, 0x255CFEC4, 0x4320FEAF, 0x60D02F5A, + 0x420FE4A, 0xB91D5DC, 0x255CFEC3, 0x403CFE5D, 0x4C0CFF64, 0x4DD661, 0x5902F00, 0x60E032C4, + 0x5ACFE13, 0x60F42136, 0x4DB4FB6E, 0x6100A69C, 0x610DF221, 0x1EA0FE6B, 0x611CFF8D, 0x9C9F12C, + 0x612C3170, 0x613CFD74, 0x4458FCFD, 0x241D4B0, 0x12F8212D, 0x1731EE4F, 0x3C02087, 0x61582498, + 0x3C88FBEF, 0x6168FF9D, 0x24B8FB60, 0x5ABC314E, 0x1215EE54, 0x61782FB7, 0x61883305, 0x61B033A1, + 0xF51D520, 0x61BC33F7, 0x61D5E053, 0x1D11D45B, 0x12F9F132, 0x61E0FF02, 0xBA9D58D, 0x61E833F9, + 0x4DD55D, 0x1D102099, 0x62002F0E, 0x7ADD416, 0x1301D4CD, 0x6210247D, 0x62242FB5, 0x62342FC7, + 0x6244FF7E, 0x1684FEE2, 0x92DD596, 0x4C802B8, 0x7ADD51A, 0x62543226, 0x75DD47D, 0x626CFD5D, + 0x2888210B, 0x628824B3, 0x1201D66, 0x775D45C, 0x8C9EE5B, 0x6298333D, 0x2618FCE3, 0x62D82F66, + 0x16B9D67B, 0x29F5D7BE, 0x1081D3C, 0x62E82F75, 0x7D1D557, 0x62F83213, 0x631C337E, 0xEE9EE89, + 0x17DD598, 0x16B9D473, 0x15F0315C, 0x6338FB27, 0x1394FBA8, 0x422CFC56, 0x1214FEB8, 0x63442FB2, + 0x1570FBD7, 0x23824C2, 0xD5DFBF0, 0x635433AA, 0x90CFC07, 0x4F9D51F, 0x636433AC, 0x905D404, + 0x6374FDBF, 0x18E0FEB1, 0x6391F126, 0x63A0FDB0, 0x1169D5EB, 0x4DC0208E, 0x475D7D9, 0x63BC2FC2, + 0xB20315E, 0x63CC2F6D, 0x4D7C3138, 0x63DC02B4, 0x63E8FD57, 0x640433F2, 0x641C0132, 0x6428317D, + 0x1F14FFAC, 0x7C5D75E, 0x6025D720, 0x1C5DD7E6, 0x64382156, 0x645107A1, 0x1169D583, 0x6464249E, + 0x86DD654, 0x5121EE2B, 0xB9024BE, 0x935D758, 0x6474FDF5, 0x64983199, 0x241D448, 0x64A832BF, + 0x4301D4D, 0x64B43232, 0x64CC33B4, 0x64D8FDA4, 0x1100FB58, 0xEE8FEF3, 0x33B8FD3A, 0x1FF83195, + 0x64F4A69D, 0x65001DA7, 0x65101DAB, 0x5A0FB88, 0x1169D417, 0x651C327A, 0xBA9D629, 0x35C3155, + 0x65383284, 0x6548330C, 0xB91D644, 0x100824C9, 0x53DD6D5, 0x657C3340, 0x7F4FEEC, 0x65BC2F7B, + 0x146C3164, 0xD8C2088, 0x65CC33B0, 0x65D8309B, 0x65EC2F36, 0x65FC3158, 0x660C2F12, 0x1410FCB5, + 0x661C33B6, 0x1CE5D71C, 0xB81F139, 0x662DE046, 0xBDDD4FE, 0x66382F0D, 0x664824A9, 0x3A50FE48, + 0x1C88FEAB, 0x66583325, 0x66803252, 0x111832E1, 0x275D5FD, 0x1301D431, 0x18F8FFCB, 0x668CFFEA, + 0x1329D6EC, 0x4F9D5EF, 0x40FB97, 0x669C3312, 0x5CC8FEF9, 0x2A4FF0D, 0x66D03201, 0x5ACFE55, + 0x935D792, 0x2118FC4E, 0x5741D30, 0x4DD62D, 0x66E9E055, 0x66F42F1B, 0x86DD418, 0x670432FF, + 0x672107B4, 0x672DE04E, 0x16B81D38, 0x525D5DA, 0xD1C24C5, 0x775D490, 0x67383380, 0x12003D0, + 0x6744217B, 0x675507B6, 0x8C8FED0, 0xD8DFBF8, 0x755FBF3, 0x6760FC5E, 0x1D11D4C3, 0x6778FCF3, + 0x4C603153, 0x6794FD5A, 0x961D6DF, 0x5020FF8B, 0xBDC1D58, 0x1648FDBB, 0x67B032FC, 0xDEE57, + 0xB75EE96, 0x655D723, 0x47B9EE7E, 0x3078FCC3, 0x17EDEE83, 0xE21D467, 0xA2C32FE, 0x2179E061, + 0x5A6CFBAB, 0x4C8FF59, 0x401CFD12, 0x2888210C, 0x24B8FB61, 0x2D18FB67, 0x1D1024DD, 0x12F9D60A, + 0x67C1E048, 0x67CC316B, 0x67DDF227, 0x67ECFB04, 0x67FCFBE0, 0x6808FE77, 0x3A74FFA6, 0xD1D799, + 0x681DF100, 0x682824AD, 0xA25D64E, 0x337DD7B6, 0x503C32D4, 0x6839078B, 0x68450799, 0x34A0FF19, + 0x6850FF9C, 0x238FF2D, 0x475D7ED, 0x4DC0FE5A, 0x1589D763, 0x22B5EE10, 0x686033DF, 0x1039D7A6, + 0x26C0FEF5, 0x687907A8, 0x6884FFA5, 0x789D400, 0x44DC315A, 0xB81D471, 0x1250FF93, 0xB81D4D9, + 0x6894320F, 0x68B8338E, 0x57424B9, 0x68C42171, 0x483432F3, 0x68D1078D, 0x255CFEC1, 0x68E0FC94, + 0x8D42F49, 0x2889D5DB, 0x2D4A7F4, 0x24B8FB5F, 0x68F42470, 0x69003374, 0x6910249A, 0x69203259, + 0x37D5D7A9, 0x692C3360, 0x7EDD42B, 0x69402FA0, 0x4EC4FF0E, 0x28E4FC1C, 0x1DB5D6AB, 0x173C3038, + 0x130832F6, 0x22202461, 0x2618FC0E, 0x69503179, 0x69603386, 0x696C2FA4, 0x2889D60F, 0x3C9F22E, + 0x1E000AA, 0x22B4FED4, 0x697C32C3, 0xD5C24EA, 0x255D589, 0x69902F84, 0x438FC10, 0x69A02F9C, + 0x69B0FCCD, 0x69C42103, 0xA58314B, 0x108FF2F, 0x22B4FED3, 0x11BCFE35, 0x35D5F217, 0x69D43309, + 0x2ADEEA7, 0x4EC42024, 0x69FCFC6B, 0x8B4FCBE, 0xFADD4D1, 0x55D67A, 0x1FD1EE2A, 0x2889D5A7, + 0x14A1D7A8, 0xDEE37, 0x109D476, 0x337DD6CE, 0x6A102F80, 0x6A2032C0, 0x1D11D663, 0x6A35F22F, + 0x9A5D69D, 0x6A45F243, 0x539CFCB8, 0xB54FCB9, 0xF51D624, 0x5F3DE054, 0x1F8C1FBD, 0x6A6C2FAE, + 0x6A7C336C, 0x1009D61B, 0x6A942FBD, 0x575D403, 0x2C0C313F, 0x6AA5078C, 0x2ADEE47, 0x2E24315B, + 0xD8C2078, 0x16B9D647, 0x5DC832F5, 0x6AB02F48, 0x3FD0FB7C, 0x219D4CB, 0x6AC03321, 0x5FD8FCC1, + 0x6B002047, 0x239D4DC, 0x9A424E3, 0x6B0D07B5, 0xFC1D67, 0x86DD44C, 0x3DE4FC05, 0x790FD51, + 0x1742115, 0xB902160, 0x6E4FD01, 0x1704FD29, 0x1499D7D3, 0x1054FE33, 0x4C824E8, 0x6B182FB4, + 0x845EEB1, 0x2220FF12, 0x7CFCE0, 0x6B283381, 0x6B34FD05, 0x6B48247A, 0x6B582FB1, 0x6B682F2B, + 0x6B781DAF, 0x2429D58A, 0x16B9F13B, 0x6B84FD15, 0x6B982F09, 0x6BA81E9A, 0xA04A7F3, 0x525D60E, + 0x3BBCFDBC, 0x6BB8FD17, 0x6BCC3172, 0x1E5CFCB4, 0x38683131, 0x6BDC013F, 0x1430FE8B, 0x6BECFDF2, + 0xB69D700, 0x4DB4FB6F, 0x845EE51, 0x4B1D45A, 0x6C1032BB, 0x2B64FC06, 0x525D50A, 0x6C1CFC43, + 0x2DDD65F, 0x2DDD527, 0x510FC3C, 0x6C30FD54, 0x6C4D0784, 0x6C58FD9D, 0x6C742F35, 0x175D4DD, + 0x6C850797, 0x6C9032B9, 0x373CFE19, 0x13342F47, 0x6C9C32A0, 0x6CACFC49, 0x2381D39, 0x6CC0FBAF, + 0x3DB4FD38, 0x6CCCFF7A, 0x6CDC3271, 0x6CF9E069, 0x6D04FE69, 0x96003D5, 0x6D0CFD8D, 0x4A9CFCEB, + 0x6D28FC77, 0x1990FB73, 0x6D3C1DAC, 0x3DB4FD2E, 0x26B8FE66, 0x1C5DD7FA, 0x6D4824A0, 0x4C9D56A, + 0x3C1FBF7, 0x6D58FC11, 0x262DF22A, 0x6D6C33D7, 0x6D782F20, 0x17C5D6A9, 0x6D883238, 0x6DA0248B, + 0x2DC24D9, 0x1009D54B, 0x50D1E062, 0x961D6D7, 0x2D5D514, 0x6DACFCD9, 0x24282091, 0x60143246, + 0x1E9D48C, 0x55D612, 0x4B1D662, 0x1E11D72C, 0x6DC0FCF2, 0x6DDC3384, 0x6DE8FC4F, 0x6DFC33BA, + 0x1C80FF16, 0x1A8FB90, 0xEE8FEF1, 0xF2DF22C, 0x6E080F0C, 0x1C5DD7DC, 0x775D428, 0x20BDD7AD, + 0x75DD651, 0x6E1824A5, 0x6E28336B, 0x6E4000BC, 0xE65D754, 0x1724FBD3, 0x6E58FB26, 0x6E64FC5C, + 0x4DC0FE36, 0x6E79F104, 0x844FEB9, 0x6E84FDA5, 0xE65D7BA, 0xA05F135, 0x6EA03223, 0x2889D43B, + 0xFADD671, 0x6EB9079A, 0x6EC433B2, 0x1B90FEED, 0x6ED4248D, 0x6EE033C8, 0x239D510, 0x18E1EE6E, + 0x38683260, 0x6EEC3316, 0x6F382FA6, 0x961D7BF, 0x6F482F43, 0x6F5832EB, 0xFADD5D5, 0x2D5D4E0, + 0x3BACFF86, 0x5B5D6D3, 0x6C1CFC86, 0x309D604, 0x6F68338C, 0x173C3289, 0xE21D59F, 0x52424BC, + 0x552C3193, 0x549D755, 0x7ADF146, 0x6F78FE94, 0x2520FCB6, 0x6F84FCA8, 0x6F98249B, 0x6FA83227, + 0x6FC0FDAE, 0x861D768, 0x6FDC33D3, 0x6FE8FE10, 0x1589D729, 0x6FF02478, 0x70002F6F, 0x4709E068, + 0xE20FF5A, 0x7010249F, 0x70202F3D, 0x703033BB, 0x655D797, 0x241D5E8, 0x16F0FBA5, 0x703CFD1A, + 0x12B9EE75, 0x7D024D5, 0x7050FCE6, 0x7064338A, 0x2221D7F8, 0x7070FD62, 0x941D743, 0x1684FEE1, + 0x2E08FBF9, 0x1C802465, 0x431D628, 0x2429D4EE, 0x708DF215, 0xBDDD496, 0x709CFC88, 0x15C8FFBA, + 0x18E0FEB4, 0x70B02153, 0x70C8FD50, 0x2D5D64C, 0x70E43375, 0x3C5432F0, 0x70F0246A, 0x28DEE62, + 0x70FCFD8C, 0x71183362, 0x713032BC, 0x713DF223, 0x309D500, 0x6CDD74C, 0x714CFC5F, 0x7165F14B, + 0xB81D611, 0x78824B6, 0x71703214, 0x7194FFAE, 0x1C81D7F2, 0x71A5F103, 0x121D6FD, 0x4A9CFC3B, + 0x4824FF8A, 0x4D4DD769, 0xB75EE16, 0x71B024A7, 0x39CCFC85, 0xCE8213F, 0x8C9EE3B, 0x71C0FC4A, + 0x37D5D6C1, 0x71D4248E, 0x71E03328, 0x6FE8FF0C, 0x71FCFC79, 0x157CFED8, 0x611C32EC, 0x7210FF3E, + 0x72182F93, 0x46C2124, 0x921D76D, 0x4B1D48E, 0xA05D5A5, 0x7F5EE64, 0xFDD738, 0x7228FDA1, + 0x3828FE5C, 0x22B5EE90, 0x4CB5D6AE, 0x72442FC6, 0x1908FC12, 0x6F84FC16, 0xA2424C8, 0x3E40FB93, + 0x5E6CFD31, 0x7254FF3B, 0x725DE06C, 0x726C3168, 0x727C339A, 0xE65D78E, 0x5BA82F55, 0x1E82096, + 0x7288322B, 0x1E11D7A0, 0x72A107B3, 0xEC1D76B, 0x72ACFE7B, 0x72C02FCF, 0x72D0FE42, 0x431D454, + 0x72E03243, 0x72F83334, 0x3A4032E7, 0x73442100, 0x3E40FB95, 0x2429D5F2, 0x36EDD6FC, 0x7355F11F, + 0x7364FC09, 0x6DE8FC8E, 0x552C3281, 0x41D1EE5D, 0x7379F108, 0x7385EE7C, 0x941D7B7, 0x845EE11, + 0x23D1D77A, 0x218FF56, 0x7390FC6A, 0x157DEE52, 0x73A42481, 0x73B8FCCF, 0x73CC24A2, 0x73DC320C, + 0x1499D7FB, 0x121D771, 0x73F42F94, 0x3C02077, 0x7405F118, 0x74140149, 0x75DD5B5, 0x46DD655, + 0x7424FD96, 0x4C9D432, 0x110CFEC5, 0x7440336D, 0xD1D6EB, 0xB30FC7B, 0x74582FC1, 0x16B9D5DF, + 0x74681D55, 0xCDDD7C1, 0x7478216A, 0x74842F64, 0x74942486, 0x53DD783, 0x74A8FD6E, 0x74C43202, + 0x74DC337F, 0x1600FC45, 0x1E9D5F8, 0x1215EE94, 0x75CFF36, 0x75102189, 0x7528323F, 0x75403347, + 0x2DDD693, 0xC4FEE8, 0x6F38328E, 0x67FCFBE1, 0x75802F3E, 0x7591E051, 0x759CFD2C, 0x75B0FC83, + 0x75C42F2F, 0x1C5DD7F0, 0x75D43039, 0x75E432B1, 0x1185D65E, 0x29803D1, 0x308FF57, 0xB90FF29, + 0x75F032C5, 0x7604248F, 0x7610FD78, 0x762CFC5B, 0x9A5D4C9, 0x121D7AB, 0x9A5D5CD, 0x3928FC4C, + 0x76402F2A, 0x1054FF3F, 0x76502F22, 0x7660FD32, 0x1FD1EE0A, 0x76742483, 0x76881DB2, 0x7695E059, + 0x4DC0FF09, 0x92DD632, 0x1185D5F6, 0x52481FEE, 0x76A03257, 0x45A4FBFC, 0x175D511, 0x4F90FD0F, + 0x4F824D1, 0x921D7A7, 0x98FDB4, 0x12F9D672, 0x34A02089, 0x13EC3262, 0x1185D4BE, 0x76AC2F9E, + 0x11BC207D, 0x157DEE72, 0x76BCFF0F, 0x76C43230, 0x76DC33E9, 0x54803D6, 0x76F43358, 0x474FF11, + 0x77081DBA, 0x77143352, 0x77302FA5, 0x921D733, 0x9A41D57, 0x2274FD37, 0x420FE4C, 0x7740336F, + 0x7758FD73, 0x34A02468, 0x9C8FF32, 0x77742FBF, 0x7784FF6B, 0x3398FBDE, 0x3130FF1F, 0x1589D6EF, + 0xBA82095, 0xFFDD79C, 0x75B0FC3D, 0x26ECFC98, 0x77942F59, 0x46DF149, 0x1E9D660, 0x77A43205, + 0x2FADEE39, 0x2DDD5F7, 0x77BC0EB3, 0x77D8FC95, 0x2274FD2D, 0x75DD449, 0x703CFCFE, 0x5C38FD65, + 0x77EC332E, 0x78390781, 0x78443196, 0x17DD5CC, 0x4B024DC, 0x7854FC92, 0x1685EE0C, 0x3C1D7F3, + 0x7869079F, 0x7194313E, 0x787CFDA3, 0x7898FF6F, 0xA05D5D9, 0x78A8FF1E, 0xECCFD68, 0x78B0FC0A, + 0x10F1D74F, 0x75DD54D, 0x78C5F247, 0x78EC3308, 0x20BDD773, 0x7921F21E, 0xB882002, 0x1301D639, + 0xFFDD6B4, 0x510FC82, 0x52D4FD1E, 0xEE8FEF4, 0x79303180, 0xBA9D489, 0x7941F213, 0xFADD505, + 0x795DD7CB, 0x79683181, 0x7978FC6D, 0x798C32CB, 0xA05D53D, 0x789D63C, 0x79A4FE70, 0x13A0FD80, + 0x9C9F141, 0x28CFEA0, 0x1730FECA, 0xD8DD7D6, 0x1845D779, 0x1B91EEA5, 0x11BCFE59, 0x55D40A, + 0x79B43215, 0x46C2128, 0x1C41D70A, 0xA25D57E, 0x79D802DA, 0x79E83212, 0x7A0CFC67, 0x4DD459, + 0x8C9EE9B, 0x7A282107, 0xFAC1D2E, 0x23D1D7B4, 0x7A35E04F, 0x552C2F06, 0x905D508, 0x1D11D5FB, + 0x17424C3, 0x7A402F6E, 0x7A50246F, 0x759CFD10, 0x19DCFC44, 0x6D04FF04, 0x1185D5C2, 0x7A5CFF69, + 0x7A6C3209, 0x7A84FC2F, 0x7A9810FC, 0x2541D48, 0x7AA8FF67, 0xFD9E05B, 0x4B1D592, 0x6025D75A, + 0xB882006, 0x13ECFFA7, 0x7AB833D4, 0xD34FD71, 0x7AC43203, 0x7ADCFDF4, 0x19BC326C, 0x789D670, + 0x7B0030FF, 0x7B1C2F0A, 0x4DB4FB71, 0x12F9D5A2, 0x66E9E034, 0x28DEE02, 0x7B2C2176, 0x7B3C2177, + 0x1329D726, 0x1FD0FEDA, 0x4C9D66E, 0xF81D72A, 0x4698FC41, 0x7B503387, 0x46DD585, 0x11842139, + 0xB81D43D, 0xCE9D72B, 0x7B5DF220, 0x7B6DF225, 0x4D8CFD6F, 0x1394FBA9, 0xFAC212C, 0x45A4FBFE, + 0x6BB8FCFB, 0x18E1EE2E, 0x9601D69, 0x32A0FC96, 0x7B7C2F23, 0x1215EE74, 0x241F144, 0x7B8CFD23, + 0x7BA033D2, 0x18E0FEB3, 0x7BB10783, 0xE65D70C, 0x7BBCFF5C, 0x57A0FE41, 0x219D463, 0x6CC1D6A, + 0x2888210D, 0x7BC4FBDC, 0x7BD03341, 0x7BF907A3, 0x7C05F123, 0x7C143323, 0x3BD8FBEB, 0x7D1D627, + 0x7254FE47, 0x275D429, 0x7C3CFF9F, 0x1EC4FCBC, 0x7C4D079B, 0x299D78B, 0x7C5833C3, 0x7C65F21D, + 0xEC1D6BD, 0x7C7432C7, 0x1BC4FF5B, 0x306CFE8D, 0x25E4FB63, 0x77D8FC59, 0x7C882482, 0x7C9CFE43, + 0x905D53C, 0x7CADF16C, 0xB75EE36, 0x7CB8336E, 0x4B1CFCC4, 0x92DD5CA, 0x7CD02F8F, 0x1185D456, + 0xFC213D, 0x7CE0A7F8, 0x7D0FF46, 0x7CEC339D, 0x86003F9, 0x14A1D6FA, 0x431D420, 0x9A5D461, + 0x7CF9F14A, 0x12B8FE95, 0x7D043372, 0x36EDD736, 0x7D102F5E, 0x7D2024A4, 0x7D31F128, 0xB91D43C, + 0x775D5C8, 0x7D403364, 0xE343142, 0xBA9D4F1, 0x7D58FF68, 0x789D49C, 0x540C3148, 0x5F90FE30, + 0x7D6832C1, 0xBDDD42E, 0x7D7DF244, 0x22A9D6C8, 0x57B0FD59, 0x4DD48D, 0x7DA5F106, 0x7DB033AF, + 0x9C81D3F, 0x7DD4215D, 0xCF4FBA3, 0x4B1D426, 0x4CB5D722, 0x7DEDF212, 0x7DFC1DB4, 0x7E082F76, + 0x51B8FE6A, 0x7E19E03D, 0x110DEE7A, 0x3C39E047, 0x7E2402DB, 0x9A5D601, 0x784432A4, 0x7E342F28, + 0x7E44FDA2, 0x17ECFEA9, 0x7E602F78, 0x7E7000A8, 0x275D52D, 0x525D572, 0x7385EE1C, 0xFAC24B7, + 0x716433B9, 0x549D7B9, 0x4D4DD6F5, 0x3D8CFC55, 0x1499D7E7, 0xE65D746, 0x4B82F54, 0xC50FE3A, + 0x4810FCEF, 0x7E8033B8, 0x1730FEC9, 0x7E8CAB5E, 0x5518FCE7, 0x7E98329D, 0x21C8FD18, 0xD5DD7D8, + 0x7EA82F5D, 0x21B832D8, 0x7EB8217A, 0x525D53E, 0x7EC42A0C, 0x7EF83329, 0x7F200F79, 0x7F49F12E, + 0x575D53B, 0xF51D484, 0x6C58FD9C, 0x3DB4FD0A, 0x17DD69C, 0x3D40FC21, 0x7F542490, 0x68843135, + 0x1169D653, 0x9C824C7, 0x420FE4B, 0x2DDD457, 0x7F6024B0, 0x575D437, 0x7F71F112, 0x1AC0FB9D, + 0x7F802FD3, 0x72D0FF63, 0x5F18FB86, 0x1E7032E3, 0x3B032DA, 0x22B4FED1, 0x6CC1D61, 0x7F90FFD7, + 0x2E08FC03, 0x1009D4AF, 0x7FA02F82, 0x5ABCFFBE, 0x7FB02048, 0x7FBC32CD, 0x1731EE8F, 0x7FCCFC52, + 0x4F9D483, 0x7FE1E03E, 0xD5DD7EC, 0x196CFB29, 0x7FEC3176, 0x239D578, 0x110CFEC8, 0x7FFC2167, + 0x80102FC5, 0x7591E030, 0x5260FC0B, 0x80203165, 0x2FACFEBF, 0x8031F121, 0x2E08FC68, 0x16B8216C, + 0x431D5C0, 0x51D0314F, 0x80401D4A, 0x5120FEDD, 0x73B8FC46, 0x1BE8FCE2, 0x1685EEAC, 0x1845D78C, + 0x804C335A, 0x56243287, 0x806033BE, 0x394CFB8D, 0x806C2F8B, 0x4B01D50, 0x4D4DD6BB, 0x46DD5B9, + 0x807C303A, 0x7070FD63, 0x808C326E, 0x80A8FD55, 0x20BDD6FF, 0x80C4325C, 0x275D491, 0xA25D4AE, + 0x431D5F4, 0x5E00FF83, 0x80D0318C, 0x34A1D7FF, 0x7FCCFCD8, 0x5F0CFB83, 0xB882003, 0x6FE8FE50, + 0x575D5A3, 0x431D58C, 0x1CE5D756, 0x9601D60, 0x184403F0, 0xCE9D79F, 0x204803D2, 0x29F5D784, + 0x80E024B2, 0x961D74B, 0x1498FF15, 0x80F02151, 0x81083224, 0x40FB96, 0x1301D501, 0x1908FCE5, + 0x8121078E, 0x565CFBF6, 0x2741D56, 0x575D4D3, 0x812C3324, 0x816032C6, 0x817432CC, 0x12F824B8, + 0x6F78FE93, 0x81801DA4, 0x755D7D1, 0x78B0FC6F, 0x5744FF76, 0x92DD5FE, 0x818C3274, 0x81A83188, + 0x6B84FCF9, 0x36F9E05C, 0x81B82F3B, 0x81C83239, 0x2429D65A, 0x5121EE8B, 0x55E03292, 0x4560FC2E, + 0x5A24FD7C, 0x239D648, 0x2D5D410, 0x12F9D56E, 0x44D4FE5F, 0x6CCC32D9, 0x4B1D5C6, 0x81E024AE, + 0xCDDD74D, 0x4CB5D796, 0x81F02F52, 0x7364FC6E, 0x82003219, 0x239D544, 0x2FADEE79, 0x8224FDF7, + 0xBDDD59A, 0x34F4FCDF, 0x824824B5, 0x4908FC1D, 0xC34FD86, 0x1850FBE7, 0x18E1EE8E, 0x1EF43197, + 0x861D6F4, 0x82582F7C, 0x299D6DD, 0x10F1D7C3, 0xB81D50D, 0x75DF145, 0x82682157, 0x655D72D, + 0x828032AA, 0x789D468, 0x8290FD94, 0x1169D687, 0x82AC318B, 0x82BC33C9, 0x82C8246B, 0x6025D794, + 0x5F74FDC5, 0x82D4327E, 0x1D10207F, 0xD1DD40F, 0x82F107A0, 0x82FC248C, 0x4DD4C1, 0x110DEE1A, + 0x23B4FDB8, 0x1301D465, 0x830833C0, 0x7E19E05D, 0x831907AC, 0x789D538, 0xD8CFF18, 0xD1D725, + 0x4BC0FBF5, 0x1CA4FF9A, 0x775D4F8, 0x8324FCE4, 0x83382017, 0x4321EE06, 0x8348334A, 0x1E1D68A, + 0x3D04FCB1, 0x839433BF, 0x1AA0FF77, 0x83A0FD56, 0x7D1D65B, 0x9A5D635, 0x6B34FD21, 0x83BCFE3E, + 0x1685EE2C, 0x7D1D487, 0x1C64FB80, 0x1E95D748, 0x219D69F, 0x61D5E032, 0x83CC24AC, 0x83DC3187, + 0x5A6CFBAA, 0x685032FB, 0x5121EEAB, 0x1054FE34, 0x65403F4, 0x83EC03D4, 0x4218FD2F, 0x451CFC32, + 0x308CFC39, 0x7BC4FBDB, 0x46DD621, 0xA05D509, 0x84002036, 0x1EB9E05F, 0x841C2F62, 0x842C3159, + 0x843C1FED, 0x504CFB5D, 0x5120FEE0, 0x84543336, 0x8324FCA5, 0x1908FC78, 0x1C89EE18, 0x4321EE86, + 0xCF4FBA1, 0x3828FE38, 0xF51D5F0, 0x39CCFCCC, 0x4A9CFC81, 0x849433D0, 0x2049D76A, 0x163DD6AD, + 0x84A033A3, 0x2DDD48B, 0x1009F143, 0x84B02F1C, 0x84C01D5A, 0x84CCFF5E, 0x2429D68E, 0x84D40678, + 0x16B9D43F, 0x475D7CF, 0x84E83315, 0x1C64FB7F, 0x853432B8, 0x4C0CFE11, 0x85402F8D, 0xEE9EE69, + 0x7EDD5CB, 0x8550FD9B, 0x1CE5D6E2, 0x1E95D782, 0x504CFB5A, 0x16B9D577, 0x624432DD, 0x856C20A8, + 0x30A0FC4D, 0x475D7E3, 0x1E1D586, 0x1E1D5BA, 0x36EDD770, 0x7ADD61E, 0x7F4FEE9, 0x85783256, + 0x85843378, 0x6101E065, 0x4B84FD24, 0x4DD695, 0x85942FC4, 0x4C9D5D2, 0xF501D9C, 0x921D6BF, + 0x85A432AE, 0xD8C2467, 0x5C542F04, 0x10081D40, 0x219D603, 0xE21D537, 0x11842148, 0x85B41DBC, + 0x85C02F45, 0x85D0FE76, 0x1A4CFD6B, 0x86DD550, 0x85E0FFEE, 0x85F02F9F, 0x860033A6, 0x3FD0FB7D, + 0x861033B7, 0x861C2F6C, 0x7A84FCC0, 0x52B0FC18, 0xFADD63D, 0x1C81D7D4, 0x1E1D41A, 0x55A4FC25, + 0x2ADEE27, 0x75DD4B1, 0x862C320E, 0x219D567, 0x86DD4B4, 0x865033AD, 0x3E4C32DB, 0x7EDD69B, + 0x8660FFE2, 0x175D5E1, 0x28DEE42, 0x866CFD7B, 0x868832B0, 0x2D5D618, 0x17DD494, 0x662DE064, + 0xE21D5D3, 0x86983242, 0x16D4FE68, 0x2A40FCC9, 0x3400315F, 0x1E9D694, 0x86B0FB03, 0x86C02152, + 0x86DCFE3F, 0xBA9D525, 0x86EC2FCC, 0x6025D6E6, 0x86FC333B, 0x873C2497, 0x874C33A4, 0xD1DD4DF, + 0x875C3306, 0x1169D47F, 0x8784FE3B, 0x34C8FBE8, 0xFFDD6EE, 0x755D7EF, 0x1850FBE6, 0x87941DBD, + 0x34A1D7EB, 0x87A033EF, 0xB69D7AE, 0x7695E038, 0x87B81D4B, 0x1E9D590, 0x1C802076, 0x1C81D7E8, + 0xB6803F5, 0x525D43A, 0x87C43222, 0x87DCFCFA, 0x1344FC2C, 0x65FCFFCD, 0x87F01DB3, 0x538CFF71, + 0x1499D7DD, 0x87FC339B, 0x2D5D680, 0x880C2F4E, 0x59D0FC31, 0x1215EEB4, 0x12D432D7, 0x881C331A, + 0x1589D79D, 0x15ACFCDE, 0x17F8207B, 0x22202082, 0x88683379, 0x1039D6BE, 0x3C443144, 0x8878FFEB, + 0x78A8FE65, 0x175F13D, 0x4338FFC4, 0x4C9D606, 0x241D5B4, 0x405832D3, 0x8888FD99, 0x7ADD582, + 0x1684FEE3, 0x88A4FDB7, 0x88C02178, 0x2ADEE87, 0x88CC317E, 0x2DC02B2, 0x88DD0782, 0x88E83182, + 0x1E95D70E, 0x46DD5ED, 0x88F80676, 0x7660FCEA, 0x890CFE7D, 0x1990FB72, 0x892033BC, 0xD1C1D3E, + 0x893024A6, 0xB882008, 0x109D442, 0x7F903160, 0x15C8314A, 0x55B8FBF2, 0x2E4FC89, 0x89402F1E, + 0x5490FB8B, 0x89510792, 0x895C24AB, 0x5A6CFBAD, 0xBDDD462, 0x2DDD5C3, 0x5903280, 0x7B8CFD07, + 0x299D717, 0x14A1D76E, 0x1009D47B, 0x5B70FB51, 0xA25D516, 0x540C3268, 0x157CFED5, 0x525D676, + 0x25F1D74E, 0x1E1D482, 0x86DD620, 0x896C33E6, 0x275D631, 0x8980FE7F, 0x33A4FBB0, 0x1430FE89, + 0xB801D36, 0x89942F90, 0x6F58FF8C, 0xBA802B0, 0x89A42F5C, 0x1054FE4F, 0x89B43363, 0x23D1D6CC, + 0x89CC1DAE, 0x6CC0FBAE, 0x89D82FAA, 0x87DCFD16, 0x80402094, 0x3F1C00B4, 0x89E82F50, 0x1301D66D, + 0x4C9D6A2, 0x1499D7F1, 0x1039D6F8, 0x89F82F73, 0x842CFFCE, 0x4D4DD7A3, 0x8A0801C7, 0xFDD6FE, + 0x1BB8FE91, +}; + #endif // #ifndef NORMALIZATION_DATA_H diff --git a/stdlib/public/stubs/Unicode/Common/NormalizationData.h b/stdlib/public/stubs/Unicode/Common/NormalizationData.h index 9389595822e2c..0d5cfee6efec1 100644 --- a/stdlib/public/stubs/Unicode/Common/NormalizationData.h +++ b/stdlib/public/stubs/Unicode/Common/NormalizationData.h @@ -19,11 +19,12 @@ #include "swift/shims/SwiftStdint.h" static const __swift_uint16_t _swift_stdlib_normData_data[66] = { - 0x1, 0x3, 0x4, 0x8, 0xC, 0x30, 0x38, 0x3C, 0x44, 0x48, 0x4C, 0x50, 0x58, 0x60, 0x68, 0x70, 0x78, - 0x80, 0x88, 0x90, 0x98, 0xA0, 0xA8, 0xB0, 0xB8, 0xC0, 0xC8, 0xD0, 0xD8, 0xE0, 0xE8, 0xF0, 0xF8, - 0x100, 0x108, 0x110, 0x118, 0x120, 0x2A0, 0x2DC, 0x338, 0x358, 0x3B0, 0x3D0, 0x408, 0x410, 0x420, - 0x650, 0x654, 0x6B0, 0x6C0, 0x6C4, 0x6D0, 0x6E0, 0x6E4, 0x6F0, 0x700, 0x710, 0x720, 0x730, 0x733, - 0x734, 0x740, 0x748, 0x750, 0x784, + 0x1, 0x3, 0x4, 0x100, 0x104, 0x600, 0x700, 0x704, 0x804, 0x900, 0x904, 0xA00, 0xB00, 0xC00, 0xD00, + 0xE00, 0xF00, 0x1000, 0x1100, 0x1200, 0x1300, 0x1400, 0x1500, 0x1600, 0x1700, 0x1800, 0x1900, + 0x1A00, 0x1B00, 0x1C00, 0x1D00, 0x1E00, 0x1F00, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x5400, + 0x5B04, 0x6700, 0x6B00, 0x7600, 0x7A00, 0x8100, 0x8200, 0x8400, 0xCA00, 0xCA04, 0xD600, 0xD800, + 0xD804, 0xDA00, 0xDC00, 0xDC04, 0xDE00, 0xE000, 0xE200, 0xE400, 0xE600, 0xE603, 0xE604, 0xE800, + 0xE900, 0xEA00, 0xF004, }; static const __swift_uint8_t _swift_stdlib_normData_data_indices[3051] = { @@ -1617,4 +1618,1649 @@ static const __swift_uint32_t * const _swift_stdlib_nfc_comp_indices[63] = { _swift_stdlib_nfc_comp60, _swift_stdlib_nfc_comp61, _swift_stdlib_nfc_comp62, }; +static const __swift_uint16_t _swift_stdlib_normData_compat_data[66] = { + 0x1, 0x3, 0x4, 0x100, 0x104, 0x600, 0x700, 0x704, 0x804, 0x900, 0x904, 0xA00, 0xB00, 0xC00, 0xD00, + 0xE00, 0xF00, 0x1000, 0x1100, 0x1200, 0x1300, 0x1400, 0x1500, 0x1600, 0x1700, 0x1800, 0x1900, + 0x1A00, 0x1B00, 0x1C00, 0x1D00, 0x1E00, 0x1F00, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x5400, + 0x5B04, 0x6700, 0x6B00, 0x7600, 0x7A00, 0x8100, 0x8200, 0x8400, 0xCA00, 0xCA04, 0xD600, 0xD800, + 0xD804, 0xDA00, 0xDC00, 0xDC04, 0xDE00, 0xE000, 0xE200, 0xE400, 0xE600, 0xE603, 0xE604, 0xE800, + 0xE900, 0xEA00, 0xF004, +}; + +static const __swift_uint8_t _swift_stdlib_normData_compat_data_indices[6847] = { + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3B, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3B, 0x3B, 0x3D, + 0x3B, 0x3D, 0x3B, 0x3D, 0x3D, 0x3E, 0x35, 0x35, 0x35, 0x35, 0x3E, 0x33, 0x35, 0x35, 0x35, 0x35, + 0x35, 0x2F, 0x2F, 0x36, 0x36, 0x36, 0x36, 0x30, 0x30, 0x35, 0x35, 0x35, 0x35, 0x36, 0x36, 0x35, + 0x36, 0x36, 0x35, 0x35, 0x3, 0x3, 0x3, 0x3, 0x4, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3C, + 0x3C, 0x3D, 0x3C, 0x3C, 0x41, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3E, 0x35, 0x35, 0x3B, 0x3F, 0x40, 0x40, 0x3F, 0x40, 0x40, + 0x3F, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x35, + 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x37, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x37, 0x3A, 0x3B, 0xB, 0xC, 0xD, + 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x3B, 0x35, + 0x13, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1F, 0x20, 0x21, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x3D, 0x3D, 0x36, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x24, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x25, + 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x35, 0x35, 0x3B, 0x35, 0x3B, + 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x35, 0x35, + 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, + 0x35, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x1C, 0x1D, 0x1E, 0x3B, 0x3B, 0x3B, + 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x7, 0x9, 0x3B, 0x35, + 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x6, 0x2, 0x0, 0x0, 0x9, 0x2, 0x1, 0x1, 0x1, + 0x3B, 0x1, 0x1, 0x6, 0x9, 0x1, 0x1, 0x1, 0x1, 0x6, 0x9, 0x6, 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0x2, + 0x1, 0x1, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0x6, 0x0, 0x9, 0x26, 0x27, 0x6, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0x2, 0x2, 0x9, 0x9, 0x2, 0x0, 0x0, 0x0, 0x9, 0x2, 0xA, 0x2, 0x0, 0x0, 0x0, 0x0, + 0x2, 0x1, 0x28, 0x28, 0x9, 0x29, 0x29, 0x29, 0x29, 0x1, 0x2A, 0x2A, 0x9, 0x2B, 0x2B, 0x2B, 0x2B, + 0x1, 0x1, 0x1, 0x35, 0x35, 0x35, 0x35, 0x32, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2C, 0x2D, 0x1, 0x2E, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x1, 0x3B, 0x3B, 0x9, 0x3B, 0x3B, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x35, 0x0, 0x2, 0x6, 0x9, 0x9, 0x35, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, + 0x2, 0x2, 0x2, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x9, 0x9, 0x3B, 0x3A, 0x37, 0x3B, 0x35, 0x3B, 0x35, + 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x9, 0x6, 0x9, 0x9, + 0x6, 0x3B, 0x3B, 0x3B, 0x3, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x35, + 0x3B, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x35, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x35, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x3B, 0x40, 0x31, 0x35, 0x2F, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3E, 0x3A, 0x3A, 0x35, 0x34, 0x3B, 0x3F, 0x35, 0x3B, 0x35, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, + 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3, 0x3, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3, 0x3, 0x3, 0x3B, 0x3B, 0x3B, 0x3, 0x3, 0x3B, 0x35, 0x3B, 0x3, 0x3, 0x35, + 0x35, 0x35, 0x35, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x3B, 0x3B, 0x3B, 0x1, 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x34, 0x3A, 0x3E, 0x37, + 0x38, 0x38, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x8, 0x1, 0x1, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x9, 0x9, 0x9, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, 0x9, 0x6, 0x9, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x35, + 0x3B, 0x3B, 0x3, 0x35, 0x9, 0x3B, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x35, 0x3B, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x35, 0x3B, 0x35, 0x9, + 0x9, 0x9, 0x0, 0x0, 0x0, 0x9, 0x7, 0x3B, 0x3B, 0x3B, 0x2, 0x0, 0x0, 0x9, 0x9, 0x6, 0x9, 0x6, 0x9, + 0x6, 0x6, 0x9, 0x6, 0x6, 0x2, 0x0, 0x0, 0x9, 0x2, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x9, 0x6, 0x3B, 0x2, 0x2, 0x0, 0x0, 0x2, 0x0, 0x9, 0x6, 0x2, 0x0, 0x0, + 0x9, 0x6, 0x9, 0x9, 0x6, 0x9, 0x9, 0x6, 0x2, 0x0, 0x9, 0x9, 0x6, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6, + 0x9, 0x9, 0x9, 0x9, 0x9, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x5, + 0x5, 0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x32, 0x32, 0x3, 0x3, 0x3, 0x39, 0x32, 0x32, 0x32, + 0x32, 0x32, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x35, + 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3B, 0x3B, 0x3B, 0x3B, + 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3E, 0x3E, 0x35, 0x3B, 0x35, 0x35, 0x35, + 0x35, 0x35, 0x35, 0x35, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x3B, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, + 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +}; + +static const __swift_uint16_t _swift_stdlib_normData_compat_ranks[517] = { + 0x0, 0x2A, 0x2A, 0x30, 0x40, 0x4D, 0x4F, 0x57, 0x62, 0x62, 0x62, 0x62, 0x0, 0x0, 0x0, 0xE, 0x43, + 0x0, 0x36, 0x62, 0x72, 0xAD, 0x0, 0xE, 0xE, 0x1D, 0x42, 0x0, 0x3F, 0x53, 0x60, 0x6E, 0x0, 0x9, + 0xE, 0x30, 0x30, 0x0, 0x1, 0x34, 0x34, 0x49, 0x0, 0x5, 0x10, 0x1C, 0x37, 0x0, 0x0, 0x5, 0x1F, + 0x22, 0x0, 0x8, 0x3D, 0x41, 0x4E, 0x0, 0x5, 0xA, 0xE, 0x12, 0x0, 0x2, 0x2, 0xC, 0xD, 0x0, 0x6, + 0x6, 0xB, 0xB, 0x0, 0x9, 0xC, 0x11, 0x11, 0x0, 0x5, 0xD, 0xD, 0x15, 0x0, 0x3, 0xB, 0x22, 0x27, + 0x0, 0x2, 0x5, 0x6, 0x6, 0x0, 0x0, 0x15, 0x2D, 0x30, 0x0, 0x3, 0x3, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x2, 0x2, 0x2, 0x0, 0x1, 0x1, 0x1, 0x4, 0x0, 0x0, 0x0, 0x2, 0xC, 0x0, 0x1E, 0x23, + 0x2C, 0x35, 0x0, 0x2, 0x5, 0x6, 0x6, 0x0, 0x18, 0x1E, 0x57, 0x6D, 0x0, 0x40, 0x80, 0xC0, 0xFC, + 0x0, 0x3A, 0x72, 0xAC, 0xEA, 0x0, 0x29, 0x38, 0x62, 0x70, 0x0, 0x25, 0x59, 0x6D, 0x70, 0x0, 0x9, + 0x18, 0x22, 0x2A, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0x0, 0x40, 0x80, 0x8B, 0x0, 0x0, 0x0, 0x1, 0x1, + 0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x3, 0x3, 0x5, 0x0, 0x10, 0x20, 0x20, + 0x21, 0x0, 0x1, 0x41, 0x81, 0xC1, 0x0, 0x7, 0x13, 0x2A, 0x40, 0x0, 0x7, 0x36, 0x73, 0x73, 0x0, + 0x2F, 0x67, 0xA6, 0xE6, 0x0, 0x40, 0x80, 0xC0, 0x100, 0x0, 0x0, 0x0, 0xB, 0xF, 0x0, 0x2, 0x2, 0x3, + 0x3, 0x0, 0x6, 0x7, 0x7, 0x8, 0x0, 0x5, 0x6, 0x6, 0x8, 0x0, 0x0, 0x0, 0x8, 0xA, 0x0, 0x0, 0x5, + 0x5, 0x6, 0x0, 0x0, 0x20, 0x60, 0xA0, 0x0, 0x40, 0x74, 0xB2, 0xF2, 0x0, 0x1A, 0x46, 0x84, 0xB6, + 0x0, 0x3D, 0x7D, 0xBD, 0xFD, 0x0, 0x40, 0x6E, 0xAC, 0xD4, 0x0, 0x27, 0x5F, 0x9D, 0xDD, 0x0, 0x3F, + 0x7F, 0xBE, 0xE1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x5, 0x5, 0x5, 0x5, 0x0, + 0x38, 0x38, 0x38, 0x38, 0x0, 0x0, 0x2, 0x6, 0x6, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0x0, 0x4, 0x4, 0x4, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x3, 0xE, 0x12, 0x12, 0x0, 0x0, 0x3, 0x8, 0x8, 0x0, 0x5, 0x6, 0x8, + 0x8, 0x0, 0x2, 0x2, 0x2, 0x4, 0x0, 0xE, 0x13, 0x13, 0x13, 0x0, 0x3, 0x9, 0xB, 0xB, 0x0, 0x0, 0x5, + 0x5, 0x6, 0x0, 0x0, 0x2, 0x2, 0x3, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x4, 0x5, 0x0, 0x0, + 0x1, 0x3, 0x3, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x3, 0x4, 0x0, 0x0, 0x2, 0x2, 0x2, 0x0, + 0x0, 0x0, 0x5, 0xC, 0x0, 0x0, 0x2, 0x2, 0x2, 0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1F, 0x29, 0x29, 0x2C, 0x0, 0x0, 0x0, 0x40, 0x7F, 0x0, 0x35, 0x72, 0xAA, 0xE9, 0x0, 0x40, + 0x80, 0xC0, 0x100, 0x0, 0x40, 0x80, 0xC0, 0x100, 0x0, 0x3E, 0x3E, 0x3E, 0x3E, 0x0, 0x0, 0x0, 0x0, + 0x26, 0x0, 0x2E, 0x2F, 0x2F, 0x36, 0x0, 0x0, 0x1, 0x5, 0x5, 0x0, 0x0, 0x4, 0x4, 0x4, 0x0, 0x7, + 0x7, 0xE, 0xE, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2B, 0x59, 0x7E, 0x7E, 0x0, 0x0, 0x0, 0x0, 0x2A, + 0x0, 0x13, 0x14, 0x14, 0x43, 0x0, 0x2, 0x2, 0x2, 0x2, 0x0, 0xA, 0xA, 0xA, 0xA, 0x0, 0x0, 0x30, + 0x70, 0xB0, 0x0, 0x40, 0x80, 0xC0, 0x100, 0x0, 0x40, 0x4E, 0x4E, 0x4E, +}; + +static const __swift_uint64_t _swift_stdlib_normData_compat[518] = { + 0xC, 0x1FF87FFE5FFFF, 0x0, 0x3F0000000, 0xED1DFC0000000000, 0x5BFF, 0x4200000, 0x1F60000400000000, + 0x403B1158, 0x0, 0x0, 0x0, 0x3800, 0x0, 0x0, 0x773C850100000000, 0xBE7EFFBF3E7EFFBF, 0xFFFF, + 0xF3F9FEFDFF3FFFFC, 0xFFFFFF3FFFF3, 0xFFF0000180030000, 0xFFFFFF3FFFCFDFFF, 0x53CFFF, 0xFFFC0, + 0x0, 0x3F00000001FF0000, 0xFFFFFFFF0000001F, 0x10EFFFF, 0xFFFFFFFF7FFFFFFF, 0xFC000001D7F04410, + 0x7F7C000001, 0x200708B0237, 0x1600200, 0xC00000708B0000, 0xF8, 0x33FFCFCFCCF0006, 0x0, 0x1CF0000, + 0x80000000000000, 0xB6BFFFFFFFFFFE, 0x0, 0xF8000000007C07FF, 0x1FFFFFF, 0x1E10000, + 0x9FC8000500000000, 0x2000000003D9F, 0x7FFFFFF0000, 0x2580000, 0x0, 0xF800000000000000, + 0x3EEFFBC00000200F, 0xE0000000000, 0x28F0000, 0xFF000000, 0xFFFFFFFBFFFFFC00, 0x1012020000000000, + 0xFF1E2000, 0x2B10000, 0x3800500000000000, 0x40000000B080, 0x2000104800000000, 0x4E00, 0x2FF0000, + 0x200010000000, 0x0, 0x30C0390050000000, 0x10000000000000, 0x3110000, 0x803C004000, 0x0, + 0x6021001000, 0x0, 0x31E1000, 0x602D85, 0x5800000000000000, 0x803C00, 0x0, 0x32A8400, 0xF400, + 0xF00070800000000, 0x0, 0xF00070800000000, 0x33D3000, 0x300100000000000, 0x1084200802A00000, + 0x200800DF3FFE0200, 0x4002001084, 0x3540000, 0x4040000000000000, 0x680, 0x20000000, 0x0, + 0x37B1000, 0x0, 0x3FFFFE00000000, 0xFFFFFF0000000000, 0x7, 0x3820000, 0xE000000000000000, 0x0, + 0x0, 0x0, 0x3B20000, 0x0, 0x0, 0x0, 0x1000000030, 0x3B50000, 0x0, 0x2004000000000000, 0x0, 0x0, + 0x3B80000, 0x200000000000000, 0x0, 0x0, 0xE00, 0x3BA0000, 0x0, 0x0, 0x1800000, 0x9FE0000100000000, + 0x3BE0000, 0x7FFFBFFF00000000, 0x5540000000000000, 0x1B283000000004, 0xFF8000000, 0x3CA0000, + 0xC00, 0xC0040, 0x800000, 0x0, 0x3FF0000, 0x21FDFFF700000000, 0x7000000000000310, + 0x7FFFFFFBFFFF7FF, 0xFFFFF80000000100, 0x405FFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFF0FFFFFFF, 0x482FFFF, 0xFFFF03FFFFFFFFFF, 0x3F3FFFFFFFFF3F3F, + 0xFFFF3FFFFFFFAAFF, 0xFFDFFFDFFFFFFFFF, 0x58EEFCF, 0x8207FF7FDCFFFF, 0x8080038050D88070, + 0x1FFF7FFFFFF30000, 0x1FFF000000000100, 0x685FFE2, 0xBD573E6FFEEF0001, 0xFFFFFFFF03E1FBFB, + 0x40000C000200FFFF, 0xE0000000, 0x7010000, 0x1B05000001210, 0x333E00500000292, 0xF00000000333, + 0x3C0F00000000, 0x7710000, 0x6000000, 0x0, 0x0, 0x0, 0x79B0000, 0x0, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0x7FF, 0x79D0000, 0x0, 0x0, 0x10000000, 0x0, 0x8280070, 0x0, 0x10000000, 0x0, + 0x0, 0x82C0000, 0x0, 0x0, 0x0, 0x300000000000, 0x82D0000, 0x0, 0x38000, 0x0, 0x80008000, + 0x82F0000, 0xFFFF000000000000, 0xFFFF, 0x0, 0x800000000000, 0x8340000, 0x8000000000000, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x855FFFF, 0x100000000003F, + 0x50000740FC000000, 0x36DB02A55555, 0x2A555555000DE10, 0x92636DB, 0xC7900000, 0xFFFFFFFFFFFE0000, + 0xFFFC7FFFFFFFFFFF, 0x0, 0x9700000, 0xFFFF7FFFFFFF0000, 0xFFFFFFFF00FFFFFF, 0xFFFFFFFFFFFF7FFF, + 0xFFFFFFFFFFFFFFFF, 0x9E3FFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xAD90000, 0x0, 0x0, 0x3FF0800000000000, 0xF0000000, 0xBD90000, 0x300000000, + 0x0, 0x100000000, 0x0, 0xBE80000, 0x40031C0000, 0x1000, 0x0, 0x1000000000, 0xBEBFFFF, + 0x3800000000000003, 0x800000000, 0x0, 0x10008, 0xC030000, 0x0, 0x0, 0xC19D000000000000, + 0x40000000000002, 0xC0B0000, 0x0, 0x200F000, 0x0, 0x20000000, 0xC150000, 0x0, 0xFFFFFFFF00000000, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xC1BFFFF, 0xFFFFFFFFFFFFFFFF, 0xFC657FE53FFFFFFF, + 0x3FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xCCBFFFF, 0x3FFFFFF, 0x5F7FFFFFE0F8007F, + 0xFFFFFFFFFFFFFFDB, 0x3FFFFFFFFFFFF, 0xDCD0000, 0xFFFFFFFFFFFFFFF8, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xE83FFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFF00003FFFFFFF, + 0xFFFCFFFFFFFFFFFF, 0xFFFFFFFFFF, 0xF900000, 0xFFFF03FF00001FFF, 0xF7FFFF7FF9FFFFF, + 0xFFFFFFFFFFFFFFD7, 0xFFFFFFFFFFFFFFFF, 0x10641FFF, 0xFFFFFFFFFFFFFFFE, 0xFFFFFFFFFFFFFFFF, + 0x7FFFFFFFFFFFFFFF, 0x7F7F1CFCFCFC, 0x114E0000, 0x0, 0x0, 0x0, 0x20000000, 0x122F0000, 0x0, 0x0, + 0x1000000000000, 0x0, 0x12300000, 0x7C0000000000000, 0x0, 0x0, 0x0, 0x12310000, 0x7FDFFFFFFFFFFBE, + 0x0, 0x0, 0x0, 0x12360000, 0x0, 0xA00000000000, 0x87000000, 0x0, 0x126E0000, 0x60000000000000, + 0x0, 0x0, 0x0, 0x12740000, 0x0, 0xF00000, 0x0, 0x0, 0x12760000, 0x0, 0x0, 0x0, 0x1800, 0x127A0000, + 0xE000, 0x1FFC00000, 0x3C0000, 0x0, 0x127C0000, 0x0, 0x8001000000000040, 0x600080014000000, 0x0, + 0x128E0007, 0x18C0800000, 0x800000000, 0x401000000000000, 0x0, 0x12990000, 0x600000, 0x0, 0x0, + 0x600, 0x12A10000, 0x1FC0008038005800, 0x1F, 0x0, 0x0, 0x12A50000, 0x40000044, 0x7C01000000000000, + 0xC, 0x0, 0x12B80000, 0x0, 0x18C0080000000, 0x0, 0x800000000000, 0x12C30000, 0x0, 0xC00000, 0x0, + 0x800, 0x12C90000, 0x0, 0x0, 0x0, 0x600, 0x12CC0000, 0x0, 0x0, 0x6101000000000000, 0x8, + 0x12CE0000, 0x0, 0x10000, 0x80001000000000, 0x0, 0x12D30200, 0x0, 0x0, 0x8000, 0x0, 0x12D70000, + 0x0, 0x0, 0x34, 0x800000, 0x12D80000, 0x0, 0x600000000, 0x0, 0x0, 0x12DC0000, 0x0, 0x0, + 0x1F00000000, 0x7F00000000, 0x12DE0000, 0x0, 0x30000, 0x0, 0x0, 0x12EA0000, 0x0, + 0x4000000000000000, 0x0, 0x0, 0x12EC0000, 0x0, 0x0, 0x0, 0x0, 0x12EDC000, 0xFE7F807E3FF, + 0x1F8003C00, 0x0, 0x1C00000000, 0x12EF0000, 0x0, 0x0, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFDFFFFF, + 0x131BFFFF, 0xFFEFEBFFDE64DFFF, 0xE7BFFFFFFFFFFFFF, 0xFC5F7BFFFFFFDFDF, 0xFFFFFFFFFFFFFFFD, + 0x13AAFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0x14A3FF3F, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, + 0x15B1FFFF, 0xFFFFFFFFFFFFCFFF, 0x0, 0x0, 0x0, 0x16C10000, 0x0, 0x0, 0x0, 0x7DBF9FFFF7F0000, + 0x16FFFFFF, 0x3FFFFFFFFFFF, 0x8000, 0x0, 0x7F000000000000, 0x17350000, 0x0, 0x4000, 0xF000, 0x0, + 0x176B0000, 0x0, 0xF00000000000, 0x0, 0x0, 0x17700000, 0x7F0000, 0x0, 0x7F0, 0x0, 0x17740000, 0x0, + 0x0, 0x0, 0x0, 0x1782FFEF, 0xEA840AF7FE96FFFF, 0xFBFF5EF7F796AA96, 0xFFFFBEE0FFF, 0x0, 0x17910000, + 0x0, 0x0, 0x0, 0x7FFFFFFF07FF0000, 0x180FFFFF, 0x1C000000FFFF, 0x10000, 0x0, 0xFFFFFFFFFFF0007, + 0x184901FF, 0x3, 0x0, 0x0, 0x0, 0x18950000, 0x3FF0000, 0x0, 0x0, 0x0, 0x18970000, 0x0, + 0xFFFFFFFFFFFF0000, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x18A1FFFF, 0xFFFFFFFFFFFFFFFF, + 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0x1961FFFF, 0xFFFFFFFFFFFFFFFF, + 0x3FFF, 0x0, 0x0, 0x1A710000, +}; + +#define NFKD_DECOMP_LEVEL_COUNT 13 + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_sizes[13] = { + 0xEE4, 0x95B, 0x5EF, 0x3CA, 0x245, 0x17E, 0x100, 0xA3, 0x5B, 0x40, 0x40, 0x40, 0x40, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys0[60] = { + 0x901220BD0BE04418, 0xB0188E290D880A4, 0xC12942408692380B, 0xA0C04914D8B447F2, 0x5C4F65A40420A830, + 0x481B468CAB702398, 0x1044931C7A228942, 0x6030013512085230, 0xA4889404B17C0100, + 0x2E46B91B72D5AAF4, 0xC629102B50E6FC29, 0x3C442A6402D314FA, 0x2CC45214DC3802BC, + 0x89468520D3C0A459, 0x8DEC8B081E2E2328, 0x468833B846919852, 0x24B9016212840488, + 0x8C232454529C2803, 0x8954927514A01615, 0x727A34B6E404042, 0x8620132CACD1A1A, 0x319022448681C181, + 0xF8272CD02FA08D82, 0xC84E7041A19951E6, 0x483A0B040A69D3A1, 0xD0C6B588648BAB48, 0x8537D43A0CC720, + 0x7E8BA4A602875947, 0x76C944E480231AD6, 0x12913630D2022644, 0x8EA6716400724406, + 0xA082A08AE14D90E2, 0x126A25000188D0E, 0xE687C5E2845AC804, 0xC4DA014108A8F8ED, 0x444BC80348BB275B, + 0x440101934F804880, 0x4009A400749CD8A0, 0x41E014830850D17E, 0x30E1CE408D618208, + 0x46B7BF58CCB71770, 0x80D0347E04909A81, 0x6650418E82860490, 0x884106045B0C0ED2, + 0x544CCF2882041408, 0xA0F70940A182E9B9, 0x604750318718294, 0x28A26C89003A2D39, 0x16424038D84C5181, + 0x3D9156E45D447326, 0xE1404463B1BAFA11, 0x42BC4183886A2220, 0x22718B00D4781423, + 0xB034AB7364E04413, 0x80E66916A0426041, 0x43641912874810BA, 0x888B017A26B19A58, 0xF60285833AC8A20, + 0x85180405A8A8100C, 0x151D3AA48, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys1[38] = { + 0x8133611C14003EC, 0x2A192E2298BC42E9, 0x3C241A1220995042, 0x20816B04B5A00465, 0x402C006864834BB2, + 0x60640E19CB589582, 0xE09C8BD876286C51, 0x5C3D820449614201, 0x1580B94452964420, + 0x73CC22481C205B98, 0xA003A10010063B84, 0x100A9424002970E2, 0x491E412E263361CC, + 0x81C91A3A701923D0, 0x832422CB89AF1A2A, 0x14B608101A00A1CD, 0xC3EC51EA0B0602DF, + 0x774241180DD40360, 0x18664CA655A13A28, 0xA00CA2EF6C00D70B, 0x221295235011731, 0xCDC65B22501A229D, + 0x1C208A5113235114, 0xA9C28F06629C62B1, 0x2698831608403040, 0xA09E1841289908E2, + 0x1F8E5E927881C1D0, 0x70004CC0560017, 0xE086081006018, 0x98A541626466085D, 0xA920040486B8CC64, + 0x6110640150471105, 0xCFE2F640B100E20A, 0xC2A520E78DB4728, 0xE460E987E1509A19, 0xC30F0903095D97C9, + 0xC10CCDC41AE4981, 0x28BBD88, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys2[24] = { + 0xB7018FA119031900, 0xD990488412E2BE22, 0xB8010BA8ACC27849, 0xDC56825527698C10, + 0x16964A841E8901D0, 0xA28CB01F0B2E0345, 0x562042CCD18C1C0D, 0x49401B9835469A58, + 0x4884A8804041A428, 0x4929C8665819A078, 0x26446C1C126A3848, 0x4056014890010395, + 0x2D007902A6804C88, 0xE170140A1005B2AA, 0xB5C6E19064161488, 0x434E434C24282046, 0x425454063C81034, + 0xC14004CA842CB23A, 0x88B3A0F07664A111, 0x2446597514193A81, 0xE98432840C924A38, 0x8AC0B169C47BA24, + 0x16738449411A538C, 0x1C7CA09A050, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys3[16] = { + 0x323323721BC053E, 0x18044D502E8B30A6, 0xA1D5F0A8100B03B5, 0x94DB307E38F20B09, 0x1D8248575DC67C56, + 0x33801BE54E04AA40, 0x953632597406272, 0x20A320ABEBB8141, 0xDF4604C05A285AD6, 0x3F84008A27E25784, + 0xA285119C0B14B910, 0x9018B98602F18875, 0x8258625A41D81A09, 0x741B63046151C6A8, + 0x62444B3B0CAC0890, 0xA6, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys4[10] = { + 0xB00AE67C9864A942, 0x360224413421201C, 0x1C8230022120154D, 0x58085298A8C12400, 0xE210C444E65D02, + 0xA01689110BD88, 0x510DCCC8AA33D62A, 0x82B6D4A39456C62B, 0xA13CA4A00A410086, 0x8, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys5[6] = { + 0x1528D382843E0B02, 0x1010833A256AB220, 0x410A9646060C320, 0xBD34198953086B83, 0xF0006402081002E, + 0x17AF381052018441, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys6[4] = { + 0x515014B089111486, 0x8430A006144488B1, 0x485280130C09EDCF, 0x17A9E5104A9A762B, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys7[3] = { + 0x18481DCB9311795, 0x5B305427C2716DB7, 0x24B180F19, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys8[2] = { + 0x78080C3711A1497D, 0xB4E44A, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys9[1] = { + 0x259F921E430F320D, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys10[1] = { + 0x891100C0029C3400, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys11[1] = { + 0x108441000100084, +}; + +static const __swift_uint64_t _swift_stdlib_nfkd_decomp_keys12[1] = { + 0x40080000000, +}; + +static const __swift_uint64_t * const _swift_stdlib_nfkd_decomp_keys[13] = { + _swift_stdlib_nfkd_decomp_keys0, _swift_stdlib_nfkd_decomp_keys1, _swift_stdlib_nfkd_decomp_keys2, + _swift_stdlib_nfkd_decomp_keys3, _swift_stdlib_nfkd_decomp_keys4, _swift_stdlib_nfkd_decomp_keys5, + _swift_stdlib_nfkd_decomp_keys6, _swift_stdlib_nfkd_decomp_keys7, _swift_stdlib_nfkd_decomp_keys8, + _swift_stdlib_nfkd_decomp_keys9, _swift_stdlib_nfkd_decomp_keys10, + _swift_stdlib_nfkd_decomp_keys11, _swift_stdlib_nfkd_decomp_keys12, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks0[8] = { + 0x0, 0xB0, 0x180, 0x239, 0x301, 0x3B6, 0x475, 0x538, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks1[5] = { + 0x589, 0x642, 0x6F6, 0x7C2, 0x862, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks2[3] = { + 0x8F5, 0x9BB, 0xA64, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks3[2] = { + 0xB1A, 0xBED, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks4[2] = { + 0xC9F, 0xD52, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks5[1] = { + 0xD66, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks6[1] = { + 0xDE4, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks7[1] = { + 0xE41, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks8[1] = { + 0xE89, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks9[1] = { + 0xEAE, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks10[1] = { + 0xECB, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks11[1] = { + 0xEDA, +}; + +static const __swift_uint16_t _swift_stdlib_nfkd_decomp_ranks12[1] = { + 0xEE2, +}; + +static const __swift_uint16_t * const _swift_stdlib_nfkd_decomp_ranks[13] = { + _swift_stdlib_nfkd_decomp_ranks0, _swift_stdlib_nfkd_decomp_ranks1, + _swift_stdlib_nfkd_decomp_ranks2, _swift_stdlib_nfkd_decomp_ranks3, + _swift_stdlib_nfkd_decomp_ranks4, _swift_stdlib_nfkd_decomp_ranks5, + _swift_stdlib_nfkd_decomp_ranks6, _swift_stdlib_nfkd_decomp_ranks7, + _swift_stdlib_nfkd_decomp_ranks8, _swift_stdlib_nfkd_decomp_ranks9, + _swift_stdlib_nfkd_decomp_ranks10, _swift_stdlib_nfkd_decomp_ranks11, + _swift_stdlib_nfkd_decomp_ranks12, +}; + +static const __swift_uint8_t _swift_stdlib_nfkd_decomp[8837] = { + 0x2, 0xC9, 0x91, 0x2, 0xD8, 0xAE, 0x2, 0xDB, 0x89, 0x3, 0xE8, 0xA7, 0xA3, 0x2, 0x33, 0x39, 0x2, + 0xDA, 0xB3, 0x1, 0x6C, 0x1, 0x4B, 0x3, 0xE5, 0xBC, 0x8B, 0x3, 0x6D, 0x6F, 0x6C, 0x6, 0xD9, 0x8A, + 0xD9, 0x94, 0xD9, 0x87, 0x6, 0xD9, 0x82, 0xD9, 0x85, 0xD8, 0xAD, 0x3, 0xE1, 0x85, 0xAF, 0x2, 0xD9, + 0x86, 0x2, 0xCE, 0x9A, 0x3, 0x73, 0xCC, 0x87, 0x3, 0xE3, 0x83, 0x9E, 0x2, 0xCE, 0xB3, 0x1, 0x4F, + 0x3, 0xE8, 0xB2, 0xA1, 0x2, 0xCE, 0xB2, 0x9, 0xE3, 0x80, 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, + 0x3, 0xE7, 0xA6, 0xBE, 0x3, 0xE9, 0xBE, 0x9F, 0x1, 0x4E, 0x1, 0x73, 0x4, 0xD9, 0x82, 0xD9, 0x89, + 0x3, 0xE6, 0x9C, 0xA8, 0x2, 0xDA, 0xA9, 0x3, 0xE7, 0xA4, 0xBA, 0x3, 0xE1, 0x84, 0x85, 0x2, 0x66, + 0x69, 0x1, 0x61, 0x1, 0x6B, 0x9, 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80, 0x95, 0x1, 0x76, + 0x5, 0x32, 0x31, 0xE6, 0x97, 0xA5, 0x1, 0x4D, 0x1, 0x55, 0x2, 0xCA, 0xA5, 0x1, 0x64, 0x2, 0xD0, + 0xBD, 0x2, 0x50, 0x61, 0x1, 0x70, 0x3, 0x28, 0x45, 0x29, 0x2, 0xD8, 0xAC, 0x2, 0xCE, 0xB8, 0x1, + 0x2D, 0x2, 0xD8, 0xAD, 0x2, 0xC9, 0xA5, 0x3, 0xE6, 0xAD, 0xB9, 0x1, 0x51, 0x1, 0x6A, 0x4, 0xD9, + 0x85, 0xD9, 0x85, 0x3, 0xE7, 0x94, 0x9F, 0x1, 0x77, 0x12, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0x3, 0xE1, 0x85, 0xA7, + 0xC, 0xE3, 0x83, 0x9F, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x3, 0xE1, 0x85, + 0xB3, 0x3, 0xE3, 0x82, 0xB5, 0x1, 0x37, 0x3, 0xE5, 0x8F, 0xB3, 0x3, 0xE1, 0x84, 0x82, 0x6, 0xD8, + 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, 0x6, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0x20, 0xCC, 0x85, 0x1, + 0x67, 0x4, 0xD8, 0xAA, 0xD9, 0x8A, 0x3, 0x28, 0x79, 0x29, 0x3, 0xE7, 0x99, 0xBD, 0x1, 0x5A, 0x1, + 0x31, 0x2, 0xDA, 0xA4, 0x4, 0xD8, 0xB5, 0xD8, 0xAE, 0x4, 0xD8, 0xB9, 0xD9, 0x85, 0x1, 0x6D, 0x3, + 0xE6, 0xB0, 0xB4, 0x1, 0x79, 0x5, 0x31, 0x38, 0xE7, 0x82, 0xB9, 0x3, 0x28, 0x58, 0x29, 0x1, 0x62, + 0x3, 0xE1, 0x85, 0xA4, 0x4, 0xD9, 0x83, 0xD9, 0x85, 0x1, 0x47, 0x3, 0xCE, 0xBC, 0x6C, 0x2, 0xCF, + 0x84, 0x2, 0xCF, 0x80, 0x3, 0xE2, 0x82, 0xA9, 0x3, 0x58, 0x49, 0x49, 0x1, 0x44, 0x4, 0xD8, 0xAD, + 0xD8, 0xAC, 0x3, 0xE4, 0xB8, 0x80, 0x2, 0xDA, 0x88, 0x1, 0x3A, 0x2, 0xCF, 0x82, 0x3, 0xE9, 0xA6, + 0xAC, 0x3, 0x47, 0x48, 0x7A, 0x2, 0xD0, 0xB5, 0x3, 0xE5, 0x89, 0x8D, 0x3, 0xE1, 0x87, 0xB2, 0x3, + 0xE1, 0x84, 0x90, 0x4, 0x38, 0xE6, 0x97, 0xA5, 0x2, 0x4E, 0x6A, 0x5, 0x28, 0xE1, 0x84, 0x8B, 0x29, + 0x2, 0xCE, 0x98, 0x3, 0xE5, 0xA5, 0xB3, 0xC, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAD, + 0xE3, 0x83, 0xB3, 0x3, 0x28, 0x31, 0x29, 0x2, 0xCE, 0x9C, 0x2, 0x6C, 0x6E, 0x2, 0xCF, 0x87, 0x2, + 0xCA, 0x8B, 0x4, 0xD8, 0xAC, 0xD9, 0x89, 0x3, 0xE3, 0x82, 0xA6, 0xF, 0xE3, 0x82, 0xB5, 0xE3, 0x83, + 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x2, 0x57, 0x43, 0x1, 0x33, 0x1, 0x56, + 0x3, 0xE5, 0x8C, 0xB8, 0x1, 0x6F, 0x2, 0xD8, 0xB1, 0x1, 0x41, 0x6, 0xD8, 0xAA, 0xD8, 0xAD, 0xD8, + 0xAC, 0x1, 0x57, 0x3, 0xE5, 0x8A, 0xB4, 0x2, 0xCE, 0x99, 0x1, 0x66, 0x4, 0xD8, 0xB9, 0xD9, 0x89, + 0x1, 0x72, 0x2, 0xD9, 0x87, 0x6, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, 0xAC, 0x2, 0xC9, 0xA3, 0x6, 0xD9, + 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x2, 0xD8, 0xB5, 0x3, 0xE9, 0xBE, 0xA0, 0x2, 0xCE, 0xA3, 0x1, 0x59, + 0x3, 0xE3, 0x80, 0x82, 0x4, 0xD9, 0x84, 0xD8, 0xAD, 0x6, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x4, + 0xD9, 0x81, 0xD8, 0xAC, 0x2, 0xD8, 0xBA, 0x3, 0xE6, 0x9C, 0x88, 0x3, 0x28, 0x61, 0x29, 0x3, 0xE3, + 0x83, 0xAD, 0x1, 0x45, 0x4, 0xD8, 0xA8, 0xD8, 0xAE, 0x2, 0xCE, 0xA8, 0x1, 0x71, 0x2, 0xCE, 0x93, + 0x2, 0xCE, 0xBE, 0x4, 0xD8, 0xB7, 0xD9, 0x89, 0x2, 0xCF, 0x86, 0x9, 0xE3, 0x80, 0x94, 0xE6, 0x9C, + 0xAC, 0xE3, 0x80, 0x95, 0x3, 0xE8, 0x80, 0x92, 0x1, 0x74, 0x2, 0xC7, 0x81, 0x3, 0x20, 0xCC, 0x84, + 0x1, 0x52, 0xC, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xB4, 0x1, 0x46, + 0x2, 0xCA, 0x8A, 0x2, 0x31, 0x33, 0x1, 0x53, 0x3, 0xE3, 0x83, 0xB2, 0x6, 0xD8, 0xB9, 0xD9, 0x85, + 0xD9, 0x8A, 0x3, 0xE1, 0x84, 0x8F, 0x8, 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29, 0x2, 0xC9, + 0x95, 0xC, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x6, 0xE3, + 0x83, 0xAC, 0xE3, 0x83, 0xA0, 0x5, 0x28, 0xE5, 0xAD, 0xA6, 0x29, 0x4, 0x37, 0xE7, 0x82, 0xB9, 0x2, + 0x6E, 0x6A, 0x3, 0xE1, 0x85, 0xB0, 0x4, 0xD8, 0xAB, 0xD9, 0x8A, 0x3, 0xE1, 0x85, 0x97, 0x4, 0xD8, + 0xB8, 0xD9, 0x85, 0x2, 0xCE, 0xB5, 0x2, 0xD8, 0xAB, 0x1, 0x4A, 0x1, 0x20, 0x1, 0x49, 0x3, 0xE7, + 0xA9, 0xBA, 0x1, 0x68, 0x2, 0xD3, 0x8F, 0x2, 0xCA, 0xA9, 0x4, 0x28, 0x31, 0x37, 0x29, 0x1, 0x75, + 0x5, 0x20, 0xCC, 0x94, 0xCD, 0x82, 0x3, 0xE2, 0xB1, 0xB1, 0x2, 0xD1, 0x87, 0x6, 0xD8, 0xB3, 0xD8, + 0xAE, 0xD9, 0x8A, 0x6, 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x3, 0xE3, 0x80, 0x95, 0x6, 0xE0, 0xBA, + 0xAB, 0xE0, 0xBA, 0xA1, 0x3, 0x63, 0x6D, 0x32, 0x3, 0xE7, 0x9B, 0xA3, 0x2, 0xCA, 0xA4, 0xC, 0xE3, + 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0x2, 0xCF, 0x88, 0x2, 0xCE, + 0xA0, 0x2, 0xDA, 0xBB, 0x3, 0xE1, 0x84, 0x9D, 0x2, 0xD9, 0xAF, 0x1, 0x50, 0x3, 0xE1, 0x84, 0x8D, + 0x6, 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x2, 0xD7, 0x93, 0x1, 0x30, 0x3, 0x20, 0xCC, 0x94, 0x5, + 0x28, 0xE4, 0xB9, 0x9D, 0x29, 0x1, 0x38, 0x3, 0xE8, 0xB5, 0xB0, 0x4, 0xD8, 0xB3, 0xD8, 0xAE, 0x3, + 0xE1, 0x87, 0x9D, 0x5, 0x28, 0xE1, 0x84, 0x8C, 0x29, 0xF, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x1, 0x7A, 0x2, 0xC9, 0xBE, 0x3, 0xE1, 0x84, + 0x87, 0x3, 0xE9, 0x9A, 0xB9, 0x3, 0xE3, 0x82, 0xA7, 0x2, 0xCF, 0x81, 0x6, 0xD9, 0x86, 0xD8, 0xAC, + 0xD9, 0x85, 0x4, 0xD8, 0xAA, 0xD9, 0x86, 0x3, 0xE2, 0x80, 0x93, 0x3, 0xE1, 0x86, 0xB1, 0x2, 0xCE, + 0xA6, 0x6, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x85, 0x2, 0xD9, 0x8A, 0x3, 0x31, 0x35, 0x2E, 0x3, 0xE8, + 0xA1, 0x80, 0x5, 0x31, 0x31, 0xE6, 0x9C, 0x88, 0x3, 0xE5, 0xB7, 0xA6, 0x4, 0xD8, 0xAA, 0xD8, 0xB2, + 0x1, 0x63, 0x5, 0x31, 0x35, 0xE7, 0x82, 0xB9, 0x3, 0xE1, 0x85, 0xB4, 0x2, 0xCE, 0x9F, 0x3, 0x4D, + 0x50, 0x61, 0x3, 0xE6, 0xAC, 0xA0, 0x1, 0x42, 0x4, 0xD8, 0xB5, 0xD9, 0x8A, 0x3, 0xE7, 0xBD, 0x91, + 0x2, 0xD0, 0xBB, 0x5, 0x28, 0xE1, 0x84, 0x90, 0x29, 0x2, 0xCE, 0x9D, 0x1, 0x54, 0x9, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x2, 0xCE, 0xA7, 0x3, 0xE5, 0x86, 0x99, 0x1, 0x5F, 0x6, + 0xD9, 0x82, 0xD9, 0x84, 0xDB, 0x92, 0x3, 0xE1, 0x85, 0xA2, 0x3, 0x20, 0xCC, 0x86, 0x6, 0xD9, 0x84, + 0xD8, 0xAC, 0xD8, 0xAC, 0x3, 0xE7, 0xAE, 0x8F, 0x3, 0xE7, 0x93, 0xA6, 0x2, 0x44, 0x5A, 0x3, 0xE5, + 0xB9, 0xB2, 0x3, 0xE2, 0x88, 0x82, 0x2, 0xD9, 0xBE, 0x2, 0xD8, 0xB8, 0x3, 0xE3, 0x83, 0x84, 0xC, + 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x2, 0xDA, 0x83, 0x1, + 0x58, 0x4, 0xD8, 0xB9, 0xD9, 0x8A, 0x1, 0x69, 0x2, 0x21, 0x21, 0x8, 0xD8, 0xA7, 0xD9, 0x83, 0xD8, + 0xA8, 0xD8, 0xB1, 0x1, 0x28, 0x2, 0xD9, 0xBB, 0x5, 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x3, 0xE4, 0xBA, + 0xBA, 0x6, 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAE, 0x2, 0xD8, 0xB4, 0x4, 0xD5, 0xB4, 0xD5, 0xB6, 0x2, + 0xCE, 0xBC, 0x3, 0xE5, 0x86, 0x82, 0x3, 0xE3, 0x83, 0xA2, 0xF, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x8B, + 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x5, 0x33, 0xE2, 0x81, 0x84, 0x34, 0x2, + 0xD8, 0xAA, 0x3, 0xE1, 0x86, 0x88, 0x3, 0xE3, 0x82, 0xAF, 0x4, 0xD9, 0x87, 0xD8, 0xAC, 0x1, 0x43, + 0x1, 0x78, 0x3, 0xE3, 0x83, 0xA9, 0x3, 0x6D, 0x69, 0x6C, 0x2, 0xCE, 0x9B, 0x3, 0xE6, 0x97, 0xA5, + 0x4, 0xD8, 0xBA, 0xD9, 0x85, 0x1, 0x3C, 0x6, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x5, 0x28, 0xE4, + 0xB8, 0x80, 0x29, 0x2, 0xDB, 0x81, 0x6, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x85, 0x4, 0xD9, 0x87, 0xD9, + 0x89, 0x6, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE1, 0x84, 0x83, 0x4, 0xD8, 0xB3, 0xD8, 0xB1, + 0x4, 0xD8, 0xB6, 0xD8, 0xAD, 0x2, 0x31, 0x30, 0x4, 0xD9, 0x8A, 0xD9, 0x94, 0x9, 0xE3, 0x80, 0x94, + 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x3, 0xE1, 0x85, 0xA0, 0x3, 0xE3, 0x83, 0xAB, 0x2, 0x6D, 0x6D, + 0x1, 0x35, 0x2, 0xCE, 0xA9, 0xC, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, + 0xB2, 0x2, 0xC8, 0xB7, 0x2, 0xC9, 0xAE, 0x5, 0x20, 0xCC, 0x94, 0xCC, 0x80, 0x3, 0xE2, 0xA6, 0x85, + 0x3, 0xE9, 0x85, 0x8D, 0x2, 0xC2, 0xA5, 0x2, 0x32, 0x31, 0x9, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAB, 0x2, 0xDB, 0x87, 0x2, 0xD9, 0x82, 0x2, 0xCE, 0x9E, 0x5, 0x33, 0x31, 0xE6, 0x97, + 0xA5, 0x4, 0xD9, 0x8A, 0xD9, 0x87, 0x1, 0x3B, 0x3, 0xE1, 0x84, 0x8E, 0x2, 0x53, 0x44, 0x2, 0x34, + 0x35, 0x3, 0xE1, 0x85, 0xAE, 0x4, 0xD9, 0x85, 0xD8, 0xAC, 0x3, 0xE9, 0x85, 0x89, 0x5, 0x28, 0xE5, + 0x91, 0xBC, 0x29, 0x2, 0xCE, 0x96, 0x6, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE6, 0x89, 0x8B, + 0x3, 0xE1, 0x85, 0x80, 0x2, 0xD9, 0x85, 0x2, 0x6D, 0x41, 0x2, 0xD8, 0xA1, 0x3, 0xE8, 0x88, 0x9B, + 0x1, 0x4C, 0x4, 0xD8, 0xA7, 0xD9, 0x94, 0x1, 0x5C, 0x4, 0x31, 0xE2, 0x81, 0x84, 0x4, 0xDB, 0x95, + 0xD9, 0x94, 0x4, 0xD8, 0xB4, 0xD8, 0xB1, 0x2, 0x32, 0x33, 0x2, 0xDA, 0xAD, 0x2, 0xD8, 0xB9, 0x3, + 0xE5, 0x8D, 0x81, 0x9, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x3, 0xEA, 0xAD, + 0xA6, 0x3, 0xE1, 0x86, 0xB0, 0x8, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x29, 0x2, 0xD0, 0xB1, + 0x2, 0xCE, 0x92, 0x6, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x2, 0xD8, 0xAF, 0x3, 0xE2, 0x88, 0x92, + 0x9, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x4, 0x28, 0x32, 0x30, 0x29, 0x2, 0xCE, + 0xBA, 0x2, 0xDB, 0x90, 0x3, 0xE3, 0x83, 0x8E, 0x4, 0xD9, 0x84, 0xD8, 0xA7, 0x5, 0x28, 0xE6, 0x9C, + 0x88, 0x29, 0x4, 0xD9, 0x82, 0xD8, 0xAD, 0x3, 0xE9, 0xBC, 0x93, 0x4, 0x34, 0xE7, 0x82, 0xB9, 0x3, + 0xEA, 0xAC, 0xB7, 0x2, 0xD8, 0xB3, 0x2, 0x43, 0x44, 0x3, 0xE1, 0x85, 0xA8, 0x4, 0xD8, 0xAB, 0xD9, + 0x85, 0x2, 0xCA, 0x81, 0x4, 0xD9, 0x83, 0xD9, 0x8A, 0x3, 0xE4, 0xBA, 0xA0, 0x3, 0xE7, 0x89, 0xB9, + 0x3, 0xE1, 0x84, 0x81, 0x1, 0x2B, 0x6, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, 0x2, 0xDA, 0x84, 0x4, + 0xD8, 0xB9, 0xD8, 0xAC, 0x2, 0xC9, 0xAD, 0x3, 0xE1, 0x84, 0x91, 0x3, 0xE7, 0xA4, 0xBE, 0x4, 0xD9, + 0x84, 0xD9, 0x8A, 0x9, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xB3, 0x3, 0xE4, 0xB8, + 0xA8, 0x4, 0xD8, 0xAE, 0xD9, 0x89, 0x3, 0xE8, 0x89, 0xAE, 0x6, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, + 0x3, 0xE9, 0x9F, 0xB3, 0x3, 0xE6, 0x97, 0xA0, 0x5, 0x20, 0xCC, 0x94, 0xCC, 0x81, 0x3, 0xE3, 0x82, + 0xAD, 0x3, 0x6D, 0x6D, 0x32, 0x2, 0xDA, 0xB1, 0x2, 0xC9, 0xA1, 0x3, 0xE8, 0xB1, 0xB8, 0x3, 0xE3, + 0x80, 0x91, 0x3, 0xE1, 0x84, 0x9A, 0x5, 0x28, 0xE5, 0x85, 0xAD, 0x29, 0x4, 0x31, 0xE7, 0x82, 0xB9, + 0x3, 0xE9, 0xBC, 0x8E, 0x4, 0xD9, 0x82, 0xD9, 0x8A, 0x6, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x85, 0x6, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x2, 0xD9, 0x88, 0x3, 0xE6, 0xB3, 0xA8, 0x2, 0x31, 0x34, 0x2, + 0xD8, 0xA8, 0x1, 0x7B, 0x6, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0xB3, 0x4, 0xD8, 0xA8, 0xD9, 0x87, 0x5, + 0x31, 0x32, 0xE6, 0x97, 0xA5, 0x3, 0xE5, 0xBD, 0xA1, 0x2, 0xCE, 0xB6, 0x3, 0x54, 0x45, 0x4C, 0x2, + 0xCE, 0xBF, 0x3, 0xE7, 0xA6, 0xB8, 0x1, 0x34, 0x2, 0xDA, 0x87, 0x3, 0xE9, 0xBC, 0xBB, 0x1, 0x36, + 0x2, 0xD8, 0xB0, 0x3, 0xE5, 0xB7, 0xBE, 0x3, 0xE3, 0x83, 0xAC, 0x3, 0xE9, 0x9D, 0xA2, 0x2, 0xCA, + 0x80, 0x4, 0xD8, 0xA7, 0xD9, 0x95, 0x2, 0xCE, 0x91, 0x2, 0x49, 0x49, 0x4, 0xD9, 0x80, 0xD9, 0x8F, + 0x1, 0x6E, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, 0x5, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x5, 0x28, + 0xE1, 0x84, 0x86, 0x29, 0x5, 0x32, 0xE2, 0x81, 0x84, 0x33, 0x9, 0xE2, 0x80, 0xB5, 0xE2, 0x80, + 0xB5, 0xE2, 0x80, 0xB5, 0x3, 0xE3, 0x83, 0xAA, 0x2, 0xCE, 0x94, 0x3, 0xE8, 0xB2, 0x9D, 0x3, 0x28, + 0x66, 0x29, 0x3, 0xE7, 0x99, 0xB6, 0x3, 0xE5, 0xB1, 0xAE, 0x3, 0xE5, 0x8D, 0x94, 0x2, 0xCE, 0xA1, + 0x3, 0x4D, 0xCE, 0xA9, 0x4, 0xD8, 0xAC, 0xD8, 0xAD, 0x2, 0xC9, 0x90, 0x3, 0x50, 0x50, 0x4D, 0x4, + 0xD8, 0xB6, 0xD8, 0xAC, 0x3, 0xE3, 0x83, 0x88, 0x4, 0xD8, 0xAA, 0xD8, 0xAD, 0x2, 0xCF, 0x83, 0x1, + 0x40, 0x3, 0x28, 0x4F, 0x29, 0x2, 0xD1, 0x83, 0x4, 0xD8, 0xBA, 0xD8, 0xAC, 0x3, 0xE6, 0x98, 0xA0, + 0x2, 0x6C, 0x6A, 0x3, 0xE4, 0xB8, 0xAD, 0x3, 0x28, 0x41, 0x29, 0x3, 0xE1, 0x86, 0xB2, 0x2, 0xD0, + 0xB7, 0xC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0x3, 0xE3, + 0x83, 0x81, 0x5, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x3, 0x20, 0xCC, 0x93, 0x4, 0xF0, 0x9D, 0xBC, 0x84, + 0x7, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x2, 0xD9, 0x83, 0x2, 0x6B, 0x67, 0x3, 0xE7, 0x94, + 0xB7, 0x3, 0xE5, 0x9B, 0x9B, 0x3, 0xE7, 0x9A, 0xBF, 0x3, 0xE7, 0x84, 0xA1, 0x3, 0xE9, 0x95, 0xB7, + 0x3, 0x28, 0x6D, 0x29, 0x2, 0xCE, 0xA5, 0x5, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x3, 0xE1, 0x85, 0xA6, + 0x8, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x2, 0x44, 0x4A, 0x3, 0xE5, 0xBF, 0x83, 0x2, + 0xCE, 0xB4, 0x2, 0xDA, 0x8C, 0x3, 0x28, 0x4B, 0x29, 0x2, 0x73, 0x74, 0x2, 0x32, 0x2E, 0x2, 0xCA, + 0x9D, 0x3, 0x50, 0x54, 0x45, 0x4, 0xD9, 0x86, 0xD9, 0x85, 0x4, 0x39, 0xE7, 0x82, 0xB9, 0x3, 0xE7, + 0xA7, 0x98, 0x2, 0xDB, 0x86, 0x3, 0xE8, 0x80, 0x8C, 0x2, 0x6E, 0x73, 0x2, 0xD1, 0x85, 0x5, 0x31, + 0x38, 0xE6, 0x97, 0xA5, 0x6, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x3, 0xE3, 0x82, 0xB1, 0x4, 0xD8, + 0xB3, 0xD9, 0x8A, 0x4, 0xD5, 0xB4, 0xD5, 0xAB, 0x4, 0x33, 0xE7, 0x82, 0xB9, 0x6, 0xD8, 0xB5, 0xD9, + 0x84, 0xD9, 0x89, 0x1, 0x32, 0x2, 0xC9, 0xB7, 0xF, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xA2, 0x4, 0xD8, 0xB4, 0xD8, 0xAC, 0x3, 0x67, 0x61, 0x6C, 0x3, + 0xE6, 0xAF, 0x8D, 0x2, 0xCE, 0xB7, 0x2, 0xD9, 0x81, 0x3, 0xE8, 0xBE, 0xB5, 0x3, 0xE5, 0xB0, 0x8F, + 0x3, 0xE7, 0x8E, 0x89, 0x2, 0xCA, 0x9C, 0x1, 0x21, 0x3, 0xE3, 0x83, 0xA6, 0x3, 0xE1, 0x85, 0xA9, + 0xF, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0x4, 0x28, 0x31, 0x31, 0x29, 0x4, 0x33, 0xE6, 0x97, 0xA5, 0x4, 0xD8, 0xAE, 0xD8, 0xAC, 0x4, 0x35, + 0xE7, 0x82, 0xB9, 0x6, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, 0x2, 0xCE, 0xBB, 0x12, 0xE3, 0x83, + 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, + 0x1, 0x65, 0x2, 0xD7, 0x9C, 0x2, 0x54, 0x4D, 0x3, 0xE3, 0x83, 0xA7, 0x5, 0x28, 0xE7, 0xA5, 0xAD, + 0x29, 0x3, 0xE9, 0xBD, 0x92, 0x6, 0xE3, 0x83, 0x9F, 0xE3, 0x83, 0xAA, 0x2, 0x53, 0x76, 0x3, 0xE4, + 0xB8, 0x81, 0x2, 0xD9, 0xBA, 0x9, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x3, 0xE4, + 0xBA, 0x85, 0x3, 0xE3, 0x82, 0xA4, 0x4, 0x31, 0xE6, 0x97, 0xA5, 0x4, 0xD8, 0xB6, 0xD8, 0xAE, 0x2, + 0xCA, 0x92, 0x6, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x2, 0xD8, 0xB7, 0x3, 0xE3, 0x82, 0xB9, 0x2, + 0xD0, 0xBC, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0xC, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0x3, 0xE5, 0xAD, 0x90, 0x2, 0xD9, 0xBF, 0x2, 0xCF, 0x89, 0x2, + 0x66, 0x6C, 0x3, 0xE9, 0x82, 0x91, 0x4, 0xD8, 0xAA, 0xD9, 0x85, 0x3, 0xE4, 0xB8, 0x89, 0x2, 0xD7, + 0x90, 0x2, 0xC9, 0xB4, 0x2, 0x70, 0x63, 0x3, 0xE2, 0x80, 0x94, 0x4, 0xD9, 0x80, 0xD9, 0x8B, 0x5, + 0x28, 0xE6, 0x9C, 0xA8, 0x29, 0x6, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, 0x1, 0x3D, 0x6, 0xD9, 0x84, + 0xD8, 0xA7, 0xD9, 0x93, 0x3, 0xE3, 0x83, 0xB1, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x6, 0xE1, + 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x95, 0x4, 0xD9, 0x86, 0xD9, + 0x8A, 0x3, 0xE7, 0xAB, 0x8B, 0x3, 0xE9, 0xAA, 0xA8, 0x3, 0x6C, 0xC2, 0xB7, 0x2, 0xD3, 0x99, 0x3, + 0xE5, 0x8C, 0x95, 0x5, 0x56, 0xE2, 0x88, 0x95, 0x6D, 0x4, 0x44, 0x5A, 0xCC, 0x8C, 0x4, 0xD9, 0x83, + 0xD8, 0xAE, 0x5, 0x37, 0xE2, 0x81, 0x84, 0x38, 0x4, 0xD8, 0xB4, 0xD9, 0x85, 0x2, 0xCA, 0xA3, 0x2, + 0xC8, 0xA2, 0x4, 0xD8, 0xAA, 0xD8, 0xAE, 0x8, 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84, 0x2, + 0xCA, 0x88, 0x3, 0xE1, 0x86, 0xB3, 0x3, 0x3D, 0x3D, 0x3D, 0x1, 0x48, 0x3, 0xE4, 0xBA, 0xA4, 0x2, + 0x49, 0x58, 0x2, 0xC9, 0xAA, 0x6, 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x3, 0xE3, 0x80, 0x96, 0x4, + 0xD8, 0xB3, 0xD8, 0xAC, 0x9, 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xA0, 0x5, 0x31, + 0x33, 0xE6, 0x97, 0xA5, 0x3, 0xE8, 0xBA, 0xAB, 0x3, 0xE6, 0x8D, 0x95, 0x2, 0x69, 0x6A, 0x3, 0xE7, + 0x88, 0xB6, 0x8, 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x29, 0x4, 0xD9, 0x88, 0xD9, 0x94, 0x4, + 0x28, 0x31, 0x32, 0x29, 0x3, 0xE1, 0x86, 0x91, 0x4, 0xD8, 0xAD, 0xD9, 0x89, 0x3, 0xE2, 0xA6, 0x86, + 0x2, 0xCF, 0x85, 0x3, 0x28, 0x4C, 0x29, 0x2, 0x33, 0x33, 0x2, 0xC5, 0x93, 0x5, 0x28, 0xE5, 0x90, + 0x8D, 0x29, 0x4, 0xD9, 0x84, 0xD8, 0xAC, 0x3, 0xE1, 0x84, 0x95, 0x3, 0xE3, 0x80, 0x8A, 0x2, 0x32, + 0x35, 0x3, 0xE1, 0xB4, 0x82, 0x3, 0xE1, 0x85, 0x98, 0x3, 0xE4, 0xB8, 0x99, 0x3, 0xE3, 0x80, 0x97, + 0x4, 0xD9, 0x86, 0xD8, 0xAC, 0x4, 0xD8, 0xAD, 0xD9, 0x8A, 0x2, 0x34, 0x39, 0x3, 0xEA, 0x9C, 0xA7, + 0x3, 0xE1, 0x87, 0x8E, 0x3, 0xE5, 0xBD, 0x90, 0x2, 0xC9, 0x9F, 0x4, 0x36, 0xE6, 0x97, 0xA5, 0x3, + 0xE7, 0x94, 0xB3, 0x3, 0xE1, 0x84, 0x8B, 0x4, 0xD8, 0xA8, 0xD8, 0xAD, 0xC, 0xE3, 0x82, 0xAD, 0xE3, + 0x82, 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x4, 0xD9, 0x87, 0xD9, 0x8A, 0x3, 0xE1, 0x84, + 0x88, 0x3, 0xE9, 0xAC, 0xA5, 0x3, 0x6B, 0x48, 0x7A, 0x2, 0xCE, 0xB9, 0x3, 0x28, 0x56, 0x29, 0x3, + 0xE1, 0x86, 0xB5, 0x3, 0x20, 0xD9, 0x8F, 0x3, 0xE3, 0x80, 0x92, 0x3, 0x28, 0x34, 0x29, 0x3, 0xE4, + 0xB8, 0x8B, 0x2, 0x4B, 0x4D, 0x3, 0xE9, 0x9D, 0x91, 0x3, 0xE6, 0xB0, 0x94, 0xC, 0xE3, 0x82, 0xAB, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x9E, 0x3, 0x28, 0x38, 0x29, 0x2, 0xD0, 0xB6, 0x3, + 0xE5, 0xB9, 0xBC, 0x4, 0x44, 0x7A, 0xCC, 0x8C, 0x3, 0xE5, 0x8F, 0xA3, 0x2, 0x32, 0x30, 0x2, 0xD9, + 0xB9, 0x5, 0x31, 0x34, 0xE7, 0x82, 0xB9, 0x3, 0xE6, 0xAD, 0xA3, 0x4, 0xD8, 0xAE, 0xD9, 0x8A, 0x3, + 0x6B, 0x6D, 0x32, 0x4, 0x33, 0xE6, 0x9C, 0x88, 0x2, 0x53, 0x4D, 0x4, 0xD8, 0xA7, 0xD9, 0x8B, 0xC, + 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x3, 0xE8, 0xA6, 0x8B, + 0x3, 0xE1, 0x87, 0x87, 0x3, 0xE6, 0x94, 0xAF, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x3, 0xE1, + 0x85, 0xAD, 0x6, 0xD8, 0xA8, 0xD8, 0xAD, 0xD9, 0x8A, 0x2, 0x33, 0x31, 0x6, 0xD8, 0xAA, 0xD8, 0xAD, + 0xD9, 0x85, 0x2, 0xD1, 0x84, 0xC, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xBC, 0x6, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x85, 0x3, 0xE1, 0x86, 0x9E, 0x6, 0xD8, 0xB4, 0xD9, + 0x85, 0xD9, 0x85, 0x3, 0xE5, 0xA3, 0xB0, 0x6, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x2, 0x68, 0x61, + 0x2, 0xCA, 0x95, 0x6, 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x2, 0x69, 0x76, 0x5, 0x28, 0xE8, 0xB3, + 0x87, 0x29, 0x2, 0x6D, 0x73, 0x6, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x2, 0xD8, 0xB6, 0x6, 0xD9, + 0x84, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0x4C, 0x54, 0x44, 0x3, 0xE3, 0x80, 0x8F, 0x2, 0x6E, 0x56, 0x4, + 0xDB, 0x87, 0xD9, 0xB4, 0x8, 0x28, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x29, 0x3, 0xE6, 0xAF, + 0x8B, 0x5, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x2, 0xD7, 0x94, 0x2, 0xD8, 0xA7, 0x4, 0xD9, 0x82, 0xD9, + 0x85, 0x4, 0xD9, 0x83, 0xD8, 0xAD, 0x4, 0xD9, 0x86, 0xD8, 0xAE, 0xF, 0xE3, 0x83, 0xA1, 0xE3, 0x82, + 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x3, 0x20, 0xCC, 0x8B, 0x3, 0xE5, + 0x8B, 0xB9, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x87, 0x1, 0x3F, 0x3, 0xE6, 0x96, 0x99, 0x6, 0xE1, + 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x6, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, 0x3, 0xE2, 0x80, 0x90, + 0x21, 0xD8, 0xB5, 0xD9, 0x84, 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, + 0x20, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8, 0xB3, 0xD9, 0x84, + 0xD9, 0x85, 0x5, 0x31, 0xE2, 0x81, 0x84, 0x38, 0x3, 0xE8, 0xB1, 0x95, 0xC, 0xE3, 0x82, 0xB3, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x6, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x3, + 0x31, 0x32, 0x2E, 0x4, 0xD9, 0x8A, 0xD9, 0x8A, 0x4, 0xD8, 0xAB, 0xD9, 0x89, 0x3, 0xE8, 0x88, 0x9F, + 0x9, 0xE3, 0x82, 0xB1, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0xF, 0xD8, 0xAC, 0xD9, 0x84, 0x20, + 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, 0x87, 0x3, 0x28, 0x53, 0x29, 0x3, 0x20, + 0xD9, 0x91, 0x6, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, 0x2, 0xCE, 0xBD, 0x3, 0xE5, 0xAD, 0xA6, 0x2, + 0xDB, 0x8B, 0x4, 0xDB, 0x92, 0xD9, 0x94, 0x4, 0xD8, 0xB7, 0xD9, 0x85, 0xC, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x9A, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x3, 0xE1, 0x85, 0xB1, 0x6, 0xD8, 0xB4, 0xD8, + 0xAC, 0xD9, 0x8A, 0x12, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x3, 0xE9, 0x81, 0x8A, 0x5, 0x31, 0xE2, 0x81, 0x84, 0x35, 0x1, + 0x39, 0x4, 0xD9, 0x8A, 0xD9, 0x85, 0x2, 0x32, 0x34, 0x2, 0xD9, 0x89, 0x3, 0x31, 0x34, 0x2E, 0x3, + 0xE5, 0x8C, 0x9A, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x85, 0x2, 0x39, 0x2C, 0x3, 0xE1, 0x85, 0xB5, + 0x12, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xB3, 0x3, 0x28, 0x32, 0x29, 0xC, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0x8B, 0xE3, 0x83, 0xBC, 0x2, 0x31, 0x2E, 0x2, 0x56, 0x49, 0x3, 0xE5, 0xA4, 0xA9, 0x3, 0x28, 0x4E, + 0x29, 0x3, 0xE2, 0x86, 0x90, 0x3, 0xE6, 0x96, 0xA4, 0x3, 0xE1, 0x84, 0x89, 0x12, 0xE3, 0x82, 0xAF, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x3, + 0xE1, 0x86, 0xAA, 0x3, 0xE6, 0xAF, 0x9B, 0x3, 0xE4, 0xBC, 0x91, 0x2, 0xC6, 0xAB, 0x3, 0x28, 0x42, + 0x29, 0x4, 0xD8, 0xAE, 0xD8, 0xAD, 0x6, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x2, 0xCE, 0xB1, 0x2, + 0xD0, 0xBE, 0x3, 0x20, 0xD9, 0x8D, 0x2, 0x4D, 0x43, 0x3, 0xE1, 0xB6, 0x85, 0x2, 0x33, 0x37, 0x3, + 0x2E, 0x2E, 0x2E, 0x3, 0xE1, 0x84, 0xAD, 0x3, 0x63, 0x2F, 0x75, 0x3, 0xCE, 0xBC, 0x41, 0x9, 0xE3, + 0x83, 0xA1, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x2, 0xCA, 0xA7, 0x2, 0x49, 0x55, 0x5, 0x20, 0xCC, + 0x93, 0xCD, 0x82, 0x3, 0xE2, 0x88, 0x87, 0xC, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4, 0xE3, 0x82, + 0xAF, 0xE3, 0x83, 0xAB, 0x3, 0xE3, 0x82, 0xBD, 0x1, 0x7D, 0x9, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, + 0xE3, 0x83, 0x88, 0x3, 0xE3, 0x80, 0x89, 0x3, 0xE1, 0x84, 0x80, 0x2, 0xC4, 0xA7, 0x6, 0xD8, 0xB3, + 0xD8, 0xAC, 0xD9, 0x89, 0x3, 0xC2, 0xB0, 0x46, 0x6, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, 0x5, 0x28, + 0xE8, 0xB2, 0xA1, 0x29, 0x3, 0xE1, 0xB4, 0x9C, 0x5, 0x33, 0xE2, 0x81, 0x84, 0x38, 0x3, 0xE1, 0x87, + 0x8C, 0x2, 0x38, 0x2C, 0x4, 0xD9, 0x86, 0xD8, 0xAD, 0x3, 0x31, 0x38, 0x2E, 0x2, 0xDA, 0x91, 0x3, + 0xE3, 0x83, 0x9F, 0x2, 0xD1, 0x81, 0xF, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xAB, 0x1, 0x2A, 0x3, 0xE3, 0x82, 0xBF, 0x4, 0xD9, 0x84, 0xD9, 0x85, + 0x5, 0x28, 0xE1, 0x84, 0x80, 0x29, 0x6, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, 0xA3, 0x4, 0x70, 0x2E, 0x6D, + 0x2E, 0x5, 0x20, 0xCC, 0x93, 0xCC, 0x80, 0x3, 0xE3, 0x83, 0x8D, 0x1, 0x5D, 0x6, 0xE0, 0xBA, 0xAB, + 0xE0, 0xBA, 0x99, 0x3, 0xE1, 0x86, 0xAD, 0x6, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, 0x2, 0xC9, 0x9C, + 0x2, 0xD7, 0x9B, 0x2, 0x33, 0x34, 0x5, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x2, 0x48, 0x50, 0x5, 0x28, + 0xE5, 0x9C, 0x9F, 0x29, 0x2, 0x44, 0x7A, 0x3, 0x20, 0xCC, 0x87, 0x3, 0xE4, 0xB8, 0xB6, 0x9, 0xE3, + 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80, 0x95, 0x9, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0xE3, + 0x83, 0xAB, 0x3, 0xE1, 0x84, 0xAB, 0x3, 0xE1, 0x84, 0xAE, 0x3, 0x28, 0x74, 0x29, 0x3, 0xE3, 0x83, + 0x8B, 0x6, 0xD9, 0x84, 0xD8, 0xAC, 0xD9, 0x85, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xA7, 0x2, 0x34, + 0x31, 0x3, 0x46, 0x41, 0x58, 0x3, 0x28, 0x68, 0x29, 0x5, 0x32, 0x35, 0xE6, 0x97, 0xA5, 0x2, 0xD1, + 0x8B, 0x3, 0xE1, 0x84, 0xA1, 0x3, 0xE3, 0x83, 0xA0, 0x3, 0xE9, 0xAB, 0x98, 0x4, 0xD7, 0x90, 0xD7, + 0x9C, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, 0x6, 0xE3, 0x81, 0xBB, 0xE3, 0x81, 0x8B, 0x2, 0xC9, + 0xA0, 0x6, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x6, 0xD8, 0xB9, 0xD8, 0xAC, 0xD9, 0x85, 0x4, 0xD8, + 0xB5, 0xD8, 0xAD, 0x3, 0xE2, 0x94, 0x82, 0x2, 0xC6, 0x8E, 0x2, 0xCF, 0x9C, 0x4, 0xD8, 0xB5, 0xD9, + 0x85, 0x2, 0xC3, 0xB8, 0x5, 0x28, 0xE7, 0x9B, 0xA3, 0x29, 0x4, 0xCE, 0xA5, 0xCC, 0x81, 0x4, 0xD9, + 0x8A, 0xD8, 0xAC, 0x4, 0xD9, 0x85, 0xD8, 0xAE, 0x4, 0xD8, 0xB4, 0xD8, 0xAD, 0x2, 0x66, 0x6D, 0x3, + 0xE3, 0x83, 0x8C, 0x4, 0xD8, 0xA8, 0xD8, 0xAC, 0x3, 0x28, 0x48, 0x29, 0x6, 0xD8, 0xA8, 0xD8, 0xAE, + 0xD9, 0x8A, 0x3, 0xE3, 0x83, 0x8A, 0x2, 0xC9, 0x92, 0x2, 0xDA, 0xAF, 0x3, 0xE3, 0x82, 0xB7, 0x1, + 0x26, 0x2, 0xCA, 0x8F, 0x4, 0xD9, 0x89, 0xD9, 0xB0, 0x2, 0x63, 0x64, 0x5, 0x31, 0xE2, 0x81, 0x84, + 0x32, 0x3, 0x28, 0x46, 0x29, 0x3, 0x28, 0x76, 0x29, 0x5, 0x28, 0xE9, 0x87, 0x91, 0x29, 0xE, 0x28, + 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xAE, 0x29, 0x3, 0x20, 0xCC, + 0x81, 0x12, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0x3, 0xE7, 0x88, 0xAA, 0x3, 0xE5, 0xB7, 0x9B, 0x6, 0xD9, 0x80, 0xD9, 0x90, + 0xD9, 0x91, 0x2, 0x73, 0x72, 0x3, 0xE5, 0x96, 0xB6, 0x2, 0xDA, 0x86, 0x3, 0xE9, 0xA6, 0x99, 0x6, + 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x4, 0xF0, 0x9D, 0xBC, 0x8A, 0x4, 0xD8, 0xB7, 0xD9, 0x8A, 0x2, + 0xD0, 0xBA, 0x3, 0xE3, 0x80, 0x94, 0x2, 0xC9, 0xA9, 0x3, 0xE3, 0x82, 0xA8, 0x5, 0x31, 0x37, 0xE7, + 0x82, 0xB9, 0x2, 0x4E, 0x4A, 0x3, 0xE3, 0x83, 0x9B, 0x11, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x4, 0x28, 0x31, 0x38, 0x29, + 0x5, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x6, 0xE3, 0x82, 0x88, 0xE3, 0x82, 0x8A, 0x3, 0xEA, 0x9E, 0x8E, + 0x5, 0x31, 0x37, 0xE6, 0x97, 0xA5, 0x2, 0xC2, 0xA2, 0x6, 0xD9, 0x85, 0xD9, 0x85, 0xD9, 0x8A, 0x2, + 0x34, 0x38, 0x2, 0x64, 0x7A, 0x3, 0xE1, 0xB4, 0xA5, 0x3, 0xE7, 0xA6, 0x81, 0x6, 0xD9, 0x86, 0xD8, + 0xAD, 0xD9, 0x8A, 0x2, 0xDA, 0xBA, 0x3, 0x28, 0x4D, 0x29, 0x6, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, + 0x3, 0xE5, 0x9C, 0x9F, 0x4, 0xD8, 0xB4, 0xD8, 0xAE, 0x4, 0xD9, 0x8A, 0xD8, 0xAD, 0x9, 0xE3, 0x83, + 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xBD, 0x2, 0x6E, 0x46, 0x3, 0xE5, 0xB1, 0xB1, 0x3, 0xE5, 0x85, + 0xAD, 0xC, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0xA1, 0x3, 0xE1, + 0xB4, 0x96, 0x2, 0xC5, 0x8B, 0x3, 0xE1, 0x84, 0xA9, 0x5, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x4, 0xD8, + 0xAA, 0xD9, 0x89, 0x2, 0xD8, 0xB2, 0x2, 0x64, 0x6D, 0x3, 0xE1, 0x85, 0xA3, 0x5, 0x31, 0x35, 0xE6, + 0x97, 0xA5, 0x3, 0xE8, 0x89, 0xB2, 0x3, 0xE4, 0xB9, 0x9D, 0x6, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, + 0x3, 0xE7, 0x88, 0xBB, 0x3, 0xE5, 0x87, 0xB5, 0x2, 0x4C, 0x6A, 0x9, 0xE3, 0x83, 0x92, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xAB, 0xC, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82, + 0xB9, 0x5, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x2, 0x32, 0x38, 0x3, 0xE9, 0xBB, 0x8D, 0x4, 0xD8, 0xB4, + 0xD9, 0x89, 0x3, 0xE9, 0xB3, 0xA5, 0x5, 0x20, 0xCC, 0x88, 0xCD, 0x82, 0x3, 0xE5, 0x8F, 0xAF, 0x2, + 0xD2, 0xAB, 0x4, 0xD5, 0xA5, 0xD6, 0x82, 0x3, 0xE5, 0xAD, 0x97, 0x1, 0x23, 0x3, 0xE1, 0x85, 0xAC, + 0x2, 0x4E, 0x6F, 0x8, 0x28, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x29, 0x4, 0xD9, 0x81, 0xD9, 0x8A, + 0x3, 0xE5, 0xA4, 0xA7, 0x3, 0xE8, 0xB0, 0xB7, 0x3, 0x28, 0x51, 0x29, 0x4, 0xD9, 0x81, 0xD8, 0xAD, + 0x7, 0xE3, 0x80, 0x94, 0x53, 0xE3, 0x80, 0x95, 0x3, 0xE5, 0x87, 0xA0, 0x2, 0xDB, 0x8C, 0x6, 0xD9, + 0x86, 0xD9, 0x85, 0xD9, 0x8A, 0x4, 0x39, 0xE6, 0x9C, 0x88, 0x2, 0xC7, 0x82, 0x4, 0xD8, 0xA8, 0xD9, + 0x85, 0x9, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x6, 0xE2, 0x80, 0xB2, 0xE2, + 0x80, 0xB2, 0x2, 0x3D, 0x3D, 0x4, 0xD9, 0x86, 0xD9, 0x86, 0x3, 0x20, 0xCC, 0xA7, 0x3, 0xE8, 0xA5, + 0xBE, 0x4, 0x64, 0x7A, 0xCC, 0x8C, 0x4, 0xD9, 0x84, 0xD8, 0xAE, 0x3, 0xE6, 0x89, 0x93, 0x3, 0xE5, + 0xBE, 0x97, 0x4, 0xD9, 0x83, 0xD8, 0xA7, 0x9, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xAB, 0x2, 0xD1, 0x96, 0x4, 0x35, 0xE6, 0x97, 0xA5, 0x3, 0xE8, 0x88, 0x8C, 0x3, 0xE1, 0x84, 0x86, + 0x3, 0xE9, 0xBE, 0x9C, 0x2, 0xC3, 0x86, 0x9, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xAA, + 0x2, 0x6B, 0x6C, 0x3, 0x28, 0x47, 0x29, 0x3, 0xE1, 0x87, 0x99, 0x2, 0xDA, 0xA1, 0x2, 0xCA, 0x8D, + 0x4, 0xD8, 0xAE, 0xD9, 0x85, 0x5, 0x32, 0x34, 0xE7, 0x82, 0xB9, 0x4, 0x32, 0xE6, 0x97, 0xA5, 0x4, + 0xD9, 0x86, 0xD9, 0x87, 0x3, 0xE3, 0x83, 0x8F, 0x3, 0xE3, 0x83, 0xA4, 0x3, 0xE3, 0x83, 0xBB, 0x2, + 0xC2, 0xA3, 0x4, 0xD8, 0xA7, 0xD9, 0x93, 0x3, 0xE6, 0xAD, 0xA2, 0x5, 0x20, 0xD9, 0x90, 0xD9, 0x91, + 0x3, 0xE3, 0x83, 0xA3, 0x6, 0xD9, 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x5, 0x28, 0xE7, 0xA5, 0x9D, 0x29, + 0x6, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x2, 0x49, 0x56, 0x4, 0xD8, 0xB3, 0xD8, 0xAD, 0x3, 0xE6, + 0xA0, 0xAA, 0x2, 0x36, 0x2C, 0x5, 0x33, 0x30, 0xE6, 0x97, 0xA5, 0x2, 0x6B, 0x74, 0x3, 0x28, 0x62, + 0x29, 0x6, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x2, 0xD1, 0x98, 0x6, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xA1, 0x2, 0x31, 0x38, 0xC, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xAA, 0xE3, 0x83, + 0xBC, 0x3, 0xE1, 0x84, 0xA0, 0x4, 0xD5, 0xB4, 0xD5, 0xAD, 0x2, 0x34, 0x30, 0x6, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0xF, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, 0x80, + 0xE1, 0x85, 0xA9, 0x3, 0xE6, 0xBA, 0x80, 0x3, 0xE2, 0x88, 0x91, 0x4, 0xD9, 0x83, 0xD9, 0x84, 0x3, + 0xE7, 0x9A, 0xAE, 0x3, 0xE1, 0x84, 0xA2, 0x3, 0x69, 0x69, 0x69, 0x3, 0xE8, 0x87, 0xBC, 0x6, 0xD8, + 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x3, 0xE9, 0x81, 0xA9, 0x4, 0xD9, 0x83, 0xD8, 0xAC, 0x3, 0xE1, 0x84, + 0x9C, 0x3, 0xE5, 0xBC, 0x93, 0xC, 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, 0xE3, + 0x82, 0x99, 0x4, 0xD8, 0xB6, 0xD9, 0x8A, 0x9, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x88, 0x5, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x2, 0xD2, 0xB1, + 0x2, 0xCA, 0x89, 0x3, 0xE3, 0x80, 0x81, 0x3, 0xEA, 0x9A, 0x89, 0xC, 0xE3, 0x82, 0xAF, 0xE3, 0x83, + 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x8D, 0x3, 0xE1, 0x85, 0xA5, 0x3, 0xE5, 0x8D, 0xA9, 0x3, 0xE6, + 0xBC, 0x94, 0x4, 0x6B, 0x63, 0x61, 0x6C, 0x3, 0xE7, 0x93, 0x9C, 0x2, 0xCE, 0x97, 0x2, 0x6D, 0x57, + 0x6, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x5, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x6, 0xD9, 0x85, 0xD8, + 0xAC, 0xD9, 0x8A, 0x3, 0x31, 0x31, 0x2E, 0x2, 0x6D, 0x6C, 0x4, 0xD9, 0x8A, 0xD8, 0xAE, 0x2, 0xCE, + 0xA4, 0x4, 0xD8, 0xA7, 0xD9, 0xB4, 0x3, 0x3A, 0x3A, 0x3D, 0x3, 0xE1, 0x84, 0x84, 0x6, 0xD8, 0xB6, + 0xD8, 0xAE, 0xD9, 0x85, 0x2, 0x4D, 0x44, 0x2, 0xDA, 0xA6, 0x1, 0x29, 0x5, 0x31, 0x36, 0xE7, 0x82, + 0xB9, 0x9, 0xE3, 0x80, 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, 0x3, 0x28, 0x36, 0x29, 0x5, 0x20, + 0xD9, 0x8E, 0xD9, 0x91, 0x3, 0x43, 0x6F, 0x2E, 0xC, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0x8B, 0xE3, 0x83, 0x92, 0x4, 0x39, 0xE6, 0x97, 0xA5, 0x3, 0xE5, 0x8D, 0xB0, 0x3, 0x28, 0x44, + 0x29, 0x3, 0xE1, 0x84, 0xA3, 0x2, 0x33, 0x35, 0x1, 0x2E, 0x4, 0x61, 0x2E, 0x6D, 0x2E, 0x8, 0x28, + 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x29, 0x4, 0x34, 0xE6, 0x97, 0xA5, 0x3, 0xE3, 0x82, 0x99, 0x6, + 0xD9, 0x85, 0xD8, 0xAE, 0xD8, 0xAC, 0x3, 0xE7, 0xBE, 0x8A, 0x3, 0xE8, 0x82, 0x89, 0x4, 0xD9, 0x8A, + 0xD8, 0xB1, 0x5, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x4, 0xD8, 0xB5, 0xD8, 0xB1, 0x9, 0xE3, 0x83, 0x92, + 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x3, 0x20, 0xD9, 0x90, 0x2, 0xC9, 0x94, 0x5, 0x31, 0xE2, 0x81, + 0x84, 0x37, 0x3, 0x68, 0x50, 0x61, 0x3, 0xE3, 0x83, 0xA1, 0x3, 0xE3, 0x83, 0x92, 0x2, 0x53, 0x53, + 0x3, 0xE3, 0x82, 0xAA, 0x2, 0xDA, 0x80, 0x6, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x3, 0x54, 0x48, + 0x7A, 0x3, 0x63, 0x61, 0x6C, 0x3, 0xE4, 0xBC, 0x81, 0x3, 0xE9, 0x96, 0x80, 0x2, 0x6B, 0x6D, 0x3, + 0xE5, 0x9C, 0xB0, 0x2, 0xD1, 0x86, 0x8, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, 0x84, 0x3, 0x28, + 0x33, 0x29, 0x3, 0xE9, 0xAC, 0xB2, 0x2, 0xD9, 0x84, 0x3, 0xE6, 0x94, 0xB4, 0x2, 0x4B, 0x42, 0x6, + 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xB2, 0x3, 0xEA, 0xAD, 0xA7, 0x6, 0xE6, 0x98, 0xAD, 0xE5, 0x92, + 0x8C, 0x3, 0xE7, 0xB3, 0xB8, 0x5, 0x28, 0xE4, 0xBC, 0x81, 0x29, 0x1, 0x25, 0x3, 0xE1, 0x84, 0xAF, + 0x3, 0xE1, 0x85, 0xA1, 0x5, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x2, 0xD1, 0x8E, 0x3, 0xEA, 0x9D, 0xAF, + 0x2, 0x50, 0x52, 0x3, 0xE5, 0x8C, 0xBB, 0x5, 0x35, 0xE2, 0x81, 0x84, 0x36, 0x5, 0x20, 0xCC, 0x88, + 0xCC, 0x81, 0x4, 0xD8, 0xAA, 0xD8, 0xAC, 0x3, 0x28, 0x55, 0x29, 0x6, 0xE1, 0x84, 0x90, 0xE1, 0x85, + 0xA1, 0x3, 0xE3, 0x83, 0xBC, 0x4, 0xD8, 0xAD, 0xD9, 0x85, 0x3, 0xE9, 0x9D, 0xA9, 0x4, 0xD8, 0xAC, + 0xD9, 0x8A, 0x3, 0xE1, 0x87, 0x97, 0x3, 0xE8, 0x80, 0xB3, 0x6, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, 0x8A, + 0x3, 0xE8, 0xB1, 0x86, 0x5, 0x32, 0x33, 0xE6, 0x97, 0xA5, 0x4, 0xD8, 0xAA, 0xD8, 0xB1, 0x3, 0xE5, + 0xB9, 0xBF, 0x6, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0x3, 0xE3, 0x82, 0xA2, 0x4, 0xD8, 0xB7, 0xD8, + 0xAD, 0x9, 0xE3, 0x83, 0x98, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x84, 0xC, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84, 0x3, 0xE1, 0x84, 0x8C, 0x2, 0xCA, 0x9B, 0x2, 0x64, + 0x6C, 0x5, 0x31, 0x30, 0xE6, 0x9C, 0x88, 0x2, 0x76, 0x69, 0x3, 0x28, 0x39, 0x29, 0x5, 0x34, 0xE2, + 0x81, 0x84, 0x35, 0x3, 0xE5, 0x8E, 0x82, 0x2, 0xDA, 0x98, 0x4, 0x36, 0xE7, 0x82, 0xB9, 0x3, 0xE7, + 0xA5, 0x9D, 0x6, 0x43, 0xE2, 0x88, 0x95, 0x6B, 0x67, 0x6, 0xD9, 0x81, 0xD9, 0x85, 0xD9, 0x8A, 0x3, + 0xE1, 0x85, 0x99, 0x3, 0xEA, 0xAD, 0x92, 0x4, 0xD8, 0xB3, 0xD9, 0x85, 0x3, 0xE4, 0xBA, 0x8C, 0x6, + 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, 0x3, 0xE7, 0x96, 0x92, 0x2, 0x66, 0x66, 0x3, 0xE1, 0x84, 0x8A, + 0x3, 0xE8, 0xB5, 0xA4, 0x3, 0xE1, 0xB4, 0x9D, 0x4, 0xD8, 0xB6, 0xD9, 0x85, 0x6, 0xD9, 0x8A, 0xD9, + 0x94, 0xDB, 0x86, 0x2, 0x65, 0x56, 0x3, 0xE6, 0x9C, 0x89, 0x3, 0xE8, 0x99, 0x8D, 0x2, 0x33, 0x30, + 0x5, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0x3, 0xE5, 0x85, 0xAB, 0x6, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, + 0x2, 0x21, 0x3F, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, 0x90, 0x3, 0xE1, 0x86, 0xA1, 0x3, 0xE5, 0xAE, + 0x80, 0x2, 0x31, 0x39, 0xF, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xAB, 0x3, 0x28, 0x4A, 0x29, 0x3, 0xE5, 0xA4, 0x82, 0x3, 0xE5, 0x8D, 0x9C, 0x2, + 0x69, 0x6E, 0x8, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, 0x3, 0xE3, 0x82, 0xAB, 0x3, 0xE4, + 0xB8, 0x83, 0x3, 0xE9, 0xBD, 0x8A, 0x6, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x89, 0x3, 0x28, 0x6F, 0x29, + 0x3, 0xE3, 0x80, 0x8C, 0x6, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, 0xAD, 0x5, 0x32, 0x39, 0xE6, 0x97, 0xA5, + 0x5, 0x32, 0x38, 0xE6, 0x97, 0xA5, 0x2, 0xC9, 0xBB, 0x3, 0xE2, 0x96, 0xA0, 0x3, 0xE5, 0x89, 0xB2, + 0x1, 0x27, 0x2, 0xD1, 0x82, 0x8, 0x28, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x2, 0xD2, 0x91, + 0x2, 0xC9, 0xB0, 0x4, 0xF0, 0x9D, 0xBC, 0x9E, 0x2, 0xC9, 0x93, 0x2, 0x6D, 0x33, 0x4, 0xD5, 0xB4, + 0xD5, 0xA5, 0x3, 0xE8, 0x87, 0xAA, 0x2, 0xD7, 0x92, 0x3, 0xE9, 0xA6, 0x96, 0x3, 0xE2, 0xB5, 0xA1, + 0x3, 0x56, 0x49, 0x49, 0x4, 0xD8, 0xAB, 0xD8, 0xB1, 0x2, 0x31, 0x35, 0x6, 0xD9, 0x8A, 0xD9, 0x94, + 0xD8, 0xB1, 0x6, 0xD8, 0xB5, 0xD9, 0x84, 0xDB, 0x92, 0x5, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x4, 0xD5, + 0xBE, 0xD5, 0xB6, 0x4, 0xD9, 0x86, 0xD8, 0xB2, 0x2, 0xCA, 0x84, 0x2, 0xC9, 0xBA, 0x3, 0x49, 0x49, + 0x49, 0x2, 0xC3, 0xB0, 0x4, 0xD9, 0x81, 0xD9, 0x89, 0x3, 0xE4, 0xB8, 0xBF, 0x2, 0x34, 0x32, 0x2, + 0xC9, 0x9E, 0x2, 0xC9, 0xB5, 0x2, 0xC9, 0xA4, 0x6, 0xD9, 0x81, 0xD8, 0xAE, 0xD9, 0x85, 0x6, 0xD8, + 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x3, 0x20, 0xD9, 0x8C, 0x2, 0xDA, 0xBE, 0x9, 0xE3, 0x83, 0x95, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0xB3, 0x3, 0x20, 0xCC, 0x83, 0x2, 0x31, 0x2C, 0x3, 0xE1, 0x84, 0x92, 0x5, + 0x31, 0x33, 0xE7, 0x82, 0xB9, 0x3, 0x63, 0x2F, 0x6F, 0x3, 0x20, 0xCD, 0x85, 0x4, 0x28, 0x31, 0x33, + 0x29, 0x9, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0x84, 0x3, 0xE5, 0xB7, 0xB1, 0x3, 0x28, + 0x5A, 0x29, 0x3, 0xE2, 0x86, 0x93, 0x2, 0xD9, 0xB1, 0x6, 0xD8, 0xAC, 0xD8, 0xAD, 0xD9, 0x8A, 0x3, + 0x20, 0xCD, 0x82, 0x3, 0xE7, 0x81, 0xAB, 0x3, 0xE9, 0xA3, 0x9B, 0x2, 0x63, 0x63, 0x3, 0xE9, 0xBB, + 0xB9, 0x2, 0x33, 0x2E, 0x3, 0xCE, 0xBC, 0x67, 0x3, 0x31, 0x30, 0x2E, 0x5, 0x28, 0xE7, 0x89, 0xB9, + 0x29, 0x3, 0xE5, 0x90, 0x88, 0x6, 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x3, 0xE4, 0xB9, 0x99, 0x3, + 0xE5, 0x95, 0x8F, 0x9, 0xE3, 0x83, 0xA6, 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xB3, 0x3, 0xE9, 0x9B, + 0xA8, 0x2, 0xD7, 0xA2, 0x3, 0xE9, 0xBB, 0x91, 0x6, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, 0x3, 0x50, + 0x50, 0x56, 0x2, 0xD1, 0x9F, 0x2, 0x4B, 0x4B, 0x1, 0x60, 0x2, 0xC4, 0xB1, 0x5, 0x28, 0xE1, 0x84, + 0x92, 0x29, 0x6, 0xD9, 0x85, 0xD8, 0xAE, 0xD9, 0x8A, 0x3, 0xE6, 0x96, 0xB0, 0x9, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x3, 0xE5, 0xB9, 0xBA, 0x3, 0x20, 0xD9, 0x92, 0x6, 0x6D, 0xE2, + 0x88, 0x95, 0x73, 0x32, 0x3, 0xE3, 0x83, 0xA8, 0x2, 0xC2, 0xA6, 0x6, 0xD9, 0x84, 0xD8, 0xAC, 0xD9, + 0x8A, 0x3, 0xE3, 0x83, 0x86, 0x3, 0xE7, 0x89, 0x99, 0x9, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, + 0x88, 0xAB, 0x3, 0xE7, 0x94, 0xB0, 0x4, 0x20, 0xE3, 0x82, 0x9A, 0x4, 0xD8, 0xB3, 0xD9, 0x87, 0x9, + 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x4, 0xF0, 0x9D, 0xBC, 0x88, 0x2, 0x33, + 0x38, 0x6, 0xD9, 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x2, 0x30, 0x2C, 0x3, 0xE5, 0x90, 0x8D, 0x2, 0x57, + 0x62, 0x2, 0xDA, 0x8D, 0x2, 0xDA, 0x8E, 0x5, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x2, 0xD0, 0xB3, 0x3, + 0xE9, 0xBB, 0x83, 0x2, 0x48, 0x7A, 0x3, 0xE3, 0x83, 0xA5, 0x6, 0xD8, 0xB5, 0xD9, 0x85, 0xD9, 0x85, + 0x2, 0x2E, 0x2E, 0x3, 0x4D, 0x48, 0x7A, 0x2, 0x41, 0x55, 0x2, 0xC9, 0xA6, 0x4, 0xD9, 0x86, 0xD8, + 0xB1, 0x4, 0xD9, 0x81, 0xD9, 0x85, 0x2, 0xCA, 0xA8, 0x3, 0xE5, 0x88, 0x80, 0x2, 0x34, 0x2C, 0x3, + 0xE6, 0x96, 0x87, 0x2, 0xCE, 0x95, 0x2, 0xD7, 0xAA, 0x3, 0x31, 0x33, 0x2E, 0xC, 0xE3, 0x83, 0x9B, + 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x5, 0x28, 0xE6, 0xA0, 0xAA, 0x29, 0x3, + 0x61, 0x2F, 0x73, 0x3, 0xE9, 0x98, 0x9C, 0x5, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x3, 0xE7, 0x89, 0x87, + 0x4, 0x35, 0xE6, 0x9C, 0x88, 0x2, 0xD7, 0x91, 0x2, 0xD1, 0x8A, 0x3, 0xE7, 0xB5, 0x82, 0x3, 0xE3, + 0x83, 0x98, 0x3, 0xE1, 0x87, 0x9F, 0x6, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0x31, 0x37, 0x2E, + 0x3, 0xE3, 0x83, 0xB3, 0x3, 0xE9, 0xA3, 0x9F, 0x9, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0x2, 0x6D, 0x32, 0x5, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x2, 0xD0, 0xB2, 0x1, 0x22, 0x5, 0x32, + 0x36, 0xE6, 0x97, 0xA5, 0x3, 0xE5, 0x86, 0xAB, 0x4, 0x28, 0x31, 0x30, 0x29, 0x3, 0xE9, 0xA2, 0xA8, + 0x3, 0xE9, 0xBA, 0xBB, 0x3, 0xE3, 0x82, 0xBB, 0x5, 0x28, 0xE4, 0xB8, 0x83, 0x29, 0x6, 0xD8, 0xB3, + 0xD8, 0xAC, 0xD8, 0xAD, 0x3, 0x28, 0x78, 0x29, 0xF, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x82, 0xA4, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x3, 0xE7, 0x96, 0x8B, 0x3, 0xE7, 0xAB, 0xB9, 0x8, + 0x28, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, 0x29, 0x6, 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x2, + 0xD7, 0xA8, 0x3, 0xE9, 0x9F, 0xAD, 0x3, 0x6B, 0x50, 0x61, 0x3, 0x47, 0x50, 0x61, 0x6, 0xD8, 0xAD, + 0xD8, 0xAC, 0xD9, 0x8A, 0x3, 0x28, 0x57, 0x29, 0x6, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0xE9, + 0xAD, 0x9A, 0x3, 0xE7, 0x9F, 0x9B, 0x2, 0xC9, 0xB9, 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x5, + 0x31, 0x39, 0xE6, 0x97, 0xA5, 0x2, 0x49, 0x4A, 0x3, 0xE1, 0x84, 0xB2, 0x5, 0x32, 0xE2, 0x81, 0x84, + 0x35, 0x4, 0xF0, 0x9D, 0xBC, 0x86, 0x3, 0x28, 0x63, 0x29, 0x8, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9, + 0xD9, 0x85, 0x3, 0xE7, 0x94, 0xB2, 0x2, 0x35, 0x30, 0x5, 0x28, 0xE6, 0x9C, 0x89, 0x29, 0x2, 0x70, + 0x56, 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x2, 0xD1, 0x8C, 0x3, 0xE1, 0xB5, 0xBB, 0x2, 0xCA, + 0x9F, 0x6, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, 0x3, 0xE4, 0xBA, 0x94, 0xC, 0xE3, 0x82, 0xAB, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xF, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, 0x3, 0xE7, 0xBE, 0xBD, 0x2, 0x70, 0x73, 0x4, 0x20, + 0xE3, 0x82, 0x99, 0x3, 0xE5, 0xBB, 0xBE, 0x3, 0xE1, 0x85, 0xAA, 0x3, 0xE5, 0x8A, 0x9B, 0x3, 0xCE, + 0xBC, 0x56, 0x2, 0xD1, 0x88, 0x3, 0xE5, 0x86, 0x96, 0x3, 0x28, 0x6E, 0x29, 0x9, 0xE3, 0x83, 0x86, + 0xE3, 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x2, 0x32, 0x32, 0x3, 0xE2, 0x86, 0x91, 0xC, 0xE3, 0x82, 0xAD, + 0xE3, 0x83, 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x5, 0x28, 0xE1, 0x84, 0x82, 0x29, 0x2, + 0xD0, 0xB4, 0x3, 0xE5, 0x8E, 0xB6, 0x6, 0xE4, 0xBB, 0xA4, 0xE5, 0x92, 0x8C, 0x2, 0xCA, 0xA2, 0x2, + 0xD3, 0xA9, 0x2, 0x70, 0x41, 0x3, 0x78, 0x69, 0x69, 0x2, 0xC7, 0x80, 0x5, 0x20, 0xD9, 0x8C, 0xD9, + 0x91, 0x6, 0xD9, 0x80, 0xD9, 0x8F, 0xD9, 0x91, 0x6, 0xD8, 0xAD, 0xD9, 0x85, 0xD9, 0x8A, 0x3, 0xE3, + 0x83, 0xB0, 0x2, 0xD1, 0x8D, 0x3, 0xE1, 0x87, 0x93, 0x3, 0xE6, 0x8A, 0x95, 0x3, 0x66, 0x66, 0x6C, + 0x2, 0xDB, 0x85, 0x4, 0xD9, 0x80, 0xD9, 0x8E, 0x2, 0x30, 0x2E, 0x3, 0x28, 0x72, 0x29, 0x2, 0xC9, + 0x96, 0x2, 0xCA, 0xAA, 0x3, 0xE3, 0x83, 0xAF, 0x5, 0x41, 0xE2, 0x88, 0x95, 0x6D, 0x2, 0xC9, 0xBD, + 0x3, 0xE1, 0x86, 0xAC, 0x8, 0x28, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x2, 0x6D, 0x67, 0x2, + 0x69, 0x69, 0x3, 0xE1, 0xB6, 0x91, 0x4, 0xD9, 0x8A, 0xD9, 0x86, 0x2, 0x31, 0x37, 0x3, 0x62, 0x61, + 0x72, 0x3, 0x31, 0x39, 0x2E, 0x2, 0x32, 0x39, 0x4, 0x38, 0xE7, 0x82, 0xB9, 0x3, 0xE8, 0xBE, 0xB0, + 0x3, 0xE1, 0x84, 0xAC, 0x2, 0x4D, 0x42, 0x3, 0xE9, 0x87, 0x86, 0x4, 0x34, 0xE6, 0x9C, 0x88, 0x3, + 0xE8, 0x87, 0xB3, 0x3, 0xE8, 0xB6, 0xB3, 0x4, 0xD9, 0x84, 0xD9, 0x87, 0x3, 0xC2, 0xB0, 0x43, 0x9, + 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x4, 0xD8, 0xA8, 0xD8, 0xB2, 0x3, 0xE8, + 0x81, 0xBF, 0x4, 0x31, 0xE6, 0x9C, 0x88, 0x3, 0xE6, 0x8C, 0x87, 0x9, 0xE3, 0x80, 0x94, 0xE5, 0xAE, + 0x89, 0xE3, 0x80, 0x95, 0x3, 0xE9, 0x9D, 0x9E, 0x5, 0x32, 0x30, 0xE7, 0x82, 0xB9, 0x3, 0xE9, 0xAB, + 0x9F, 0x2, 0xC9, 0x97, 0x3, 0xE6, 0x9B, 0xB0, 0xF, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, + 0xB3, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x2, 0x3F, 0x3F, 0x2, 0xCA, 0x98, 0x3, 0xE9, 0xA0, 0x81, + 0x2, 0x6E, 0x41, 0x4, 0xD8, 0xB5, 0xD9, 0x89, 0x3, 0x28, 0x37, 0x29, 0x3, 0xE9, 0x9F, 0x8B, 0x3, + 0xE5, 0xB0, 0xB8, 0x2, 0xC9, 0xB3, 0x4, 0xD8, 0xBA, 0xD9, 0x89, 0x3, 0xE5, 0x84, 0xBF, 0x3, 0x61, + 0xCA, 0xBE, 0x4, 0xD8, 0xB3, 0xD9, 0x89, 0x3, 0xE1, 0x84, 0x9E, 0x3, 0x4C, 0xC2, 0xB7, 0x8, 0xD8, + 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x2, 0x34, 0x36, 0x4, 0xD9, 0x84, 0xD9, 0x89, 0x6, 0xD8, + 0xAA, 0xD8, 0xAE, 0xD9, 0x85, 0x2, 0xCA, 0x99, 0x6, 0xD9, 0x8A, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE5, + 0xBB, 0xB4, 0x2, 0xC9, 0xA7, 0x2, 0x34, 0x34, 0x3, 0xE9, 0xA0, 0x85, 0x4, 0xD9, 0x85, 0xD9, 0x89, + 0x2, 0xDB, 0x92, 0x3, 0xE3, 0x82, 0xB3, 0x6, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, 0x2, 0xD1, 0x95, + 0x1, 0x24, 0x6, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x85, 0x4, 0xD8, 0xAB, 0xD8, 0xB2, 0x2, 0xC9, 0xB1, + 0x3, 0x28, 0x65, 0x29, 0x4, 0xD8, 0xAB, 0xD8, 0xAC, 0x2, 0x50, 0x48, 0x3, 0xE5, 0xA3, 0xAB, 0x5, + 0x28, 0xE5, 0x8A, 0xB4, 0x29, 0x2, 0x34, 0x2E, 0x4, 0xD9, 0x87, 0xD9, 0xB0, 0x6, 0xD9, 0x80, 0xD9, + 0x8E, 0xD9, 0x91, 0x2, 0x6B, 0x41, 0x4, 0xD9, 0x86, 0xD9, 0x89, 0x2, 0x70, 0x57, 0x3, 0xE0, 0xBC, + 0x8B, 0x3, 0x28, 0x6A, 0x29, 0x5, 0x31, 0x39, 0xE7, 0x82, 0xB9, 0x5, 0x31, 0xE2, 0x81, 0x84, 0x34, + 0x2, 0xD7, 0x9D, 0x4, 0xD8, 0xB1, 0xD9, 0xB0, 0x2, 0x33, 0x2C, 0x6, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, + 0x8A, 0x5, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x2, 0xCA, 0xAB, 0x3, 0xCE, 0xBC, 0x73, 0x2, 0x36, 0x2E, + 0x2, 0x64, 0x42, 0x12, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x3, 0xE9, 0x87, 0x91, 0x3, 0xE6, 0x96, 0x97, 0x3, 0xE3, 0x83, + 0x95, 0x3, 0xCE, 0xBC, 0x46, 0x2, 0xD8, 0xA9, 0x4, 0xD8, 0xAC, 0xD9, 0x85, 0x3, 0x32, 0x30, 0x2E, + 0x5, 0x28, 0xE5, 0x85, 0xAB, 0x29, 0x6, 0xD9, 0x8A, 0xD8, 0xAD, 0xD9, 0x8A, 0x2, 0x6C, 0x78, 0x1, + 0x2C, 0x3, 0x28, 0x35, 0x29, 0x3, 0xE7, 0x9F, 0xB3, 0x3, 0x28, 0x64, 0x29, 0x3, 0xE6, 0x88, 0x88, + 0x2, 0x6E, 0x57, 0x4, 0xD8, 0xB4, 0xD9, 0x8A, 0x4, 0xD8, 0xAB, 0xD9, 0x87, 0x2, 0x70, 0x46, 0x6, + 0xD8, 0xB3, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE5, 0xA4, 0x9A, 0x4, 0xD9, 0x85, 0xD8, 0xA7, 0x5, 0x31, + 0xE2, 0x81, 0x84, 0x33, 0x6, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, 0x2, 0x6F, 0x56, 0x2, 0x31, 0x31, + 0x6, 0xD9, 0x85, 0xD8, 0xAC, 0xD8, 0xAD, 0x5, 0x31, 0x30, 0xE7, 0x82, 0xB9, 0x2, 0x34, 0x37, 0x3, + 0xE8, 0xB2, 0xA9, 0x5, 0x20, 0xD9, 0x8D, 0xD9, 0x91, 0x2, 0x4D, 0x56, 0x8, 0x28, 0xE1, 0x84, 0x89, + 0xE1, 0x85, 0xA1, 0x29, 0x3, 0xE1, 0x86, 0xB4, 0x2, 0x32, 0x2C, 0x3, 0x28, 0x6C, 0x29, 0x4, 0xD9, + 0x85, 0xD9, 0x8A, 0x2, 0x37, 0x2E, 0x6, 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x4, 0xD8, 0xAB, 0xD9, + 0x86, 0x1, 0x5E, 0x3, 0xE8, 0xA7, 0x92, 0x6, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x8A, 0x3, 0xE9, 0xBA, + 0xA5, 0x1, 0x5B, 0x3, 0xEA, 0x99, 0x91, 0x3, 0xE1, 0x87, 0x88, 0x2, 0x6E, 0x6D, 0x5, 0x28, 0xE7, + 0x81, 0xAB, 0x29, 0x2, 0xCA, 0xA1, 0x4, 0xD9, 0x80, 0xD9, 0x90, 0x3, 0xE9, 0xBC, 0xA0, 0x3, 0xE3, + 0x80, 0x8D, 0x5, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x12, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, 0xE3, + 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x3, 0x61, 0x2F, 0x63, 0x3, + 0x28, 0x50, 0x29, 0x4, 0xD8, 0xA8, 0xD9, 0x89, 0x2, 0x37, 0x2C, 0x2, 0xD9, 0xAE, 0x4, 0xD8, 0xA8, + 0xD8, 0xB1, 0x4, 0x28, 0x31, 0x34, 0x29, 0x4, 0xD9, 0x85, 0xD8, 0xAD, 0x3, 0x28, 0x67, 0x29, 0x5, + 0x28, 0xE1, 0x84, 0x91, 0x29, 0x3, 0xE8, 0xA8, 0x80, 0x3, 0x28, 0x49, 0x29, 0x3, 0xCA, 0xBC, 0x6E, + 0x6, 0xD9, 0x86, 0xD8, 0xAD, 0xD9, 0x89, 0x5, 0x32, 0x31, 0xE7, 0x82, 0xB9, 0x3, 0xE9, 0xAC, 0xBC, + 0x3, 0xE1, 0xB4, 0x97, 0x2, 0x58, 0x49, 0x3, 0xE7, 0x94, 0xA8, 0x4, 0x28, 0x31, 0x39, 0x29, 0x6, + 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x89, 0x5, 0x28, 0xE1, 0x84, 0x83, 0x29, 0xC, 0xE6, 0xA0, 0xAA, + 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, 0x9A, 0xE7, 0xA4, 0xBE, 0x5, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x5, + 0x28, 0xE5, 0x8D, 0x94, 0x29, 0xF, 0xE3, 0x83, 0x9E, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, + 0x83, 0xA7, 0xE3, 0x83, 0xB3, 0x3, 0xE6, 0x88, 0xB6, 0x2, 0xD0, 0xB0, 0x4, 0xD8, 0xB6, 0xD8, 0xB1, + 0x4, 0xD9, 0x83, 0xD9, 0x89, 0x3, 0xE5, 0xB7, 0xA5, 0x3, 0xE5, 0x8D, 0x84, 0x2, 0x33, 0x36, 0x4, + 0x36, 0xE6, 0x9C, 0x88, 0x2, 0x38, 0x2E, 0x6, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x89, 0x4, 0xD8, 0xB0, + 0xD9, 0xB0, 0x3, 0xE5, 0xB0, 0xA2, 0x3, 0xE5, 0xA4, 0x8A, 0x4, 0xD8, 0xB4, 0xD9, 0x87, 0x4, 0x28, + 0x31, 0x36, 0x29, 0x2, 0xC9, 0xB8, 0x2, 0xD0, 0xB8, 0x2, 0x32, 0x37, 0x3, 0xE8, 0xBB, 0x8A, 0x1, + 0x2F, 0x5, 0x28, 0xE6, 0x97, 0xA5, 0x29, 0x5, 0x31, 0x30, 0xE6, 0x97, 0xA5, 0x4, 0x30, 0xE7, 0x82, + 0xB9, 0x2, 0xCA, 0x8C, 0x6, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xA9, 0x3, 0xE9, 0x87, 0x8C, 0x5, 0x32, + 0x33, 0xE7, 0x82, 0xB9, 0x6, 0xD8, 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE9, 0xAC, 0xAF, 0x3, 0xE3, + 0x82, 0xA9, 0x3, 0xE7, 0x88, 0xBF, 0x5, 0x28, 0xE1, 0x84, 0x87, 0x29, 0x6, 0xE0, 0xBB, 0x8D, 0xE0, + 0xBA, 0xB2, 0x4, 0xD9, 0x8A, 0xD9, 0x89, 0x12, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, + 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x2, 0xCB, 0x90, 0x3, 0xE4, 0xB8, + 0x8A, 0x4, 0xD9, 0x8A, 0xD8, 0xB2, 0x4, 0xF0, 0x9D, 0xBC, 0x85, 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD9, + 0x8A, 0x3, 0xE3, 0x83, 0x83, 0x1, 0x3E, 0x4, 0xD8, 0xA8, 0xD9, 0x8A, 0x9, 0xE3, 0x80, 0x94, 0xE5, + 0x8B, 0x9D, 0xE3, 0x80, 0x95, 0xC, 0xE3, 0x82, 0xA8, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, + 0x83, 0xBC, 0x3, 0xE5, 0x86, 0x8D, 0x3, 0xE1, 0x85, 0x87, 0x6, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, + 0x2, 0xCF, 0x9D, 0x3, 0xE1, 0x85, 0x8C, 0x4, 0xD8, 0xA8, 0xD9, 0x86, 0x5, 0x31, 0x32, 0xE6, 0x9C, + 0x88, 0x3, 0x20, 0xD9, 0x8B, 0x8, 0x28, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x3, 0x20, 0xCC, + 0x8A, 0x8, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, 0x29, 0x6, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, + 0x86, 0x2, 0xC6, 0x90, 0x2, 0xD2, 0xAF, 0x3, 0xE7, 0x9F, 0xA2, 0x2, 0x31, 0x36, 0x3, 0xE3, 0x82, + 0xA5, 0x5, 0x28, 0xE1, 0x84, 0x8E, 0x29, 0x4, 0xD9, 0x81, 0xD8, 0xAE, 0x3, 0xE1, 0x83, 0x9C, 0x3, + 0xE3, 0x82, 0xA1, 0x2, 0x6D, 0x62, 0x5, 0x28, 0xE1, 0x84, 0x85, 0x29, 0x8, 0xD9, 0x85, 0xD8, 0xAD, + 0xD9, 0x85, 0xD8, 0xAF, 0x6, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, 0x3, 0xE5, 0x85, 0xA5, 0x3, 0x76, + 0x69, 0x69, 0x4, 0x76, 0x69, 0x69, 0x69, 0x2, 0x47, 0x42, 0x3, 0xE5, 0x88, 0x9D, 0x3, 0xE5, 0x90, + 0xB9, 0x3, 0xE5, 0xA4, 0x95, 0x4, 0xD8, 0xB6, 0xD9, 0x89, 0x3, 0x6C, 0x6F, 0x67, 0x2, 0xC3, 0xA6, + 0x1, 0x7C, 0x2, 0xDB, 0x88, 0x9, 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x2, 0xC9, + 0xB6, 0x3, 0x28, 0x54, 0x29, 0x9, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x3, 0xE3, + 0x82, 0x9A, 0x2, 0xC9, 0xAC, 0x2, 0x42, 0x71, 0x3, 0xE5, 0xBE, 0x8C, 0x4, 0x38, 0xE6, 0x9C, 0x88, + 0x4, 0x28, 0x31, 0x35, 0x29, 0x3, 0xE3, 0x80, 0x8E, 0x2, 0x4D, 0x52, 0x5, 0x32, 0x32, 0xE7, 0x82, + 0xB9, 0x3, 0xE8, 0xA1, 0x8C, 0x2, 0xC4, 0xA6, 0x2, 0x63, 0x6D, 0x2, 0x48, 0x56, 0x2, 0x64, 0x61, + 0x3, 0xE7, 0x8E, 0x84, 0x3, 0x28, 0x69, 0x29, 0x3, 0x28, 0x59, 0x29, 0x5, 0x31, 0x32, 0xE7, 0x82, + 0xB9, 0x3, 0xE3, 0x82, 0xA3, 0x4, 0x32, 0xE6, 0x9C, 0x88, 0x9, 0xE3, 0x80, 0x94, 0xE7, 0x82, 0xB9, + 0xE3, 0x80, 0x95, 0x2, 0x35, 0x2C, 0x8, 0x72, 0x61, 0x64, 0xE2, 0x88, 0x95, 0x73, 0x32, 0x5, 0x35, + 0xE2, 0x81, 0x84, 0x38, 0x3, 0xE5, 0x8F, 0x8C, 0x2, 0xCA, 0x83, 0x3, 0xE7, 0xB1, 0xB3, 0x2, 0xD0, + 0xBF, 0x3, 0x20, 0xCC, 0xA8, 0x3, 0xE5, 0xAF, 0xB8, 0x6, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, 0x89, 0x3, + 0xE7, 0xBC, 0xB6, 0x3, 0x20, 0xCC, 0x88, 0x2, 0x6B, 0x56, 0x2, 0xC9, 0xAB, 0x3, 0xE5, 0x84, 0xAA, + 0x3, 0xE7, 0x8A, 0xAC, 0x2, 0x78, 0x69, 0xC, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0x9, 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0x9, 0xE0, 0xBE, + 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0x2, 0x57, 0x5A, 0x2, 0x39, 0x2E, 0x3, 0x28, 0x75, 0x29, + 0x3, 0x28, 0x43, 0x29, 0x3, 0xE9, 0xBE, 0x8D, 0x3, 0xE1, 0x85, 0xB2, 0x3, 0xE8, 0x87, 0xA3, 0x2, + 0x3F, 0x21, 0x3, 0x65, 0x72, 0x67, 0x4, 0xD9, 0x87, 0xD9, 0x85, 0x2, 0xD1, 0x80, 0x3, 0xE1, 0x84, + 0xA7, 0x4, 0x56, 0x49, 0x49, 0x49, 0x3, 0xE9, 0xB9, 0xBF, 0x3, 0xE1, 0x84, 0x94, 0x3, 0x28, 0x52, + 0x29, 0x2, 0xC9, 0x99, 0x4, 0x32, 0xE7, 0x82, 0xB9, 0x2, 0x6B, 0x57, 0x3, 0xE8, 0x89, 0xB8, 0x3, + 0xE5, 0x8D, 0x85, 0x6, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, + 0xAC, 0x2, 0x33, 0x32, 0x3, 0xE1, 0x86, 0x94, 0x3, 0x28, 0x77, 0x29, 0x5, 0x31, 0xE2, 0x81, 0x84, + 0x39, 0x5, 0x28, 0xE4, 0xBA, 0x94, 0x29, 0x2, 0xC9, 0x98, 0xC, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x4, 0x37, 0xE6, 0x9C, 0x88, 0x2, 0x48, 0x67, 0x2, 0xC9, 0xA8, + 0x6, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, 0x3, 0xE1, 0x86, 0x85, 0x3, 0xE5, 0xBD, 0xB3, 0x5, 0x28, + 0xE4, 0xBB, 0xA3, 0x29, 0x3, 0x28, 0x73, 0x29, 0x3, 0xE6, 0xB0, 0x8F, 0x8, 0x28, 0xE1, 0x84, 0x90, + 0xE1, 0x85, 0xA1, 0x29, 0x8, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, 0x8A, 0xD9, 0x87, 0x3, 0x28, 0x7A, + 0x29, 0x3, 0xE8, 0x80, 0x81, 0x5, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x3, 0xE5, 0xAE, 0x97, 0x6, 0xD9, + 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x3, 0xE1, 0x86, 0x92, 0x2, 0x47, 0x79, 0x2, 0x31, 0x32, 0x6, 0xE1, + 0x84, 0x8B, 0xE1, 0x85, 0xAE, 0x2, 0xCA, 0x8E, 0x2, 0x35, 0x2E, 0x3, 0x6B, 0xCE, 0xA9, 0x2, 0xCA, + 0xA6, 0x4, 0xD8, 0xAA, 0xD9, 0x87, 0x3, 0x20, 0xCC, 0xB3, 0x12, 0xE3, 0x83, 0x9F, 0xE3, 0x83, + 0xAA, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x2, 0x4D, 0x57, + 0x6, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x3, 0xE3, 0x80, 0x8B, 0x3, 0x28, 0x71, 0x29, 0x3, 0xE1, + 0x86, 0x84, 0x4, 0xCE, 0xA5, 0xCC, 0x88, 0x6, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x3, 0xE7, 0x94, + 0x98, 0x3, 0xE1, 0x85, 0xAB, 0x5, 0x20, 0xCC, 0x88, 0xCC, 0x80, 0xF, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x2, 0x6C, 0x6D, 0x3, 0x6D, 0x6D, + 0x33, 0x3, 0xE5, 0x8F, 0x88, 0x2, 0xC9, 0xAF, 0x1, 0x7E, 0x4, 0xD9, 0x8A, 0xD9, 0xB4, 0x12, 0xE3, + 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0xA0, 0x2, 0x34, 0x33, 0x3, 0xE8, 0x99, 0xAB, 0x6, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x89, 0x2, 0x52, + 0x73, 0x2, 0x32, 0x36, 0x3, 0x64, 0x6D, 0x32, 0x3, 0xE9, 0xB9, 0xB5, 0x3, 0xE8, 0xB3, 0x87, 0x2, + 0xCA, 0x90, 0x3, 0xE6, 0x96, 0xB9, 0x3, 0x20, 0xD9, 0x8E, 0x3, 0xE2, 0x97, 0x8B, 0x3, 0xE8, 0xBE, + 0x9B, 0x3, 0x6B, 0x6D, 0x33, 0x2, 0x6D, 0x56, 0x3, 0xE7, 0x9B, 0xAE, 0x8, 0x28, 0xE1, 0x84, 0x80, + 0xE1, 0x85, 0xA1, 0x29, 0x3, 0x72, 0x61, 0x64, 0x2, 0xC2, 0xAC, 0x6, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, + 0x89, 0x3, 0xE5, 0xA4, 0x9C, 0x5, 0x28, 0xE8, 0x87, 0xAA, 0x29, 0x3, 0x66, 0x66, 0x69, 0x6, 0x31, + 0xE2, 0x81, 0x84, 0x31, 0x30, 0x3, 0xE3, 0x80, 0x88, 0x3, 0xE9, 0xBB, 0xBD, 0xF, 0xE3, 0x83, 0x98, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x3, 0x31, 0x36, 0x2E, + 0x3, 0x63, 0x6D, 0x33, 0x9, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x3, 0xE3, 0x80, + 0x90, 0x2, 0xCA, 0x91, 0x5, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x2, 0xC9, 0x9B, 0x5, 0x28, 0xE4, 0xB8, + 0x89, 0x29, 0x4, 0xD8, 0xBA, 0xD9, 0x8A, 0x2, 0xCA, 0x82, 0x3, 0xCE, 0xBC, 0x6D, 0x3, 0xE6, 0xAE, + 0xB3, 0x12, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xAD, 0x3, 0x64, 0x6D, 0x33, 0x3, 0xE2, 0x86, 0x92, 0x6, 0xD9, 0x86, 0xD8, 0xAC, + 0xD9, 0x89, 0x6, 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x2, 0x69, 0x78, 0x3, 0xE1, 0x84, 0xB6, 0x2, + 0xCB, 0x91, 0x3, 0xE1, 0x87, 0xB1, 0x4, 0xD9, 0x88, 0xD9, 0xB4, 0x4, 0xD9, 0x80, 0xD9, 0x91, 0x3, + 0xCE, 0xBC, 0x57, 0x3, 0x28, 0x6B, 0x29, 0x3, 0xE5, 0x9B, 0x97, 0x2, 0xC9, 0xA2, 0x3, 0x28, 0x70, + 0x29, 0x4, 0x37, 0xE6, 0x97, 0xA5, 0x4, 0xD9, 0x80, 0xD9, 0x92, 0x3, 0xE8, 0xA1, 0xA3, 0x3, 0xE7, + 0x89, 0x9B, 0x5, 0x31, 0x31, 0xE7, 0x82, 0xB9, 0x2, 0xC9, 0xB2, 0x3, 0xE9, 0x9A, 0xB6, 0x3, 0xE6, + 0xAF, 0x94, 0x3, 0xE7, 0xA9, 0xB4, 0x2, 0x4C, 0x4A, +}; + +static const __swift_uint32_t _swift_stdlib_nfkd_decomp_indices[3812] = { + 0x1D45, 0xDEEB7, 0x18FBE3, 0x25F216, 0x3432B4, 0x40FB98, 0x4C2113, 0x55D4DA, 0x5C2F37, 0x6C33D6, + 0x7CFC9B, 0x98FD7E, 0xB4315D, 0xC5EE6D, 0xD1D6B1, 0xDC1E9B, 0xEC32EE, 0xFC1D5E, 0x109D5AE, + 0x1103296, 0x121D737, 0x12DF245, 0x1542F72, 0x1642EF3, 0x175D615, 0x17DD634, 0x184FC7E, 0x1982F4A, + 0x1A8FB91, 0x1B42F70, 0x1C4FFA9, 0x1D4FB01, 0x1E02090, 0x1E9D4F4, 0x1F1F242, 0x219D637, 0x175D40D, + 0x22033F4, 0x239D40C, 0x240FF35, 0x2490789, 0x254217E, 0x25C1D78, 0x26833A9, 0x275D595, 0x27DF114, + 0x198328D, 0x21824E5, 0x28CFE9E, 0x299D7B1, 0x17C017F, 0x2A4FE63, 0x2ACFEA3, 0x255D521, 0x2B81DA3, + 0x2C42F4D, 0x2D5D5B0, 0x2DDD4F3, 0x239D5E0, 0x2E4FC48, 0x2F82F63, 0x309D464, 0x3103313, 0x35CFFCA, + 0x36C3348, 0x3A0FFDA, 0xC5EE0D, 0x3B0FF7B, 0x3C1D7E9, 0x3C832A8, 0x3D8FFA4, 0x3E8FDAB, 0x404FD7A, + 0x420FE49, 0x431D690, 0x438FC75, 0x255D5F1, 0x44C24B4, 0x1E9D458, 0x45C2F69, 0x46DD419, 0x4742081, + 0x47CFB6D, 0x488FCB2, 0x49CFC2A, 0x4B0217F, 0x4B8328C, 0x4C9D502, 0x4D0336A, 0x4E9F127, 0x184FC35, + 0x4F9D553, 0x500FFC5, 0x510FCC8, 0x525D642, 0x52C3395, 0x53DD70F, 0x1741D3A, 0x549D7C9, 0x554FFE6, + 0x564216B, 0x4DD529, 0x575D507, 0x57CFCA9, 0x5903192, 0x5A0FB89, 0x5ACFF1A, 0x5B5D747, 0x5C02FBA, + 0x5D03393, 0x5E1E035, 0x5EDF21C, 0x5FC3183, 0x60CFFBC, 0x61C33E7, 0x63001CB, 0x63C3207, 0x655D75D, + 0x660329B, 0x670330E, 0x6A42474, 0x6B5D6ED, 0x6C033D1, 0x6CDD7C0, 0x6D81DB9, 0x6E4FD1D, 0x6F832D2, + 0xC4FEE7, 0x7083320, 0x749F14F, 0x755D7F9, 0x75DD415, 0x7642F16, 0x77400BA, 0x28CFE9F, 0x77DEEB3, + 0x788FF21, 0x790FD52, 0x7AC24CC, 0x7B43298, 0x7C5D6EA, 0x7D1D453, 0x7D8FCF7, 0x7ECFF52, 0x7F5EE84, + 0x77CFEAE, 0x800FD5C, 0x1C43263, 0x81C02E0, 0x828FD93, 0x845EE71, 0x8502FD5, 0x861D72E, 0x86DD584, + 0x241D61C, 0x874FF61, 0x884FCCA, 0x898FDB2, 0x844FEBC, 0x8B4FC2D, 0x8C8FECF, 0x8D5F237, 0x8E4249C, + 0x8F432FA, 0x905D5A4, 0x90CFC9E, 0x921D6F9, 0x92DD69A, 0x2D5D478, 0x935D6AA, 0x941D6CF, 0x94CFD11, + 0x961D78D, 0x96DF240, 0x9942F7E, 0x46C24CF, 0x9A5D4FD, 0x9AD07B7, 0x9B8FFE3, 0x47400B9, 0x549D745, + 0x9C9D64D, 0x55D5DE, 0x9D0327D, 0xA05D405, 0xA0C1DB7, 0xA18246C, 0x55F13A, 0xA24FF33, 0xA2CFF66, + 0xA3CFDB6, 0xC5EE2D, 0xA58326A, 0x7D1D5F3, 0xA683217, 0x6B5D6B3, 0xA8C1D9D, 0xA98333C, 0xACC3355, + 0xAE8323B, 0x86DD4E8, 0x4C9D49A, 0x1E81D4F, 0xB00335F, 0xB1401CC, 0xB20FFD5, 0xB30FC14, 0xB443184, + 0xB54FD3B, 0xB69D73A, 0xB75EEB6, 0xB81D575, 0xA25D54A, 0xB88202F, 0xB91D540, 0xB99F233, 0xBA9D691, + 0x309D59C, 0xBB1E050, 0xBBD0790, 0xBC82484, 0xBDDD66A, 0xB74FE99, 0xBE41FDF, 0xBFD07B0, 0xC0DE045, + 0xC18FDC6, 0xC34FD85, 0xC50FE5E, 0xC600EDD, 0xC7C33A0, 0xC8C32AC, 0xC9D078A, 0xCA83343, 0xB75EE76, + 0xCDDD6D9, 0x9C9D445, 0xCE9D765, 0xCF4FBA0, 0xD003171, 0xD11EE1F, 0xD1DD67F, 0xD243149, 0xD34FD72, + 0xD50FB22, 0xD5DD7CE, 0xD641FFE, 0xD743228, 0xD8DD7EA, 0xD95F230, 0x4B1D4F6, 0x4F9D44F, 0xBA8210E, + 0x861D7A2, 0x54FF2B, 0x274FF50, 0x8C9EE7B, 0xB882001, 0xDA4FCAF, 0xDB8316F, 0x6602F25, 0xDC83208, + 0xB882004, 0x525D5A6, 0xDE03300, 0xE21D6A3, 0xE2907A9, 0xE343265, 0xE442FAB, 0x9C9D619, 0xE54FF6A, + 0xE641D68, 0xE70FD97, 0x789D608, 0xE8CFC73, 0xEA0FE32, 0xEB0313B, 0xEC1D6F7, 0xECCFD67, 0xEE9EE09, + 0xEF42496, 0xA05D641, 0x109D4AA, 0xF042F8E, 0xF1432CA, 0xF2C32A7, 0xF3CFC71, 0xF51D41C, 0xF583367, + 0xF703162, 0x46DD689, 0x8C8FECE, 0xF81D6B6, 0x4C9D63A, 0x92DD492, 0xF8C33AB, 0xF9C2F4B, 0xFACFF22, + 0x2981DBF, 0xFB4FD22, 0xFC82F79, 0xFD9E03A, 0xFE4320B, 0xFFDD728, 0x40FB99, 0x1009D413, + 0x10100F77, 0xD8DD7E0, 0x1039D76C, 0xA05D60D, 0x104432A2, 0x1054FE4D, 0xDEE17, 0xA25D5B2, + 0x105CFDF1, 0x10783150, 0xA25D682, 0x108802D8, 0x1098FD83, 0x10B43247, 0x10C42F61, 0x10D401F1, + 0x10E02F32, 0x574216E, 0x10F1D789, 0x1100FB56, 0x110DEE9A, 0x1118FF82, 0x1128334D, 0x241D54C, + 0xF51D5BC, 0x775D630, 0x4DD5F9, 0x75DD5E9, 0x115CFB78, 0x11682169, 0x4DD591, 0x75DD4E5, 0xBDDD602, + 0x1170FD14, 0x755D7E5, 0x1185D526, 0x118C203C, 0x1198FDF3, 0x11BCFF08, 0x11C4FB53, 0x11D0FC63, + 0x11E8319F, 0xB81D4A5, 0x75DD685, 0x17CFF53, 0x11F8FD92, 0xB91D408, 0x1214FEB6, 0x1220FB13, + 0x1235D77B, 0x12402F0C, 0x109D64A, 0x125032F2, 0xFADD609, 0x934213E, 0x575D60B, 0x12603304, + 0x12A000BE, 0x12B8FE97, 0x7ACFF37, 0x75DD519, 0x12C43189, 0x844FEBA, 0x12D4FF78, 0x12E4FC51, + 0x12F82102, 0x1301D569, 0xFDD7AC, 0x1308FF97, 0x131833D5, 0x1329D760, 0x510FCEC, 0x13343290, + 0x1344FCBD, 0x1358FE64, 0x845EE91, 0x1360FD9F, 0x137C3220, 0x1394FBA6, 0x13A0FDB5, 0x13BCFC53, + 0x13D0FD76, 0x13EC3137, 0x13FCFD2A, 0x1410FC23, 0x14242469, 0x1430FE8C, 0x655D6B9, 0x1445F241, + 0x146CFFA0, 0x147CFF99, 0x148C339C, 0x14982075, 0x14A1D734, 0x14AC2057, 0x14E1D6A5, 0x14ED079E, + 0x941D77D, 0x14F81FDD, 0x1185D4F2, 0x1510FF5F, 0x1521F23B, 0x1530FFE5, 0x153C3251, 0x15483344, + 0x1570FBD8, 0x775D52C, 0x157CFED6, 0xEE9EE29, 0x1589D6B5, 0x159433FE, 0x15ACFCF1, 0x15C0FE14, + 0x15C83269, 0x15D9F14C, 0x15E432BA, 0x15F0FFD3, 0x1600FCCE, 0x16142FA3, 0x4B1D696, 0xD942F9B, + 0x53DD7BD, 0x1214FEB5, 0x7C5D798, 0x1624323A, 0x1300FF58, 0x905F134, 0x163DD721, 0x1648FDC3, + 0x1665F210, 0x1674317F, 0x1685EE8C, 0x16903383, 0x169CFE80, 0x16A82F87, 0x16B82112, 0x16C0FE84, + 0x16D4FF3C, 0x4F9D4EB, 0x16DC215F, 0x1170FCF8, 0x16F0FBA4, 0x9A5D669, 0x1704FD0D, 0x17183253, + 0xB81D541, 0x1724FBD4, 0x1731EE0F, 0xE201DBB, 0x173C2F17, 0x174C2034, 0x75C2C7D, 0x3C1D7DF, + 0x17750788, 0x7D1D68F, 0x1784FFAA, 0x109D512, 0x17943218, 0x46DD4E9, 0x17B9E052, 0x17DD42C, + 0x17C5D6E3, 0x17D0337B, 0x17EDEE03, 0x17F8208B, 0x1808331D, 0x18302487, 0x1845D73F, 0x1850FBE4, + 0x185CFF89, 0x186CFEFC, 0x2ACFEA2, 0x9042130, 0x1880322A, 0x1185D692, 0x1898FC33, 0x18AC2FCE, + 0x18BC335C, 0x1235D6CD, 0x18D0AB5D, 0x18E1EE4E, 0x18EDF12D, 0x18F83156, 0x1908FCA6, 0x961D7C7, + 0x191C02B6, 0x1928FC3E, 0x193C2F07, 0x194C3295, 0x195CFFA2, 0x196C207A, 0x1974FDA7, 0x7D8FD13, + 0x1990FB74, 0x199CFCBA, 0x19B01DA9, 0x9C9D681, 0x4F9D587, 0x1169F147, 0x19BC314D, 0x19CC3293, + 0x19DCFC87, 0x19F03342, 0x4DD4F5, 0x1A182F01, 0x12F9D49E, 0x7D1D58B, 0x1A28FD1F, 0xDA4FC1E, + 0x1A3C2F89, 0x4DD425, 0x1A4CFD6A, 0x1A682FB3, 0x1A782F46, 0x1A881FDE, 0x1AA032D6, 0x1AB0339F, + 0x1AC0FB9C, 0x9B800AF, 0x9A4FF54, 0x1ACC1DA2, 0xB80FF2A, 0x1AD82F98, 0x1AE8FE3C, 0x1AF8FFB0, + 0x1B083225, 0x1B203359, 0x309D5D0, 0x1B342FCD, 0x961D753, 0x110CFEC6, 0x2D5D57C, 0x2D5F140, + 0x1B44FC36, 0x9C8211B, 0x1B58FD8F, 0x2401D41, 0x1B74FC69, 0x1B91EE05, 0x1B9C329F, 0x1BAC246D, + 0x1BB9EE81, 0x1BC4FE5B, 0x275D665, 0x1BCDF201, 0x1BE8FCA0, 0x1BFC33EB, 0x1C142F3A, 0x1C25D7AF, + 0x1C302121, 0x874FE12, 0x274209A, 0x905D60C, 0x1C41D6D0, 0x1C4C2F71, 0x255D451, 0x1C5C2074, + 0x1C64FB7E, 0x1C702FD0, 0x1C81FBF6, 0x1C89EEB8, 0x1C942F31, 0x4F9D4B7, 0x905D5D8, 0x1CA432F9, + 0x1CB42FAF, 0xD1DD443, 0x4C02E1, 0x46DD4B5, 0xB81D645, 0x1CC507AA, 0x1CD0FE88, 0x16B9D40B, + 0x1E9D62C, 0x525D4A2, 0x1CE5D6A8, 0x1CF02161, 0x9A5D599, 0x1CFCFE79, 0x3C1D7D5, 0x1D11D4F7, + 0x1D18FC97, 0x1C25D73B, 0x2F9F222, 0xE65D6E0, 0x1D3433FA, 0x7542083, 0x299D6C9, 0x195C3132, + 0x1D4C3204, 0xB91D610, 0x1D642154, 0x1D7C2037, 0x1DA432F7, 0x1DB5D71F, 0x4C9D536, 0x1DC02F99, + 0x1DD024A1, 0x175D579, 0x1DE02F68, 0x1DF02F2C, 0x1E0032AF, 0x1E11D766, 0x1E1C33C1, 0x157DEE12, + 0x14982464, 0x431D488, 0x18E1EE0E, 0x1E2CFC15, 0x219D59B, 0xF51D450, 0x1E401D44, 0x1E4C33D9, + 0x1E5CFC22, 0x1E70FF84, 0x1E80FCA2, 0x7EC02B3, 0x1E95D7BC, 0x1EA0FF20, 0x1EA9F11E, 0x1201D5D, + 0x1EB9E041, 0x1EC4FC2B, 0x541D37, 0x1ED9F219, 0x1EE801C9, 0xB69D6C6, 0x2D5D5E4, 0x1EF432A5, + 0x1F05F110, 0x1F14313C, 0x1E1D622, 0x1F25E058, 0x1F303333, 0x1F64FF81, 0xB74FE9B, 0x17B9E031, + 0x1078FFC3, 0x309D568, 0x549D6E1, 0xC4FEE6, 0x8C9EEBB, 0xD1C2119, 0x1F7433F5, 0x47CFB6A, + 0x431D4F0, 0x1F8C1FBF, 0xA05D675, 0xC4FEE5, 0x1F9D079C, 0x1FB033AE, 0x17C02E2, 0x941D709, + 0x1FD1EE6A, 0x1FDC338F, 0x961D711, 0x46DD44D, 0x30824E6, 0x309D4CC, 0x1FE8329A, 0x1FF83283, + 0x20082F6B, 0x2019F21A, 0x20282FA7, 0x7ADD4E6, 0x219D4FF, 0x203824A8, 0x574FF24, 0x2049D7A4, + 0x2054FC61, 0x206C3154, 0x241D414, 0x86CFF39, 0x207CFDF8, 0xB69D716, 0x20A1F190, 0x20AC2F3C, + 0x20BDD739, 0x20C8FB85, 0x7EC24E1, 0xFDD772, 0x275D699, 0x7EDD563, 0x20D5F11A, 0x20E4FB06, + 0x1E9D528, 0x1D11D52B, 0x20F02489, 0x20FC1DA8, 0xDA4FD36, 0x21083250, 0xD1DD513, 0x2118FC8C, + 0x18E0FEB2, 0x212C3361, 0x21403299, 0x7ADD4B2, 0x2150FBDA, 0x215C2F7D, 0x216C33B1, 0xCE9D6F1, + 0x2179E043, 0x218433F1, 0x219C3327, 0x21B8FF79, 0x4CFF4C, 0x21C8FCFC, 0x16B824C1, 0x21DCFB15, + 0x21F0335B, 0x2D4211A, 0x2204FDF9, 0x2221D7EE, 0x222907A4, 0xCDDD713, 0x22343302, 0x2274FD25, + 0x4F9D5BB, 0x186CFEFB, 0x239D5AC, 0x228833FF, 0xB902111, 0x22982E9F, 0x22A9D702, 0x22B5EE30, + 0x1215EE34, 0x22C02FA1, 0x22D02F29, 0x22E02F5F, 0xB8024BF, 0x905D674, 0x7742134, 0xF70FFDB, + 0x1184FF49, 0x22F10796, 0x22FCFF01, 0xA0424BB, 0x230432F4, 0x2314FFCC, 0x1B90FEEE, 0x23243317, + 0x2364247E, 0x237833E2, 0x55D646, 0x7D1D41F, 0x22A9D73C, 0x92DD666, 0x7F4FEEA, 0x238CFC19, + 0x23A0335D, 0x309D66C, 0x23B4FDBD, 0x15C0FE54, 0x7C5D6B0, 0x55D472, 0x23D1D706, 0x23DC332B, + 0x2428212F, 0x549D78F, 0x2430FB25, 0x789D504, 0x243C2122, 0xCFEA6, 0x175D67D, 0x2448FF6E, + 0x24583240, 0x24702FD2, 0x655D6AF, 0x961D785, 0x24803349, 0x249C33DC, 0x24A8319C, 0x24B8FB5E, + 0xBA9D559, 0x24C43346, 0x24EC2F05, 0x24FCFF72, 0x250C33E0, 0x6B5D79B, 0x57CFC17, 0x2520FC24, + 0x575D5D7, 0x25341DBE, 0x2540FD5F, 0x255CFEC2, 0x256832DC, 0x255D625, 0x1C5CFF14, 0xB69D78A, + 0x3D83261, 0x1845D7C6, 0x22A9D776, 0x789D434, 0x789D5A0, 0x175D649, 0x2579E03B, 0x2584FC99, + 0x25A03318, 0x25D42F26, 0xB81D5DD, 0x775D594, 0xD1DF13F, 0x25E4FB62, 0x25F1D788, 0x25FCFB02, + 0x309D534, 0x2D5D4AC, 0x4C217C, 0x11842170, 0x9C9D5E5, 0xD1DD477, 0x26082FA2, 0x12F9D46A, + 0x2618FCA4, 0x262C3194, 0x263CFB21, 0x5241D33, 0x26481DB0, 0x26543376, 0xB69D7C4, 0x2660FE31, + 0x2670FE71, 0x2684322D, 0x269C3278, 0x28DEEA2, 0x1214FEB7, 0xD1DD57B, 0x4B1D5FA, 0xD1DD64B, + 0x26B8FF1D, 0x1B91EE85, 0x222000B2, 0xB88205F, 0x26C0FEF6, 0x26DC32FD, 0x26ECFC01, 0x27083272, + 0x2724FBEC, 0x46DD481, 0xD1D75F, 0xB91D470, 0x12F9D436, 0x9C9D411, 0x4B1D62E, 0x2740FC50, + 0x27542F74, 0x27642FBB, 0x4B1D4C2, 0x27740140, 0x2785E04B, 0x255DEEA8, 0x17DD4FC, 0x27902F14, + 0x27A033DE, 0x157DEEB2, 0x163DD6E7, 0x9C8211D, 0x7D01DA0, 0x24024CA, 0x27B801C4, 0xE21D49B, + 0x27CCFCC6, 0x1C88FEAC, 0x4B0FF4D, 0x27E0215E, 0x27F8FD0C, 0x280D0787, 0x28181D3D, 0x241D4E4, + 0x309D498, 0x2824FC0D, 0x1D10FF4E, 0x2838FDF6, 0x1E1D552, 0xB91D574, 0x1E1D44E, 0x285D07AF, + 0x2868FFAD, 0x28782A76, 0x2889D407, 0x2891F218, 0x28A02168, 0x28AC1DA6, 0xBA9D4BD, 0x28B8FD8A, + 0x28D4FE17, 0x75C2164, 0x12B9EE15, 0x28E4FCAD, 0x935D6E4, 0x28F8330A, 0x7EDD667, 0x292033EC, + 0x275D561, 0x29382F9D, 0x1100FB59, 0x2949F228, 0x9C8211C, 0x29580133, 0x23143157, 0x29642F57, + 0x29743210, 0x2998FE85, 0x29AC247F, 0x1009D4E3, 0x29C0318A, 0xE21D4CF, 0x77424DE, 0x655D6F3, + 0xCF4FBA2, 0x29D0FD1B, 0x29E4FF60, 0x1784313A, 0x29F5D74A, 0x2A01F11B, 0x2A10325D, 0x2540FD60, + 0xBDC24E4, 0x2A1CA7F9, 0x2A283234, 0x2A40FC3F, 0x2A543166, 0x115CFB76, 0x1BB8FE90, 0x2A64FE3D, + 0x2A743255, 0x2A801D46, 0xD5C2070, 0x525F136, 0x1E11D6B8, 0x2A903185, 0x2889D573, 0x2AA0319B, + 0x2181D5B, 0x2AB0FE18, 0xBDCFF55, 0x2AC0FCD2, 0x549D71B, 0x175D5AD, 0x2AD4FD1C, 0x1100FB57, + 0x12B8FE98, 0x2AE832BE, 0x299D7C5, 0x2AF4AB5C, 0x775D664, 0x2B04316A, 0x2B142F39, 0x844FEBB, + 0x2B241DA1, 0x16B9D543, 0x2B3033E5, 0x255D4B9, 0x2B45F238, 0x2B543267, 0x1731EE6F, 0x2B64FC9D, + 0x2B783310, 0x2BACFC54, 0x2BC03143, 0x2BD02FBE, 0x16B9D50F, 0x2BE03391, 0x94CFCF5, 0x2BF1D778, + 0x2BFDF125, 0x2C0CFFAF, 0x6B5D761, 0x2C1CFE78, 0x524FF27, 0x1C5DFBF4, 0x2C2C3036, 0x53DD749, + 0x2C3C2477, 0x2C4C3198, 0x2C5C33CE, 0x175D4A9, 0x2C682FAD, 0x2C782F53, 0x2C88330F, 0x2150FBD9, + 0x2CBC247B, 0x2CCDE057, 0x1E1D656, 0x55D4A6, 0x2CD83245, 0x22A9D7B0, 0x17DD564, 0x22B5EE70, + 0x2CE801C5, 0x2CFC2F1D, 0x1E024D0, 0x2D0C2473, 0x2D18FB69, 0x4F9D623, 0x2D243366, 0x2D3C32A3, + 0x1E9D4C0, 0xDEE97, 0x2D4CFD20, 0x2D6033A2, 0x2D7032C2, 0x905D4D4, 0x2D842120, 0x2D90FD3D, + 0x2DA43351, 0xB882000, 0x2DD82F92, 0x7ADD47E, 0x475D7F7, 0x2DE83167, 0x2DF82F40, 0x2E08FBFB, + 0x275D45D, 0x255D68D, 0x2E24FFD2, 0x2E34FDC2, 0x2E50325B, 0x2E5CFD53, 0x2E79E042, 0x2ACFEA4, + 0x2E843353, 0x2EB8FD95, 0x905D640, 0xCDDD787, 0xB81D409, 0x275D4C5, 0x2ED4318D, 0x2EE4FD6D, + 0x2F01F224, 0x1C25D701, 0x1845D718, 0x2F10FD81, 0x175D475, 0x525D406, 0x28E4FD34, 0x2F2C33CA, + 0x109D67E, 0xC0DE063, 0x2F3802E4, 0x7881D2C, 0x2F44FD61, 0x1D11D62F, 0x11C4FB54, 0x2F602173, + 0x2F6C323E, 0x2F8433B3, 0x2F90FD5B, 0x2FACFEBE, 0x2FB8FDAD, 0x16C0FE83, 0x55D576, 0x2429D556, + 0x905D438, 0x2FD432CF, 0x109D4DE, 0x1235D741, 0x2FE4FE44, 0x9A5D495, 0x2FF433B5, 0x30000677, + 0x3014321B, 0x591F229, 0x30382F4F, 0x90424BA, 0x30482159, 0x3060FB23, 0x306CFE8E, 0x3078FC34, + 0x1BB9EEA1, 0x7ADD686, 0x308CFCC5, 0x1169D4B3, 0x4F9D41B, 0x1E1D5EE, 0x30A0FCD4, 0x30B4334C, + 0xA05D4D5, 0x75400B3, 0x5B5D781, 0xEE9EEA9, 0xBDDD532, 0x30F402DD, 0x31042F13, 0x7D1D4BB, + 0x2ACFEA1, 0xB91D678, 0x2889D677, 0x3114FBF1, 0xA25D446, 0x2221D7E4, 0x3130FE56, 0x1BB8FE8F, + 0x3139F21B, 0x92DD52E, 0x1BB9EE01, 0x31483273, 0x3164327B, 0x31802011, 0x12F8FF23, 0x16642F3F, + 0x3190FDFA, 0xB69D6DC, 0x1C25D6C7, 0x3218215B, 0x32302F97, 0x655D767, 0x10F1D715, 0x3240331E, + 0x28CFE9D, 0x196CFF0B, 0xB88200A, 0x3274326F, 0x196C208A, 0x32902493, 0x1009D57F, 0x548213C, + 0x7EDD52F, 0xEC1D731, 0x1C5DD7D2, 0x32A0FC5A, 0x7ADD5EA, 0x121D6C3, 0x32B4FC7A, 0x32C82F88, + 0x32D8331C, 0x3300FDFB, 0x3341F122, 0x3350FE7C, 0x3360FEF8, 0x238CFCAB, 0x92DD4C6, 0x337DD77C, + 0x338832AB, 0x3398FBDF, 0x33A4FBB1, 0x27F8FD28, 0x33B8FC27, 0x1E2CFCA7, 0x961D719, 0x1009D5E7, + 0x2724FBED, 0x2B54FFB7, 0x33CC332F, 0x1850FBE5, 0x430FF47, 0x3400FFD6, 0x3410FD69, 0x342C3307, + 0x1009D447, 0x3479F22B, 0x275D5C9, 0x34882155, 0x34A1D7F5, 0x1BB8FE92, 0x34A8FCF0, 0x34BC3254, + 0x34C8FEEF, 0x34D42495, 0xF81D6F0, 0x34E42F15, 0x32B4FC13, 0x34F4FC9A, 0x1169D5B7, 0x3511F10A, + 0x351C3163, 0x7EDD493, 0x352C3356, 0x35782475, 0x13FCFD0E, 0x86DD688, 0xBDDD636, 0xF51D68C, + 0x35883311, 0xBA9D5C1, 0xBA824D7, 0x35BC2488, 0x35C82165, 0x2998FE86, 0x35D4319D, 0x2E79E060, + 0x575F133, 0xECFF8F, 0x60C326B, 0x35E5F11D, 0x35F4FFE9, 0x36042F44, 0x1E01D43, 0x1301D605, + 0x36143266, 0x86DD5EC, 0x2DDD62B, 0x1898FCC2, 0x36243319, 0x36703133, 0x1009D517, 0x3360FEF7, + 0xF51D4EC, 0x36802F51, 0x369032A1, 0x36A01DB5, 0x1B74FC04, 0x1724FBD5, 0xFADF131, 0x36ADF111, + 0x36BCFC1A, 0x36D0FDC7, 0x24282147, 0x36EDD6C2, 0x17C24E2, 0x36F9E03C, 0x2429D41E, 0x3704FE74, + 0x3C1D7FD, 0x3715F16A, 0x2BF1D7B2, 0x37201DAA, 0x373032B2, 0x373C2026, 0x1928FC84, 0xDEE77, + 0x1DB5D6E5, 0x1C81D7FC, 0x1169D54F, 0x374C317A, 0x22FCFE57, 0x375C2106, 0x376C3382, 0xC5EE4D, + 0x377C334B, 0x37A507AE, 0x26B8208C, 0x37B0337A, 0x255D41D, 0x37BC1FCF, 0x37D5D735, 0x7ADD54E, + 0x37E4331F, 0x2B543147, 0x431D524, 0x3818FF7F, 0x3828FF5D, 0x38303357, 0x3858FE40, 0x3868FFA1, + 0x2429D522, 0x38790795, 0x3884FD5E, 0x38A02109, 0x12F8216D, 0x2542146, 0x38B0FD82, 0xF51D588, + 0x38CC3236, 0x1D11D48F, 0x4742460, 0x430210A, 0x7EDD45F, 0x431D558, 0x38E41DB8, 0x38F4215C, + 0x5E1E056, 0x390C3169, 0x11842071, 0x391DF109, 0x3928FCD3, 0x393C2499, 0x1169D44B, 0x394CFB8C, + 0x3958FF90, 0x2889D4D7, 0x3969E03F, 0x3974332D, 0x1168FF38, 0x1C89EE98, 0x219D533, 0x2DCFF4A, + 0x12F9D4D2, 0x39B4FF0A, 0x39BC32DF, 0x381832DE, 0x39CCFC42, 0x115CFB79, 0x39E03200, 0xBA9D65D, + 0x39F8337D, 0xF5024D2, 0x3A1433D8, 0x1C64FB81, 0x3A281FCD, 0x3A40FF88, 0x4B1D52A, 0x1DA4FF98, + 0x3A50FF3D, 0x3A580EDC, 0x3A743136, 0x17ECFEAA, 0x2D18FB68, 0x3A840E33, 0x3AA01D9F, 0x3AACFB24, + 0x3AB8325E, 0xE21D503, 0xFADD435, 0x157DEE32, 0x3AC43206, 0x3ADC33CB, 0x3AE8322F, 0xB882007, + 0x2E08FBFA, 0x3B0001F2, 0x263C2135, 0x1009D5B3, 0x30802B7, 0x1B44FC7F, 0x3B0C02D9, 0x17DD460, + 0x3B1C2F02, 0x34C8FBE9, 0x9C9D479, 0xE21D66F, 0x1BC4FE37, 0x1BB9EE61, 0x2D4CFD04, 0x1FD0FEDB, + 0x3B2DF248, 0x845EE31, 0xD1DD5AF, 0x3B543326, 0x3B7C3178, 0x3B8C317B, 0x3B9C24AF, 0xD11EE5F, + 0x3BAC32E5, 0x3BBCFDBA, 0x3BD8FBEA, 0x7EDD4FB, 0x1301D5D1, 0x3BF432B6, 0x5B5D7BB, 0x4C24DB, + 0x3C00213B, 0x34A1D7E1, 0x9A4209C, 0x309D430, 0x2429D486, 0x9A5D42D, 0x39B4FE61, 0x3C0FF17, + 0xD1CFF30, 0x3C1024A3, 0xB81D5A9, 0x255D485, 0x1AF83140, 0x3C2033F8, 0x299D751, 0x3C39E066, + 0x3C44FFB4, 0x3C54FF91, 0x3C642FBC, 0x3C74FB4F, 0x3C88FBEE, 0x275D4F9, 0x3CA5F200, 0x4F8FF42, + 0x3CC10793, 0x157DEE92, 0xB4FFD4, 0x9041D31, 0x3CCC333F, 0x3CE8FD75, 0x3D04FC20, 0x34A8FC58, + 0x3969E05E, 0xD502138, 0x28DEE22, 0x18E1EEAE, 0x3D18FFE8, 0x130024E7, 0x2274FD09, 0x525D4D6, + 0x309D638, 0x3D281D32, 0x3D35D7CA, 0x3D40FCB3, 0x789D56C, 0x3D5507A2, 0x2AD4FD00, 0xFADD401, + 0x3D60323C, 0x3D7803D3, 0x86DF148, 0x2428FF45, 0x3D8CFCDA, 0x3DA0FCD0, 0x2CCDE036, 0x3DB4FD26, + 0x3DC83399, 0x3DD432E6, 0x3DE4FC9C, 0x20BDD6C5, 0x163DD75B, 0x3DF9F117, 0x3E08FD9E, 0x525D46E, + 0x3E2432E4, 0x3E341D9B, 0x3E40FB94, 0x3E4CFF7C, 0x4C9D466, 0x11E82F08, 0x3E5CFF06, 0x3E6507B2, + 0x241D518, 0xD5CFF10, 0x3E70FC90, 0x39CCFCED, 0x549D70B, 0x77CFEAD, 0x92C24E0, 0x3E8433C5, + 0x1F6432E0, 0x3E9000BD, 0x3EA9F115, 0xBDDD5CE, 0x3EB824B1, 0xCFEA8, 0x18FBE2, 0x3EC8322E, + 0x15C0FF1B, 0x3EE0321E, 0x3F1C1FFD, 0x3F2C3332, 0x3F782F56, 0x2221D7DA, 0x754FF13, 0x7F5EE24, + 0xD1DD4AB, 0xE70FD98, 0x7EDD4C7, 0x43024D6, 0x3F882F2E, 0x3F98FCF4, 0x1685EE6C, 0x241D684, + 0x4F81D47, 0x3FB433DB, 0x1E8FF4B, 0x3FC1F23A, 0x12B9EE95, 0x2BF1D6CA, 0x5003152, 0x3FD0FB7A, + 0x10824C4, 0x3FDC2FB9, 0x3FECFD8B, 0x400907B9, 0x34A8FC93, 0x401CFCF6, 0x655D7A1, 0x4031E05A, + 0x403CFE39, 0x28881D34, 0xE65D71A, 0x404C1DA5, 0x4058FF74, 0x40683369, 0x408001CA, 0x241D580, + 0x7741D52, 0x7ADD44A, 0x255DEE08, 0x408C32ED, 0x409C321D, 0x1009D683, 0x40E42485, 0x40F83233, + 0x4110309F, 0x2FACFEC0, 0x2DDD58F, 0x17C5D791, 0xF50FF43, 0xBDC1D64, 0x412D079D, 0x413C33F0, + 0x4154FFE0, 0x1C41D77E, 0x1AC0FB9A, 0xB91D5A8, 0x4160FDB1, 0x417C32BD, 0x418801F3, 0x41941D5C, + 0xE2024E9, 0x41A5F232, 0x41B4FDB3, 0x41D0FB9F, 0x1499FBF5, 0xFB4FD06, 0x41DDF11C, 0x2118FCD5, + 0x92DD45E, 0xA25D412, 0x2049D6BC, 0x41EC222F, 0x1E95D6D4, 0x4208328F, 0x26B8207C, 0x7542462, + 0xBA8FF48, 0x2FADEE59, 0x4218FD39, 0x422CFCDB, 0x42403337, 0x4268338B, 0x1E80FC0C, 0x42742F2D, + 0x42843285, 0xA05D46D, 0x42943301, 0x42C81D54, 0x13002179, 0x42D81D51, 0x306DEE80, 0x1301D535, + 0x42E43177, 0x2889D46F, 0x4C9D59E, 0x42F43229, 0x430CFC74, 0x4321EEA6, 0x3614FFB5, 0xD8DD7FE, + 0x2FADEE99, 0x42082F1F, 0xD1DD5E3, 0x36143145, 0x432C3377, 0x43383151, 0x434833EE, 0xCFEA7, + 0x43602F8A, 0x43703288, 0x3E40FB92, 0x4380FD7F, 0x92DD562, 0x439C2F58, 0x43AC2F10, 0x43BC01C8, + 0x43C83331, 0x43F0333A, 0x12E4FCD7, 0x7742092, 0x27F8FD30, 0x7ADD652, 0x442433EA, 0x443C3258, + 0x1AC0FB9B, 0xBA9D421, 0x44482FC9, 0x4458FD19, 0x446C2FC3, 0x17DD4C8, 0x755D7DB, 0x1169D4E7, + 0xBA9D5F5, 0x110DEEBA, 0x2181D65, 0x447C1FC1, 0x774FF4F, 0x575D673, 0x4495F251, 0x20BC1D5F, + 0x288824BD, 0x44A5E06B, 0xA04FF26, 0x44B00587, 0x44C5F211, 0x44D4FF03, 0x44DCFFCF, 0x1329D79A, + 0x44EC2116, 0x22FCFE15, 0x1054FE4E, 0x44F8321A, 0xCFEA5, 0x451CFC7D, 0x45302F24, 0xA25D47A, + 0x45402F95, 0x34A02079, 0x4551F120, 0x4560FCBF, 0x4575F12A, 0x45942F0F, 0x2FACFEBD, 0x45A4FBFD, + 0x2DDD4BF, 0x7ADD5B6, 0x13002093, 0x10F1D6DB, 0x45B0FD9A, 0x2824FCA3, 0x12B9EEB5, 0x3E70FC5D, + 0xF81D79E, 0x1098FD84, 0x45CC32C8, 0x1E1D4EA, 0x45E107B8, 0xA25D4E2, 0x1EF5F22D, 0x45ECFCE1, + 0x46002230, 0x9C9D57D, 0x905D46C, 0x2429D452, 0x255D5BD, 0x46282033, 0x46442A75, 0x4650FC8D, + 0x466400B8, 0x46742F91, 0x468401C6, 0x24FC32D1, 0x935D71E, 0x4698FCCB, 0x46ADF231, 0x17DD600, + 0x46BDF250, 0x46CCFC37, 0x46E0334F, 0x238216F, 0x575D46B, 0x4709E04C, 0x471433E4, 0x47282F86, + 0x1A8FB8E, 0x47383141, 0x2049D6F6, 0x2660FE58, 0x2D424C6, 0x47482FD4, 0x47581D2D, 0x351CFFDC, + 0x4764330B, 0x1DB5D793, 0x478C3398, 0x430CFC0F, 0x239D474, 0x4799F116, 0x241D47C, 0x47A8316D, + 0xFDD6C4, 0x47B9EE1E, 0x37D5D6FB, 0x1C81D7DE, 0x92D07A5, 0x255DEE68, 0x25F1D714, 0x1CD0FE87, + 0x47C4AB69, 0x174FF2E, 0x47D0FC1B, 0x575D56F, 0xB91D4D8, 0x1F25E037, 0x47E43370, 0xA25D5E6, + 0x1008FF34, 0x5742145, 0xB882005, 0x47FC33E1, 0x11BC208D, 0x4810FCD6, 0x219D5CF, 0x20E4FB05, + 0x482432E9, 0xA25F142, 0x34C8FEF0, 0x4834FF94, 0x4844FF65, 0xEE8FEF2, 0x4854FFE1, 0x4860FE82, + 0x48742F4C, 0x4738FFB1, 0x4884FC62, 0x86DD51C, 0x11841D62, 0xD8DD7F4, 0x489CFF6C, 0x2ADEE07, + 0x4C9D4CE, 0x48ACFD88, 0x2889D643, 0x2BC0FFB3, 0x4860FE81, 0x9A5D531, 0x147C32F8, 0x48C83237, + 0x48E03270, 0x4218FD0B, 0x48FC2163, 0x4908FCAE, 0xE21D607, 0x491C3291, 0x254FF44, 0x12F9D63E, + 0x492DF107, 0x19BCFFBD, 0x493833FD, 0x47CFB6C, 0x241D650, 0x495033CF, 0x495C249D, 0x496C3277, + 0x4908FD35, 0x157CFED7, 0x1C41D7B8, 0x4989E04D, 0x49943275, 0x49B02471, 0x17C5D757, 0x11C4FB55, + 0x7C5D724, 0x49BC330D, 0x49F03173, 0xF81D764, 0x109D57A, 0x2568FF7D, 0x4A00FB17, 0x4A1432B5, + 0x4A20222C, 0x4A3C327C, 0x775D698, 0x4A7DF235, 0x408CFF8E, 0x27CCFC3A, 0xB882009, 0x4A8C2140, + 0x4A9CFCC7, 0x4AB02F6A, 0x1D11D55F, 0x4AC03174, 0x28DEE82, 0x14982085, 0x4AD02172, 0x2221FBF2, + 0x4AE02F85, 0x4AF0FDA9, 0x206CFFC7, 0xE21D63B, 0x4B0C329C, 0x337DD708, 0x4B1CFC38, 0xD24FFB9, + 0xB74FE9C, 0x1DB5D759, 0x12F9D5D6, 0x4B30316E, 0x17C5D71D, 0xA042131, 0x4B402F38, 0x4B50334E, + 0x2D90FD3C, 0x4B84FD08, 0x9C9D4E1, 0x4B983322, 0x4BC0FBF4, 0x4BDC3241, 0x4BF5E06D, 0x2DDD55B, + 0x34F4FC66, 0x4C001DB6, 0x4C0CFE51, 0x4C1DE04A, 0x3878210F, 0x4C2C331B, 0x1D18FC00, 0x1FD0FEDC, + 0x4C60FFC6, 0x4C702F19, 0x1731EE2F, 0x2D4FF31, 0x789F130, 0x24281D49, 0x4C81F226, 0x4C903389, + 0x4CA42F60, 0x4CB5D75C, 0x2888FF28, 0x4CC033BD, 0x255D4ED, 0x4B1D55E, 0x395832EF, 0x4CCCFD79, + 0x4CE833F3, 0x2BF1D704, 0x4D00FDC0, 0xF51D658, 0x12F9F12B, 0x4D1C2492, 0x55D5AA, 0x48ACFD87, + 0x49CFCBB, 0x4D2C3396, 0x1E9D424, 0x4D38FC57, 0x4D4DD72F, 0x2DC2149, 0x4D580675, 0x4D6C2A74, + 0x3A03161, 0x4D7CFFA8, 0x4D8CFD70, 0x262C3282, 0x3E24FF85, 0x16B9D4DB, 0x4DA9F16B, 0x25424D3, + 0x163DD795, 0x4DB4FB70, 0x2AC0FC4B, 0x1185D422, 0x4DC0207E, 0x4DC83368, 0xCE9D6B7, 0x4DE1F246, + 0x6F8FF73, 0x4E082479, 0x1E11D6F2, 0x4E18FC60, 0x4E3033C7, 0x118424D8, 0x4E403338, 0x6B5D727, + 0x4E7433E8, 0x299D703, 0x884FC40, 0x4E88329E, 0x4E99F113, 0x4EA83175, 0x4EB8325F, 0x4EC4FE52, + 0x4ECC33C2, 0x3DD4FF87, 0x4EE03211, 0x1E9D55C, 0x4F0433E3, 0x4F18FF9E, 0x8C8FECD, 0x1730FECC, + 0x4F28FD8E, 0x4F442F7A, 0x9A5D565, 0x46CFF3A, 0x4F542F81, 0x4F64FC91, 0x4F78320A, 0x12B9EE35, + 0x4F90FD2B, 0x4FA43330, 0x4FCCFE7A, 0x4FDC1D53, 0xB91F138, 0x575D49F, 0x4FE82150, 0x50003371, + 0xFADD56D, 0x501032F1, 0xB902110, 0x502032EA, 0x1845D6CB, 0x5031F14D, 0x55D43E, 0x503CFF75, + 0xFFDD762, 0x504CFB5C, 0x11C4FB52, 0x50583276, 0x50743394, 0x50843388, 0x509432AD, 0x50A42FA8, + 0x50B4339E, 0x50C0319E, 0x50D1E044, 0x255D555, 0x33B8FD33, 0x41D0FB9E, 0x1CE5D790, 0x861D6BA, + 0x50DCFDFC, 0x549D6D1, 0x34A1FBF9, 0x51002476, 0x51102FC0, 0x2118FCEE, 0x1185D55A, 0x2EE4FD6C, + 0x5121EE4B, 0x29F5D710, 0x1FD0FED9, 0xE65D7C8, 0x242824D4, 0x504CFB5B, 0x175D441, 0x512C2F41, + 0x513C3385, 0x5148FC65, 0x4F9D657, 0x1185D62A, 0x23D1D740, 0x516507AD, 0x116824CD, 0x5174337C, + 0x51902F77, 0x51A0323D, 0x51B8FF05, 0x5120FEDE, 0x1185D58E, 0xEC1D7A5, 0x51C0317C, 0x3000FBDD, + 0x109F13E, 0x51D0FFC2, 0xBDDD69E, 0x2868313D, 0x655D6E9, 0x51E033ED, 0x75DD61D, 0x51F9E049, + 0x5204A770, 0x2E4FCD1, 0x521433DA, 0x522032A9, 0x1845D6DE, 0x5230215A, 0x5B5D70D, 0x7EDD597, + 0x3E5CFE60, 0x14A1D6C0, 0x219D42F, 0x52480385, 0x1301D6A1, 0x5260FCA1, 0x5275F124, 0x1724FBD6, + 0x52843279, 0x1C802086, 0x52A0FF70, 0x52B0FCAA, 0x52C42FB0, 0x52D4FD02, 0x75DD581, 0x52E8316C, + 0x52F82F7F, 0x1E824DA, 0xB69D774, 0x4B02098, 0x5308FDAA, 0x53242F96, 0x533433F6, 0x29D0FCFF, + 0x2889F137, 0x6CDD786, 0xB901D35, 0x534CFC70, 0x8D4328A, 0x4D38FCDC, 0x53602F34, 0xD5C2080, + 0x53703314, 0x538C32D0, 0x539CFC26, 0x53B03339, 0xE21D433, 0x25F1D6DA, 0x60C314C, 0x4320FEB0, + 0x92DD42A, 0x1039D732, 0x53D8332C, 0x47D0FCAC, 0x540CFFB8, 0x34A1D7D7, 0x541D0794, 0x54283397, + 0x20C8FB84, 0x2ADEE67, 0x1E1D4B6, 0x306DEE00, 0x543432C9, 0x34A8FCDD, 0x544C2175, 0x12F9D402, + 0x1329D6B2, 0x5458247C, 0x54682158, 0x54802F1A, 0x5490FB8A, 0x1D11D697, 0x549C335E, 0x54B03297, + 0x575D63F, 0x54C033C6, 0x1235D707, 0x2DC2C7C, 0x54DCFDC1, 0x54F83186, 0x5508AB5F, 0x5518FCB0, + 0x552DF214, 0x1169D61F, 0x553CFDA8, 0x55582F67, 0x5568FB00, 0x196CFE62, 0x5574FFB6, 0x55842F9A, + 0x2FADEEB9, 0x55941D59, 0x255DEE88, 0x55D50E, 0x309D6A0, 0x1845D705, 0x115CFB77, 0x1C25D775, + 0xD5DD7F6, 0x55A4FCB7, 0x55B8FBF3, 0x55D432CE, 0x905D570, 0x1215EE14, 0x55E1F236, 0x55F02F8C, + 0x55D542, 0x299D777, 0x3CE8FDC4, 0x39BCFF80, 0x5600325A, 0x5010FF92, 0x239F13C, 0x560C1FCE, + 0x56242F0B, 0x5424C0, 0x5634FD89, 0x56502049, 0x565CFBF7, 0x1301D499, 0x92DD4FA, 0x3B1F202, + 0x2429D5BE, 0x775D560, 0x5678318E, 0x56882F27, 0x56982472, 0x92CFF51, 0x56A43354, 0x219D66B, + 0x86C24CE, 0x775D5FC, 0x75C24CB, 0xE65D780, 0x56E5F119, 0x6CDD712, 0x5B403F2, 0x56F42F21, + 0x1301D59D, 0x57042F18, 0x571433CC, 0x5720321C, 0x7EDD5FF, 0x3D83134, 0x574432D5, 0x57543286, + 0x17DD668, 0xB69D750, 0x29F5D6D6, 0x109D546, 0x57642FD1, 0x431D65C, 0xE34FFB2, 0x86DD480, + 0x549D77F, 0x5518FC1F, 0x2304FF95, 0x4218FD27, 0x8C9EE1B, 0xF51D4B8, 0x2BF1D73E, 0x1D11D593, + 0x5774FDA6, 0x579024AA, 0x57A0FF62, 0x86DD5B8, 0x239D614, 0x57B0FD58, 0x57CC33FC, 0x1D11D427, + 0x57E433FB, 0x57FC02B5, 0x5808FFED, 0x109D5E2, 0x1845D752, 0x475FBF1, 0x109D40E, 0x27F8FCE9, + 0x5819F239, 0x5828FF07, 0x5831E040, 0x1394FBA7, 0x9C9D5B1, 0x2DDD423, 0x583C3216, 0xEB0FFAB, + 0x1730FECB, 0x5861E067, 0xBDDD4CA, 0x586C1DAD, 0x2049D730, 0x587907BA, 0x16B8FF2C, 0x588D0785, + 0x1845D7B3, 0x789D4D0, 0x589833A5, 0x1C43139, 0x58A4FB14, 0x1D11D5C7, 0x1A8FB8F, 0x4031E039, + 0x58B82F83, 0x58C82137, 0xC5EEAD, 0x58D42FB8, 0x110CFEC7, 0xC5EE8D, 0x45A4FBFF, 0x58E42D6F, + 0x58F42166, 0x3AA01D4C, 0x1430FE8A, 0x5904FC76, 0x1684FEE4, 0x5918246E, 0x5924FC64, 0x5940FDF0, + 0x6CDD6D8, 0x595C3221, 0x5974FB16, 0x5988FC8B, 0x599D0798, 0x59A907A6, 0x45ECFC9F, 0x59B42162, + 0x3DA0FC47, 0x2D18FB66, 0xB8800A0, 0x1731EEAF, 0x59C41D9E, 0x59D0FC7C, 0x59E42F03, 0x255D659, + 0x59F432B7, 0x5A01078F, 0x5A0C1DB1, 0x1185D48A, 0x5A190791, 0x5A24FD7D, 0x337DD742, 0x5121EE0B, + 0x5A40FDA0, 0x5A5CFE72, 0x2FADEE19, 0x5A6CFBAC, 0x5A783335, 0x5AA002DC, 0xA58FFBB, 0x1C41D744, + 0x1E1D51E, 0x5AB1F102, 0x5ABC326D, 0x5ACC3365, 0x5AE42105, 0xD1DD617, 0xB74FE9A, 0x46CCFC80, + 0x420203E, 0x77DEE93, 0x5AF4037A, 0x565CFBF8, 0xEE9EE49, 0xF51D554, 0x5B042480, 0x5B18332A, + 0xA25D61A, 0xB81D679, 0xB883000, 0x5B402F30, 0x239D440, 0x5B51F129, 0x2740FC8F, 0x1E0FF41, + 0x5B60FFEC, 0x47383264, 0x5B70FB50, 0x5B7CFDBE, 0x5B981FC0, 0x5BA8328B, 0x27424DF, 0x25E4FB65, + 0x5BB82FB6, 0x5BC833C4, 0x36EDD7AA, 0x1BB9EE21, 0x5BD42FCB, 0x7F4FEEB, 0x1990FB75, 0xD5DD7E2, + 0x4DD5C5, 0x2D5D444, 0x5BE4248A, 0x5BF0338D, 0xB54FC28, 0x45ECFC08, 0x5C002491, 0x2618FC72, + 0xFADD469, 0x5C103235, 0xFADD5A1, 0x5C29F234, 0x5C38FD64, 0x3670FFA3, 0x4F9D68B, 0x5C54319A, + 0x2429D626, 0xE65D6D2, 0x5C643244, 0x5C743350, 0x5C9C2FAC, 0x3114FBF0, 0x5CACFB20, 0x34F4FC02, + 0x1E9D5C4, 0xFADD539, 0x5CB82FCA, 0x5CC8FEFA, 0xBDDD566, 0x5CE5F14E, 0x22B5EEB0, 0x5CF5E06A, + 0x5D0033CD, 0xA05D439, 0x5D0CFF40, 0x5D15D6A4, 0x239D67C, 0x2221D7D0, 0x16B9D5AB, 0x5D20320D, + 0x25E4FB64, 0x5D38FDB9, 0x5D55F21F, 0x5D643303, 0x5120FEDF, 0x3F1C0384, 0x5D8C2F33, 0x2C4C32A6, + 0x1358FF1C, 0x5D9CFE7E, 0x13D0FD77, 0x5DAC33A8, 0x5DC8FF96, 0x5DD8FFE4, 0x7D1D4EF, 0x3C02466, + 0x5DE4FDAC, 0x5E0032E2, 0x5E102F5B, 0x5E20222D, 0x5E482F65, 0x5E58309C, 0x5E6CFCE8, 0x109D616, + 0x5E803345, 0x2382133, 0x130002E3, 0x16B9D613, 0x5EA907A7, 0x5EBC32B3, 0x5EC8FDAF, 0x1A28FD03, + 0x7EC1D63, 0x5EE5F101, 0x2182174, 0x47CFB6B, 0x5EF03294, 0x7D1D523, 0x4C2097, 0x5F0033DD, + 0x12B8FE96, 0x5F0CFB82, 0x5F18FB87, 0x5F24322C, 0x789D5D4, 0x7AC1D42, 0x5F3DE033, 0x4CB5D6E8, + 0x37D5D76F, 0xE6403F1, 0x7EDD633, 0x3FD0FB7B, 0x7D1D5BF, 0x1009D64F, 0x5F482FC8, 0x77DEE13, + 0x12F8A7F2, 0x5F583390, 0xF50217D, 0x5F64FF6D, 0xE21D56B, 0x5F74FD66, 0x5F902025, 0x185C32E8, + 0x5F9C3392, 0x123400B5, 0x8F4FF9B, 0x5FAC3373, 0x5FB802B1, 0x5FC4FC8A, 0x5FD8FC30, 0x17C209B, + 0x55743146, 0x5FED07AB, 0x17EDEEA3, 0x5FF82F11, 0x219D497, 0x6009F105, 0x60142F42, 0x6025D6AC, + 0x1169D51B, 0x6030FB28, 0x17DD530, 0x3130FE16, 0x1C5C2084, 0x199CFC29, 0x25F1D7C2, 0x603C2494, + 0x41D1EE1D, 0x604C333E, 0x60803231, 0x299D73D, 0x45ECFC6C, 0x60982101, 0x904FF25, 0x60A82FA9, + 0x1C5C2463, 0x1235D7B5, 0xA05D571, 0x22B4FED2, 0x60B833A7, 0x255CFEC4, 0x4320FEAF, 0x60D02F5A, + 0x420FE4A, 0xB91D5DC, 0x255CFEC3, 0x403CFE5D, 0x4C0CFF64, 0x4DD661, 0x5902F00, 0x60E032C4, + 0x5ACFE13, 0x60F42136, 0x4DB4FB6E, 0x6100A69C, 0x610DF221, 0x1EA0FE6B, 0x611CFF8D, 0x9C9F12C, + 0x612C3170, 0x613CFD74, 0x4458FCFD, 0x241D4B0, 0x12F8212D, 0x1731EE4F, 0x3C02087, 0x61582498, + 0x3C88FBEF, 0x6168FF9D, 0x24B8FB60, 0x5ABC314E, 0x1215EE54, 0x61782FB7, 0x61883305, 0x61B033A1, + 0xF51D520, 0x61BC33F7, 0x61D5E053, 0x1D11D45B, 0x12F9F132, 0x61E0FF02, 0xBA9D58D, 0x61E833F9, + 0x4DD55D, 0x1D102099, 0x62002F0E, 0x7ADD416, 0x1301D4CD, 0x6210247D, 0x62242FB5, 0x62342FC7, + 0x6244FF7E, 0x1684FEE2, 0x92DD596, 0x4C802B8, 0x7ADD51A, 0x62543226, 0x75DD47D, 0x626CFD5D, + 0x2888210B, 0x628824B3, 0x1201D66, 0x775D45C, 0x8C9EE5B, 0x6298333D, 0x2618FCE3, 0x62D82F66, + 0x16B9D67B, 0x29F5D7BE, 0x1081D3C, 0x62E82F75, 0x7D1D557, 0x62F83213, 0x631C337E, 0xEE9EE89, + 0x17DD598, 0x16B9D473, 0x15F0315C, 0x6338FB27, 0x1394FBA8, 0x422CFC56, 0x1214FEB8, 0x63442FB2, + 0x1570FBD7, 0x23824C2, 0xD5DFBF0, 0x635433AA, 0x90CFC07, 0x4F9D51F, 0x636433AC, 0x905D404, + 0x6374FDBF, 0x18E0FEB1, 0x6391F126, 0x63A0FDB0, 0x1169D5EB, 0x4DC0208E, 0x475D7D9, 0x63BC2FC2, + 0xB20315E, 0x63CC2F6D, 0x4D7C3138, 0x63DC02B4, 0x63E8FD57, 0x640433F2, 0x641C0132, 0x6428317D, + 0x1F14FFAC, 0x7C5D75E, 0x6025D720, 0x1C5DD7E6, 0x64382156, 0x645107A1, 0x1169D583, 0x6464249E, + 0x86DD654, 0x5121EE2B, 0xB9024BE, 0x935D758, 0x6474FDF5, 0x64983199, 0x241D448, 0x64A832BF, + 0x4301D4D, 0x64B43232, 0x64CC33B4, 0x64D8FDA4, 0x1100FB58, 0xEE8FEF3, 0x33B8FD3A, 0x1FF83195, + 0x64F4A69D, 0x65001DA7, 0x65101DAB, 0x5A0FB88, 0x1169D417, 0x651C327A, 0xBA9D629, 0x35C3155, + 0x65383284, 0x6548330C, 0xB91D644, 0x100824C9, 0x53DD6D5, 0x657C3340, 0x7F4FEEC, 0x65BC2F7B, + 0x146C3164, 0xD8C2088, 0x65CC33B0, 0x65D8309B, 0x65EC2F36, 0x65FC3158, 0x660C2F12, 0x1410FCB5, + 0x661C33B6, 0x1CE5D71C, 0xB81F139, 0x662DE046, 0xBDDD4FE, 0x66382F0D, 0x664824A9, 0x3A50FE48, + 0x1C88FEAB, 0x66583325, 0x66803252, 0x111832E1, 0x275D5FD, 0x1301D431, 0x18F8FFCB, 0x668CFFEA, + 0x1329D6EC, 0x4F9D5EF, 0x40FB97, 0x669C3312, 0x5CC8FEF9, 0x2A4FF0D, 0x66D03201, 0x5ACFE55, + 0x935D792, 0x2118FC4E, 0x5741D30, 0x4DD62D, 0x66E9E055, 0x66F42F1B, 0x86DD418, 0x670432FF, + 0x672107B4, 0x672DE04E, 0x16B81D38, 0x525D5DA, 0xD1C24C5, 0x775D490, 0x67383380, 0x12003D0, + 0x6744217B, 0x675507B6, 0x8C8FED0, 0xD8DFBF8, 0x755FBF3, 0x6760FC5E, 0x1D11D4C3, 0x6778FCF3, + 0x4C603153, 0x6794FD5A, 0x961D6DF, 0x5020FF8B, 0xBDC1D58, 0x1648FDBB, 0x67B032FC, 0xDEE57, + 0xB75EE96, 0x655D723, 0x47B9EE7E, 0x3078FCC3, 0x17EDEE83, 0xE21D467, 0xA2C32FE, 0x2179E061, + 0x5A6CFBAB, 0x4C8FF59, 0x401CFD12, 0x2888210C, 0x24B8FB61, 0x2D18FB67, 0x1D1024DD, 0x12F9D60A, + 0x67C1E048, 0x67CC316B, 0x67DDF227, 0x67ECFB04, 0x67FCFBE0, 0x6808FE77, 0x3A74FFA6, 0xD1D799, + 0x681DF100, 0x682824AD, 0xA25D64E, 0x337DD7B6, 0x503C32D4, 0x6839078B, 0x68450799, 0x34A0FF19, + 0x6850FF9C, 0x238FF2D, 0x475D7ED, 0x4DC0FE5A, 0x1589D763, 0x22B5EE10, 0x686033DF, 0x1039D7A6, + 0x26C0FEF5, 0x687907A8, 0x6884FFA5, 0x789D400, 0x44DC315A, 0xB81D471, 0x1250FF93, 0xB81D4D9, + 0x6894320F, 0x68B8338E, 0x57424B9, 0x68C42171, 0x483432F3, 0x68D1078D, 0x255CFEC1, 0x68E0FC94, + 0x8D42F49, 0x2889D5DB, 0x2D4A7F4, 0x24B8FB5F, 0x68F42470, 0x69003374, 0x6910249A, 0x69203259, + 0x37D5D7A9, 0x692C3360, 0x7EDD42B, 0x69402FA0, 0x4EC4FF0E, 0x28E4FC1C, 0x1DB5D6AB, 0x173C3038, + 0x130832F6, 0x22202461, 0x2618FC0E, 0x69503179, 0x69603386, 0x696C2FA4, 0x2889D60F, 0x3C9F22E, + 0x1E000AA, 0x22B4FED4, 0x697C32C3, 0xD5C24EA, 0x255D589, 0x69902F84, 0x438FC10, 0x69A02F9C, + 0x69B0FCCD, 0x69C42103, 0xA58314B, 0x108FF2F, 0x22B4FED3, 0x11BCFE35, 0x35D5F217, 0x69D43309, + 0x2ADEEA7, 0x4EC42024, 0x69FCFC6B, 0x8B4FCBE, 0xFADD4D1, 0x55D67A, 0x1FD1EE2A, 0x2889D5A7, + 0x14A1D7A8, 0xDEE37, 0x109D476, 0x337DD6CE, 0x6A102F80, 0x6A2032C0, 0x1D11D663, 0x6A35F22F, + 0x9A5D69D, 0x6A45F243, 0x539CFCB8, 0xB54FCB9, 0xF51D624, 0x5F3DE054, 0x1F8C1FBD, 0x6A6C2FAE, + 0x6A7C336C, 0x1009D61B, 0x6A942FBD, 0x575D403, 0x2C0C313F, 0x6AA5078C, 0x2ADEE47, 0x2E24315B, + 0xD8C2078, 0x16B9D647, 0x5DC832F5, 0x6AB02F48, 0x3FD0FB7C, 0x219D4CB, 0x6AC03321, 0x5FD8FCC1, + 0x6B002047, 0x239D4DC, 0x9A424E3, 0x6B0D07B5, 0xFC1D67, 0x86DD44C, 0x3DE4FC05, 0x790FD51, + 0x1742115, 0xB902160, 0x6E4FD01, 0x1704FD29, 0x1499D7D3, 0x1054FE33, 0x4C824E8, 0x6B182FB4, + 0x845EEB1, 0x2220FF12, 0x7CFCE0, 0x6B283381, 0x6B34FD05, 0x6B48247A, 0x6B582FB1, 0x6B682F2B, + 0x6B781DAF, 0x2429D58A, 0x16B9F13B, 0x6B84FD15, 0x6B982F09, 0x6BA81E9A, 0xA04A7F3, 0x525D60E, + 0x3BBCFDBC, 0x6BB8FD17, 0x6BCC3172, 0x1E5CFCB4, 0x38683131, 0x6BDC013F, 0x1430FE8B, 0x6BECFDF2, + 0xB69D700, 0x4DB4FB6F, 0x845EE51, 0x4B1D45A, 0x6C1032BB, 0x2B64FC06, 0x525D50A, 0x6C1CFC43, + 0x2DDD65F, 0x2DDD527, 0x510FC3C, 0x6C30FD54, 0x6C4D0784, 0x6C58FD9D, 0x6C742F35, 0x175D4DD, + 0x6C850797, 0x6C9032B9, 0x373CFE19, 0x13342F47, 0x6C9C32A0, 0x6CACFC49, 0x2381D39, 0x6CC0FBAF, + 0x3DB4FD38, 0x6CCCFF7A, 0x6CDC3271, 0x6CF9E069, 0x6D04FE69, 0x96003D5, 0x6D0CFD8D, 0x4A9CFCEB, + 0x6D28FC77, 0x1990FB73, 0x6D3C1DAC, 0x3DB4FD2E, 0x26B8FE66, 0x1C5DD7FA, 0x6D4824A0, 0x4C9D56A, + 0x3C1FBF7, 0x6D58FC11, 0x262DF22A, 0x6D6C33D7, 0x6D782F20, 0x17C5D6A9, 0x6D883238, 0x6DA0248B, + 0x2DC24D9, 0x1009D54B, 0x50D1E062, 0x961D6D7, 0x2D5D514, 0x6DACFCD9, 0x24282091, 0x60143246, + 0x1E9D48C, 0x55D612, 0x4B1D662, 0x1E11D72C, 0x6DC0FCF2, 0x6DDC3384, 0x6DE8FC4F, 0x6DFC33BA, + 0x1C80FF16, 0x1A8FB90, 0xEE8FEF1, 0xF2DF22C, 0x6E080F0C, 0x1C5DD7DC, 0x775D428, 0x20BDD7AD, + 0x75DD651, 0x6E1824A5, 0x6E28336B, 0x6E4000BC, 0xE65D754, 0x1724FBD3, 0x6E58FB26, 0x6E64FC5C, + 0x4DC0FE36, 0x6E79F104, 0x844FEB9, 0x6E84FDA5, 0xE65D7BA, 0xA05F135, 0x6EA03223, 0x2889D43B, + 0xFADD671, 0x6EB9079A, 0x6EC433B2, 0x1B90FEED, 0x6ED4248D, 0x6EE033C8, 0x239D510, 0x18E1EE6E, + 0x38683260, 0x6EEC3316, 0x6F382FA6, 0x961D7BF, 0x6F482F43, 0x6F5832EB, 0xFADD5D5, 0x2D5D4E0, + 0x3BACFF86, 0x5B5D6D3, 0x6C1CFC86, 0x309D604, 0x6F68338C, 0x173C3289, 0xE21D59F, 0x52424BC, + 0x552C3193, 0x549D755, 0x7ADF146, 0x6F78FE94, 0x2520FCB6, 0x6F84FCA8, 0x6F98249B, 0x6FA83227, + 0x6FC0FDAE, 0x861D768, 0x6FDC33D3, 0x6FE8FE10, 0x1589D729, 0x6FF02478, 0x70002F6F, 0x4709E068, + 0xE20FF5A, 0x7010249F, 0x70202F3D, 0x703033BB, 0x655D797, 0x241D5E8, 0x16F0FBA5, 0x703CFD1A, + 0x12B9EE75, 0x7D024D5, 0x7050FCE6, 0x7064338A, 0x2221D7F8, 0x7070FD62, 0x941D743, 0x1684FEE1, + 0x2E08FBF9, 0x1C802465, 0x431D628, 0x2429D4EE, 0x708DF215, 0xBDDD496, 0x709CFC88, 0x15C8FFBA, + 0x18E0FEB4, 0x70B02153, 0x70C8FD50, 0x2D5D64C, 0x70E43375, 0x3C5432F0, 0x70F0246A, 0x28DEE62, + 0x70FCFD8C, 0x71183362, 0x713032BC, 0x713DF223, 0x309D500, 0x6CDD74C, 0x714CFC5F, 0x7165F14B, + 0xB81D611, 0x78824B6, 0x71703214, 0x7194FFAE, 0x1C81D7F2, 0x71A5F103, 0x121D6FD, 0x4A9CFC3B, + 0x4824FF8A, 0x4D4DD769, 0xB75EE16, 0x71B024A7, 0x39CCFC85, 0xCE8213F, 0x8C9EE3B, 0x71C0FC4A, + 0x37D5D6C1, 0x71D4248E, 0x71E03328, 0x6FE8FF0C, 0x71FCFC79, 0x157CFED8, 0x611C32EC, 0x7210FF3E, + 0x72182F93, 0x46C2124, 0x921D76D, 0x4B1D48E, 0xA05D5A5, 0x7F5EE64, 0xFDD738, 0x7228FDA1, + 0x3828FE5C, 0x22B5EE90, 0x4CB5D6AE, 0x72442FC6, 0x1908FC12, 0x6F84FC16, 0xA2424C8, 0x3E40FB93, + 0x5E6CFD31, 0x7254FF3B, 0x725DE06C, 0x726C3168, 0x727C339A, 0xE65D78E, 0x5BA82F55, 0x1E82096, + 0x7288322B, 0x1E11D7A0, 0x72A107B3, 0xEC1D76B, 0x72ACFE7B, 0x72C02FCF, 0x72D0FE42, 0x431D454, + 0x72E03243, 0x72F83334, 0x3A4032E7, 0x73442100, 0x3E40FB95, 0x2429D5F2, 0x36EDD6FC, 0x7355F11F, + 0x7364FC09, 0x6DE8FC8E, 0x552C3281, 0x41D1EE5D, 0x7379F108, 0x7385EE7C, 0x941D7B7, 0x845EE11, + 0x23D1D77A, 0x218FF56, 0x7390FC6A, 0x157DEE52, 0x73A42481, 0x73B8FCCF, 0x73CC24A2, 0x73DC320C, + 0x1499D7FB, 0x121D771, 0x73F42F94, 0x3C02077, 0x7405F118, 0x74140149, 0x75DD5B5, 0x46DD655, + 0x7424FD96, 0x4C9D432, 0x110CFEC5, 0x7440336D, 0xD1D6EB, 0xB30FC7B, 0x74582FC1, 0x16B9D5DF, + 0x74681D55, 0xCDDD7C1, 0x7478216A, 0x74842F64, 0x74942486, 0x53DD783, 0x74A8FD6E, 0x74C43202, + 0x74DC337F, 0x1600FC45, 0x1E9D5F8, 0x1215EE94, 0x75CFF36, 0x75102189, 0x7528323F, 0x75403347, + 0x2DDD693, 0xC4FEE8, 0x6F38328E, 0x67FCFBE1, 0x75802F3E, 0x7591E051, 0x759CFD2C, 0x75B0FC83, + 0x75C42F2F, 0x1C5DD7F0, 0x75D43039, 0x75E432B1, 0x1185D65E, 0x29803D1, 0x308FF57, 0xB90FF29, + 0x75F032C5, 0x7604248F, 0x7610FD78, 0x762CFC5B, 0x9A5D4C9, 0x121D7AB, 0x9A5D5CD, 0x3928FC4C, + 0x76402F2A, 0x1054FF3F, 0x76502F22, 0x7660FD32, 0x1FD1EE0A, 0x76742483, 0x76881DB2, 0x7695E059, + 0x4DC0FF09, 0x92DD632, 0x1185D5F6, 0x52481FEE, 0x76A03257, 0x45A4FBFC, 0x175D511, 0x4F90FD0F, + 0x4F824D1, 0x921D7A7, 0x98FDB4, 0x12F9D672, 0x34A02089, 0x13EC3262, 0x1185D4BE, 0x76AC2F9E, + 0x11BC207D, 0x157DEE72, 0x76BCFF0F, 0x76C43230, 0x76DC33E9, 0x54803D6, 0x76F43358, 0x474FF11, + 0x77081DBA, 0x77143352, 0x77302FA5, 0x921D733, 0x9A41D57, 0x2274FD37, 0x420FE4C, 0x7740336F, + 0x7758FD73, 0x34A02468, 0x9C8FF32, 0x77742FBF, 0x7784FF6B, 0x3398FBDE, 0x3130FF1F, 0x1589D6EF, + 0xBA82095, 0xFFDD79C, 0x75B0FC3D, 0x26ECFC98, 0x77942F59, 0x46DF149, 0x1E9D660, 0x77A43205, + 0x2FADEE39, 0x2DDD5F7, 0x77BC0EB3, 0x77D8FC95, 0x2274FD2D, 0x75DD449, 0x703CFCFE, 0x5C38FD65, + 0x77EC332E, 0x78390781, 0x78443196, 0x17DD5CC, 0x4B024DC, 0x7854FC92, 0x1685EE0C, 0x3C1D7F3, + 0x7869079F, 0x7194313E, 0x787CFDA3, 0x7898FF6F, 0xA05D5D9, 0x78A8FF1E, 0xECCFD68, 0x78B0FC0A, + 0x10F1D74F, 0x75DD54D, 0x78C5F247, 0x78EC3308, 0x20BDD773, 0x7921F21E, 0xB882002, 0x1301D639, + 0xFFDD6B4, 0x510FC82, 0x52D4FD1E, 0xEE8FEF4, 0x79303180, 0xBA9D489, 0x7941F213, 0xFADD505, + 0x795DD7CB, 0x79683181, 0x7978FC6D, 0x798C32CB, 0xA05D53D, 0x789D63C, 0x79A4FE70, 0x13A0FD80, + 0x9C9F141, 0x28CFEA0, 0x1730FECA, 0xD8DD7D6, 0x1845D779, 0x1B91EEA5, 0x11BCFE59, 0x55D40A, + 0x79B43215, 0x46C2128, 0x1C41D70A, 0xA25D57E, 0x79D802DA, 0x79E83212, 0x7A0CFC67, 0x4DD459, + 0x8C9EE9B, 0x7A282107, 0xFAC1D2E, 0x23D1D7B4, 0x7A35E04F, 0x552C2F06, 0x905D508, 0x1D11D5FB, + 0x17424C3, 0x7A402F6E, 0x7A50246F, 0x759CFD10, 0x19DCFC44, 0x6D04FF04, 0x1185D5C2, 0x7A5CFF69, + 0x7A6C3209, 0x7A84FC2F, 0x7A9810FC, 0x2541D48, 0x7AA8FF67, 0xFD9E05B, 0x4B1D592, 0x6025D75A, + 0xB882006, 0x13ECFFA7, 0x7AB833D4, 0xD34FD71, 0x7AC43203, 0x7ADCFDF4, 0x19BC326C, 0x789D670, + 0x7B0030FF, 0x7B1C2F0A, 0x4DB4FB71, 0x12F9D5A2, 0x66E9E034, 0x28DEE02, 0x7B2C2176, 0x7B3C2177, + 0x1329D726, 0x1FD0FEDA, 0x4C9D66E, 0xF81D72A, 0x4698FC41, 0x7B503387, 0x46DD585, 0x11842139, + 0xB81D43D, 0xCE9D72B, 0x7B5DF220, 0x7B6DF225, 0x4D8CFD6F, 0x1394FBA9, 0xFAC212C, 0x45A4FBFE, + 0x6BB8FCFB, 0x18E1EE2E, 0x9601D69, 0x32A0FC96, 0x7B7C2F23, 0x1215EE74, 0x241F144, 0x7B8CFD23, + 0x7BA033D2, 0x18E0FEB3, 0x7BB10783, 0xE65D70C, 0x7BBCFF5C, 0x57A0FE41, 0x219D463, 0x6CC1D6A, + 0x2888210D, 0x7BC4FBDC, 0x7BD03341, 0x7BF907A3, 0x7C05F123, 0x7C143323, 0x3BD8FBEB, 0x7D1D627, + 0x7254FE47, 0x275D429, 0x7C3CFF9F, 0x1EC4FCBC, 0x7C4D079B, 0x299D78B, 0x7C5833C3, 0x7C65F21D, + 0xEC1D6BD, 0x7C7432C7, 0x1BC4FF5B, 0x306CFE8D, 0x25E4FB63, 0x77D8FC59, 0x7C882482, 0x7C9CFE43, + 0x905D53C, 0x7CADF16C, 0xB75EE36, 0x7CB8336E, 0x4B1CFCC4, 0x92DD5CA, 0x7CD02F8F, 0x1185D456, + 0xFC213D, 0x7CE0A7F8, 0x7D0FF46, 0x7CEC339D, 0x86003F9, 0x14A1D6FA, 0x431D420, 0x9A5D461, + 0x7CF9F14A, 0x12B8FE95, 0x7D043372, 0x36EDD736, 0x7D102F5E, 0x7D2024A4, 0x7D31F128, 0xB91D43C, + 0x775D5C8, 0x7D403364, 0xE343142, 0xBA9D4F1, 0x7D58FF68, 0x789D49C, 0x540C3148, 0x5F90FE30, + 0x7D6832C1, 0xBDDD42E, 0x7D7DF244, 0x22A9D6C8, 0x57B0FD59, 0x4DD48D, 0x7DA5F106, 0x7DB033AF, + 0x9C81D3F, 0x7DD4215D, 0xCF4FBA3, 0x4B1D426, 0x4CB5D722, 0x7DEDF212, 0x7DFC1DB4, 0x7E082F76, + 0x51B8FE6A, 0x7E19E03D, 0x110DEE7A, 0x3C39E047, 0x7E2402DB, 0x9A5D601, 0x784432A4, 0x7E342F28, + 0x7E44FDA2, 0x17ECFEA9, 0x7E602F78, 0x7E7000A8, 0x275D52D, 0x525D572, 0x7385EE1C, 0xFAC24B7, + 0x716433B9, 0x549D7B9, 0x4D4DD6F5, 0x3D8CFC55, 0x1499D7E7, 0xE65D746, 0x4B82F54, 0xC50FE3A, + 0x4810FCEF, 0x7E8033B8, 0x1730FEC9, 0x7E8CAB5E, 0x5518FCE7, 0x7E98329D, 0x21C8FD18, 0xD5DD7D8, + 0x7EA82F5D, 0x21B832D8, 0x7EB8217A, 0x525D53E, 0x7EC42A0C, 0x7EF83329, 0x7F200F79, 0x7F49F12E, + 0x575D53B, 0xF51D484, 0x6C58FD9C, 0x3DB4FD0A, 0x17DD69C, 0x3D40FC21, 0x7F542490, 0x68843135, + 0x1169D653, 0x9C824C7, 0x420FE4B, 0x2DDD457, 0x7F6024B0, 0x575D437, 0x7F71F112, 0x1AC0FB9D, + 0x7F802FD3, 0x72D0FF63, 0x5F18FB86, 0x1E7032E3, 0x3B032DA, 0x22B4FED1, 0x6CC1D61, 0x7F90FFD7, + 0x2E08FC03, 0x1009D4AF, 0x7FA02F82, 0x5ABCFFBE, 0x7FB02048, 0x7FBC32CD, 0x1731EE8F, 0x7FCCFC52, + 0x4F9D483, 0x7FE1E03E, 0xD5DD7EC, 0x196CFB29, 0x7FEC3176, 0x239D578, 0x110CFEC8, 0x7FFC2167, + 0x80102FC5, 0x7591E030, 0x5260FC0B, 0x80203165, 0x2FACFEBF, 0x8031F121, 0x2E08FC68, 0x16B8216C, + 0x431D5C0, 0x51D0314F, 0x80401D4A, 0x5120FEDD, 0x73B8FC46, 0x1BE8FCE2, 0x1685EEAC, 0x1845D78C, + 0x804C335A, 0x56243287, 0x806033BE, 0x394CFB8D, 0x806C2F8B, 0x4B01D50, 0x4D4DD6BB, 0x46DD5B9, + 0x807C303A, 0x7070FD63, 0x808C326E, 0x80A8FD55, 0x20BDD6FF, 0x80C4325C, 0x275D491, 0xA25D4AE, + 0x431D5F4, 0x5E00FF83, 0x80D0318C, 0x34A1D7FF, 0x7FCCFCD8, 0x5F0CFB83, 0xB882003, 0x6FE8FE50, + 0x575D5A3, 0x431D58C, 0x1CE5D756, 0x9601D60, 0x184403F0, 0xCE9D79F, 0x204803D2, 0x29F5D784, + 0x80E024B2, 0x961D74B, 0x1498FF15, 0x80F02151, 0x81083224, 0x40FB96, 0x1301D501, 0x1908FCE5, + 0x8121078E, 0x565CFBF6, 0x2741D56, 0x575D4D3, 0x812C3324, 0x816032C6, 0x817432CC, 0x12F824B8, + 0x6F78FE93, 0x81801DA4, 0x755D7D1, 0x78B0FC6F, 0x5744FF76, 0x92DD5FE, 0x818C3274, 0x81A83188, + 0x6B84FCF9, 0x36F9E05C, 0x81B82F3B, 0x81C83239, 0x2429D65A, 0x5121EE8B, 0x55E03292, 0x4560FC2E, + 0x5A24FD7C, 0x239D648, 0x2D5D410, 0x12F9D56E, 0x44D4FE5F, 0x6CCC32D9, 0x4B1D5C6, 0x81E024AE, + 0xCDDD74D, 0x4CB5D796, 0x81F02F52, 0x7364FC6E, 0x82003219, 0x239D544, 0x2FADEE79, 0x8224FDF7, + 0xBDDD59A, 0x34F4FCDF, 0x824824B5, 0x4908FC1D, 0xC34FD86, 0x1850FBE7, 0x18E1EE8E, 0x1EF43197, + 0x861D6F4, 0x82582F7C, 0x299D6DD, 0x10F1D7C3, 0xB81D50D, 0x75DF145, 0x82682157, 0x655D72D, + 0x828032AA, 0x789D468, 0x8290FD94, 0x1169D687, 0x82AC318B, 0x82BC33C9, 0x82C8246B, 0x6025D794, + 0x5F74FDC5, 0x82D4327E, 0x1D10207F, 0xD1DD40F, 0x82F107A0, 0x82FC248C, 0x4DD4C1, 0x110DEE1A, + 0x23B4FDB8, 0x1301D465, 0x830833C0, 0x7E19E05D, 0x831907AC, 0x789D538, 0xD8CFF18, 0xD1D725, + 0x4BC0FBF5, 0x1CA4FF9A, 0x775D4F8, 0x8324FCE4, 0x83382017, 0x4321EE06, 0x8348334A, 0x1E1D68A, + 0x3D04FCB1, 0x839433BF, 0x1AA0FF77, 0x83A0FD56, 0x7D1D65B, 0x9A5D635, 0x6B34FD21, 0x83BCFE3E, + 0x1685EE2C, 0x7D1D487, 0x1C64FB80, 0x1E95D748, 0x219D69F, 0x61D5E032, 0x83CC24AC, 0x83DC3187, + 0x5A6CFBAA, 0x685032FB, 0x5121EEAB, 0x1054FE34, 0x65403F4, 0x83EC03D4, 0x4218FD2F, 0x451CFC32, + 0x308CFC39, 0x7BC4FBDB, 0x46DD621, 0xA05D509, 0x84002036, 0x1EB9E05F, 0x841C2F62, 0x842C3159, + 0x843C1FED, 0x504CFB5D, 0x5120FEE0, 0x84543336, 0x8324FCA5, 0x1908FC78, 0x1C89EE18, 0x4321EE86, + 0xCF4FBA1, 0x3828FE38, 0xF51D5F0, 0x39CCFCCC, 0x4A9CFC81, 0x849433D0, 0x2049D76A, 0x163DD6AD, + 0x84A033A3, 0x2DDD48B, 0x1009F143, 0x84B02F1C, 0x84C01D5A, 0x84CCFF5E, 0x2429D68E, 0x84D40678, + 0x16B9D43F, 0x475D7CF, 0x84E83315, 0x1C64FB7F, 0x853432B8, 0x4C0CFE11, 0x85402F8D, 0xEE9EE69, + 0x7EDD5CB, 0x8550FD9B, 0x1CE5D6E2, 0x1E95D782, 0x504CFB5A, 0x16B9D577, 0x624432DD, 0x856C20A8, + 0x30A0FC4D, 0x475D7E3, 0x1E1D586, 0x1E1D5BA, 0x36EDD770, 0x7ADD61E, 0x7F4FEE9, 0x85783256, + 0x85843378, 0x6101E065, 0x4B84FD24, 0x4DD695, 0x85942FC4, 0x4C9D5D2, 0xF501D9C, 0x921D6BF, + 0x85A432AE, 0xD8C2467, 0x5C542F04, 0x10081D40, 0x219D603, 0xE21D537, 0x11842148, 0x85B41DBC, + 0x85C02F45, 0x85D0FE76, 0x1A4CFD6B, 0x86DD550, 0x85E0FFEE, 0x85F02F9F, 0x860033A6, 0x3FD0FB7D, + 0x861033B7, 0x861C2F6C, 0x7A84FCC0, 0x52B0FC18, 0xFADD63D, 0x1C81D7D4, 0x1E1D41A, 0x55A4FC25, + 0x2ADEE27, 0x75DD4B1, 0x862C320E, 0x219D567, 0x86DD4B4, 0x865033AD, 0x3E4C32DB, 0x7EDD69B, + 0x8660FFE2, 0x175D5E1, 0x28DEE42, 0x866CFD7B, 0x868832B0, 0x2D5D618, 0x17DD494, 0x662DE064, + 0xE21D5D3, 0x86983242, 0x16D4FE68, 0x2A40FCC9, 0x3400315F, 0x1E9D694, 0x86B0FB03, 0x86C02152, + 0x86DCFE3F, 0xBA9D525, 0x86EC2FCC, 0x6025D6E6, 0x86FC333B, 0x873C2497, 0x874C33A4, 0xD1DD4DF, + 0x875C3306, 0x1169D47F, 0x8784FE3B, 0x34C8FBE8, 0xFFDD6EE, 0x755D7EF, 0x1850FBE6, 0x87941DBD, + 0x34A1D7EB, 0x87A033EF, 0xB69D7AE, 0x7695E038, 0x87B81D4B, 0x1E9D590, 0x1C802076, 0x1C81D7E8, + 0xB6803F5, 0x525D43A, 0x87C43222, 0x87DCFCFA, 0x1344FC2C, 0x65FCFFCD, 0x87F01DB3, 0x538CFF71, + 0x1499D7DD, 0x87FC339B, 0x2D5D680, 0x880C2F4E, 0x59D0FC31, 0x1215EEB4, 0x12D432D7, 0x881C331A, + 0x1589D79D, 0x15ACFCDE, 0x17F8207B, 0x22202082, 0x88683379, 0x1039D6BE, 0x3C443144, 0x8878FFEB, + 0x78A8FE65, 0x175F13D, 0x4338FFC4, 0x4C9D606, 0x241D5B4, 0x405832D3, 0x8888FD99, 0x7ADD582, + 0x1684FEE3, 0x88A4FDB7, 0x88C02178, 0x2ADEE87, 0x88CC317E, 0x2DC02B2, 0x88DD0782, 0x88E83182, + 0x1E95D70E, 0x46DD5ED, 0x88F80676, 0x7660FCEA, 0x890CFE7D, 0x1990FB72, 0x892033BC, 0xD1C1D3E, + 0x893024A6, 0xB882008, 0x109D442, 0x7F903160, 0x15C8314A, 0x55B8FBF2, 0x2E4FC89, 0x89402F1E, + 0x5490FB8B, 0x89510792, 0x895C24AB, 0x5A6CFBAD, 0xBDDD462, 0x2DDD5C3, 0x5903280, 0x7B8CFD07, + 0x299D717, 0x14A1D76E, 0x1009D47B, 0x5B70FB51, 0xA25D516, 0x540C3268, 0x157CFED5, 0x525D676, + 0x25F1D74E, 0x1E1D482, 0x86DD620, 0x896C33E6, 0x275D631, 0x8980FE7F, 0x33A4FBB0, 0x1430FE89, + 0xB801D36, 0x89942F90, 0x6F58FF8C, 0xBA802B0, 0x89A42F5C, 0x1054FE4F, 0x89B43363, 0x23D1D6CC, + 0x89CC1DAE, 0x6CC0FBAE, 0x89D82FAA, 0x87DCFD16, 0x80402094, 0x3F1C00B4, 0x89E82F50, 0x1301D66D, + 0x4C9D6A2, 0x1499D7F1, 0x1039D6F8, 0x89F82F73, 0x842CFFCE, 0x4D4DD7A3, 0x8A0801C7, 0xFDD6FE, + 0x1BB8FE91, +}; + #endif // #ifndef NORMALIZATION_DATA_H diff --git a/stdlib/public/stubs/Unicode/UnicodeNormalization.cpp b/stdlib/public/stubs/Unicode/UnicodeNormalization.cpp index ec2f2a613c1eb..f8c51289050a3 100644 --- a/stdlib/public/stubs/Unicode/UnicodeNormalization.cpp +++ b/stdlib/public/stubs/Unicode/UnicodeNormalization.cpp @@ -28,11 +28,11 @@ SWIFT_RUNTIME_STDLIB_INTERNAL __swift_uint16_t _swift_stdlib_getNormData(__swift_uint32_t scalar) { // Fast Path: ASCII and some latiny scalars are very basic and have no - // normalization properties. + // canonical normalization properties. if (scalar < 0xC0) { return 0; } - + #if !SWIFT_STDLIB_ENABLE_UNICODE_DATA swift::swift_abortDisabledUnicodeSupport(); #else @@ -51,12 +51,44 @@ __swift_uint16_t _swift_stdlib_getNormData(__swift_uint32_t scalar) { #endif } +SWIFT_RUNTIME_STDLIB_INTERNAL +__swift_uint16_t _swift_stdlib_getCompatibilityNormData(__swift_uint32_t scalar) { + // Fast Path: ASCII and C1 controls have no + // compatibility normalization properties. + if (scalar < 0xA0) { + return 0; + } + +#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA + swift::swift_abortDisabledUnicodeSupport(); +#else + auto dataIdx = _swift_stdlib_getScalarBitArrayIdx( + scalar, + _swift_stdlib_normData_compat, + _swift_stdlib_normData_compat_ranks + ); + + // If we don't have an index into the data indices, then this scalar has no + // normalization information. + if (dataIdx == INTPTR_MAX) { + return 0; + } + + auto scalarDataIdx = _swift_stdlib_normData_compat_data_indices[dataIdx]; + return _swift_stdlib_normData_compat_data[scalarDataIdx]; +#endif +} + #if SWIFT_STDLIB_ENABLE_UNICODE_DATA SWIFT_RUNTIME_STDLIB_INTERNAL const __swift_uint8_t * const _swift_stdlib_nfd_decompositions = _swift_stdlib_nfd_decomp; +SWIFT_RUNTIME_STDLIB_INTERNAL +const __swift_uint8_t * const _swift_stdlib_nfkd_decompositions = _swift_stdlib_nfkd_decomp; #else SWIFT_RUNTIME_STDLIB_INTERNAL const __swift_uint8_t * const _swift_stdlib_nfd_decompositions = nullptr; +SWIFT_RUNTIME_STDLIB_INTERNAL +const __swift_uint8_t * const _swift_stdlib_nfkd_decompositions = nullptr; #endif SWIFT_RUNTIME_STDLIB_INTERNAL @@ -74,6 +106,21 @@ __swift_uint32_t _swift_stdlib_getDecompositionEntry(__swift_uint32_t scalar) { #endif } +SWIFT_RUNTIME_STDLIB_INTERNAL +__swift_uint32_t _swift_stdlib_getCompatibilityDecompositionEntry(__swift_uint32_t scalar) { +#if !SWIFT_STDLIB_ENABLE_UNICODE_DATA + swift::swift_abortDisabledUnicodeSupport(); +#else + auto levelCount = NFKD_DECOMP_LEVEL_COUNT; + __swift_intptr_t decompIdx = _swift_stdlib_getMphIdx(scalar, levelCount, + _swift_stdlib_nfkd_decomp_keys, + _swift_stdlib_nfkd_decomp_ranks, + _swift_stdlib_nfkd_decomp_sizes); + + return _swift_stdlib_nfkd_decomp_indices[decompIdx]; +#endif +} + SWIFT_RUNTIME_STDLIB_INTERNAL __swift_uint32_t _swift_stdlib_getComposition(__swift_uint32_t x, __swift_uint32_t y) { diff --git a/utils/gen-unicode-data/Sources/GenNormalization/CCC.swift b/utils/gen-unicode-data/Sources/GenNormalization/CCC.swift index b39972c39f0c8..24f8a0406c96f 100644 --- a/utils/gen-unicode-data/Sources/GenNormalization/CCC.swift +++ b/utils/gen-unicode-data/Sources/GenNormalization/CCC.swift @@ -23,12 +23,18 @@ import GenUtils // scalar in the line with the various properties. For the purposes of CCC data, // we only need the 0 in between the Cc and BN (index 3) which is the raw value // for the CCC. -func getCCCData(from data: String, with dict: inout [UInt32: UInt16]) { +func parseCCCData( + from data: String +) -> [UInt32: NormData] { + + var result: [UInt32: NormData] = [:] + for line in data.split(separator: "\n") { + let components = line.split(separator: ";", omittingEmptySubsequences: false) - let ccc = UInt16(components[3])! - + let ccc = UInt8(components[3])! + // For the most part, CCC 0 is the default case, so we can save much more // space by not keeping this information and making it the fallback case. if ccc == 0 { @@ -38,11 +44,8 @@ func getCCCData(from data: String, with dict: inout [UInt32: UInt16]) { let scalarStr = components[0] let scalar = UInt32(scalarStr, radix: 16)! - var newValue = dict[scalar, default: 0] - - // Store our ccc past the 3rd bit. - newValue |= ccc << 3 - - dict[scalar] = newValue + result[scalar, default: NormData()].ccc = ccc } + + return result } diff --git a/utils/gen-unicode-data/Sources/GenNormalization/Decomp.swift b/utils/gen-unicode-data/Sources/GenNormalization/Decomp.swift index 3dbae3aecd522..9fb9bd1af1c2f 100644 --- a/utils/gen-unicode-data/Sources/GenNormalization/Decomp.swift +++ b/utils/gen-unicode-data/Sources/GenNormalization/Decomp.swift @@ -12,106 +12,229 @@ import GenUtils -// Given a string to the UnicodeData file, return the flattened list of scalar -// to Canonical Decompositions. -// -// Each line in this data file is formatted like the following: -// -// 1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; -// -// Where each section is split by a ';'. The first section informs us of the -// scalar in the line with the various properties. For the purposes of -// decomposition data, we only need the 1B05 1B35 after the L (index 5) which is -// the array of scalars that the scalars decomposes to. -func getDecompData( +enum DecompositionKind { + case canonical + case compatibility +} + +typealias ParsedDecompositions = [(scalar: UInt32, decomposition: [UInt32])] + +/// Parses a list of scalars and their decompositions from a UnicodeData.txt +/// file. +/// +/// The format of UnicodeData.txt is described by [UAX#44](UAX44). +/// +/// [UAX44]: https://www.unicode.org/reports/tr44/#UnicodeData.txt +/// +func parseDecompositionMappings( + kind: DecompositionKind, from data: String -) -> [(UInt32, [UInt32])] { - var unflattened: [(UInt32, [UInt32])] = [] - +) -> ParsedDecompositions { + + var mappings: ParsedDecompositions = [] + for line in data.split(separator: "\n") { - let components = line.split(separator: ";", omittingEmptySubsequences: false) - - let decomp = components[5] - - // We either 1. don't have decompositions, or 2. the decompositions is for - // compatible forms. We only care about NFD, so ignore these cases. - if decomp == "" || decomp.hasPrefix("<") { - continue + + // Each line in the data file contains a series of components + // separated by a ';'. For example: + // + // 1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; + // + // Index 0 is the scalar value ("1B06" above). + // Index 5 is the list of scalars it decomposes to ("1B05 1B35" above). + + let components = line.split( + separator: ";", + omittingEmptySubsequences: false + ) + + var decompositionStr = components[5] + guard !decompositionStr.isEmpty else { + continue // No decomposition. } - - let decomposedScalars = decomp.split(separator: " ").map { + + // Compatibility decompositions are prefixed with a formatting tag, + // such as , , or . For example: + // + // 2460;CIRCLED DIGIT ONE;No;0;ON; 0031;;1;1;N;;;;; + // ^^^^^^^^ + // + // If there is no tag, the decomposition is canonical. + + switch kind { + case .canonical: + guard decompositionStr.first != "<" else { + continue + } + + case .compatibility: + guard decompositionStr.first == "<" else { + continue + } + decompositionStr = decompositionStr.drop(while: { $0 != ">" }) + decompositionStr = decompositionStr.dropFirst() + precondition( + !decompositionStr.isEmpty, + "Invalid decomposition mapping in line: \(line)" + ) + } + + let decomposition = decompositionStr.split(separator: " ").map { UInt32($0, radix: 16)! } let scalarStr = components[0] let scalar = UInt32(scalarStr, radix: 16)! - unflattened.append((scalar, decomposedScalars)) + mappings.append((scalar, decomposition)) } - - return unflattened + + return mappings } -// Takes a mph for the keys and the data values and writes the required data into -// static C arrays. -func emitDecomp( - _ mph: Mph, - _ data: [(UInt32, [UInt32])], - into result: inout String -) { - emitMph( - mph, - name: "_swift_stdlib_nfd_decomp", - defineLabel: "NFD_DECOMP", - into: &result - ) - - // Fixup the decomposed scalars first for fully decompositions. - - var data = data - +/// Returns the recursive expansion of the given decomposition mapping table, +/// as required for full decomposition. +/// +/// If an additional table is provided, they must not overlap +/// (no scalar may have a decomposition in both tables). +/// The result is the recursive expansion of the union of both tables. +/// +func recursivelyExpand( + _ rawDecompositions: ParsedDecompositions, + including additionalDecompositions: ParsedDecompositions? = .none +) -> ParsedDecompositions { + func decompose(_ scalar: UInt32, into result: inout [UInt32]) { - if scalar <= 0x7F { - result.append(scalar) + + // Data in the ParsedDecompositions table is sorted by scalar, + // so cut off the search if we exceed the value we're looking for. + + if let rawEntry = rawDecompositions.first(where: { $0.scalar >= scalar }), + rawEntry.scalar == scalar { + for scalar in rawEntry.decomposition { + decompose(scalar, into: &result) + } return } - - if let decomp = data.first(where: { $0.0 == scalar }) { - for scalar in decomp.1 { + + if let rawEntry = additionalDecompositions?.first(where: { $0.scalar >= scalar }), + rawEntry.scalar == scalar { + for scalar in rawEntry.decomposition { decompose(scalar, into: &result) } - } else { - result.append(scalar) + return } + + result.append(scalar) } - - for (i, (_, rawDecomposed)) in data.enumerated() { - var newDecomposed: [UInt32] = [] - - for rawScalar in rawDecomposed { - decompose(rawScalar, into: &newDecomposed) + + // Recursively expand 'rawDecompositions', + // including decompositions from 'additionalDecompositions' (if given). + // + // This keeps the same set of scalar keys, and just expands the values. + + var expandedDecompositions: ParsedDecompositions = rawDecompositions.map { + (scalar, rawDecomposition) in + var expandedDecomposition: [UInt32] = [] + for rawDecompositionScalar in rawDecomposition { + decompose(rawDecompositionScalar, into: &expandedDecomposition) } - - data[i].1 = newDecomposed + return (scalar, expandedDecomposition) } - - var sortedData: [(UInt32, UInt16)] = [] - - for (scalar, _) in data { - sortedData.append((scalar, UInt16(mph.index(for: UInt64(scalar))))) + + guard let additionalDecompositions else { + return expandedDecompositions } - - sortedData.sort { $0.1 < $1.1 } - - let indices = emitDecompDecomp(data, sortedData, into: &result) - emitDecompIndices(indices, into: &result) + + // If we have two decomposition tables, they must not overlap - + // Every scalar must have a single decomposition in ONE table only. + + var seenScalars = Set( + minimumCapacity: rawDecompositions.count + additionalDecompositions.count + ) + for (scalar, _) in rawDecompositions { + guard seenScalars.insert(scalar).inserted else { + fatalError("Duplicate entries for scalar: \(scalar)") + } + } + for (scalar, _) in additionalDecompositions { + guard seenScalars.insert(scalar).inserted else { + fatalError("Duplicate entries for scalar: \(scalar)") + } + } + + // Recursively expand 'additionalDecompositions', + // including decompositions from both tables. + // + // Merge the result in to 'expandedDecompositions'. + + expandedDecompositions += additionalDecompositions.map { + (scalar, rawDecomposition) in + var expandedDecomposition: [UInt32] = [] + for rawDecompositionScalar in rawDecomposition { + decompose(rawDecompositionScalar, into: &expandedDecomposition) + } + return (scalar, expandedDecomposition) + } + expandedDecompositions.sort(by: { $0.scalar < $1.scalar }) + + return expandedDecompositions } -func emitDecompDecomp( - _ data: [(UInt32, [UInt32])], - _ sortedData: [(UInt32, UInt16)], +/// Emits the given decomposition mapping table +/// as a Minimal Perfect Hash table (MPH), contained in static C arrays. +/// +func emitDecompositionMappingTable( + _ data: ParsedDecompositions, + kind: DecompositionKind, + into result: inout String +) { + + let mph = mph(for: data.map { UInt64($0.scalar) }) + emitMph( + mph, + name: kind.mappingTableBaseName, + defineLabel: kind.defineLabel, + into: &result + ) + + let sortedData: [(scalar: UInt32, mphIndex: UInt16)] = data.map { + (scalar, _) in + return (scalar, UInt16(mph.index(for: UInt64(scalar)))) + }.sorted { $0.mphIndex < $1.mphIndex } + + let indices = emitDecompDecomp(data, sortedData, kind: kind, into: &result) + emitDecompIndices(indices, kind: kind, into: &result) +} + +extension DecompositionKind { + + fileprivate var mappingTableBaseName: String { + switch self { + case .canonical: + return "_swift_stdlib_nfd_decomp" + case .compatibility: + return "_swift_stdlib_nfkd_decomp" + } + } + + fileprivate var defineLabel: String { + switch self { + case .canonical: + return "NFD_DECOMP" + case .compatibility: + return "NFKD_DECOMP" + } + } +} + +private func emitDecompDecomp( + _ data: ParsedDecompositions, + _ sortedData: [(scalar: UInt32, mphIndex: UInt16)], + kind: DecompositionKind, into result: inout String ) -> [(UInt32, UInt16)] { + var indices: [(UInt32, UInt16)] = [] var decompResult: [UInt8] = [] @@ -121,8 +244,8 @@ func emitDecompDecomp( var uniqueDecomps: [[UInt32]: UInt16] = [:] for (scalar, _) in sortedData { - let decomp = data.first(where: { $0.0 == scalar })!.1 - + let decomp = data.first { $0.scalar == scalar }!.decomposition + // If we've seen this decomp before, use it. if let idx = uniqueDecomps[decomp] { indices.append((scalar, idx)) @@ -149,7 +272,7 @@ func emitDecompDecomp( } result += """ - static const __swift_uint8_t _swift_stdlib_nfd_decomp[\(decompResult.count)] = { + static const __swift_uint8_t \(kind.mappingTableBaseName)[\(decompResult.count)] = { """ @@ -162,12 +285,13 @@ func emitDecompDecomp( return indices } -func emitDecompIndices( +private func emitDecompIndices( _ indices: [(UInt32, UInt16)], + kind: DecompositionKind, into result: inout String ) { result += """ - static const __swift_uint32_t _swift_stdlib_nfd_decomp_indices[\(indices.count)] = { + static const __swift_uint32_t \(kind.mappingTableBaseName)_indices[\(indices.count)] = { """ @@ -176,7 +300,8 @@ func emitDecompIndices( // 14 bits to store the index into decomp array. Although Unicode scalars // can go up to 21 bits, none of the higher scalars actually decompose into // anything or aren't assigned yet. - assert(scalar <= 0x3FFFF) + precondition(scalar <= 0x3FFFF, "Scalar does not fit in 18 bits") + precondition(idx <= 0x3FFF, "Decomposition index does not fit in 14 bits") var value = scalar value |= UInt32(idx) << 18 diff --git a/utils/gen-unicode-data/Sources/GenNormalization/NFX_QC.swift b/utils/gen-unicode-data/Sources/GenNormalization/NFX_QC.swift index 30d72cdcd4c2c..bbe88bdbe3844 100644 --- a/utils/gen-unicode-data/Sources/GenNormalization/NFX_QC.swift +++ b/utils/gen-unicode-data/Sources/GenNormalization/NFX_QC.swift @@ -12,82 +12,104 @@ import GenUtils -// Given a string to the DerivedNormalizationProps Unicode file, return the -// flattened list of scalar to NFC Quick Check. -// -// Each line in one of these data files is formatted like the following: -// -// 0343..0344 ; NFC_QC; N # Mn [2] COMBINING GREEK KORONIS..COMBINING GREEK DIALYTIKA TONOS -// 0374 ; NFC_QC; N # Lm GREEK NUMERAL SIGN -// -// Where each section is split by a ';'. The first section informs us of either -// the range of scalars who conform to this property or the singular scalar -// who does. The second section tells us what normalization property these -// scalars conform to. There are extra comments telling us what general -// category these scalars are a part of, how many scalars are in a range, and -// the name of the scalars. -func getQCData(from data: String, with dict: inout [UInt32: UInt16]) { +enum EquivalenceType { + case canonical + case compatibility +} + +private enum NormalizationForm { + case decomposed + case precomposed +} + +/// Parses normalization Quick Check flags for a given equivalence type +/// from a DerivedNormalizationProps.txt file, and updates the given database. +/// +/// If a scalar is already present in the database, +/// the precomposed and decomposed quick-check flags will be updated. +/// +/// If a scalar is not already present in the database, +/// a default-initialized `NormData` will be inserted with the appropriate +/// quick-check flags. +/// +/// The format of DerivedNormalizationProps.txt is described by [UAX#44](UAX44). +/// +/// [UAX44]: https://www.unicode.org/reports/tr44/#DerivedNormalizationProps.txt +/// +func parseQuickCheckFlags( + kind: EquivalenceType, + from data: String, + mergingInto database: inout [UInt32: NormData] +) { + for line in data.split(separator: "\n") { - // Skip comments + + // Each line in the data file contains a series of components + // separated by a ';'. For example: + // + // 0343..0344 ; NFC_QC; N # Mn [2] COMBINING GREEK KORONIS..COMBINING GREEK DIALYTIKA TONOS + // 0374 ; NFC_QC; N # Lm GREEK NUMERAL SIGN + // + // Index 0 is a scalar value or range of scalars. + // Index 1 is the property being specified. + // Index 2 is the property value. It is either "N" (No) or "M" (Maybe). + // Unlisted scalars have a default value of Yes. + // + // Everything after the "#" is a comment. + + // Skip comments. + guard !line.hasPrefix("#") else { continue } - let info = line.split(separator: "#") - let components = info[0].split(separator: ";") - - // Get the property first because we only care about NFC_QC or NFD_QC. - let filteredProperty = components[1].filter { !$0.isWhitespace } + let components = line.prefix { $0 != "#" }.split(separator: ";") - guard filteredProperty == "NFD_QC" || filteredProperty == "NFC_QC" else { - continue + // Parse the normalization form. + + let normalizationForm: NormalizationForm + switch (kind, components[1].filter({ !$0.isWhitespace })) { + case (.canonical, "NFD_QC"): normalizationForm = .decomposed + case (.canonical, "NFC_QC"): normalizationForm = .precomposed + case (.compatibility, "NFKD_QC"): normalizationForm = .decomposed + case (.compatibility, "NFKC_QC"): normalizationForm = .precomposed + default: continue } - + + // Parse the scalar/range of scalars. + let scalars: ClosedRange let filteredScalars = components[0].filter { !$0.isWhitespace } - - // If we have . appear, it means we have a legitimate range. Otherwise, - // it's a singular scalar. if filteredScalars.contains(".") { let range = filteredScalars.split(separator: ".") - scalars = UInt32(range[0], radix: 16)! ... UInt32(range[1], radix: 16)! } else { let scalar = UInt32(filteredScalars, radix: 16)! - scalars = scalar ... scalar } - // Special case: Do not store hangul NFD_QC. - if scalars == 0xAC00...0xD7A3, filteredProperty == "NFD_QC" { + // Special case: Do not store hangul decompositions. + + if scalars == 0xAC00...0xD7A3, normalizationForm == .decomposed { continue } let filteredNFCQC = components[2].filter { !$0.isWhitespace } - + + // Insert the data in to the result dictionary. + // Any scalars not listed are implicitly *_QC=Yes. + for scalar in scalars { - var newValue = dict[scalar, default: 0] - - switch filteredProperty { - case "NFD_QC": - // NFD_QC is the first bit in the data value and is set if a scalar is - // NOT qc. - newValue |= 1 << 0 - case "NFC_QC": - // If our scalar is NOT NFC_QC, then set the 2nd bit in our data value. - // Otherwise, this scalar is MAYBE NFC_QC, so set the 3rd bit. A scalar - // who IS NFC_QC has a value of 0. - if filteredNFCQC == "N" { - newValue |= 1 << 1 - } else { - newValue |= 1 << 2 - } - default: - fatalError("Unknown NFC_QC type?") + + var normData = database[scalar, default: NormData()] + switch normalizationForm { + case .decomposed: + normData.decomposedFormQuickCheck = false + case .precomposed: + normData.precomposedFormQuickCheck = filteredNFCQC == "N" ? .no : .maybe } - - dict[scalar] = newValue + database[scalar] = normData } } } diff --git a/utils/gen-unicode-data/Sources/GenNormalization/NormData.swift b/utils/gen-unicode-data/Sources/GenNormalization/NormData.swift index d92297a484475..740492492a50c 100644 --- a/utils/gen-unicode-data/Sources/GenNormalization/NormData.swift +++ b/utils/gen-unicode-data/Sources/GenNormalization/NormData.swift @@ -12,10 +12,48 @@ import GenUtils +struct NormData { + + enum QuickCheckTriState { + case yes + case no + case maybe + } + + var ccc: UInt8 = 0 + var decomposedFormQuickCheck: Bool = true + var precomposedFormQuickCheck: QuickCheckTriState = .yes + + var compacted: UInt16 { + + // Layout from stdlib/public/core/UnicodeData.swift: + // + // 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 + // └──── CCC ────┘ └───────┘ └─┘ │ + // │ │ └── decomposed_QC + // Unused ┘ └── precomposed_QC + // + // - For decomposed: Yes = 0, No = 1 + // - For precomposed: Yes = 0, No = 1, Maybe = 2 + + var quickCheckFlags: UInt8 = 0 + if !decomposedFormQuickCheck { quickCheckFlags |= 0b0000_0001 } + switch precomposedFormQuickCheck { + case .yes: break + case .no: quickCheckFlags |= 0b0000_0010 + case .maybe: quickCheckFlags |= 0b0000_0100 + } + return (UInt16(ccc) << 8) | UInt16(quickCheckFlags) + } +} + func emitNormData( - _ data: [(ClosedRange, UInt16)], + _ data: [UInt32: NormData], + kind: EquivalenceType, into result: inout String ) { + + let data = flatten(data.map { ($0.key, $0.value.compacted) }) let uniqueData = Set(data.map { $0.1 }).sorted() // 64 bit arrays * 8 bytes = .512 KB @@ -124,28 +162,34 @@ func emitNormData( return ba } } - + + let baseName: String + switch kind { + case .canonical: baseName = "_swift_stdlib_normData" + case .compatibility: baseName = "_swift_stdlib_normData_compat" + } + emitCollection( uniqueData, - name: "_swift_stdlib_normData_data", + name: "\(baseName)_data", into: &result ) emitCollection( dataIndices, - name: "_swift_stdlib_normData_data_indices", + name: "\(baseName)_data_indices", into: &result ) emitCollection( ranks, - name: "_swift_stdlib_normData_ranks", + name: "\(baseName)_ranks", into: &result ) emitCollection( bitArrays, - name: "_swift_stdlib_normData", + name: baseName, type: "__swift_uint64_t", into: &result ) { diff --git a/utils/gen-unicode-data/Sources/GenNormalization/main.swift b/utils/gen-unicode-data/Sources/GenNormalization/main.swift index 15ca05afc3a70..f893e51f17e07 100644 --- a/utils/gen-unicode-data/Sources/GenNormalization/main.swift +++ b/utils/gen-unicode-data/Sources/GenNormalization/main.swift @@ -14,6 +14,7 @@ import GenUtils // Main entry point into the normalization generator. func generateNormalization(for platform: String, version: String) { + var result = readFile("Input/NormalizationData.h") let derivedNormalizationProps = readFile("Data/\(version)/DerivedNormalizationProps.txt") @@ -27,29 +28,87 @@ func generateNormalization(for platform: String, version: String) { unicodeData = readFile("Data/\(version)/UnicodeData.txt") } - // Get all NFX_QC information and put it together with CCC info. - var normData: [UInt32: UInt16] = [:] - getQCData(from: derivedNormalizationProps, with: &normData) - getCCCData(from: unicodeData, with: &normData) - - // Take the NFX_QC info and CCC and emit it as a singular "normData". - let flattenedNormData = flatten(Array(normData)) - emitNormData(flattenedNormData, into: &result) - - // Get and emit decomposition data. - let decompData = getDecompData(from: unicodeData) - let decompMph = mph(for: decompData.map { UInt64($0.0) }) - emitDecomp(decompMph, decompData, into: &result) - - // Get and emit composition data. (Remove composition exclusions) - let compExclusions = getCompExclusions(from: derivedNormalizationProps) - let filteredDecomp = decompData.filter { (scalar, _) in - !compExclusions.contains { - $0.contains(scalar) + let combiningClasses = parseCCCData(from: unicodeData) + let canonicalDecompositions: ParsedDecompositions + + // Canonical Normalization Forms. + do { + + // Construct and emit NormData for canonical normalization forms. + // This includes the combining class and QuickCheck flags. + var canonicalNormData = combiningClasses + parseQuickCheckFlags( + kind: .canonical, + from: derivedNormalizationProps, + mergingInto: &canonicalNormData + ) + emitNormData(canonicalNormData, kind: .canonical, into: &result) + + // Parse, expand, and emit the canonical decomposition mapping table. + let rawDecompositions = parseDecompositionMappings( + kind: .canonical, + from: unicodeData + ) + canonicalDecompositions = recursivelyExpand(rawDecompositions) + emitDecompositionMappingTable( + canonicalDecompositions, + kind: .canonical, + into: &result + ) + + // Parse and emit composition data. (Remove composition exclusions) + // Composition data is computed from raw decompositions, + // not the expanded data. + let compExclusions = getCompExclusions(from: derivedNormalizationProps) + let filteredDecomp = rawDecompositions.filter { (scalar, _) in + !compExclusions.contains { + $0.contains(scalar) + } + } + let compMph = mph(for: Array(Set(filteredDecomp.map { UInt64($0.decomposition[1]) }))) + emitComp(compMph, filteredDecomp, into: &result) + } + + // Compatibility Normalization Forms. + do { + + // Construct and emit NormData for compatibility normalization forms. + // This includes the same combining class data from before. + var compatibilityNormData = combiningClasses + parseQuickCheckFlags( + kind: .compatibility, + from: derivedNormalizationProps, + mergingInto: &compatibilityNormData + ) + emitNormData(compatibilityNormData, kind: .compatibility, into: &result) + + // Parse, expand, and emit the compatibility decomposition mapping table. + let rawCompatibilityDecompositions = parseDecompositionMappings( + kind: .compatibility, + from: unicodeData + ) + // Expansion merges the two decomposition tables, + // but the result is just about too large to fit in our MPH table. + // To reduce its size, remove purely canonical decompositions. + // + // This means we will need to perform 2 table lookups at runtime, + // which is fine - compatibility normalization is not performance critical. + var compatibilityDecompositions = recursivelyExpand( + rawCompatibilityDecompositions, including: canonicalDecompositions + ) + compatibilityDecompositions.removeAll { compatibilityMapping in + guard let canonicalMapping = canonicalDecompositions.first(where: { $0.scalar >= compatibilityMapping.scalar }), + canonicalMapping.scalar == compatibilityMapping.scalar else { + return false + } + return compatibilityMapping.decomposition == canonicalMapping.decomposition } + emitDecompositionMappingTable( + compatibilityDecompositions, + kind: .compatibility, + into: &result + ) } - let compMph = mph(for: Array(Set(filteredDecomp.map { UInt64($0.1[1]) }))) - emitComp(compMph, filteredDecomp, into: &result) result += """ #endif // #ifndef NORMALIZATION_DATA_H diff --git a/validation-test/stdlib/String.swift b/validation-test/stdlib/String.swift index cc2219af7e73f..345d75463517f 100644 --- a/validation-test/stdlib/String.swift +++ b/validation-test/stdlib/String.swift @@ -1,6 +1,6 @@ // RUN: %empty-directory(%t) // RUN: %target-clang -fobjc-arc %S/Inputs/NSSlowString/NSSlowString.m -c -o %t/NSSlowString.o -// RUN: %target-build-swift -I %S/Inputs/NSSlowString/ %t/NSSlowString.o %s -Xfrontend -disable-access-control -o %t/String +// RUN: %target-build-swift -I %S/Inputs/NSSlowString/ %t/NSSlowString.o %s -Xfrontend -disable-access-control -Xfrontend -disable-availability-checking -o %t/String // RUN: %target-codesign %t/String // RUN: %target-run %t/String @@ -62,6 +62,9 @@ extension String { var byteWidth: Int { return _classify()._isASCII ? 1 : 2 } + var isKnownNFC: Bool { + return _classify()._isNFC + } } extension Substring { @@ -1208,6 +1211,43 @@ StringTests.test("Construction") { expectEqual("abc", String(["a", "b", "c"] as [Character])) } +StringTests.test("Construction/FromUnicodeScalars") { + + // Smol strings do not have an isNFC bit, so at least the NFC forms + // must to be large enough that they require an allocated StringStorage. + + let testData: [(source: [Unicode.Scalar], nfc: [Unicode.Scalar], nfkc: [Unicode.Scalar])] = [ + ( + source: ["\u{1D160}", "c", "a", "f", "e", "\u{0301}", "\u{1D160}"], + nfc: ["\u{1D158}", "\u{1D165}", "\u{1D16E}", "c", "a", "f", "\u{00E9}", "\u{1D158}", "\u{1D165}", "\u{1D16E}"], + nfkc: ["\u{1D158}", "\u{1D165}", "\u{1D16E}", "c", "a", "f", "\u{00E9}", "\u{1D158}", "\u{1D165}", "\u{1D16E}"] + ), + ( + source: ["\u{1D160}", "a", "\u{FB00}", "e", "\u{1D160}"], + nfc: ["\u{1D158}", "\u{1D165}", "\u{1D16E}", "a", "\u{FB00}", "e", "\u{1D158}", "\u{1D165}", "\u{1D16E}"], + nfkc: ["\u{1D158}", "\u{1D165}", "\u{1D16E}", "a", "f", "f", "e", "\u{1D158}", "\u{1D165}", "\u{1D16E}"] + ), + ] + for (source, expectedNFC, expectedNFKC) in testData { + + // String.init(_: some Sequence) + expectEqualSequence(source, String(AnySequence(source.lazy.map { $0 })).unicodeScalars) + + // String.init(_: some RandomAccessCollection) + expectEqualSequence(source, String(source).unicodeScalars) + + // String.init(_: Unicode.NormalizedScalars>.NFC) + let nfcString = String(source.normalized.nfc) + expectEqualSequence(expectedNFC, nfcString.unicodeScalars) + expectTrue(nfcString.isKnownNFC) + + // String.init(_: Unicode.NormalizedScalars>.NFKC) + let nfkcString = String(source.normalized.nfkc) + expectEqualSequence(expectedNFKC, nfkcString.unicodeScalars) + expectTrue(nfkcString.isKnownNFC) + } +} + StringTests.test("Conversions") { // Whether we are natively ASCII or small ASCII func isKnownASCII(_ s: String) -> Bool { diff --git a/validation-test/stdlib/StringNormalization.swift b/validation-test/stdlib/StringNormalization.swift index 20b9ad4ad9f3c..c461f35225461 100644 --- a/validation-test/stdlib/StringNormalization.swift +++ b/validation-test/stdlib/StringNormalization.swift @@ -12,7 +12,7 @@ // RUN: %empty-directory(%t) // RUN: %target-clang -fobjc-arc %S/Inputs/NSSlowString/NSSlowString.m -c -o %t/NSSlowString.o -// RUN: %target-build-swift -I %S/Inputs/NSSlowString/ %t/NSSlowString.o %s -o %t/a.out +// RUN: %target-build-swift -Xfrontend -disable-availability-checking -I %S/Inputs/NSSlowString/ %t/NSSlowString.o %s -o %t/a.out // RUN: %target-codesign %t/a.out // RUN: %target-run %t/a.out %S/Inputs/NormalizationTest.txt %S/Inputs/NormalizationTest15.txt @@ -28,6 +28,69 @@ import StdlibUnicodeUnittest import NSSlowString #endif +private func UTF8ToScalars(_ utf8: some Collection) -> [Unicode.Scalar] { + var result: [Unicode.Scalar] = [] + var iter = utf8.makeIterator() + var decoder = UTF8() + decode: while true { + switch decoder.decode(&iter) { + case .scalarValue(let s): result.append(s) + case .emptyInput: break decode + case .error: fatalError("Invalid UTF8") + } + } + return result +} + +private class SinglePassSequence: Sequence { + var iter: AnyIterator + var consumed: Bool + + init(wrapping source: some Collection) { + self.iter = AnyIterator(source.makeIterator()) + self.consumed = false + } + + func makeIterator() -> AnyIterator { + expectFalse(consumed, "Sequence iterated for a second time") + consumed = true + return iter + } +} + +extension Collection { + fileprivate var singlePassSequence: SinglePassSequence { + SinglePassSequence(wrapping: self) + } + + fileprivate var async: AsyncStream { + var it = self.makeIterator() + return AsyncStream { + await Task.yield() + return it.next() + } + } +} + +extension AsyncSequence where Element: Equatable { + + func elementsEqual(_ other: some Sequence) async throws -> Bool { + + var thisIter = self.makeAsyncIterator() + var otherIter = other.makeIterator() + + while let thisNext = try await thisIter.next(), + let otherNext = otherIter.next() { + guard thisNext == otherNext else { return false } + } + guard try await thisIter.next() == nil, otherIter.next() == nil else { + return false + } + + return true + } +} + private func expectEqualIterators( label: String, expected: [UInt8], @@ -130,6 +193,217 @@ if #available(SwiftStdlib 5.9, *) { } } +//if #available(SwiftStdlib 9999, *) { +if true { + + tests.test("StringNormalization15/NormalizedSequence") + .code { + for test in normalizationTests14 { + let sourceScalars = UTF8ToScalars(test.source) + let nfdScalars = UTF8ToScalars(test.NFD) + let nfcScalars = UTF8ToScalars(test.NFC) + let nfkdScalars = UTF8ToScalars(test.NFKD) + let nfkcScalars = UTF8ToScalars(test.NFKC) + + expectEqualSequence(sourceScalars.normalized.nfd, nfdScalars) + expectEqualSequence(sourceScalars.normalized.nfc, nfcScalars) + expectEqualSequence(sourceScalars.normalized.nfkd, nfkdScalars) + expectEqualSequence(sourceScalars.normalized.nfkc, nfkcScalars) + + // toNFKC(x) = toNFC(toNFKD(x)) + expectEqualSequence(sourceScalars.normalized.nfkd.normalized.nfc, nfkcScalars) + } + } + + tests.test("StringNormalization15/NormalizedSequence/Async") + .code { + for test in normalizationTests14 { + let sourceScalars = UTF8ToScalars(test.source) + let nfdScalars = UTF8ToScalars(test.NFD) + let nfcScalars = UTF8ToScalars(test.NFC) + let nfkdScalars = UTF8ToScalars(test.NFKD) + let nfkcScalars = UTF8ToScalars(test.NFKC) + + expectTrue(try! await sourceScalars.async.normalized.nfd.elementsEqual(nfdScalars)) + expectTrue(try! await sourceScalars.async.normalized.nfc.elementsEqual(nfcScalars)) + expectTrue(try! await sourceScalars.async.normalized.nfkd.elementsEqual(nfkdScalars)) + expectTrue(try! await sourceScalars.async.normalized.nfkc.elementsEqual(nfkcScalars)) + + // toNFKC(x) = toNFC(toNFKD(x)) + expectTrue(try! await sourceScalars.async.normalized.nfkd.normalized.nfc.elementsEqual(nfkcScalars)) + } + } + + tests.test("StringNormalization15/NormalizedString") + .code { + for test in normalizationTests14 { + let source = String(validating: test.source, as: UTF8.self)! + + expectEqualSequence(source.normalized(.nfd).utf8, test.NFD) + expectEqualSequence(source.normalized(.nfc).utf8, test.NFC) + expectEqualSequence(source.normalized(.nfkd).utf8, test.NFKD) + expectEqualSequence(source.normalized(.nfkc).utf8, test.NFKC) + + // toNFKC(x) = toNFC(toNFKD(x)) + expectEqualSequence(source.normalized(.nfkd).normalized(.nfc).utf8, test.NFKC) + + // The isNFC bit should be set for large native strings when normalizing to NFC/NFKC. + let nfcStringInfo = source.normalized(.nfc)._classify() + switch nfcStringInfo._form { + case ._cocoa, ._immortal: + fatalError("We should not see a cocoa/immortal string here") + case ._small: + expectTrue(nfcStringInfo._isASCII || !nfcStringInfo._isNFC, "Small strings do not have an isNFC bit") + default: + print("1️⃣") + expectTrue(nfcStringInfo._isNFC) + } + + let nfkcStringInfo = source.normalized(.nfkc)._classify() + switch nfkcStringInfo._form { + case ._cocoa, ._immortal: + fatalError("We should not see a cocoa/immortal string here") + case ._small: + expectTrue(nfcStringInfo._isASCII || !nfcStringInfo._isNFC, "Small strings do not have an isNFC bit") + default: + print("2️⃣") + expectTrue(nfkcStringInfo._isNFC) + } + } + } + + tests.test("StringNormalization15/NormalizedCharacter") + .code { + for test in normalizationTests14 { + let source = String(validating: test.source, as: UTF8.self)! + let nfdString = source.normalized(.nfd) + let nfcString = source.normalized(.nfc) + + for (nfdChar, nfcChar) in zip(nfdString, nfcString) { + expectEqualSequence(nfdChar.unicodeScalars, nfcChar.normalized(.nfd).unicodeScalars) + expectEqualSequence(nfdChar.normalized(.nfc).unicodeScalars, nfcChar.unicodeScalars) + } + } + } + + tests.test("StringNormalization15/NormalizedCharacter/isNFC") + .code { + let sourceScalars: [Unicode.Scalar] = [ + "t", "e", "s", "t", + "t", "\u{0300}", "\u{0301}", "\u{0302}", "\u{0303}", "\u{0304}", "\u{0305}", "\u{0306}", "\u{0307}", "\u{0308}", + "\u{0309}", "\u{0322}", "\u{0323}", "\u{0324}", "\u{0325}", "\u{0326}", "\u{0327}", "\u{0328}", "\u{0329}", + "\u{035C}", "\u{035D}", "\u{035E}", "\u{035F}", "\u{0360}", "\u{0361}", "\u{0362}", "\u{0363}", "\u{0364}", + "\u{032A}", "\u{032B}", "\u{032C}", "\u{032D}", "\u{032E}", "\u{032F}", "\u{0330}", "\u{030A}", "\u{030B}", + "\u{030C}", "\u{030D}", "\u{030E}", "\u{030F}", "\u{0310}", "\u{0311}", "\u{0312}", "\u{0313}", "\u{0314}", + "\u{0315}", "\u{0316}", "\u{0317}", "\u{0318}", "\u{0319}", "\u{031A}", "\u{031B}", "\u{031C}", "\u{031D}", + "\u{031E}", "\u{031F}", "\u{0320}", "\u{0321}", "\u{0331}", "\u{0332}", "\u{0333}", "\u{0334}", "\u{0335}", + "\u{0336}", "\u{0337}", "\u{0338}", "\u{0339}", "\u{033A}", "\u{033B}", "\u{033C}", "\u{033D}", "\u{033E}", + "\u{033F}", "\u{0340}", "\u{0341}", "\u{0342}", "\u{0343}", "\u{0344}", "\u{0345}", "\u{0346}", "\u{0347}", + "\u{0348}", "\u{0349}", "\u{034A}", "\u{034B}", "\u{034C}", "\u{034D}", "\u{034E}", "\u{034F}", "\u{0350}", + "\u{0351}", "\u{0352}", "\u{0353}", "\u{0354}", "\u{0355}", "\u{0356}", "\u{0357}", "\u{0358}", "\u{0359}", + "\u{035A}", "\u{035B}", "\u{035C}", "\u{035D}", "\u{035E}", "\u{035F}", "\u{0360}", "\u{0361}", "\u{0362}", + "\u{0363}", "\u{0364}", "\u{0365}", "\u{0366}", "\u{0367}", "\u{0368}", "\u{0369}", "\u{036A}", "\u{036B}", + "\u{036C}", "\u{036D}", "\u{036E}", + "t", "e", "s", "t", + ] + + let sourceString = String(sourceScalars) + precondition(sourceString.count == 9) + + let nfdString = sourceString.normalized(.nfd) + let nfcString = sourceString.normalized(.nfc) + + // Extract the big Zalgo character. + let (nfdChar, nfcChar) = (nfdString.dropFirst(4).first!, nfcString.dropFirst(4).first!) + expectTrue(nfdChar.unicodeScalars.count > 50) + expectTrue(nfcChar.unicodeScalars.count > 50) + + expectEqualSequence(nfdChar.unicodeScalars, nfcChar.normalized(.nfd).unicodeScalars) + expectEqualSequence(nfdChar.normalized(.nfc).unicodeScalars, nfcChar.unicodeScalars) + + // Characters from an isNFC string should inherit the isNFC bit + // if their storage representation allows. + expectTrue(nfcString._classify()._isNFC) + expectTrue(nfcChar._classify()._isNFC) + expectFalse(nfdString._classify()._isNFC) + expectFalse(nfdChar._classify()._isNFC) + + // Characters normalized to NFC should set the isNFC bit + // if their storage representation allows. + expectTrue(nfdChar.normalized(.nfc)._classify()._isNFC) + } + + tests.test("StringNormalization15/IsNormalized/Sequence") + .code { + for test in normalizationTests14 { + let nfdScalars = UTF8ToScalars(test.NFD) + let nfcScalars = UTF8ToScalars(test.NFC) + let nfkdScalars = UTF8ToScalars(test.NFKD) + let nfkcScalars = UTF8ToScalars(test.NFKC) + + // All samples should be confirmed as normalized in their respective forms. + + expectTrue(nfdScalars.singlePassSequence.isNormalized(.nfd)) + expectTrue(nfcScalars.singlePassSequence.isNormalized(.nfc)) + expectTrue(nfkdScalars.singlePassSequence.isNormalized(.nfkd)) + expectTrue(nfkcScalars.singlePassSequence.isNormalized(.nfkc)) + + // If the source text is expected to be modified by the normalization process, + // it is an example of text that is NOT in the given normal form. + + let sourceScalars = UTF8ToScalars(test.source) + + if !sourceScalars.elementsEqual(nfdScalars) { + expectFalse(sourceScalars.singlePassSequence.isNormalized(.nfd)) + } + if !sourceScalars.elementsEqual(nfcScalars) { + expectFalse(sourceScalars.singlePassSequence.isNormalized(.nfc)) + } + if !sourceScalars.elementsEqual(nfkdScalars) { + expectFalse(sourceScalars.singlePassSequence.isNormalized(.nfkd)) + } + if !sourceScalars.elementsEqual(nfkcScalars) { + expectFalse(sourceScalars.singlePassSequence.isNormalized(.nfkc)) + } + } + } + + tests.test("StringNormalization15/IsNormalized/Collection") + .code { + for test in normalizationTests14 { + let nfdScalars = UTF8ToScalars(test.NFD) + let nfcScalars = UTF8ToScalars(test.NFC) + let nfkdScalars = UTF8ToScalars(test.NFKD) + let nfkcScalars = UTF8ToScalars(test.NFKC) + + // All samples should be confirmed as normalized in their respective forms. + + expectTrue(nfdScalars.isNormalized(.nfd)) + expectTrue(nfcScalars.isNormalized(.nfc)) + expectTrue(nfkdScalars.isNormalized(.nfkd)) + expectTrue(nfkcScalars.isNormalized(.nfkc)) + + // If the source text is expected to be modified by the normalization process, + // it is an example of text that is NOT in the given normal form. + + let sourceScalars = UTF8ToScalars(test.source) + + if !sourceScalars.elementsEqual(nfdScalars) { + expectFalse(sourceScalars.isNormalized(.nfd)) + } + if !sourceScalars.elementsEqual(nfcScalars) { + expectFalse(sourceScalars.isNormalized(.nfc)) + } + if !sourceScalars.elementsEqual(nfkdScalars) { + expectFalse(sourceScalars.isNormalized(.nfkd)) + } + if !sourceScalars.elementsEqual(nfkcScalars) { + expectFalse(sourceScalars.isNormalized(.nfkc)) + } + } + } +} + let codeUnitNormalizationTestsA: [([UInt8], String)] = [ ( [0xef, 0xbd, 0x9a, 0xec, 0xa2, 0x85, 0xe1, 0xbf, 0x90, 0xef, 0xb9, 0xb4, 0xeb, 0x9d, 0x9d, 0xec, 0xa6, 0x81, 0xea, 0xba, 0x91, 0xf0, 0x9d, 0x9b, 0xbb, 0xed, 0x98, 0x9d, 0xe0, 0xb5, 0x8b], @@ -545,4 +819,4 @@ for (i, test) in codeUnitNormalizationTests.enumerated() { #endif } -runAllTests() +await runAllTestsAsync() From 39655ef67ff17e5acf291bee724caf8bff3a3fb9 Mon Sep 17 00:00:00 2001 From: Karl Wagner <5254025+karwa@users.noreply.github.com> Date: Wed, 17 Jul 2024 17:53:08 +0200 Subject: [PATCH 6/6] Temporary changes for toolchain --- stdlib/public/core/Character.swift | 94 ++++++++++++++++++- stdlib/public/core/String.swift | 4 +- stdlib/public/core/StringNormalization.swift | 12 +-- .../core/UnicodeNormalizationCheck.swift | 48 +++++----- stdlib/public/core/UnicodeScalar.swift | 2 +- 5 files changed, 126 insertions(+), 34 deletions(-) diff --git a/stdlib/public/core/Character.swift b/stdlib/public/core/Character.swift index 7c647ab60243f..c548df1917ed4 100644 --- a/stdlib/public/core/Character.swift +++ b/stdlib/public/core/Character.swift @@ -270,10 +270,102 @@ extension Character { /// assert(nfc == nfd) /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public func normalized( _ form: Unicode.CanonicalNormalizationForm ) -> Character { Character(unchecked: _str.normalized(form)) } } + +// FIXME: Improve these and move them somewhere logical. + +extension String.UTF8View: Equatable, Hashable, Comparable { + + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.elementsEqual(rhs) + } + + public static func < (lhs: Self, rhs: Self) -> Bool { + lhs.lexicographicallyPrecedes(rhs) + } + + public func hash(into hasher: inout Hasher) { + for cu in self { hasher.combine(cu) } + } +} + +extension Substring.UTF8View: Equatable, Hashable, Comparable { + + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.elementsEqual(rhs) + } + + public static func < (lhs: Self, rhs: Self) -> Bool { + lhs.lexicographicallyPrecedes(rhs) + } + + public func hash(into hasher: inout Hasher) { + for cu in self { hasher.combine(cu) } + } +} + +extension String.UTF16View: Equatable, Hashable, Comparable { + + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.elementsEqual(rhs) + } + + public static func < (lhs: Self, rhs: Self) -> Bool { + lhs.lexicographicallyPrecedes(rhs) + } + + public func hash(into hasher: inout Hasher) { + for cu in self { hasher.combine(cu) } + } +} + +extension Substring.UTF16View: Equatable, Hashable, Comparable { + + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.elementsEqual(rhs) + } + + public static func < (lhs: Self, rhs: Self) -> Bool { + lhs.lexicographicallyPrecedes(rhs) + } + + public func hash(into hasher: inout Hasher) { + for cu in self { hasher.combine(cu) } + } +} + +extension String.UnicodeScalarView: Equatable, Hashable, Comparable { + + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.elementsEqual(rhs) + } + + public static func < (lhs: Self, rhs: Self) -> Bool { + lhs.lexicographicallyPrecedes(rhs) + } + + public func hash(into hasher: inout Hasher) { + for cu in self { hasher.combine(cu) } + } +} + +extension Substring.UnicodeScalarView: Equatable, Hashable, Comparable { + + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.elementsEqual(rhs) + } + + public static func < (lhs: Self, rhs: Self) -> Bool { + lhs.lexicographicallyPrecedes(rhs) + } + + public func hash(into hasher: inout Hasher) { + for cu in self { hasher.combine(cu) } + } +} diff --git a/stdlib/public/core/String.swift b/stdlib/public/core/String.swift index 661c25f675254..a2c0fbc561d07 100644 --- a/stdlib/public/core/String.swift +++ b/stdlib/public/core/String.swift @@ -810,7 +810,7 @@ extension String { /// - scalars: A sequence of Unicode scalar values. /// @inlinable - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public init( _ scalars: consuming Unicode.NormalizedScalars.NFC ) { @@ -829,7 +829,7 @@ extension String { /// - scalars: A sequence of Unicode scalar values. /// @inlinable - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public init( _ scalars: consuming Unicode.NormalizedScalars.NFKC ) { diff --git a/stdlib/public/core/StringNormalization.swift b/stdlib/public/core/StringNormalization.swift index 1be42bad4fc34..bee93ee83fe1e 100644 --- a/stdlib/public/core/StringNormalization.swift +++ b/stdlib/public/core/StringNormalization.swift @@ -31,7 +31,7 @@ extension Unicode { /// allow one to choose whether the result contains the composed (NFC) /// or decomposed (NFD) representations of these characters. /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @frozen public enum CanonicalNormalizationForm { @@ -74,7 +74,7 @@ extension Unicode { /// allow one to choose whether the result contains the composed (NFKC) /// or decomposed (NFKD) representations of these characters. /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @frozen public enum CompatibilityNormalizationForm { @@ -132,7 +132,7 @@ extension StringProtocol { /// @_specialize(where Self == String) @_specialize(where Self == Substring) - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public func normalized( _ form: Unicode.CanonicalNormalizationForm ) -> String { @@ -230,7 +230,7 @@ extension StringProtocol { /// @_specialize(where Self == String) @_specialize(where Self == Substring) - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public func stableNormalization( _ form: Unicode.CanonicalNormalizationForm ) -> String? { @@ -291,7 +291,7 @@ extension StringProtocol { /// @_specialize(where Self == String) @_specialize(where Self == Substring) - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public func normalized( _ form: Unicode.CompatibilityNormalizationForm ) -> String { @@ -362,7 +362,7 @@ extension StringProtocol { /// @_specialize(where Self == String) @_specialize(where Self == Substring) - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public func stableNormalization( _ form: Unicode.CompatibilityNormalizationForm ) -> String? { diff --git a/stdlib/public/core/UnicodeNormalizationCheck.swift b/stdlib/public/core/UnicodeNormalizationCheck.swift index 95da481c97d7b..b94a6d48a09f0 100644 --- a/stdlib/public/core/UnicodeNormalizationCheck.swift +++ b/stdlib/public/core/UnicodeNormalizationCheck.swift @@ -30,7 +30,7 @@ extension Sequence { /// aString.unicodeScalars.isNormalized(.nfc) // true /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable public consuming func isNormalized( _ form: Unicode.CanonicalNormalizationForm @@ -53,7 +53,7 @@ extension Sequence { /// aString.unicodeScalars.isNormalized(.nfc) // true /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable public consuming func isNormalized( _ form: Unicode.CompatibilityNormalizationForm @@ -79,7 +79,7 @@ extension Collection { /// aString.unicodeScalars.isNormalized(.nfc) // true /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable public func isNormalized( _ form: Unicode.CanonicalNormalizationForm @@ -102,7 +102,7 @@ extension Collection { /// aString.unicodeScalars.isNormalized(.nfc) // true /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable public func isNormalized( _ form: Unicode.CompatibilityNormalizationForm @@ -128,7 +128,7 @@ extension StringProtocol { /// aString.isNormalized(.nfc) // true /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @_specialize(where Self == String) @_specialize(where Self == Substring) public func isNormalized( @@ -149,7 +149,7 @@ extension StringProtocol { /// aString.isNormalized(.nfc) // true /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @_specialize(where Self == String) @_specialize(where Self == Substring) public func isNormalized( @@ -173,7 +173,7 @@ extension Character { /// char.isNormalized(.nfc) // true /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public func isNormalized( _ form: Unicode.CanonicalNormalizationForm ) -> Bool { @@ -192,7 +192,7 @@ extension Character { /// char.isNormalized(.nfc) // true /// ``` /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public func isNormalized( _ form: Unicode.CompatibilityNormalizationForm ) -> Bool { @@ -210,14 +210,14 @@ extension Unicode.Scalar { // ABI barrier for data required by the NFD Quick Check algorithm. - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @usableFromInline internal typealias _NFDQuickCheckData = ( CCC: Unicode.CanonicalCombiningClass, isNFDQC: Bool ) - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @usableFromInline internal func _getNFDQuickCheckData() -> _NFDQuickCheckData { let normdata = Unicode._CanonicalNormData(self) @@ -227,7 +227,7 @@ extension Unicode.Scalar { extension Sequence { - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable internal consuming func _isNFD() -> Bool { @@ -262,14 +262,14 @@ extension Unicode.Scalar { // ABI barrier for data required by the NFKD Quick Check algorithm. - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @usableFromInline internal typealias _NFKDQuickCheckData = ( CCC: Unicode.CanonicalCombiningClass, isNFKDQC: Bool ) - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @usableFromInline internal func _getNFKDQuickCheckData() -> _NFKDQuickCheckData { let normdata = Unicode._CompatibilityNormData(self) @@ -279,7 +279,7 @@ extension Unicode.Scalar { extension Sequence { - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable internal consuming func _isNFKD() -> Bool { @@ -314,14 +314,14 @@ extension Unicode.Scalar { // ABI barrier for data required by the NFC Quick Check algorithm. - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @usableFromInline internal typealias _NFCQuickCheckData = ( CCC: Unicode.CanonicalCombiningClass, isNFCQC: Unicode.NFCQCResult ) - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @usableFromInline internal func _getNFCQuickCheckData() -> _NFCQuickCheckData { let normdata = Unicode._CanonicalNormData(onlyCCCAndNFCQC: self) @@ -331,7 +331,7 @@ extension Unicode.Scalar { extension Collection { - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable @inline(never) internal func _isNFC() -> Bool { @@ -389,7 +389,7 @@ extension Collection { extension Sequence { - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable @inline(never) internal consuming func _isNFC() -> Bool { @@ -451,7 +451,7 @@ extension Sequence { } } -@available(SwiftStdlib 9999, *) +// @available(SwiftStdlib 9999, *) @inlinable internal func _isNFC_sequence_slow( segment: some Collection, @@ -480,14 +480,14 @@ extension Unicode.Scalar { // ABI barrier for data required by the NFKC Quick Check algorithm. - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @usableFromInline internal typealias _NFKCQuickCheckData = ( CCC: Unicode.CanonicalCombiningClass, isNFKCQC: Unicode.NFCQCResult ) - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @usableFromInline internal func _getNFKCQuickCheckData() -> _NFKCQuickCheckData { let normdata = Unicode._CompatibilityNormData(self) @@ -497,7 +497,7 @@ extension Unicode.Scalar { extension Collection { - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable @inline(never) internal func _isNFKC() -> Bool { @@ -555,7 +555,7 @@ extension Collection { extension Sequence { - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) @inlinable @inline(never) internal consuming func _isNFKC() -> Bool { @@ -617,7 +617,7 @@ extension Sequence { } } -@available(SwiftStdlib 9999, *) +// @available(SwiftStdlib 9999, *) @inlinable internal func _isNFKC_sequence_slow( segment: some Collection, diff --git a/stdlib/public/core/UnicodeScalar.swift b/stdlib/public/core/UnicodeScalar.swift index 8c6799c343310..ead776af93843 100644 --- a/stdlib/public/core/UnicodeScalar.swift +++ b/stdlib/public/core/UnicodeScalar.swift @@ -545,7 +545,7 @@ extension Unicode.Scalar { /// Scalars which are unassigned in this version of Unicode /// may be meaningful to applications using a later version of the standard. /// - @available(SwiftStdlib 9999, *) + // @available(SwiftStdlib 9999, *) public var isUnassigned: Bool { // Accurate for Unicode 14.0 and later.